NSEntity: Added new methods based on GMod's API. More to follow.

This commit is contained in:
Marco Cawthorne 2022-04-02 00:10:25 -07:00
parent bd63874118
commit e45987d65c
Signed by: eukara
GPG key ID: C196CD8BA993248A
64 changed files with 407 additions and 208 deletions

View file

@ -71,7 +71,7 @@ env_glow::RendererRestarted(void)
m_vecSize = drawgetimagesize(m_strSprite) / 2;
}
if (spawnflags & 1) {
if (HasSpawnFlags(1)) {
hitcontentsmaski = CONTENTBIT_SOLID;
decal_pickwall(this, origin);
m_vecOrientation = vectoangles(g_tracedDecal.normal * -1);
@ -119,7 +119,7 @@ env_glow::predraw(void)
makevectors(vectoangles(origin - vecPlayer));
forg = origin + (v_forward * -16);
if (spawnflags & 1) {
if (HasSpawnFlags(1)) {
vector above;
makevectors(m_vecOrientation);
above = origin + (v_forward * 16);

View file

@ -34,7 +34,6 @@ var int autocvar_dev_loddistance = 0;
class func_lod:NSRenderableEntity
{
int m_iDisappearDist;
vector m_vecTestPos;
void(void) func_lod;
virtual void(void) Init;
@ -57,16 +56,16 @@ func_lod::predraw(void)
#ifdef DEVELOPER
if (autocvar_dev_loddistance != 0) {
if (vlen(vecPlayer - m_vecTestPos) > autocvar_dev_loddistance) {
if (vlen(vecPlayer - WorldSpaceCenter()) > autocvar_dev_loddistance) {
return (PREDRAW_NEXT);
}
} else {
if (vlen(vecPlayer - m_vecTestPos) > m_iDisappearDist) {
if (vlen(vecPlayer - WorldSpaceCenter()) > m_iDisappearDist) {
return (PREDRAW_NEXT);
}
}
#else
if (vlen(vecPlayer - m_vecTestPos) > m_iDisappearDist) {
if (vlen(vecPlayer - WorldSpaceCenter()) > m_iDisappearDist) {
return (PREDRAW_NEXT);
}
#endif
@ -101,10 +100,6 @@ func_lod::Init(void)
setorigin(this, origin);
movetype = MOVETYPE_NONE;
drawmask = MASK_ENGINE;
m_vecTestPos[0] = absmin[0] + (0.5 * (absmax[0] - absmin[0]));
m_vecTestPos[1] = absmin[1] + (0.5 * (absmax[1] - absmin[1]));
m_vecTestPos[2] = absmin[2] + (0.5 * (absmax[2] - absmin[2]));
}
void

View file

@ -61,8 +61,8 @@ server/stubs.qc
server/infodecal.qc
server/player_weaponstrip.qc
server/player_loadsaved.qc
server/prop_physics.qc
server/prop_dynamic.qc
server/prop_physics.qc
server/point_camera.qc
server/targ_speaker.qc
server/target_cdaudio.qc

View file

@ -184,14 +184,14 @@ ambient_generic::Respawn(void)
{
m_strActivePath = m_strSoundPath;
if (spawnflags & AS_NOTTOGGLED) {
if (HasSpawnFlags(AS_NOTTOGGLED)) {
Trigger = UseNormal;
m_iLoop = FALSE;
} else {
m_iLoop = TRUE;
/* set our sample up */
if (spawnflags & AS_SILENT) {
if (HasSpawnFlags(AS_SILENT)) {
m_iToggleSwitch = FALSE;
m_strActivePath = "common/null.wav";
} else {
@ -258,13 +258,13 @@ ambient_generic::ambient_generic(void)
}
// There can be only one
if (spawnflags & AS_ARADIUS) {
if (HasSpawnFlags(AS_ARADIUS)) {
m_flRadius = ATTN_NONE;
} else if (spawnflags & AS_SRADIUS) {
} else if (HasSpawnFlags(AS_SRADIUS)) {
m_flRadius = ATTN_IDLE;
} else if (spawnflags & AS_MRADIUS) {
} else if (HasSpawnFlags(AS_MRADIUS)) {
m_flRadius = ATTN_STATIC;
} else if (spawnflags & AS_LRADIUS) {
} else if (HasSpawnFlags(AS_LRADIUS)) {
m_flRadius = ATTN_NORM;
} else {
m_flRadius = ATTN_STATIC;

View file

@ -59,7 +59,7 @@ button_target::Respawn(void)
SetOrigin(GetSpawnOrigin());
/* it's either one or the other */
if (spawnflags & BUTTA_USE) {
if (HasSpawnFlags(BUTTA_USE)) {
PlayerUse = PUseWrapper;
} else {
health = 1;
@ -68,7 +68,7 @@ button_target::Respawn(void)
}
/* purely cosmetic */
frame = (spawnflags & BUTTA_TEXON) ? 1 : 0;
frame = HasSpawnFlags(BUTTA_TEXON) ? 1 : 0;
}
void

View file

@ -87,12 +87,12 @@ env_explosion::Trigger(entity act, int state)
{
FX_Explosion(origin);
if (!(spawnflags & ENVEXPLO_NODAMAGE)) {
if (!HasSpawnFlags(ENVEXPLO_NODAMAGE)) {
Damage_Radius(origin, this, m_iMagnitude, m_iMagnitude * 2.5f, TRUE, 0);
}
// TODO: Respawn after round instead?
if (!(spawnflags & ENVEXPLO_REPEATABLE)) {
if (!HasSpawnFlags(ENVEXPLO_REPEATABLE)) {
remove(this);
}
}

View file

@ -102,7 +102,7 @@ env_fade::Trigger(entity act, int state)
WriteByte(MSG_MULTICAST, spawnflags);
msg_entity = act;
if (spawnflags & EVF_ONLYUSER)
if (HasSpawnFlags(EVF_ONLYUSER))
multicast([0,0,0], MULTICAST_ONE_R);
else
multicast([0,0,0], MULTICAST_ALL);

View file

@ -177,7 +177,7 @@ env_global::env_global(void)
objerror("env_global: No globalstate name given! Aborting\n");
}
if (spawnflags & GLOBAL_SETSPAWN) {
if (HasSpawnFlags(GLOBAL_SETSPAWN)) {
if (!GlobalPresent(m_strGlobalState)) {
AddNewGlobal(m_strGlobalState, m_iInitialState);
}

View file

@ -122,7 +122,7 @@ env_laser::Trigger(entity act, int state)
void
env_laser::Respawn(void)
{
if (spawnflags & ENVLAZ_STARTON) {
if (HasSpawnFlags(ENVLAZ_STARTON)) {
m_iState = 1;
nextthink = time + 0.1;
}

View file

@ -63,7 +63,7 @@ env_message::Play(entity act, int state)
WriteFloat(MSG_MULTICAST, m_flVolume);
WriteByte(MSG_MULTICAST, m_iAttenuation);
if (spawnflags & EMF_ALLPLAYERS) {
if (HasSpawnFlags(EMF_ALLPLAYERS)) {
msg_entity = this;
multicast(origin, MULTICAST_ALL);
} else {
@ -71,7 +71,7 @@ env_message::Play(entity act, int state)
multicast(origin, MULTICAST_ONE_R);
}
if (spawnflags & EMF_ONCE) {
if (HasSpawnFlags(EMF_ONCE)) {
Trigger = __NULL__;
}
}

View file

@ -93,19 +93,19 @@ env_render::Trigger(entity act, int state)
dprint(sprintf("^2env_render::^3Trigger^7: with spawnflags %d\n", spawnflags));
dprint(sprintf("\tTarget: %s\n", target));
if (!(spawnflags & SF_NORENDERMODE)) {
if (!HasSpawnFlags(SF_NORENDERMODE)) {
dprint(sprintf("\tMode change from %d to %d\n", trigger.m_iRenderMode, m_iRenderMode));
trigger.SetRenderMode(m_iRenderMode);
}
if (!(spawnflags & SF_NORENDERCOLOR)) {
if (!HasSpawnFlags(SF_NORENDERCOLOR)) {
dprint(sprintf("\tColor change from %v to %v\n", trigger.m_vecRenderColor, m_vecRenderColor));
trigger.SetRenderColor(m_vecRenderColor);
}
if (!(spawnflags & SF_NORENDERAMT)) {
if (!HasSpawnFlags(SF_NORENDERAMT)) {
dprint(sprintf("\tAmt change from %d to %d\n", trigger.m_flRenderAmt, m_flRenderAmt));
trigger.SetRenderAmt(m_flRenderAmt);
}
if (!(spawnflags & SF_NORENDERFX)) {
if (!HasSpawnFlags(SF_NORENDERFX)) {
dprint(sprintf("\tFX change from %d to %d\n", trigger.m_iRenderFX, m_iRenderFX));
trigger.SetRenderFX(m_iRenderFX);
}

View file

@ -77,7 +77,7 @@ env_spark::TimedSpark(void)
void
env_spark::Trigger(entity act, int state)
{
if (spawnflags & EVSPARK_TOGGLE) {
if (HasSpawnFlags(EVSPARK_TOGGLE)) {
switch (state) {
case TRIG_OFF:
think = __NULL__;
@ -106,7 +106,7 @@ env_spark::Respawn(void)
m_flMaxDelay = 1.0f;
}
if (spawnflags & EVSPARK_STARTON) {
if (HasSpawnFlags(EVSPARK_STARTON)) {
Trigger(this, TRIG_ON);
}
}

View file

@ -65,7 +65,7 @@ env_sprite::SendEntity(entity ePEnt, float flags)
if (clienttype(ePEnt) != CLIENTTYPE_REAL)
return (0);
if (spawnflags & ENVS_PLAYONCE)
if (HasSpawnFlags(ENVS_PLAYONCE))
return (0);
/* Delete it on the client. */
@ -132,7 +132,7 @@ env_sprite::NetworkOnce(void)
void
env_sprite::Trigger(entity act, int state)
{
if (spawnflags & ENVS_PLAYONCE) {
if (HasSpawnFlags(ENVS_PLAYONCE)) {
NetworkOnce();
} else {
m_iToggled = 1 - m_iToggled;
@ -163,7 +163,7 @@ env_sprite::env_sprite(void)
super::NSRenderableEntity();
m_iToggled = ((spawnflags & ENVS_STARTON) > 0);
m_iToggled = (HasSpawnFlags(ENVS_STARTON) > 0) ? TRUE : FALSE;
/* how pointless this would be otherwise. */
if (!targetname)

View file

@ -176,7 +176,7 @@ func_breakable::Restore(string strKey, string strValue)
void
func_breakable::Pain(void)
{
if (spawnflags & SF_TRIGGER) {
if (HasSpawnFlags(SF_TRIGGER)) {
return;
}
@ -187,7 +187,7 @@ func_breakable::Pain(void)
void
func_breakable::Explode(void)
{
vector rp = absmin + (0.5 * (absmax - absmin));
vector rp = WorldSpaceCenter();
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], GetSurfaceData(SURFDATA_MATERIAL));
FX_Explosion(rp);
Damage_Radius(rp, this, m_flExplodeMag, m_flExplodeRad, TRUE, 0);
@ -227,7 +227,7 @@ func_breakable::Death(void)
unit.think = break_spawnobject;
unit.nextthink = time;
unit.real_owner = this;
setorigin(unit, absmin + (0.5 * (absmax - absmin)));
setorigin(unit, WorldSpaceCenter());
}
/* This may seem totally absurd. That's because it is. It's very
@ -272,7 +272,7 @@ func_breakable::PlayerTouch(void)
}
}
if (spawnflags & SF_TOUCH) {
if (HasSpawnFlags(SF_TOUCH)) {
int fDamage = (float)(vlen(other.velocity) * 0.01f);
if (fDamage >= health) {
@ -285,7 +285,7 @@ func_breakable::PlayerTouch(void)
}
}
if ((spawnflags & SF_PRESSURE) && (other.absmin[2] >= maxs[2] - 2)) {
if (HasSpawnFlags(SF_PRESSURE) && (other.absmin[2] >= maxs[2] - 2)) {
touch = __NULL__;
think = TriggerWrap;
@ -309,7 +309,7 @@ func_breakable::Respawn(void)
touch = PlayerTouch;
think = __NULL__;
if (spawnflags & SF_TRIGGER) {
if (HasSpawnFlags(SF_TRIGGER)) {
takedamage = DAMAGE_NO;
} else {
takedamage = DAMAGE_YES;

View file

@ -106,7 +106,7 @@ class func_button:NSSurfacePropEntity
virtual void(void) MoveBack;
virtual void(void) MoveAway;
virtual void(void) Touch;
virtual void(void) Blocked;
virtual void(entity) Blocked;
virtual void(entity, int) Trigger;
virtual void(void) DeathTrigger;
virtual void(void) Use;
@ -210,13 +210,13 @@ func_button::Arrived(void)
UseOutput(this, m_strOnIn);
m_iState = STATE_RAISED;
if (spawnflags & SF_BTT_TOUCH_ONLY) {
if (HasSpawnFlags(SF_BTT_TOUCH_ONLY)) {
touch = Touch;
} else {
touch = __NULL__;
}
if (spawnflags & SF_BTT_TOGGLE) {
if (HasSpawnFlags(SF_BTT_TOGGLE)) {
return;
}
@ -234,7 +234,7 @@ func_button::Returned(void)
velocity = [0,0,0];
nextthink = 0;
if (spawnflags & SF_BTT_TOUCH_ONLY) {
if (HasSpawnFlags(SF_BTT_TOUCH_ONLY)) {
touch = Touch;
}
@ -329,7 +329,7 @@ func_button::Touch(void)
if (other.movetype == MOVETYPE_WALK) {
Trigger(other, TRIG_TOGGLE);
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
if (!HasSpawnFlags(SF_BTT_TOUCH_ONLY)) {
touch = __NULL__;
}
}
@ -342,7 +342,7 @@ func_button::Use(void)
}
void
func_button::Blocked(void)
func_button::Blocked(entity eBlocker)
{
if (m_flWait >= 0) {
if (m_iState == STATE_DOWN) {
@ -411,7 +411,6 @@ func_button::Respawn(void)
SetOrigin(GetSpawnOrigin());
SetModel(GetSpawnModel());
blocked = Blocked;
velocity = [0,0,0];
nextthink = -1;
health = GetSpawnHealth();
@ -425,7 +424,7 @@ func_button::Respawn(void)
m_flSpeed = 100;
}
if (spawnflags & SF_BTT_TOUCH_ONLY) {
if (HasSpawnFlags(SF_BTT_TOUCH_ONLY)) {
touch = Touch;
PlayerUse = __NULL__;
} else {
@ -435,7 +434,7 @@ func_button::Respawn(void)
m_vecPos1 = GetSpawnOrigin();
if (spawnflags & SF_BTT_NOMOVE) {
if (HasSpawnFlags(SF_BTT_NOMOVE)) {
m_vecPos2 = m_vecPos1;
} else {
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip));

View file

@ -85,7 +85,7 @@ func_conveyor::SetMovementDirection(void)
void
func_conveyor::touch(void)
{
if (spawnflags & SF_CONVEYOR_VISUAL)
if (HasSpawnFlags(SF_CONVEYOR_VISUAL))
return;
other.basevelocity = m_vecMoveDir * (m_flSpeed * -0.2);
@ -127,7 +127,7 @@ func_conveyor::Respawn(void)
Trigger(this, TRIG_ON);
if (spawnflags & SF_CONVEYOR_NOTSOLID) {
if (HasSpawnFlags(SF_CONVEYOR_NOTSOLID)) {
SetSolid(SOLID_NOT);
SetSkin(0);
}

View file

@ -110,7 +110,7 @@ class func_door:NSRenderableEntity
virtual void(void) Returned;
virtual void(void) Respawn;
virtual void(entity, int) Trigger;
virtual void(void) Blocked;
virtual void(entity) Blocked;
virtual void(void) Touch;
virtual void(void) Use;
virtual void(float) Save;
@ -164,14 +164,14 @@ func_door::Arrived(void)
if (m_strSndMove)
sound(this, CHAN_WEAPON, "common/null.wav", 1.0f, ATTN_NORM);
if (!(spawnflags & SF_MOV_USE)) {
if (!HasSpawnFlags(SF_MOV_USE)) {
touch = Touch;
}
if (m_flWait < 0) {
return;
}
if (!(spawnflags & SF_MOV_TOGGLE)) {
if (!HasSpawnFlags(SF_MOV_TOGGLE)) {
think = MoveBack;
nextthink = (ltime + m_flWait);
}
@ -201,7 +201,7 @@ func_door::Returned(void)
if (m_strSndMove)
sound(this, CHAN_WEAPON, "common/null.wav", 1.0f, ATTN_NORM);
if (!(spawnflags & SF_MOV_USE)) {
if (!HasSpawnFlags(SF_MOV_USE)) {
touch = Touch;
}
@ -221,7 +221,7 @@ func_door::MoveBack(void)
if (m_strSndMove)
Sound_Play(this, CHAN_WEAPON, m_strSndMove);
if (!(spawnflags & SF_MOV_USE)) {
if (!HasSpawnFlags(SF_MOV_USE)) {
touch = __NULL__;
}
@ -246,7 +246,7 @@ func_door::MoveAway(void)
if (m_strSndMove)
Sound_Play(this, CHAN_WEAPON, m_strSndMove);
if (!(spawnflags & SF_MOV_TOGGLE)) {
if (!HasSpawnFlags(SF_MOV_TOGGLE)) {
if (m_iState == DOORSTATE_RAISED) {
nextthink = (ltime + m_flWait);
return;
@ -266,7 +266,7 @@ func_door::Trigger(entity act, int state)
return;
if (m_flNextTrigger > time) {
if (!(spawnflags & SF_MOV_TOGGLE)) {
if (!HasSpawnFlags(SF_MOV_TOGGLE)) {
return;
}
}
@ -301,7 +301,7 @@ func_door::Touch(void)
return;
}
if (spawnflags & SF_MOV_TOGGLE) {
if (HasSpawnFlags(SF_MOV_TOGGLE)) {
return;
}
@ -313,10 +313,10 @@ func_door::Touch(void)
}
void
func_door::Blocked(void)
func_door::Blocked(entity eBlocker)
{
if (m_iDamage) {
Damage_Apply(other, this, m_iDamage, 0, DMG_CRUSH);
Damage_Apply(eBlocker, this, m_iDamage, 0, DMG_CRUSH);
}
if (!m_iForceClosed)
@ -394,7 +394,7 @@ func_door::Respawn(void)
SetMovementDirection();
ClearAngles();
if (spawnflags & SF_MOV_PASSABLE)
if (HasSpawnFlags(SF_MOV_PASSABLE))
SetSolid(SOLID_NOT);
else
SetSolid(SOLID_BSP);
@ -402,7 +402,7 @@ func_door::Respawn(void)
SetMovetype(MOVETYPE_PUSH);
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
blocked = Blocked;
think = __NULL__;
nextthink = 0.0f;
@ -419,7 +419,7 @@ func_door::Respawn(void)
m_iDamage = 2;
}
if (spawnflags & SF_MOV_USE) {
if (HasSpawnFlags(SF_MOV_USE)) {
touch = __NULL__;
PlayerUse = Use;
} else {
@ -434,7 +434,7 @@ func_door::Respawn(void)
m_vecPos1 = GetSpawnOrigin();
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip));
if (spawnflags & SF_MOV_OPEN) {
if (HasSpawnFlags(SF_MOV_OPEN)) {
SetOrigin(m_vecPos2);
m_vecPos2 = m_vecPos1;
m_vecPos1 = origin;

View file

@ -101,7 +101,7 @@ class func_door_rotating:NSRenderableEntity
virtual void(entity, int) Trigger;
virtual void(void) Use;
virtual void(void) Touch;
virtual void(void) Blocked;
virtual void(entity) Blocked;
virtual void(void) SetMovementDirection;
virtual void(vector angle, void(void) func) RotToDest;
virtual void(string, string) SpawnKey;
@ -159,11 +159,11 @@ func_door_rotating::Arrived(void)
sound(this, CHAN_VOICE, "common/null.wav", 1.0f, ATTN_NORM);
}
if (!(spawnflags & SF_ROT_USE)) {
if (!HasSpawnFlags(SF_ROT_USE)) {
touch = Touch;
}
if ((spawnflags & SF_ROT_TOGGLE) || m_flWait < 0)
if (HasSpawnFlags(SF_ROT_TOGGLE) || m_flWait < 0)
return;
think = Back;
@ -177,7 +177,7 @@ func_door_rotating::Returned(void)
avelocity = [0,0,0];
nextthink = 0.0f;
if (!(spawnflags & SF_ROT_USE)) {
if (!HasSpawnFlags(SF_ROT_USE)) {
touch = Touch;
}
@ -203,7 +203,7 @@ func_door_rotating::Returned(void)
void
func_door_rotating::Back(void)
{
if (!(spawnflags & SF_DOOR_SILENT)) {
if (!HasSpawnFlags(SF_DOOR_SILENT)) {
if (m_strSndClose) {
Sound_Play(this, CHAN_VOICE, m_strSndClose);
@ -212,7 +212,7 @@ func_door_rotating::Back(void)
}
}
if (!(spawnflags & SF_ROT_USE)) {
if (!HasSpawnFlags(SF_ROT_USE)) {
touch = __NULL__;
}
@ -229,7 +229,7 @@ func_door_rotating::Away(void)
return;
}
if (!(spawnflags & SF_DOOR_SILENT)) {
if (!HasSpawnFlags(SF_DOOR_SILENT)) {
if (m_strSndOpen) {
Sound_Play(this, CHAN_VOICE, m_strSndOpen);
} else {
@ -244,9 +244,9 @@ func_door_rotating::Away(void)
m_iState = STATE_UP;
if (!(spawnflags & SF_ROT_ONEWAY)) {
if (!HasSpawnFlags(SF_ROT_ONEWAY)) {
/* One way doors only work on the Y axis */
if (!(spawnflags & SF_ROT_ZAXIS || spawnflags & SF_ROT_XAXIS)) {
if (!HasSpawnFlags(SF_ROT_ZAXIS) || HasSpawnFlags(SF_ROT_XAXIS)) {
vector vDifference = (eActivator.origin - eActivator.view_ofs) - origin;
vector vAngles = eActivator.angles;
vAngles[0] = vAngles[2] = 0;
@ -311,7 +311,7 @@ func_door_rotating::Touch(void)
return;
}
if (spawnflags & SF_ROT_USE) {
if (HasSpawnFlags(SF_ROT_USE)) {
return;
}
@ -324,10 +324,10 @@ func_door_rotating::Touch(void)
}
void
func_door_rotating::Blocked(void)
func_door_rotating::Blocked(entity eBlocker)
{
if (m_iDamage) {
Damage_Apply(other, this, m_iDamage, 0, DMG_CRUSH);
Damage_Apply(eBlocker, this, m_iDamage, 0, DMG_CRUSH);
}
if (m_flWait >= 0) {
@ -342,9 +342,9 @@ func_door_rotating::Blocked(void)
void
func_door_rotating::SetMovementDirection(void)
{
if (spawnflags & SF_ROT_ZAXIS) {
if (HasSpawnFlags(SF_ROT_ZAXIS)) {
m_vecMoveDir = [0,0,1];
} else if (spawnflags & SF_ROT_XAXIS) {
} else if (HasSpawnFlags(SF_ROT_XAXIS)) {
m_vecMoveDir = [1,0,0];
} else {
m_vecMoveDir = [0,1,0];
@ -404,9 +404,7 @@ func_door_rotating::Respawn(void)
if (m_flWait == 0)
m_flWait = 0.01f;
blocked = Blocked;
if (spawnflags & SF_ROT_USE) {
if (HasSpawnFlags(SF_ROT_USE)) {
touch = __NULL__;
PlayerUse = Use;
} else {
@ -416,13 +414,13 @@ func_door_rotating::Respawn(void)
m_vecPos1 = GetSpawnAngles();
if (spawnflags & SF_ROT_BACKWARDS) {
if (HasSpawnFlags(SF_ROT_BACKWARDS)) {
m_vecPos2 = GetSpawnAngles() + m_vecMoveDir * -m_flDistance;
} else {
m_vecPos2 = GetSpawnAngles() + m_vecMoveDir * m_flDistance;
}
if (spawnflags & SF_ROT_OPEN) {
if (HasSpawnFlags(SF_ROT_OPEN)) {
vector vTemp = m_vecPos2;
m_vecPos2 = m_vecPos1;
m_vecPos1 = vTemp;
@ -434,7 +432,7 @@ func_door_rotating::Respawn(void)
m_iState = STATE_LOWERED;
if (spawnflags & SF_ROT_PASSABLE) {
if (HasSpawnFlags(SF_ROT_PASSABLE)) {
SetSolid(SOLID_NOT);
}

View file

@ -95,9 +95,7 @@ func_guntarget::Move(void)
}
vector vecWorldPos;
vecWorldPos[0] = absmin[0] + (0.5 * (absmax[0] - absmin[0]));
vecWorldPos[1] = absmin[1] + (0.5 * (absmax[1] - absmin[1]));
vecWorldPos[2] = absmin[2] + (0.5 * (absmax[2] - absmin[2]));
vecWorldPos = WorldSpaceCenter();
vel_to_pos = (node.origin - vecWorldPos);
flTravelTime = (vlen(vel_to_pos) / m_flSpeed);
@ -206,7 +204,7 @@ func_guntarget::Respawn(void)
SetOrigin(GetSpawnOrigin());
health = GetSpawnHealth();
if (spawnflags & SF_GUNTARGET_ON) {
if (HasSpawnFlags(SF_GUNTARGET_ON)) {
think = ThinkWrap;
nextthink = ltime + 0.25f;
}

View file

@ -122,9 +122,7 @@ func_mortar_field::FireRandom(void)
vector vecPos;
/* get our center */
vecPos[0] = absmin[0] + (0.5f * (absmax[0] - absmin[0]));
vecPos[1] = absmin[1] + (0.5f * (absmax[1] - absmin[1]));
vecPos[2] = absmin[2] + (0.5f * (absmax[2] - absmin[2]));
vecPos = WorldSpaceCenter();
/* now randomize the position in the volume */
vecPos[0] += mins[0] + (random() * size[0]);
@ -140,9 +138,7 @@ func_mortar_field::FireTarget(entity act)
vector vecPos;
/* get our center */
vecPos[0] = absmin[0] + (0.5f * (absmax[0] - absmin[0]));
vecPos[1] = absmin[1] + (0.5f * (absmax[1] - absmin[1]));
vecPos[2] = absmin[2] + (0.5f * (absmax[2] - absmin[2]));
vecPos = WorldSpaceCenter();
/* orient towards the nearest player pos, clamping by our bounds */
vecPos[0] = bound(vecPos[0] + mins[0], act.origin[0], vecPos[0] + maxs[0]);
@ -178,9 +174,7 @@ func_mortar_field::FireControlled(void)
return;
/* find our center */
vecPos[0] = absmin[0] + (0.5f * (absmax[0] - absmin[0]));
vecPos[1] = absmin[1] + (0.5f * (absmax[1] - absmin[1]));
vecPos[2] = absmin[2] + (0.5f * (absmax[2] - absmin[2]));
vecPos = WorldSpaceCenter();
/* now offset the position to the rot_buttons */
vecPos[0] += mins[0] + (mX.GetProgress() * size[0]);

View file

@ -105,9 +105,9 @@ func_pendulum::customphysics(void)
m_flProgress += frametime;
if (spawnflags & FUNCPEND_XAXIS)
if (HasSpawnFlags(FUNCPEND_XAXIS))
angles[2] = sin(m_flProgress);
else if (spawnflags & FUNCPEND_YAXIS)
else if (HasSpawnFlags(FUNCPEND_YAXIS))
angles[0] = sin(m_flProgress);
else
angles[1] = sin(m_flProgress);
@ -129,17 +129,17 @@ func_pendulum::Trigger(entity act, int state)
m_iActive = 1 - m_iActive;
}
if (m_iActive == 0 && spawnflags & FUNCPEND_RETURNONTRIGGER)
if (m_iActive == 0 && HasSpawnFlags(FUNCPEND_RETURNONTRIGGER))
angles = [0,0,0];
}
void
func_pendulum::Respawn(void)
{
if (spawnflags & FUNCPEND_STARTON)
if (HasSpawnFlags(FUNCPEND_STARTON))
m_iActive = TRUE;
if (spawnflags & FUNCPEND_NONSOLID)
if (HasSpawnFlags(FUNCPEND_NONSOLID))
SetSolid(SOLID_NOT);
else
SetSolid(SOLID_BSP);

View file

@ -37,7 +37,7 @@ func_physbox::Respawn(void)
{
NSPhysicsEntity::Respawn();
if (spawnflags & FNCPHYBX_ASLEEP)
if (HasSpawnFlags(FNCPHYBX_ASLEEP))
PhysicsDisable();
else
PhysicsEnable();

View file

@ -135,7 +135,7 @@ func_plat::MoveToggle(void)
void
func_plat::Trigger(entity act, int state)
{
if (spawnflags & FNCPLAT_TRIGGER)
if (HasSpawnFlags(FNCPLAT_TRIGGER))
return;
switch (state) {

View file

@ -96,7 +96,7 @@ func_pushable::customphysics(void)
}
/* see if we're clipping against entities or other func_pushable_bbox helper entities */
vector position = absmin + (0.5 * (absmax - absmin));
vector position = WorldSpaceCenter();
/* if we're too far away from our box, split */
if ((vlen(m_pPuller.origin - position) - vlen(size)) > 64)
@ -114,7 +114,7 @@ func_pushable::customphysics(void)
if (vlen(velocity))
runstandardplayerphysics(this);
setorigin(m_eCollBox, absmin + (0.5 * (absmax - absmin)));
setorigin(m_eCollBox, WorldSpaceCenter());
}
void
@ -126,7 +126,7 @@ func_pushable::PlayerTouch(void)
}
/* get the real position of the pushable */
vector position = absmin + (0.5 * (absmax - absmin));
vector position = WorldSpaceCenter();
/* check if we're inside the pushable */
if (other.origin[0] >= absmin[0] && other.origin[0] <= absmax[0])
@ -165,7 +165,7 @@ func_pushable::Respawn(void)
m_eCollBox.solid = SOLID_BBOX;
m_eCollBox.owner = this;
setsize(m_eCollBox, -(size/2) * 0.9f, (size/2) * 0.9f);
setorigin(m_eCollBox, absmin + (0.5 * (absmax - absmin)));
setorigin(m_eCollBox, WorldSpaceCenter());
}
}

View file

@ -177,7 +177,7 @@ func_rot_button::OnPlayerUse(void)
void
func_rot_button::touch(void)
{
if (spawnflags & FNCROTBUT_TOUCHABLE)
if (HasSpawnFlags(FNCROTBUT_TOUCHABLE))
TurnToggle();
}
@ -190,7 +190,7 @@ func_rot_button::TurnToggle(void)
Rotate(GetSpawnAngles(), ArrivedOpened);
/* in toggle mode, we trigger our targets every turn */
if (spawnflags & FNCROTBUT_TOGGLE)
if (HasSpawnFlags(FNCROTBUT_TOGGLE))
TriggerTargets();
}
}
@ -207,7 +207,7 @@ func_rot_button::Respawn(void)
{
SetMovetype(MOVETYPE_PUSH);
if (spawnflags & FNCROTBUT_NONSOLID)
if (HasSpawnFlags(FNCROTBUT_NONSOLID))
SetSolid(SOLID_NOT);
else
SetSolid(SOLID_BSP);
@ -227,15 +227,15 @@ func_rot_button::Respawn(void)
}
vector vecMoveDir;
if (spawnflags & FNCROTBUT_XAXIS) {
if (HasSpawnFlags(FNCROTBUT_XAXIS)) {
vecMoveDir = [0,0,1];
} else if (spawnflags & FNCROTBUT_YAXIS) {
} else if (HasSpawnFlags(FNCROTBUT_YAXIS)) {
vecMoveDir = [0,1,0];
} else {
vecMoveDir = [1,0,0];
}
if (spawnflags & FNCROTBUT_REVERSE) {
if (HasSpawnFlags(FNCROTBUT_REVERSE)) {
vecMoveDir *= -1;
}

View file

@ -80,7 +80,8 @@ class func_rotating:NSRenderableEntity
virtual void(string, string) SpawnKey;
virtual void(void) Rotate;
virtual void(void) Blocked;
virtual void(entity) Blocked;
virtual void(void) BlockedTouch;
virtual void(void) SetMovementDirection;
};
@ -132,7 +133,7 @@ func_rotating::Trigger(entity act, int state)
} else {
float flSpeed;
if (spawnflags & FR_TOGGLEDIR && m_flDir) {
if (HasSpawnFlags(FR_TOGGLEDIR) && m_flDir) {
flSpeed = m_flSpeed * -1;
} else {
flSpeed = m_flSpeed;
@ -148,7 +149,7 @@ func_rotating::Trigger(entity act, int state)
}
void
func_rotating::Blocked(void)
func_rotating::Blocked(entity eBlocker)
{
if (vlen(avelocity) <= 0) {
return;
@ -167,6 +168,12 @@ func_rotating::Blocked(void)
}
}
void
func_rotating::BlockedTouch(void)
{
Blocked(other);
}
void
func_rotating::Respawn(void)
{
@ -180,38 +187,36 @@ func_rotating::Respawn(void)
SetModel(GetSpawnModel());
SetMovetype(MOVETYPE_PUSH);
SetSolid((spawnflags & FR_NOTSOLID) ? SOLID_NOT : SOLID_BSP);
SetSolid(HasSpawnFlags(FR_NOTSOLID) ? SOLID_NOT : SOLID_BSP);
SetOrigin(GetSpawnOrigin());
RestoreAngles();
SetMovementDirection();
ClearAngles();
if (spawnflags & FR_STARTON) {
if (HasSpawnFlags(FR_STARTON)) {
avelocity = m_vecMoveDir * m_flSpeed;
think = Rotate;
nextthink = ltime + 1.5f;
}
blocked = Blocked;
if (spawnflags & FR_FANPAIN) {
touch = Blocked;
if (HasSpawnFlags(FR_FANPAIN)) {
touch = BlockedTouch;
}
}
void
func_rotating::SetMovementDirection(void)
{
if (spawnflags & FR_ZAXIS) {
if (HasSpawnFlags(FR_ZAXIS)) {
m_vecMoveDir = [0,0,1];
} else if (spawnflags & FR_XAXIS) {
} else if (HasSpawnFlags(FR_XAXIS)) {
m_vecMoveDir = [1,0,0];
} else {
m_vecMoveDir = [0,1,0];
}
if (spawnflags & FR_REVERSE) {
if (HasSpawnFlags(FR_REVERSE)) {
m_vecMoveDir *= -1;
}
}

View file

@ -73,7 +73,7 @@ class func_tracktrain:NSRenderableEntity
virtual void(void) AfterSpawn;
virtual void(void) PathNext;
virtual void(void) PathMove;
virtual void(void) Blocked;
virtual void(entity) Blocked;
};
void
@ -120,18 +120,18 @@ func_tracktrain::Restore(string strKey, string strValue)
}
void
func_tracktrain::Blocked(void)
func_tracktrain::Blocked(entity eBlocker)
{
/* HACK: Make corpses gib instantly */
if (other.solid == SOLID_CORPSE) {
Damage_Apply(other, this, 500, 0, DMG_EXPLODE);
if (eBlocker.solid == SOLID_CORPSE) {
Damage_Apply(eBlocker, this, 500, 0, DMG_EXPLODE);
return;
}
if (other.takedamage != DAMAGE_NO) {
Damage_Apply(other, this, m_flDamage, 0, DMG_CRUSH);
if (eBlocker.takedamage != DAMAGE_NO) {
Damage_Apply(eBlocker, this, m_flDamage, 0, DMG_CRUSH);
} else {
remove(other);
remove(eBlocker);
}
}
@ -242,12 +242,12 @@ func_tracktrain::PathNext(void)
velocity = [0,0,0];
/* warp */
if (eNode.spawnflags & PC_TELEPORT) {
if (eNode.HasSpawnFlags(PC_TELEPORT)) {
SetOrigin((eNode.origin) + [0,0,m_flHeight]);
}
/* stop until triggered again */
if (eNode.spawnflags & PC_WAIT) {
if (eNode.HasSpawnFlags(PC_WAIT)) {
SoundStop();
return;
}
@ -281,9 +281,8 @@ func_tracktrain::AfterSpawn(void)
void
func_tracktrain::Respawn(void)
{
SetSolid(spawnflags & TRAIN_NOTSOLID ? SOLID_NOT : SOLID_BSP);
SetSolid(HasSpawnFlags(TRAIN_NOTSOLID) ? SOLID_NOT : SOLID_BSP);
SetMovetype(MOVETYPE_PUSH);
blocked = Blocked;
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());
m_flSpeed = m_flStartSpeed;

View file

@ -76,7 +76,7 @@ class func_train:NSRenderableEntity
virtual void(void) AfterSpawn;
virtual void(void) PathNext;
virtual void(void) PathMove;
virtual void(void) Blocked;
virtual void(entity) Blocked;
};
void
@ -115,18 +115,18 @@ func_train::Restore(string strKey, string strValue)
}
void
func_train::Blocked(void)
func_train::Blocked(entity eBlocker)
{
/* HACK: Make corpses gib instantly */
if (other.solid == SOLID_CORPSE) {
Damage_Apply(other, this, 500, 0, DMG_EXPLODE);
Damage_Apply(eBlocker, this, 500, 0, DMG_EXPLODE);
return;
}
if (other.takedamage != DAMAGE_NO) {
Damage_Apply(other, this, m_flDamage, 0, DMG_CRUSH);
Damage_Apply(eBlocker, this, m_flDamage, 0, DMG_CRUSH);
} else {
remove(other);
remove(eBlocker);
}
}
@ -164,9 +164,7 @@ func_train::PathMove(void)
return;
}
vecWorldPos[0] = absmin[0] + (0.5 * (absmax[0] - absmin[0]));
vecWorldPos[1] = absmin[1] + (0.5 * (absmax[1] - absmin[1]));
vecWorldPos[2] = absmin[2] + (0.5 * (absmax[2] - absmin[2]));
vecWorldPos = WorldSpaceCenter();
vecVelocity = (eNode.origin - vecWorldPos);
flTravelTime = (vlen(vecVelocity) / m_flSpeed);
@ -224,12 +222,12 @@ func_train::PathNext(void)
velocity = [0,0,0];
/* warp */
if (eNode.spawnflags & PC_TELEPORT) {
if (eNode.HasSpawnFlags(PC_TELEPORT)) {
SetOrigin(eNode.origin - (mins + maxs) * 0.5);
}
/* stop until triggered again */
if (eNode.spawnflags & PC_WAIT || spawnflags & TRAIN_WAIT) {
if (eNode.HasSpawnFlags(PC_WAIT) || HasSpawnFlags(TRAIN_WAIT)) {
SoundStop();
return;
}
@ -263,9 +261,8 @@ func_train::AfterSpawn(void)
void
func_train::Respawn(void)
{
SetSolid(spawnflags & TRAIN_NOTSOLID ? SOLID_NOT : SOLID_BSP);
SetSolid(HasSpawnFlags(TRAIN_NOTSOLID) ? SOLID_NOT : SOLID_BSP);
SetMovetype(MOVETYPE_PUSH);
blocked = Blocked;
SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin());

View file

@ -360,12 +360,12 @@ func_vehicle::customphysics(void)
setorigin(m_wlBR, origin + v_right * m_flWidth - v_forward * m_flLength);
setorigin(m_wlBL, origin - v_right * m_flWidth - v_forward * m_flLength);
if (spawnflags & FUNCVEH_FWDRIVE) {
if (HasSpawnFlags(FUNCVEH_FWDRIVE)) {
m_wlFL.Physics(0);
m_wlFR.Physics(0);
m_wlBL.Physics(m_flTurn);
m_wlBR.Physics(m_flTurn);
} else if (spawnflags & FUNCVEH_RWDRIVE) {
} else if (HasSpawnFlags(FUNCVEH_RWDRIVE)) {
m_wlFL.Physics(-m_flTurn);
m_wlFR.Physics(-m_flTurn);
m_wlBL.Physics(0);

View file

@ -104,7 +104,7 @@ func_wall_toggle::Respawn(void)
m_iVisible = 1;
m_oldmodelindex = modelindex;
if (spawnflags & FTW_STARTHIDDEN) {
if (HasSpawnFlags(FTW_STARTHIDDEN)) {
Trigger(this, TRIG_OFF);
}
}

View file

@ -109,9 +109,9 @@ game_counter::Trigger(entity act, int state)
if (m_iCounted < m_iMaxCount)
return;
if (spawnflags & GMCNT_REMOVE)
if (HasSpawnFlags(GMCNT_REMOVE))
Destroy();
else if (spawnflags & GMCNT_RESET)
else if (HasSpawnFlags(GMCNT_RESET))
Respawn();
else
m_iValue = 1;

View file

@ -86,7 +86,7 @@ game_counter_set::Trigger(entity act, int state)
targ.SetCount(m_iCount);
}
if (spawnflags & GMCNTS_REMOVE)
if (HasSpawnFlags(GMCNTS_REMOVE))
Destroy();
}

View file

@ -143,7 +143,7 @@ game_text::Trigger(entity act, int state)
WriteFloat(MSG_MULTICAST, m_flHoldTime);
WriteFloat(MSG_MULTICAST, m_flFXTime);
if (spawnflags & GTF_ALLPLAYERS) {
if (HasSpawnFlags(GTF_ALLPLAYERS)) {
msg_entity = this;
multicast(origin, MULTICAST_ALL);
} else {

View file

@ -187,7 +187,7 @@ light::Respawn(void)
case BSPVER_HL:
case BSPVER_Q2:
case BSPVER_Q2W:
if (spawnflags & 1 && targetname) {
if (HasSpawnFlags(1) && targetname) {
m_iEnabled = 0;
} else {
m_iEnabled = 1;
@ -202,6 +202,8 @@ light::Respawn(void)
m_iEnabled = 1;
}
break;
default:
m_iEnabled = 1;
}
RestoreComplete();

View file

@ -157,7 +157,7 @@ logic_auto::Processing(void)
if (serverkeyfloat("background") == 1)
UseOutput(this, m_strOnBackgroundMap);
if (spawnflags & 1) {
if (HasSpawnFlags(1)) {
dprint(sprintf("^2logic_auto::^3think^7: %s triggerer removed self\n", target));
remove(this);
}

View file

@ -144,7 +144,7 @@ momentary_rot_button::OnPlayerUse(void)
m_eUser = eActivator;
/* if we're not already rotating (or can only turn 1 way) */
if (m_iTurnDir == 0 || (spawnflags & MRBFL_AUTORETURN))
if (m_iTurnDir == 0 || HasSpawnFlags(MRBFL_AUTORETURN))
iEndState = (MOMENTARY_ROTATING); /* always turning one way on auto-return */
else
iEndState = (MOMENTARY_RETURNING);
@ -163,7 +163,7 @@ momentary_rot_button::OnPlayerUse(void)
CBaseMomentary b = (CBaseMomentary)e;
/* door hack: any entity with the same name as ours will follow our states */
if (b.spawnflags & MRBFL_DOORHACK)
if (HasSpawnFlags(MRBFL_DOORHACK))
b.SetMoveState(iEndState);
}
}
@ -176,7 +176,7 @@ momentary_rot_button::OnPlayerUnUse(void)
m_eUser = world;
/* instead of stopping, auto-return. */
if (spawnflags & MRBFL_AUTORETURN)
if (HasSpawnFlags(MRBFL_AUTORETURN))
iEndState = (MOMENTARY_RETURNING);
else
iEndState = (MOMENTARY_IDLE);
@ -193,7 +193,7 @@ momentary_rot_button::OnPlayerUnUse(void)
CBaseMomentary b = (CBaseMomentary)e;
/* door hack: any entity with the same name as ours will follow our states */
if (b.spawnflags & MRBFL_DOORHACK)
if (b.HasSpawnFlags(MRBFL_DOORHACK))
b.SetMoveState(iEndState);
}
}
@ -201,9 +201,9 @@ momentary_rot_button::OnPlayerUnUse(void)
void
momentary_rot_button::SetMovementDirection(void)
{
if (spawnflags & MRBFL_XAXIS) {
if (HasSpawnFlags(MRBFL_XAXIS)) {
m_vecMoveDir = [0,0,1];
} else if (spawnflags & MRBFL_YAXIS) {
} else if (HasSpawnFlags(MRBFL_YAXIS)) {
m_vecMoveDir = [1,0,0];
} else {
m_vecMoveDir = [0,1,0];
@ -228,7 +228,7 @@ momentary_rot_button::Respawn(void)
SetOrigin(GetSpawnOrigin());
/* purely visual, can't use this */
if (!(spawnflags & MRBFL_NOTUSE)) {
if (!HasSpawnFlags(MRBFL_NOTUSE)) {
PlayerUse = OnPlayerUse;
PlayerUseUnpressed = OnPlayerUnUse;
}

View file

@ -43,7 +43,7 @@ monster_generic::Respawn(void)
{
NSTalkMonster::Respawn();
if (spawnflags & MGF_NONSOLID) {
if (HasSpawnFlags(MGF_NONSOLID)) {
takedamage = DAMAGE_NO;
SetSolid(SOLID_NOT);
iBleeds = FALSE;

View file

@ -190,7 +190,7 @@ monstermaker::Spawner(void)
}
/* inherit the monsterclip flag */
if (spawnflags & MMF_MONSTERCLIP) {
if (HasSpawnFlags(MMF_MONSTERCLIP)) {
unit.spawnflags |= MSF_MONSTERCLIP;
}
} else {
@ -206,7 +206,7 @@ monstermaker::Spawner(void)
}
/* sometimes all we do is just spawn a single monster at a time */
if (spawnflags & MMF_NONTOGGLE) {
if (HasSpawnFlags(MMF_NONTOGGLE)) {
TurnOff();
} else {
nextthink = time + m_flDelay;
@ -234,7 +234,7 @@ monstermaker::Trigger(entity act, int state)
void
monstermaker::Respawn(void)
{
if (spawnflags & MMF_STARTON) {
if (HasSpawnFlags(MMF_STARTON)) {
TurnOn();
} else {
TurnOff();

View file

@ -207,7 +207,7 @@ multi_manager::Trigger(entity act, int state)
m_iValue = TRUE;
/* If not multi-threaded, we have to watch out 'til all triggers are done. */
if (!(spawnflags & MM_MULTITHREADED)) {
if (!HasSpawnFlags(MM_MULTITHREADED)) {
for (int i = 0; i < 16; i++) {
if (m_eTriggers[i].nextthink > time) {
return;

View file

@ -97,7 +97,7 @@ path_corner::Trigger(entity act, int state)
{
entity a;
if ((spawnflags & PC_FIREONCE) && m_iFired) {
if (HasSpawnFlags(PC_FIREONCE) && m_iFired) {
return;
}

View file

@ -44,7 +44,7 @@ prop_dynamic::Respawn(void)
super::Respawn();
SetModel(GetSpawnModel());
if (spawnflags & PRPDYN_NONSOLID)
if (HasSpawnFlags(PRPDYN_NONSOLID))
SetSolid(SOLID_NOT);
}

View file

@ -37,7 +37,7 @@ prop_physics::Respawn(void)
{
NSPhysicsEntity::Respawn();
if (spawnflags & PRPPHYS_ASLEEP)
if (HasSpawnFlags(PRPPHYS_ASLEEP))
PhysicsDisable();
else
PhysicsEnable();
@ -56,4 +56,4 @@ void
prop_physics::prop_physics(void)
{
super::NSPhysicsEntity();
}
}

View file

@ -167,7 +167,7 @@ scripted_sequence::RunOnEntity(entity targ)
return;
/* aaaaand it's gone */
if (!(spawnflags & SSFL_REPEATABLE))
if (!HasSpawnFlags(SSFL_REPEATABLE))
m_iEnabled = FALSE;
dprint(sprintf("\tName: %s\n", targetname));
@ -243,7 +243,7 @@ scripted_sequence::RunOnEntity(entity targ)
f.m_iSequenceState = SEQUENCESTATE_ENDING;
if (spawnflags & SSFL_NOSCRIPTMOVE)
if (HasSpawnFlags(SSFL_NOSCRIPTMOVE))
f.think = NSMonster::FreeState;
else
f.think = NSMonster::FreeStateMoved;

View file

@ -137,7 +137,7 @@ speaker::Respawn(void)
think = Annouce;
if (!(spawnflags & SPEAKFL_SILENT))
if (!HasSpawnFlags(SPEAKFL_SILENT))
nextthink = time + 10.0f;
}

View file

@ -88,7 +88,7 @@ trigger_auto::Processing(void)
UseTargets(this, m_iTriggerState, m_flDelay);
if (spawnflags & 1) {
if (HasSpawnFlags(1)) {
dprint(sprintf("^2trigger_auto::^3think^7: %s triggerer removed self\n", target));
remove(this);
}

View file

@ -226,7 +226,7 @@ trigger_changelevel::Respawn(void)
{
InitBrushTrigger();
if (!(spawnflags & LC_USEONLY)) {
if (!HasSpawnFlags(LC_USEONLY)) {
touch = TouchTrigger;
}
}

View file

@ -83,9 +83,9 @@ trigger_counter::touch(void)
void
trigger_counter::Trigger(entity act, int state)
{
if (act.classname == "func_pushable" && !(spawnflags & TRCNT_PUSHABLES))
if (act.classname == "func_pushable" && !HasSpawnFlags(TRCNT_PUSHABLES))
return;
if (spawnflags & TRCNT_NOCLIENTS && act.spawnflags & FL_CLIENT)
if (HasSpawnFlags(TRCNT_NOCLIENTS) && act.flags & FL_CLIENT)
return;
if (GetMaster() == FALSE)
return;

View file

@ -153,9 +153,9 @@ trigger_hurt::touch(void)
{
if (other.takedamage == DAMAGE_NO) {
return;
} else if ((spawnflags & SF_HURT_TOUCHPLAYER) && !(other.flags & FL_CLIENT)) {
} else if (HasSpawnFlags(SF_HURT_TOUCHPLAYER) && !(other.flags & FL_CLIENT)) {
return;
} else if ((spawnflags & SF_HURT_NOPLAYERS) && (other.flags & FL_CLIENT)) {
} else if (HasSpawnFlags(SF_HURT_NOPLAYERS) && (other.flags & FL_CLIENT)) {
return;
} else if (other.hurt_next > time) {
return;
@ -167,7 +167,7 @@ trigger_hurt::touch(void)
else
UseOutput(other, m_strOnHurt);
} else {
if (spawnflags & SF_HURT_FIREONPLAYER) {
if (HasSpawnFlags(SF_HURT_FIREONPLAYER)) {
if (other.flags & FL_CLIENT) {
eActivator = other;
UseTargets(other, TRIG_TOGGLE, m_flDelay);
@ -208,7 +208,7 @@ trigger_hurt::touch(void)
other.netname, m_iDamage));
/* shut it down if used once */
if (spawnflags & SF_HURT_ONCE) {
if (HasSpawnFlags(SF_HURT_ONCE)) {
Trigger(other, TRIG_OFF);
}
@ -218,7 +218,7 @@ trigger_hurt::touch(void)
void
trigger_hurt::Respawn(void)
{
if (spawnflags & SF_HURT_OFF) {
if (HasSpawnFlags(SF_HURT_OFF)) {
Trigger(this, TRIG_OFF);
} else {
Trigger(this, TRIG_ON);

View file

@ -121,11 +121,11 @@ trigger_multiple::touch(void)
{
if (GetMaster() == FALSE)
return;
if (spawnflags & TM_NOCLIENTS && other.flags & FL_CLIENT)
if (HasSpawnFlags(TM_NOCLIENTS) && other.flags & FL_CLIENT)
return;
if (!(spawnflags & TM_MONSTERS) && other.flags & FL_MONSTER)
if (!HasSpawnFlags(TM_MONSTERS) && other.flags & FL_MONSTER)
return;
if (!(spawnflags & TM_PUSHABLES) && other.classname == "func_pushable")
if (!HasSpawnFlags(TM_PUSHABLES) && other.classname == "func_pushable")
return;
if (Rules_IsTeamPlay() == TRUE) {

View file

@ -82,11 +82,11 @@ trigger_once::touch(void)
{
if (GetMaster() == FALSE)
return;
if (spawnflags & TO_NOCLIENTS && other.flags & FL_CLIENT)
if (HasSpawnFlags(TO_NOCLIENTS) && other.flags & FL_CLIENT)
return;
if (!(spawnflags & TO_MONSTERS) && other.flags & FL_MONSTER)
if (!HasSpawnFlags(TO_MONSTERS) && other.flags & FL_MONSTER)
return;
if (!(spawnflags & TO_PUSHABLES) && other.classname == "func_pushable")
if (!HasSpawnFlags(TO_PUSHABLES) && other.classname == "func_pushable")
return;
SetSolid(SOLID_NOT); /* make inactive */

View file

@ -124,7 +124,7 @@ trigger_push::touch(void)
vector vecPush;
vecPush = (m_flSpeed * m_vecMoveDir);
if (spawnflags & TP_ONCE) {
if (HasSpawnFlags(TP_ONCE)) {
other.velocity += vecPush;
if (other.velocity[2] > 0) {
other.flags &= ~FL_ONGROUND;
@ -145,7 +145,7 @@ trigger_push::Respawn(void)
SetMovementDirection();
ClearAngles();
if (spawnflags & TP_STARTOFF) {
if (HasSpawnFlags(TP_STARTOFF)) {
SetSolid(SOLID_NOT);
}
}

View file

@ -77,7 +77,7 @@ trigger_relay::Trigger(entity act, int state)
{
if (m_iEnabled == FALSE)
return;
if (spawnflags & TRLY_ONCE)
if (HasSpawnFlags(TRLY_ONCE))
m_iEnabled = FALSE;
UseTargets(act, m_iTriggerState, m_flDelay);

View file

@ -45,9 +45,9 @@ trigger_teleport::touch(void)
{
if (GetMaster() == FALSE)
return;
if (spawnflags & TRIGTELE_NOCLIENTS && other.flags & FL_CLIENT)
if (HasSpawnFlags(TRIGTELE_NOCLIENTS) && other.flags & FL_CLIENT)
return;
if (!(spawnflags & TRIGTELE_MONSTERS) && other.flags & FL_MONSTER)
if (!HasSpawnFlags(TRIGTELE_MONSTERS) && other.flags & FL_MONSTER)
return;
if (other.movetype != MOVETYPE_NONE) {

View file

@ -68,6 +68,7 @@ class NSEntity:NSTrigger
virtual void(void) EvaluateEntity;
virtual float(entity, float) SendEntity;
nonvirtual entity(void) GetParent;
nonvirtual void(string) SetParent;
nonvirtual void(string) SetParentAttachment;
nonvirtual void(void) ClearParent;
@ -97,4 +98,21 @@ class NSEntity:NSTrigger
virtual void(string, string) SpawnKey;
nonvirtual void(void) Destroy;
virtual void(void) UpdateBounds;
/* useful methods, based on GMod's API */
nonvirtual float(void) EntIndex;
nonvirtual void(void) DropToFloor;
nonvirtual vector(void) GetForward;
nonvirtual vector(void) GetRight;
nonvirtual vector(void) GetUp;
nonvirtual vector(void) WorldSpaceCenter;
nonvirtual float(void) WaterLevel;
nonvirtual bool(entity) Visible;
nonvirtual bool(vector) VisibleVec;
nonvirtual entity(void) GetOwner;
nonvirtual bool(float) HasSpawnFlags;
nonvirtual bool(void) IsOnGround;
nonvirtual entity(void) GetGroundEntity;
virtual void(entity) Blocked;
nonvirtual void(void) _BlockedHandler;
};

View file

@ -14,6 +14,170 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
float
NSEntity::EntIndex(void)
{
return num_for_edict(this);
}
void
droptofloorwrapper(entity foo)
{
entity old_self = self;
self = foo;
droptofloor();
self = old_self;
}
void
NSEntity::DropToFloor(void)
{
droptofloorwrapper(this);
}
vector
NSEntity::GetForward(void)
{
makevectors(angles);
return v_forward;
}
vector
NSEntity::GetRight(void)
{
makevectors(angles);
return v_right;
}
vector
NSEntity::GetUp(void)
{
makevectors(angles);
return v_up;
}
/*
============
NSEntity::WorldSpaceCenter
Returns the center of an entity's bounding boxes.
Useful on brush entities that have no real 'origin' defined.
============
*/
vector
NSEntity::WorldSpaceCenter(void)
{
return absmin + (0.5 * (absmax - absmin));
}
/*
============
NSEntity::VisibleVec
Returns whether or not the entity is able to see a given position
============
*/
float
NSEntity::WaterLevel(void)
{
return waterlevel;
}
/*
============
NSEntity::VisibleVec
Returns whether or not the entity is able to see a given position
============
*/
bool
NSEntity::VisibleVec(vector org)
{
vector flDelta;
float flFoV;
makevectors(angles);
flDelta = normalize (org - origin);
flFoV = flDelta * v_forward;
if (flFoV > 0.3) {
traceline(origin, org, TRUE, this);
if (trace_fraction == 1.0) {
return (TRUE);
}
}
return (FALSE);
}
/*
============
NSEntity::Visible
Returns whether or not the entity is able to see a given entity
============
*/
bool
NSEntity::Visible(entity ent)
{
vector flDelta;
float flFoV;
makevectors(angles);
flDelta = normalize (ent.origin - origin);
flFoV = flDelta * v_forward;
if (flFoV > 0.3) {
traceline(origin, ent.origin, MOVE_NORMAL, this);
if (trace_fraction == 1.0) {
return (true);
}
}
return (false);
}
entity
NSEntity::GetOwner(void)
{
return owner;
}
bool
NSEntity::HasSpawnFlags(float sf)
{
return (spawnflags & sf) ? true : false;
}
bool
NSEntity::IsOnGround(void)
{
return (flags & FL_ONGROUND) ? true : false;
}
bool
NSEntity::IsSolid(void)
{
return (solid != SOLID_NOT) ? true : false;
}
entity
NSEntity::GetGroundEntity(void)
{
return groundentity;
}
void
NSEntity::Blocked(entity eBlocker)
{
/* To be handled by sub-classes */
}
void
NSEntity::_BlockedHandler(void)
{
Blocked(other);
}
#ifdef CLIENT
/*
============
@ -279,6 +443,11 @@ NSEntity::ParentUpdate(void)
}
}
}
entity
NSEntity::GetParent(void)
{
return find(world, ::targetname, m_parent);
}
void
NSEntity::SetParent(string name)
{
@ -701,6 +870,7 @@ NSEntity::NSEntity(void)
m_oldOrigin = origin;
m_oldSolid = solid;
m_oldModel = Util_FixModel(model);
blocked = _BlockedHandler;
/* Input/Output system */
m_strOnTrigger = CreateOutput(m_strOnTrigger);

View file

@ -194,7 +194,7 @@ NSMonster::SeeThink(void)
continue;
/* some monsters will ignore players */
if ((w.flags & FL_CLIENT) && (spawnflags & MSF_IGNOREPLAYER))
if ((w.flags & FL_CLIENT) && HasSpawnFlags(MSF_IGNOREPLAYER))
continue;
/* first, is the potential enemy in our field of view? */
@ -967,7 +967,7 @@ void
NSMonster::NSMonster(void)
{
#ifdef SERVER
if (!(spawnflags & MSF_MULTIPLAYER))
if (!HasSpawnFlags(MSF_MULTIPLAYER))
if (g_grMode.MonstersSpawn() == FALSE) {
remove(this);
return;

View file

@ -52,6 +52,10 @@ class NSSurfacePropEntity:NSRenderableEntity
virtual void(void) Pain;
virtual void(void) Death;
/* Generic Damage */
virtual void(float) SetTakedamage;
virtual void(float) SetHealth;
/* Surface/PropKit */
int m_iMaterial;
int m_iPropData;

View file

@ -15,6 +15,18 @@
*/
#ifdef SERVER
void
NSSurfacePropEntity::SetTakedamage(float type)
{
takedamage = type;
}
void
NSSurfacePropEntity::SetHealth(float new_health)
{
health = new_health;
}
float
NSSurfacePropEntity::GetSpawnHealth(void)
{

View file

@ -203,7 +203,7 @@ NSTalkMonster::TalkPlayerIdle(void)
{
if (m_iSequenceState != SEQUENCESTATE_NONE)
return;
if (spawnflags & MSF_PREDISASTER)
if (HasSpawnFlags(MSF_PREDISASTER))
return;
if (m_flNextSentence > time)
return;
@ -228,7 +228,7 @@ NSTalkMonster::TalkPlayerAsk(void)
{
if (m_iSequenceState != SEQUENCESTATE_NONE)
return;
if (spawnflags & MSF_PREDISASTER)
if (HasSpawnFlags(MSF_PREDISASTER))
return;
if (m_flNextSentence > time)
return;

View file

@ -316,7 +316,7 @@ env_projectedtexture::Respawn(void)
SetOrigin(GetSpawnOrigin());
SetAngles(GetSpawnAngles());
m_iState = (spawnflags & 1) ? 1 : 0;
m_iState = HasSpawnFlags(1) ? 1 : 0;
}
#endif

View file

@ -239,7 +239,7 @@ info_particle_system::Respawn(void)
SetOrigin(GetSpawnOrigin());
SetAngles(GetSpawnAngles());
if (spawnflags & PSFL_STARTACTIVE) {
if (HasSpawnFlags(PSFL_STARTACTIVE)) {
Trigger(this, TRIG_ON);
} else {
Trigger(this, TRIG_OFF);

View file

@ -183,7 +183,7 @@ prop_rope::predraw(void)
}
/* only drawing one segment. */
if (spawnflags & 1) {
if (HasSpawnFlags(1)) {
return (PREDRAW_NEXT);
}

View file

@ -206,7 +206,7 @@ trigger_camera::NextPath(void)
velocity = [0,0,0];
/* warp next frame */
if (eNode.spawnflags & PC_TELEPORT) {
if (eNode.HasSpawnFlags(PC_TELEPORT)) {
print(sprintf("^1trigger_camera::^3NextPath^7: Node %s wants %s to teleport\n", eNode.targetname, targetname));
think = NextPath;
nextthink = ltime;
@ -214,7 +214,7 @@ trigger_camera::NextPath(void)
}
/* stop until triggered again */
if (eNode.spawnflags & PC_WAIT) {
if (eNode.HasSpawnFlags(PC_WAIT)) {
return;
}

View file

@ -3763,3 +3763,11 @@ accessor filestream : float
#undef FTEDEP
#undef DEP
#pragma noref 0
typedef enum
{
true = 1,
false = 0,
TRUE = 1,
FALSE = 0
} bool;