From e45987d65c3e3f27551440b65b8f243c04a562d6 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sat, 2 Apr 2022 00:10:25 -0700 Subject: [PATCH] NSEntity: Added new methods based on GMod's API. More to follow. --- src/gs-entbase/client/env_glow.qc | 4 +- src/gs-entbase/client/func_lod.qc | 11 +- src/gs-entbase/server.src | 2 +- src/gs-entbase/server/ambient_generic.qc | 12 +- src/gs-entbase/server/button_target.qc | 4 +- src/gs-entbase/server/env_explosion.qc | 4 +- src/gs-entbase/server/env_fade.qc | 2 +- src/gs-entbase/server/env_global.qc | 2 +- src/gs-entbase/server/env_laser.qc | 2 +- src/gs-entbase/server/env_message.qc | 4 +- src/gs-entbase/server/env_render.qc | 8 +- src/gs-entbase/server/env_spark.qc | 4 +- src/gs-entbase/server/env_sprite.qc | 6 +- src/gs-entbase/server/func_breakable.qc | 12 +- src/gs-entbase/server/func_button.qc | 17 +- src/gs-entbase/server/func_conveyor.qc | 4 +- src/gs-entbase/server/func_door.qc | 28 +-- src/gs-entbase/server/func_door_rotating.qc | 38 ++-- src/gs-entbase/server/func_guntarget.qc | 6 +- src/gs-entbase/server/func_mortar_field.qc | 12 +- src/gs-entbase/server/func_pendulum.qc | 10 +- src/gs-entbase/server/func_physbox.qc | 2 +- src/gs-entbase/server/func_plat.qc | 2 +- src/gs-entbase/server/func_pushable.qc | 8 +- src/gs-entbase/server/func_rot_button.qc | 12 +- src/gs-entbase/server/func_rotating.qc | 29 +-- src/gs-entbase/server/func_tracktrain.qc | 21 ++- src/gs-entbase/server/func_train.qc | 21 +-- src/gs-entbase/server/func_vehicle.qc | 4 +- src/gs-entbase/server/func_wall_toggle.qc | 2 +- src/gs-entbase/server/game_counter.qc | 4 +- src/gs-entbase/server/game_counter_set.qc | 2 +- src/gs-entbase/server/game_text.qc | 2 +- src/gs-entbase/server/light.qc | 4 +- src/gs-entbase/server/logic_auto.qc | 2 +- src/gs-entbase/server/momentary_rot_button.qc | 14 +- src/gs-entbase/server/monster_generic.qc | 2 +- src/gs-entbase/server/monstermaker.qc | 6 +- src/gs-entbase/server/multi_manager.qc | 2 +- src/gs-entbase/server/path_corner.qc | 2 +- src/gs-entbase/server/prop_dynamic.qc | 2 +- src/gs-entbase/server/prop_physics.qc | 4 +- src/gs-entbase/server/scripted_sequence.qc | 4 +- src/gs-entbase/server/speaker.qc | 2 +- src/gs-entbase/server/trigger_auto.qc | 2 +- src/gs-entbase/server/trigger_changelevel.qc | 2 +- src/gs-entbase/server/trigger_counter.qc | 4 +- src/gs-entbase/server/trigger_hurt.qc | 10 +- src/gs-entbase/server/trigger_multiple.qc | 6 +- src/gs-entbase/server/trigger_once.qc | 6 +- src/gs-entbase/server/trigger_push.qc | 4 +- src/gs-entbase/server/trigger_relay.qc | 2 +- src/gs-entbase/server/trigger_teleport.qc | 4 +- src/gs-entbase/shared/NSEntity.h | 18 ++ src/gs-entbase/shared/NSEntity.qc | 170 ++++++++++++++++++ src/gs-entbase/shared/NSMonster.qc | 4 +- src/gs-entbase/shared/NSSurfacePropEntity.h | 4 + src/gs-entbase/shared/NSSurfacePropEntity.qc | 12 ++ src/gs-entbase/shared/NSTalkMonster.qc | 4 +- src/gs-entbase/shared/env_projectedtexture.qc | 2 +- src/gs-entbase/shared/info_particle_system.qc | 2 +- src/gs-entbase/shared/prop_rope.qc | 2 +- src/gs-entbase/shared/trigger_camera.qc | 4 +- src/shared/fteextensions.qc | 8 + 64 files changed, 407 insertions(+), 208 deletions(-) diff --git a/src/gs-entbase/client/env_glow.qc b/src/gs-entbase/client/env_glow.qc index 06babef0..d01b00fa 100644 --- a/src/gs-entbase/client/env_glow.qc +++ b/src/gs-entbase/client/env_glow.qc @@ -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); diff --git a/src/gs-entbase/client/func_lod.qc b/src/gs-entbase/client/func_lod.qc index 0ff81c75..dad981f0 100644 --- a/src/gs-entbase/client/func_lod.qc +++ b/src/gs-entbase/client/func_lod.qc @@ -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 diff --git a/src/gs-entbase/server.src b/src/gs-entbase/server.src index 6b783e8d..419ceadd 100644 --- a/src/gs-entbase/server.src +++ b/src/gs-entbase/server.src @@ -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 diff --git a/src/gs-entbase/server/ambient_generic.qc b/src/gs-entbase/server/ambient_generic.qc index e1a55c8c..44d7622d 100644 --- a/src/gs-entbase/server/ambient_generic.qc +++ b/src/gs-entbase/server/ambient_generic.qc @@ -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; diff --git a/src/gs-entbase/server/button_target.qc b/src/gs-entbase/server/button_target.qc index 616b616d..105045f3 100644 --- a/src/gs-entbase/server/button_target.qc +++ b/src/gs-entbase/server/button_target.qc @@ -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 diff --git a/src/gs-entbase/server/env_explosion.qc b/src/gs-entbase/server/env_explosion.qc index d473f15a..52f0d4ef 100644 --- a/src/gs-entbase/server/env_explosion.qc +++ b/src/gs-entbase/server/env_explosion.qc @@ -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); } } diff --git a/src/gs-entbase/server/env_fade.qc b/src/gs-entbase/server/env_fade.qc index f6bc4a20..eec0c1b9 100644 --- a/src/gs-entbase/server/env_fade.qc +++ b/src/gs-entbase/server/env_fade.qc @@ -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); diff --git a/src/gs-entbase/server/env_global.qc b/src/gs-entbase/server/env_global.qc index a3db0091..fc075bd1 100644 --- a/src/gs-entbase/server/env_global.qc +++ b/src/gs-entbase/server/env_global.qc @@ -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); } diff --git a/src/gs-entbase/server/env_laser.qc b/src/gs-entbase/server/env_laser.qc index 1552e056..75ed6adc 100644 --- a/src/gs-entbase/server/env_laser.qc +++ b/src/gs-entbase/server/env_laser.qc @@ -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; } diff --git a/src/gs-entbase/server/env_message.qc b/src/gs-entbase/server/env_message.qc index dc509b0d..ce4cccc8 100644 --- a/src/gs-entbase/server/env_message.qc +++ b/src/gs-entbase/server/env_message.qc @@ -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__; } } diff --git a/src/gs-entbase/server/env_render.qc b/src/gs-entbase/server/env_render.qc index a15abd55..4c060768 100644 --- a/src/gs-entbase/server/env_render.qc +++ b/src/gs-entbase/server/env_render.qc @@ -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); } diff --git a/src/gs-entbase/server/env_spark.qc b/src/gs-entbase/server/env_spark.qc index 8ae954d3..0d3566fc 100644 --- a/src/gs-entbase/server/env_spark.qc +++ b/src/gs-entbase/server/env_spark.qc @@ -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); } } diff --git a/src/gs-entbase/server/env_sprite.qc b/src/gs-entbase/server/env_sprite.qc index b03201fd..b3fa3212 100644 --- a/src/gs-entbase/server/env_sprite.qc +++ b/src/gs-entbase/server/env_sprite.qc @@ -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) diff --git a/src/gs-entbase/server/func_breakable.qc b/src/gs-entbase/server/func_breakable.qc index 4eaa1aa6..9e59e954 100644 --- a/src/gs-entbase/server/func_breakable.qc +++ b/src/gs-entbase/server/func_breakable.qc @@ -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; diff --git a/src/gs-entbase/server/func_button.qc b/src/gs-entbase/server/func_button.qc index 2975f897..e8e5d5f7 100644 --- a/src/gs-entbase/server/func_button.qc +++ b/src/gs-entbase/server/func_button.qc @@ -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)); diff --git a/src/gs-entbase/server/func_conveyor.qc b/src/gs-entbase/server/func_conveyor.qc index 8a24e297..0ee964c9 100644 --- a/src/gs-entbase/server/func_conveyor.qc +++ b/src/gs-entbase/server/func_conveyor.qc @@ -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); } diff --git a/src/gs-entbase/server/func_door.qc b/src/gs-entbase/server/func_door.qc index 195cc266..fc26d30d 100644 --- a/src/gs-entbase/server/func_door.qc +++ b/src/gs-entbase/server/func_door.qc @@ -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; diff --git a/src/gs-entbase/server/func_door_rotating.qc b/src/gs-entbase/server/func_door_rotating.qc index c55427b1..f4b31b06 100644 --- a/src/gs-entbase/server/func_door_rotating.qc +++ b/src/gs-entbase/server/func_door_rotating.qc @@ -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); } diff --git a/src/gs-entbase/server/func_guntarget.qc b/src/gs-entbase/server/func_guntarget.qc index 4b678c1f..a7f5f45a 100644 --- a/src/gs-entbase/server/func_guntarget.qc +++ b/src/gs-entbase/server/func_guntarget.qc @@ -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; } diff --git a/src/gs-entbase/server/func_mortar_field.qc b/src/gs-entbase/server/func_mortar_field.qc index a6ea5aca..a8b621cf 100644 --- a/src/gs-entbase/server/func_mortar_field.qc +++ b/src/gs-entbase/server/func_mortar_field.qc @@ -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]); diff --git a/src/gs-entbase/server/func_pendulum.qc b/src/gs-entbase/server/func_pendulum.qc index 5e93a9d6..558737db 100644 --- a/src/gs-entbase/server/func_pendulum.qc +++ b/src/gs-entbase/server/func_pendulum.qc @@ -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); diff --git a/src/gs-entbase/server/func_physbox.qc b/src/gs-entbase/server/func_physbox.qc index 61fb23d8..a83e16ca 100644 --- a/src/gs-entbase/server/func_physbox.qc +++ b/src/gs-entbase/server/func_physbox.qc @@ -37,7 +37,7 @@ func_physbox::Respawn(void) { NSPhysicsEntity::Respawn(); - if (spawnflags & FNCPHYBX_ASLEEP) + if (HasSpawnFlags(FNCPHYBX_ASLEEP)) PhysicsDisable(); else PhysicsEnable(); diff --git a/src/gs-entbase/server/func_plat.qc b/src/gs-entbase/server/func_plat.qc index b0a6c10a..e937075d 100644 --- a/src/gs-entbase/server/func_plat.qc +++ b/src/gs-entbase/server/func_plat.qc @@ -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) { diff --git a/src/gs-entbase/server/func_pushable.qc b/src/gs-entbase/server/func_pushable.qc index f4f682f6..98aa6e3d 100644 --- a/src/gs-entbase/server/func_pushable.qc +++ b/src/gs-entbase/server/func_pushable.qc @@ -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()); } } diff --git a/src/gs-entbase/server/func_rot_button.qc b/src/gs-entbase/server/func_rot_button.qc index a1b502a4..848677b9 100644 --- a/src/gs-entbase/server/func_rot_button.qc +++ b/src/gs-entbase/server/func_rot_button.qc @@ -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; } diff --git a/src/gs-entbase/server/func_rotating.qc b/src/gs-entbase/server/func_rotating.qc index d85e8464..bbc4b560 100644 --- a/src/gs-entbase/server/func_rotating.qc +++ b/src/gs-entbase/server/func_rotating.qc @@ -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; } } diff --git a/src/gs-entbase/server/func_tracktrain.qc b/src/gs-entbase/server/func_tracktrain.qc index 8147335f..e58c3dc6 100644 --- a/src/gs-entbase/server/func_tracktrain.qc +++ b/src/gs-entbase/server/func_tracktrain.qc @@ -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; diff --git a/src/gs-entbase/server/func_train.qc b/src/gs-entbase/server/func_train.qc index bf0ea35e..e881501b 100644 --- a/src/gs-entbase/server/func_train.qc +++ b/src/gs-entbase/server/func_train.qc @@ -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()); diff --git a/src/gs-entbase/server/func_vehicle.qc b/src/gs-entbase/server/func_vehicle.qc index 620a3f43..3771b578 100644 --- a/src/gs-entbase/server/func_vehicle.qc +++ b/src/gs-entbase/server/func_vehicle.qc @@ -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); diff --git a/src/gs-entbase/server/func_wall_toggle.qc b/src/gs-entbase/server/func_wall_toggle.qc index 193da8e3..83745fb7 100644 --- a/src/gs-entbase/server/func_wall_toggle.qc +++ b/src/gs-entbase/server/func_wall_toggle.qc @@ -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); } } diff --git a/src/gs-entbase/server/game_counter.qc b/src/gs-entbase/server/game_counter.qc index 7ed45d89..87c5c48a 100644 --- a/src/gs-entbase/server/game_counter.qc +++ b/src/gs-entbase/server/game_counter.qc @@ -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; diff --git a/src/gs-entbase/server/game_counter_set.qc b/src/gs-entbase/server/game_counter_set.qc index 2c4dfeba..0e6ebe63 100644 --- a/src/gs-entbase/server/game_counter_set.qc +++ b/src/gs-entbase/server/game_counter_set.qc @@ -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(); } diff --git a/src/gs-entbase/server/game_text.qc b/src/gs-entbase/server/game_text.qc index 890d1bf9..4efb4e7d 100644 --- a/src/gs-entbase/server/game_text.qc +++ b/src/gs-entbase/server/game_text.qc @@ -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 { diff --git a/src/gs-entbase/server/light.qc b/src/gs-entbase/server/light.qc index 8e450e86..7476de40 100644 --- a/src/gs-entbase/server/light.qc +++ b/src/gs-entbase/server/light.qc @@ -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(); diff --git a/src/gs-entbase/server/logic_auto.qc b/src/gs-entbase/server/logic_auto.qc index 5986f2ed..75ea5d03 100644 --- a/src/gs-entbase/server/logic_auto.qc +++ b/src/gs-entbase/server/logic_auto.qc @@ -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); } diff --git a/src/gs-entbase/server/momentary_rot_button.qc b/src/gs-entbase/server/momentary_rot_button.qc index be9fc9c3..ce6ae23a 100644 --- a/src/gs-entbase/server/momentary_rot_button.qc +++ b/src/gs-entbase/server/momentary_rot_button.qc @@ -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; } diff --git a/src/gs-entbase/server/monster_generic.qc b/src/gs-entbase/server/monster_generic.qc index bd781f2f..3562991e 100644 --- a/src/gs-entbase/server/monster_generic.qc +++ b/src/gs-entbase/server/monster_generic.qc @@ -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; diff --git a/src/gs-entbase/server/monstermaker.qc b/src/gs-entbase/server/monstermaker.qc index da3f93d6..e014c10d 100644 --- a/src/gs-entbase/server/monstermaker.qc +++ b/src/gs-entbase/server/monstermaker.qc @@ -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(); diff --git a/src/gs-entbase/server/multi_manager.qc b/src/gs-entbase/server/multi_manager.qc index af499a46..c2fe1e95 100644 --- a/src/gs-entbase/server/multi_manager.qc +++ b/src/gs-entbase/server/multi_manager.qc @@ -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; diff --git a/src/gs-entbase/server/path_corner.qc b/src/gs-entbase/server/path_corner.qc index e21eb540..fec55007 100644 --- a/src/gs-entbase/server/path_corner.qc +++ b/src/gs-entbase/server/path_corner.qc @@ -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; } diff --git a/src/gs-entbase/server/prop_dynamic.qc b/src/gs-entbase/server/prop_dynamic.qc index 0b0d1f90..78db8c5f 100644 --- a/src/gs-entbase/server/prop_dynamic.qc +++ b/src/gs-entbase/server/prop_dynamic.qc @@ -44,7 +44,7 @@ prop_dynamic::Respawn(void) super::Respawn(); SetModel(GetSpawnModel()); - if (spawnflags & PRPDYN_NONSOLID) + if (HasSpawnFlags(PRPDYN_NONSOLID)) SetSolid(SOLID_NOT); } diff --git a/src/gs-entbase/server/prop_physics.qc b/src/gs-entbase/server/prop_physics.qc index a2ea4038..0c781018 100644 --- a/src/gs-entbase/server/prop_physics.qc +++ b/src/gs-entbase/server/prop_physics.qc @@ -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(); -} +} \ No newline at end of file diff --git a/src/gs-entbase/server/scripted_sequence.qc b/src/gs-entbase/server/scripted_sequence.qc index 1db0db98..d4a309e7 100644 --- a/src/gs-entbase/server/scripted_sequence.qc +++ b/src/gs-entbase/server/scripted_sequence.qc @@ -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; diff --git a/src/gs-entbase/server/speaker.qc b/src/gs-entbase/server/speaker.qc index eda9c826..a9d7bc99 100644 --- a/src/gs-entbase/server/speaker.qc +++ b/src/gs-entbase/server/speaker.qc @@ -137,7 +137,7 @@ speaker::Respawn(void) think = Annouce; - if (!(spawnflags & SPEAKFL_SILENT)) + if (!HasSpawnFlags(SPEAKFL_SILENT)) nextthink = time + 10.0f; } diff --git a/src/gs-entbase/server/trigger_auto.qc b/src/gs-entbase/server/trigger_auto.qc index 677e3032..b95bfa30 100644 --- a/src/gs-entbase/server/trigger_auto.qc +++ b/src/gs-entbase/server/trigger_auto.qc @@ -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); } diff --git a/src/gs-entbase/server/trigger_changelevel.qc b/src/gs-entbase/server/trigger_changelevel.qc index 31f54798..fe43af5b 100644 --- a/src/gs-entbase/server/trigger_changelevel.qc +++ b/src/gs-entbase/server/trigger_changelevel.qc @@ -226,7 +226,7 @@ trigger_changelevel::Respawn(void) { InitBrushTrigger(); - if (!(spawnflags & LC_USEONLY)) { + if (!HasSpawnFlags(LC_USEONLY)) { touch = TouchTrigger; } } diff --git a/src/gs-entbase/server/trigger_counter.qc b/src/gs-entbase/server/trigger_counter.qc index 8c47a662..0e6c4bed 100644 --- a/src/gs-entbase/server/trigger_counter.qc +++ b/src/gs-entbase/server/trigger_counter.qc @@ -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; diff --git a/src/gs-entbase/server/trigger_hurt.qc b/src/gs-entbase/server/trigger_hurt.qc index f9f2ce68..88cdaa67 100644 --- a/src/gs-entbase/server/trigger_hurt.qc +++ b/src/gs-entbase/server/trigger_hurt.qc @@ -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); diff --git a/src/gs-entbase/server/trigger_multiple.qc b/src/gs-entbase/server/trigger_multiple.qc index e95a4110..4a8af2fe 100644 --- a/src/gs-entbase/server/trigger_multiple.qc +++ b/src/gs-entbase/server/trigger_multiple.qc @@ -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) { diff --git a/src/gs-entbase/server/trigger_once.qc b/src/gs-entbase/server/trigger_once.qc index eb88a797..47605983 100644 --- a/src/gs-entbase/server/trigger_once.qc +++ b/src/gs-entbase/server/trigger_once.qc @@ -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 */ diff --git a/src/gs-entbase/server/trigger_push.qc b/src/gs-entbase/server/trigger_push.qc index a12f13e1..43e1293b 100644 --- a/src/gs-entbase/server/trigger_push.qc +++ b/src/gs-entbase/server/trigger_push.qc @@ -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); } } diff --git a/src/gs-entbase/server/trigger_relay.qc b/src/gs-entbase/server/trigger_relay.qc index 3ff6b004..f69b45a2 100644 --- a/src/gs-entbase/server/trigger_relay.qc +++ b/src/gs-entbase/server/trigger_relay.qc @@ -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); diff --git a/src/gs-entbase/server/trigger_teleport.qc b/src/gs-entbase/server/trigger_teleport.qc index 0c5dee41..2c6f42bc 100644 --- a/src/gs-entbase/server/trigger_teleport.qc +++ b/src/gs-entbase/server/trigger_teleport.qc @@ -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) { diff --git a/src/gs-entbase/shared/NSEntity.h b/src/gs-entbase/shared/NSEntity.h index 27bbdb5a..0d3f880c 100644 --- a/src/gs-entbase/shared/NSEntity.h +++ b/src/gs-entbase/shared/NSEntity.h @@ -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; }; diff --git a/src/gs-entbase/shared/NSEntity.qc b/src/gs-entbase/shared/NSEntity.qc index 0e70fa68..84abdc9a 100644 --- a/src/gs-entbase/shared/NSEntity.qc +++ b/src/gs-entbase/shared/NSEntity.qc @@ -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); diff --git a/src/gs-entbase/shared/NSMonster.qc b/src/gs-entbase/shared/NSMonster.qc index a9a8ca44..686c61ed 100644 --- a/src/gs-entbase/shared/NSMonster.qc +++ b/src/gs-entbase/shared/NSMonster.qc @@ -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; diff --git a/src/gs-entbase/shared/NSSurfacePropEntity.h b/src/gs-entbase/shared/NSSurfacePropEntity.h index c47d7659..f639cf2d 100644 --- a/src/gs-entbase/shared/NSSurfacePropEntity.h +++ b/src/gs-entbase/shared/NSSurfacePropEntity.h @@ -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; diff --git a/src/gs-entbase/shared/NSSurfacePropEntity.qc b/src/gs-entbase/shared/NSSurfacePropEntity.qc index fb758985..380ea59b 100644 --- a/src/gs-entbase/shared/NSSurfacePropEntity.qc +++ b/src/gs-entbase/shared/NSSurfacePropEntity.qc @@ -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) { diff --git a/src/gs-entbase/shared/NSTalkMonster.qc b/src/gs-entbase/shared/NSTalkMonster.qc index be8a7ec8..d61ee360 100644 --- a/src/gs-entbase/shared/NSTalkMonster.qc +++ b/src/gs-entbase/shared/NSTalkMonster.qc @@ -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; diff --git a/src/gs-entbase/shared/env_projectedtexture.qc b/src/gs-entbase/shared/env_projectedtexture.qc index 1cca4569..7f1546b8 100644 --- a/src/gs-entbase/shared/env_projectedtexture.qc +++ b/src/gs-entbase/shared/env_projectedtexture.qc @@ -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 diff --git a/src/gs-entbase/shared/info_particle_system.qc b/src/gs-entbase/shared/info_particle_system.qc index 01ae8bdb..990220bb 100644 --- a/src/gs-entbase/shared/info_particle_system.qc +++ b/src/gs-entbase/shared/info_particle_system.qc @@ -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); diff --git a/src/gs-entbase/shared/prop_rope.qc b/src/gs-entbase/shared/prop_rope.qc index 1d54faf6..977e269a 100644 --- a/src/gs-entbase/shared/prop_rope.qc +++ b/src/gs-entbase/shared/prop_rope.qc @@ -183,7 +183,7 @@ prop_rope::predraw(void) } /* only drawing one segment. */ - if (spawnflags & 1) { + if (HasSpawnFlags(1)) { return (PREDRAW_NEXT); } diff --git a/src/gs-entbase/shared/trigger_camera.qc b/src/gs-entbase/shared/trigger_camera.qc index 11bf5ce9..c7ae4032 100644 --- a/src/gs-entbase/shared/trigger_camera.qc +++ b/src/gs-entbase/shared/trigger_camera.qc @@ -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; } diff --git a/src/shared/fteextensions.qc b/src/shared/fteextensions.qc index e76816c7..041299f3 100644 --- a/src/shared/fteextensions.qc +++ b/src/shared/fteextensions.qc @@ -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;