Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Tworzenie bytu


  • Zamknięty Temat jest zamknięty
13 odpowiedzi w tym temacie

#1 A może sma?

    Godlike

  • Power User

Reputacja: 539
Wszechwiedzący

  • Postów:1464
  • GG:
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 20:56

Cześć... Tworzę byt w taki sposób:
		new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_wall"));

// set a name to the entity
set_pev(ent,pev_classname,g_class);

// set model
losuj = random(2);
switch(losuj)
{
case 0:
{
engfunc(EngFunc_SetModel,ent,"models/QTM_CodMod/1.mdl");
}
case 1:
{
engfunc(EngFunc_SetModel,ent,"models/QTM_CodMod/2.mdl");
}
}

// register a new var. for origin
static Float:xorigin[3];
get_user_hitpoint(id,xorigin);


// check if user is aiming at the air
if(engfunc(EngFunc_PointContents,xorigin) == CONTENTS_SKY)
{
client_print(id,print_chat,"Nie mozesz postawic bytu w powietrzu!");
return PLUGIN_HANDLED;
}

// set sizes
static Float:p_mins[3], Float:p_maxs[3];
p_mins = PALLET_MINS;
p_maxs = PALLET_MAXS;
engfunc(EngFunc_SetSize, ent, p_mins, p_maxs);
set_pev(ent, pev_mins, p_mins);
set_pev(ent, pev_maxs, p_maxs );
set_pev(ent, pev_absmin, p_mins);
set_pev(ent, pev_absmax, p_maxs );

// set the rock of origin where is user placed
engfunc(EngFunc_SetOrigin, ent, xorigin);

// make the rock solid
set_pev(ent,pev_solid,SOLID_BBOX); // touch on edge, block

// set the movetype
set_pev(ent,pev_movetype,MOVETYPE_FLY); // no gravity, but still collides with stuff

new Float:p_cvar_health = get_pcvar_float(phealth)+float(cod_get_user_intelligence(id, 1, 1, 1));
set_pev(ent,pev_health,p_cvar_health);
set_pev(ent,pev_takedamage,DAMAGE_YES);

static Float:rvec[3];
pev(id,pev_v_angle,rvec);

rvec[0] = 0.0;

set_pev(ent,pev_angles,rvec);

// drop entity to floor
fm_drop_to_floor(ent);

return PLUGIN_HANDLED;
}

return PLUGIN_HANDLED;
}


I moje pytanie jest następujące: jak sprawdzić czy byt nie zostanie utworzony w podłodze/ścianie/graczu tworzącym byt/innym graczu/czymkolwiek innym
  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6033
Godlike

  • Postów:10831
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 15.08.2011 21:16

możesz zrobić traceline np. od origin bytu do origin w którym oś z równała by się ( z + p_maxs[2]) zwróci ci jeśli jest kontakt między jakimś innym bytem
lub
register_touch(g_class,"*","touchEnt")
będzie ci uruchamiać funkcje touchEnt przy każdym dotknieciu entu przez świat inny ent
ewentualnie sprawdzaj pev_flags
#define	FL_FLY			(1<<0)		/* Changes the SV_Movestep() behavior to not need to be on ground */
#define	FL_SWIM			(1<<1)		/* Changes the SV_Movestep() behavior to not need to be on ground (but stay in water) */
#define	FL_CONVEYOR		(1<<2)
#define	FL_CLIENT		(1<<3)
#define	FL_INWATER		(1<<4)
#define	FL_MONSTER		(1<<5)
#define	FL_GODMODE		(1<<6)
#define	FL_NOTARGET		(1<<7)
#define	FL_SKIPLOCALHOST	(1<<8)		/* Don\\\'t send entity to local host, it\\\'s predicting this entity itself */
#define	FL_ONGROUND		(1<<9)		/* At rest / on the ground */
#define	FL_PARTIALGROUND	(1<<10)		/* not all corners are valid */
#define	FL_WATERJUMP		(1<<11)		/* player jumping out of water */
#define FL_FROZEN		(1<<12) 	/* Player is frozen for 3rd person camera */
#define FL_FAKECLIENT		(1<<13)		/* JAC: fake client, simulated server side; don\\\'t send network messages to them */
#define FL_DUCKING		(1<<14)		/* Player flag -- Player is fully crouched */
#define FL_FLOAT		(1<<15)		/* Apply floating force to this entity when in water */
#define FL_GRAPHED		(1<<16)		/* worldgraph has this ent listed as something that blocks a connection */
#define FL_IMMUNE_WATER		(1<<17)
#define	FL_IMMUNE_SLIME		(1<<18)
#define FL_IMMUNE_LAVA		(1<<19)
#define FL_PROXY		(1<<20)		/* This is a spectator proxy */
#define FL_ALWAYSTHINK		(1<<21)		/* Brush model flag -- call think every frame regardless of nextthink - ltime (for constantly changing velocity/path) */
#define FL_BASEVELOCITY		(1<<22)		/* Base velocity has been applied this frame (used to convert base velocity into momentum) */
#define FL_MONSTERCLIP		(1<<23)		/* Only collide in with monsters who have FL_MONSTERCLIP set */
#define FL_ONTRAIN		(1<<24)		/* Player is _controlling_ a train, so movement commands should be ignored on client during prediction. */
#define FL_WORLDBRUSH		(1<<25)		/* Not moveable/removeable brush entity (really part of the world, but represented as an entity for transparency or something) */
#define FL_SPECTATOR		(1<<26) 	/* This client is a spectator, don\\\'t run touch functions, etc. */
#define FL_CUSTOMENTITY		(1<<29)		/* This is a custom entity */
#define FL_KILLME		(1<<30)		/* This entity is marked for death -- This allows the engine to kill ents at the appropriate time */
#define FL_DORMANT		(1<<31)		/* Entity is dormant, no updates to client */
lub funkcja
AMX Mod X Documentation
#define	CONTENTS_EMPTY		-1
#define	CONTENTS_SOLID		-2
#define	CONTENTS_WATER		-3
#define	CONTENTS_SLIME		-4
#define	CONTENTS_LAVA		-5
#define	CONTENTS_SKY		-6
#define	CONTENTS_ORIGIN		-7		/* removed at csg time */
#define	CONTENTS_CLIP		-8		/* changed to contents_solid */
#define	CONTENTS_CURRENT_0	-9
#define	CONTENTS_CURRENT_90	-10
#define	CONTENTS_CURRENT_180	-11
#define	CONTENTS_CURRENT_270	-12
#define	CONTENTS_CURRENT_UP	-13
#define	CONTENTS_CURRENT_DOWN	-14
#define CONTENTS_TRANSLUCENT	-15
#define	CONTENTS_LADDER		-16

  • +
  • -
  • 1

#3 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 539
Wszechwiedzący

  • Postów:1464
  • GG:
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 21:27

Yyy... Podałeś dużo sposobów za co dziękuję. Jednak chyba ciut za dużo i przez to nie wiem jak wykonać to najprościej, bez zbędnych kombinacji :]
W sumie to w ogóle nie wiem jak zastosować to w praktyce co podałeś :D
  • +
  • -
  • 0

#4 Dwdov

    Profesjonalista

  • Zbanowany

Reputacja: 59
Pomocny

  • Postów:172
  • Imię:Dawid
  • Lokalizacja:Jawor
Offline

Napisano 15.08.2011 21:39

Moim zdaniem najlepiej użyć traceline albo toucha.

Nie pomagam na PW, tylko na forum.


#5 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 539
Wszechwiedzący

  • Postów:1464
  • GG:
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 15.08.2011 21:49

Więc załóżmy, że zrobił bym to po przez
register_touch(g_class,"*","touchEnt")
Jak powinna wyglądać w takim razie funkcja touchEnt?
  • +
  • -
  • 0

#6 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 840
Czempion

  • Postów:1485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 16.08.2011 16:39

Zobacz tak:

public touchEnt(Toucher, Touched)
{
new className[33]
entity_get_string(Touched, EV_SZ_classname, className, 32)

if(equal(className, "func_wall"))
{
//Gdy dotknie sciany
} else if(equal(className, "player")) {
//Gdy dotknie gracza

if(Touched == entity_get_edict(Toucher, EV_ENT_owner)
{
//Gdy dotnknie gracza-tworce
}
}

}


Z drugiej strony nie wiem czemu używasz Toucha z engine a nie fakemety.
  • +
  • -
  • 1

marwit-0.png


#7 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6033
Godlike

  • Postów:10831
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 16.08.2011 17:04

z tego co pamiętam jak ustawimy bytowi owner id gracza to gracz może przechodzić przez ten byt bez niczego chociaż reszta nie może wiec nie wiem czy w takim przypadku touch zostanie wykryty
  • +
  • -
  • 1

#8 MarWit

    The Chosen One

  • Przyjaciel

Reputacja: 840
Czempion

  • Postów:1485
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Bystrzyca
Offline

Napisano 16.08.2011 17:37

@UP, tak, przy ustawieniu ownera można przechodzić przez byt, ale chyba wykrywa toucha (tak mi sie wydaje)
  • +
  • -
  • 1

marwit-0.png


#9 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 539
Wszechwiedzący

  • Postów:1464
  • GG:
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 16.08.2011 18:27

Generalnie to mi to jest obojętne jak do tego dojść - byle by doprowadzić do sytuacji, w której by będzie mógł być tworzony tylko jeżeli nie utworzy się w graczu, ścianie, itd...
  • +
  • -
  • 0

#10 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6033
Godlike

  • Postów:10831
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 16.08.2011 20:27

to było tak od razu mówić
w portal modzie masz funkcje skanujaca miejsce
bool:checkPortalPlace(Float: fOrigin[3],Float: fMins[3],Float: fMaxs[3]){
		new Float:fOriginTmp[3]
		
		xs_vec_copy(fOrigin,fOriginTmp)
		
		
		fOriginTmp[0] += fMins[0];
		fOriginTmp[1] += fMaxs[1];
		fOriginTmp[2] += fMaxs[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		
		fOriginTmp[0] += fMaxs[0];
		fOriginTmp[1] += fMaxs[1];
		fOriginTmp[2] += fMaxs[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		
		fOriginTmp[0] += fMins[0];
		fOriginTmp[1] += fMins[1];
		fOriginTmp[2] += fMaxs[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		fOriginTmp[0] += fMaxs[0];
		fOriginTmp[1] += fMins[1];
		fOriginTmp[2] += fMaxs[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		fOriginTmp[0] += fMins[0];
		fOriginTmp[1] += fMaxs[1];
		fOriginTmp[2] += fMins[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		fOriginTmp[0] += fMaxs[0];
		fOriginTmp[1] += fMaxs[1];
		fOriginTmp[2] += fMins[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		fOriginTmp[0] += fMins[0];
		fOriginTmp[1] += fMins[1];
		fOriginTmp[2] += fMins[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		fOriginTmp[0] += fMaxs[0];
		fOriginTmp[1] += fMins[1];
		fOriginTmp[2] += fMins[2];
		if(!traceTo(fOrigin,fOriginTmp)){
			return false;
		}
		xs_vec_copy(fOrigin,fOriginTmp)
		
		return true;
	}

bool:traceTo(const Float:fFrom[3],const Float:fTo[3]){
		new tr = create_tr2();
		
		engfunc(EngFunc_TraceLine, fFrom, fTo,DONT_IGNORE_MONSTERS, 0, tr);
		
		new Float:fFrac;
		get_tr2(tr, TR_flFraction, fFrac);
		free_tr2(tr);
		
		return (fFrac == 1.0);
		
	}

uzycie masz tu tez uzycie trace_hulla
moveTo(id, in, out){
	if(pev_valid(out)){
		#if defined TRACE_HULL
		new hull = HULL_POINT;
		
		if(is_user_alive(id)){
			hull = HULL_HUMAN;
		}
		#endif
		
		new Float:fDistance = MIN_DISTANCE;
		while(fDistance <= MAX_DISTANCE){
			new Float:fOrigin[3];
			pev(out, pev_origin, fOrigin);
			
			new Float:fAngles[3];
			pev(out, pev_vuser1, fAngles);
			
			xs_vec_mul_scalar(fAngles, fDistance, fAngles);
			xs_vec_add(fOrigin, fAngles, fOrigin);
			
			new Float:fMins[3],Float:fMaxs[3];
			pev(id,pev_mins,fMins);
			pev(id,pev_maxs,fMaxs);
			
			
			
			#if defined TRACE_HULL
			if(!trace_hull(fOrigin, hull, id, 0)){
			#else
			if(checkPortalPlace(fOrigin,fMins,fMaxs)){
			#endif
					set_pev(id, pev_origin, fOrigin);
					
					#if defined SOUNDS
					engfunc(EngFunc_EmitAmbientSound, 0,fOrigin, soundEnter[random(sizeof soundEnter)],VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
					#endif
					
					parseAngle(id, in, out);
					
					break;
				}
			fDistance += 10.0;
			}
		}
	}

  • +
  • -
  • 1

#11 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 539
Wszechwiedzący

  • Postów:1464
  • GG:
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 16.08.2011 21:11

Czyli wystarczy, że na początku funkcji tworzenia bytu umieszczę warunki true/false dla tych stocków, tak?
I tego... moveTo - to jest po prostu przykład, tak?
  • +
  • -
  • 0

#12 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6033
Godlike

  • Postów:10831
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 17.08.2011 08:49

Czyli wystarczy, że na początku funkcji tworzenia bytu umieszczę warunki true/false dla tych stocków, tak?

tak

I tego... moveTo - to jest po prostu przykład, tak?

tak
  • +
  • -
  • 1

#13 A może sma?

    Godlike

  • Autor tematu
  • Power User

Reputacja: 539
Wszechwiedzący

  • Postów:1464
  • GG:
  • Steam:steam
  • Imię:Tomasz
  • Lokalizacja:Polska
Offline

Napisano 18.08.2011 14:40

:mur:
Możesz mi ten warunek wkleić w ten kod?
Spoiler

Bo jak ja to zrobiłem to nigdzie nie można było postawić bytu... Ojj wiele nauki jeszcze przede mną...
  • +
  • -
  • 0

#14 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6033
Godlike

  • Postów:10831
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 18.08.2011 17:32

 if(!checkBagsPlace(xorigin, p_mins, p_maxs))
                {
                        client_print(id,print_center,"Nie mozesz tu postawic workow!");
                        return PLUGIN_HANDLED;
                }
na
xorigin[2] += 30.0;
if(!checkBagsPlace(xorigin, p_mins, p_maxs))
                {
                        client_print(id,print_center,"Nie mozesz tu postawic workow!");
                        return PLUGIN_HANDLED;
                }
xorigin[2] -= 30.0

  • +
  • -
  • 1




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych