From d3dcb3a12bf9f5b309bbc62c5600a620be8e6e74 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Mon, 3 Jan 2022 00:23:20 -0800 Subject: [PATCH] GS-EntBase: Cleanup and fixes regarding which func_ entities support the 'angles' key for visuals. trigger_hurt damagetype tweaks (needs more tests) as well as monstermaker fixes and SF_ROT_TOGGLE func_door_rotatings no longer auto-return... --- src/gs-entbase/server/func_breakable.qc | 4 +- src/gs-entbase/server/func_button.qc | 3 +- src/gs-entbase/server/func_conveyor.qc | 6 +-- src/gs-entbase/server/func_door.qc | 5 +- src/gs-entbase/server/func_door_rotating.qc | 10 ++-- src/gs-entbase/server/func_mortar_field.qc | 1 + src/gs-entbase/server/func_plat.qc | 1 + src/gs-entbase/server/func_rotating.qc | 3 ++ .../server/func_tracktraincontrols.qc | 11 +++-- src/gs-entbase/server/func_vehiclecontrols.qc | 2 +- src/gs-entbase/server/func_wall_toggle.qc | 2 + src/gs-entbase/server/momentary_door.qc | 4 +- src/gs-entbase/server/momentary_rot_button.qc | 5 +- src/gs-entbase/server/monstermaker.qc | 8 ++-- src/gs-entbase/server/trigger_hurt.qc | 47 +++++++++---------- src/gs-entbase/server/trigger_push.qc | 5 +- src/gs-entbase/shared/NSEntity.h | 4 ++ src/gs-entbase/shared/NSEntity.qc | 11 +++++ src/gs-entbase/shared/func_illusionary.qc | 3 +- src/gs-entbase/shared/func_ladder.qc | 4 +- src/gs-entbase/shared/func_wall.qc | 3 +- src/gs-entbase/shared/worldspawn.qc | 3 +- 22 files changed, 89 insertions(+), 56 deletions(-) diff --git a/src/gs-entbase/server/func_breakable.qc b/src/gs-entbase/server/func_breakable.qc index c7c7dcd8..d6fc181b 100644 --- a/src/gs-entbase/server/func_breakable.qc +++ b/src/gs-entbase/server/func_breakable.qc @@ -305,6 +305,7 @@ func_breakable::Respawn(void) SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); + ClearAngles(); touch = PlayerTouch; think = __NULL__; @@ -375,9 +376,6 @@ func_breakable::func_breakable(void) /* proper init */ super::NSSurfacePropEntity(); - /* contrary to what some map designers think, angles are not supported */ - GetSpawnAngles() = angles = [0,0,0]; - /* precache impact sound */ Sound_Precache(GetSurfaceData(SURFDATA_SND_BULLETIMPACT)); } diff --git a/src/gs-entbase/server/func_button.qc b/src/gs-entbase/server/func_button.qc index 82c3ff67..ece4b8e0 100644 --- a/src/gs-entbase/server/func_button.qc +++ b/src/gs-entbase/server/func_button.qc @@ -318,7 +318,9 @@ func_button::MoveToDestination(vector vecDest, void(void) func) void func_button::Respawn(void) { + RestoreAngles(); SetMovementDirection(); + ClearAngles(); SetSolid(SOLID_BSP); SetMovetype(MOVETYPE_PUSH); @@ -356,7 +358,6 @@ func_button::Respawn(void) } m_iState = STATE_LOWERED; - SetAngles([0,0,0]); } void diff --git a/src/gs-entbase/server/func_conveyor.qc b/src/gs-entbase/server/func_conveyor.qc index 6b2f42b2..c7a2d7b0 100644 --- a/src/gs-entbase/server/func_conveyor.qc +++ b/src/gs-entbase/server/func_conveyor.qc @@ -118,10 +118,9 @@ func_conveyor::Respawn(void) if (!m_flSpeed) m_flSpeed = 100; - m_vecMoveDir = [0,0,0]; - angles = GetSpawnAngles(); - + RestoreAngles(); SetMovementDirection(); + ClearAngles(); SetModel(GetSpawnModel()); SetMovetype(MOVETYPE_NONE); SetSolid(SOLID_BSP); @@ -133,7 +132,6 @@ func_conveyor::Respawn(void) SetSkin(0); } - SetAngles([0,0,0]); } void diff --git a/src/gs-entbase/server/func_door.qc b/src/gs-entbase/server/func_door.qc index 0f641a56..273103fb 100644 --- a/src/gs-entbase/server/func_door.qc +++ b/src/gs-entbase/server/func_door.qc @@ -372,8 +372,9 @@ func_door::Respawn(void) if (m_flWait == 0) m_flWait = 0.01f; - /* angles to vecMoveDir */ + RestoreAngles(); SetMovementDirection(); + ClearAngles(); if (spawnflags & SF_MOV_PASSABLE) SetSolid(SOLID_NOT); @@ -428,8 +429,6 @@ func_door::Respawn(void) if (targetname) { m_iLocked = TRUE; } - - SetAngles([0,0,0]); } void diff --git a/src/gs-entbase/server/func_door_rotating.qc b/src/gs-entbase/server/func_door_rotating.qc index db97c9fa..56b5a67a 100644 --- a/src/gs-entbase/server/func_door_rotating.qc +++ b/src/gs-entbase/server/func_door_rotating.qc @@ -165,9 +165,9 @@ func_door_rotating::Arrived(void) if (!(spawnflags & SF_ROT_USE)) { touch = Touch; } - if (m_flWait < 0) { + + if ((spawnflags & SF_ROT_TOGGLE) || m_flWait < 0) return; - } think = Back; nextthink = (ltime + m_flWait); @@ -385,7 +385,9 @@ func_door_rotating::RotToDest(vector vDestAngle, void(void) func) void func_door_rotating::Respawn(void) { - func_door_rotating::SetMovementDirection(); + RestoreAngles(); + SetMovementDirection(); + ClearAngles(); #ifdef GS_PHYSICS takedamage = DAMAGE_YES; @@ -433,6 +435,8 @@ func_door_rotating::Respawn(void) PortalClose(); } + m_iState = STATE_LOWERED; + if (spawnflags & SF_ROT_PASSABLE) { SetSolid(SOLID_NOT); } diff --git a/src/gs-entbase/server/func_mortar_field.qc b/src/gs-entbase/server/func_mortar_field.qc index 540fbc42..b5b5207c 100644 --- a/src/gs-entbase/server/func_mortar_field.qc +++ b/src/gs-entbase/server/func_mortar_field.qc @@ -173,6 +173,7 @@ void func_mortar_field::Respawn(void) { InitBrushTrigger(); + ClearAngles(); } void diff --git a/src/gs-entbase/server/func_plat.qc b/src/gs-entbase/server/func_plat.qc index 3776ab42..f9b9f1be 100644 --- a/src/gs-entbase/server/func_plat.qc +++ b/src/gs-entbase/server/func_plat.qc @@ -138,6 +138,7 @@ func_plat::Respawn(void) SetSolid(SOLID_BSP); SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); + ClearAngles(); m_iState = PLATSTATE_RAISED; think = __NULL__; diff --git a/src/gs-entbase/server/func_rotating.qc b/src/gs-entbase/server/func_rotating.qc index c7771ada..c9d8410e 100644 --- a/src/gs-entbase/server/func_rotating.qc +++ b/src/gs-entbase/server/func_rotating.qc @@ -182,7 +182,10 @@ func_rotating::Respawn(void) SetMovetype(MOVETYPE_PUSH); SetSolid((spawnflags & FR_NOTSOLID) ? SOLID_NOT : SOLID_BSP); SetOrigin(GetSpawnOrigin()); + + RestoreAngles(); SetMovementDirection(); + ClearAngles(); if (spawnflags & FR_STARTON) { avelocity = m_vecMoveDir * m_flSpeed; diff --git a/src/gs-entbase/server/func_tracktraincontrols.qc b/src/gs-entbase/server/func_tracktraincontrols.qc index 376832dc..9409a9fa 100644 --- a/src/gs-entbase/server/func_tracktraincontrols.qc +++ b/src/gs-entbase/server/func_tracktraincontrols.qc @@ -14,7 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/*QUAKED func_tracktraincontrols (0 .5 .8) ? +/*QUAKED func_traincontrols (0 .5 .8) ? Brush that marks the usable region of a func_tracktrain, in order to gain control. @@ -26,21 +26,22 @@ to gain control. This entity was introduced in Half-Life (1998). */ -class func_tracktraincontrols:NSBrushTrigger +class func_traincontrols:NSBrushTrigger { - void(void) func_tracktraincontrols; + void(void) func_traincontrols; virtual void(void) Respawn; }; void -func_tracktraincontrols::Respawn(void) +func_traincontrols::Respawn(void) { InitBrushTrigger(); + ClearAngles(); } void -func_tracktraincontrols::func_tracktraincontrols(void) +func_traincontrols::func_traincontrols(void) { super::NSBrushTrigger(); } diff --git a/src/gs-entbase/server/func_vehiclecontrols.qc b/src/gs-entbase/server/func_vehiclecontrols.qc index 0d5b5da2..cf48a499 100644 --- a/src/gs-entbase/server/func_vehiclecontrols.qc +++ b/src/gs-entbase/server/func_vehiclecontrols.qc @@ -33,6 +33,6 @@ This entity was introduced in Counter-Strike (2000). void func_vehiclecontrols(void) { - spawnfunc_func_tracktraincontrols(); + spawnfunc_func_traincontrols(); self.classname = "func_vehiclecontrols"; } diff --git a/src/gs-entbase/server/func_wall_toggle.qc b/src/gs-entbase/server/func_wall_toggle.qc index e08aa79e..91fc5ce4 100644 --- a/src/gs-entbase/server/func_wall_toggle.qc +++ b/src/gs-entbase/server/func_wall_toggle.qc @@ -99,6 +99,8 @@ func_wall_toggle::Respawn(void) SetSolid(SOLID_BSP); SetModel(GetSpawnModel()); SetOrigin(origin); + ClearAngles(); + m_iVisible = 1; m_oldmodelindex = modelindex; diff --git a/src/gs-entbase/server/momentary_door.qc b/src/gs-entbase/server/momentary_door.qc index f749807e..fbdc089c 100644 --- a/src/gs-entbase/server/momentary_door.qc +++ b/src/gs-entbase/server/momentary_door.qc @@ -98,8 +98,10 @@ momentary_door::Respawn(void) SetSolid(SOLID_BSP); SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); + + RestoreAngles(); SetMovementDirection(); - SetAngles([0,0,0]); + ClearAngles(); m_vecPos1 = GetSpawnOrigin(); m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flDistance)); diff --git a/src/gs-entbase/server/momentary_rot_button.qc b/src/gs-entbase/server/momentary_rot_button.qc index f5a3ae13..306ec3de 100644 --- a/src/gs-entbase/server/momentary_rot_button.qc +++ b/src/gs-entbase/server/momentary_rot_button.qc @@ -129,8 +129,11 @@ momentary_rot_button::Respawn(void) SetSolid(SOLID_BSP); SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); + + RestoreAngles(); SetMovementDirection(); - SetAngles([0,0,0]); + ClearAngles(); + PlayerUse = OnPlayerUse; m_vecPos1 = [0,0,0]; diff --git a/src/gs-entbase/server/monstermaker.qc b/src/gs-entbase/server/monstermaker.qc index 3a1281ea..dbcb4925 100644 --- a/src/gs-entbase/server/monstermaker.qc +++ b/src/gs-entbase/server/monstermaker.qc @@ -132,15 +132,17 @@ monstermaker::Spawner(void) vector newang = self.angles; string tname = self.netname; + /* prevent us from being deleted by callfunction() */ + self.spawnflags |= MSF_MULTIPLAYER; + /* become the classname assigned */ NSMonster t = (NSMonster)self; callfunction(self.classname); /* apply the saved values back */ - t.origin = t.GetSpawnOrigin() = neworg; - t.angles = t.GetSpawnAngles() = newang; + t.origin = t.m_oldOrigin = neworg; + t.angles = t.m_oldAngle = newang; t.targetname = tname; - t.spawnflags |= MSF_MULTIPLAYER; /* spawn anew */ t.Respawn(); diff --git a/src/gs-entbase/server/trigger_hurt.qc b/src/gs-entbase/server/trigger_hurt.qc index 3e5998e7..6ccee6d5 100644 --- a/src/gs-entbase/server/trigger_hurt.qc +++ b/src/gs-entbase/server/trigger_hurt.qc @@ -37,30 +37,27 @@ This entity was introduced in Quake (1996). .float hurt_next; -typedef enumflags -{ -HURTTYPE_GENERIC, -HURTTYPE_CRUSH, -HURTTYPE_BULLET, -HURTTYPE_SLASH, -HURTTYPE_BURN, -HURTTYPE_FREEZE, -HURTTYPE_FALL, -HURTTYPE_BLAST, -HURTTYPE_CLUB, -HURTTYPE_SHOCK, -HURTTYPE_SONIC, -HURTTYPE_ENERGYBEAM, -HURTTYPE_DROWN, -HURTTYPE_PARALYSE, -HURTTYPE_NERVEGAS, -HURTTYPE_POISON, -HURTTYPE_RADIATION, -HURTTYPE_DROWNRECOVER, -HURTTYPE_CHEMICAL, -HURTTYPE_SLOWBURN, -HURTTYPE_SLOWFREEZE, -} hurttype_e; +#define HURTTYPE_GENERIC 0 +#define HURTTYPE_CRUSH 1 +#define HURTTYPE_BULLET 2 +#define HURTTYPE_SLASH 4 +#define HURTTYPE_BURN 8 +#define HURTTYPE_FREEZE 16 +#define HURTTYPE_FALL 32 +#define HURTTYPE_BLAST 64 +#define HURTTYPE_CLUB 128 +#define HURTTYPE_SHOCK 256 +#define HURTTYPE_SONIC 512 +#define HURTTYPE_ENERGYBEAM 1024 +#define HURTTYPE_DROWN 16384 +#define HURTTYPE_PARALYSE 32768 +#define HURTTYPE_NERVEGAS 65536 +#define HURTTYPE_POISON 131072 +#define HURTTYPE_RADIATION 262144 +#define HURTTYPE_DROWNRECOVER 524288 +#define HURTTYPE_CHEMICAL 1048576 +#define HURTTYPE_SLOWBURN 2097152 +#define HURTTYPE_SLOWFREEZE 4194304 #define SF_HURT_ONCE 1 // Turn off once it fired the first time #define SF_HURT_OFF 2 // Needs to be triggered in order to work again @@ -249,7 +246,7 @@ trigger_hurt::SpawnKey(string strKey, string strValue) m_iDamage = stoi(strValue); break; case "damagetype": - m_iDamageType = stoi(strValue); + m_iDamageType = (int)stoi(strValue); break; case "wait": m_flNextDmg = stof(strValue); diff --git a/src/gs-entbase/server/trigger_push.qc b/src/gs-entbase/server/trigger_push.qc index 5aeeb829..85bef3fd 100644 --- a/src/gs-entbase/server/trigger_push.qc +++ b/src/gs-entbase/server/trigger_push.qc @@ -86,8 +86,6 @@ trigger_push::SetMovementDirection(void) makevectors(GetSpawnAngles()); m_vecMoveDir = v_forward; } - - angles = [0,0,0]; } void @@ -142,7 +140,10 @@ void trigger_push::Respawn(void) { InitBrushTrigger(); + + RestoreAngles(); SetMovementDirection(); + ClearAngles(); if (spawnflags & TP_STARTOFF) { SetSolid(SOLID_NOT); diff --git a/src/gs-entbase/shared/NSEntity.h b/src/gs-entbase/shared/NSEntity.h index 3b4cae21..093a3626 100644 --- a/src/gs-entbase/shared/NSEntity.h +++ b/src/gs-entbase/shared/NSEntity.h @@ -63,6 +63,10 @@ class NSEntity:NSTrigger nonvirtual void(void) ClearParent; virtual void(void) ParentUpdate; + /* some ents need this */ + nonvirtual void(void) RestoreAngles; + nonvirtual void(void) ClearAngles; + nonvirtual vector(void) GetSpawnOrigin; nonvirtual vector(void) GetSpawnAngles; nonvirtual string(void) GetSpawnModel; diff --git a/src/gs-entbase/shared/NSEntity.qc b/src/gs-entbase/shared/NSEntity.qc index 6b8a802f..3fdc8ad5 100644 --- a/src/gs-entbase/shared/NSEntity.qc +++ b/src/gs-entbase/shared/NSEntity.qc @@ -240,6 +240,17 @@ NSEntity::ClearParent(void) { m_parent = __NULL__; } + +void +NSEntity::RestoreAngles(void) +{ + angles = GetSpawnAngles(); +} +void +NSEntity::ClearAngles(void) +{ + angles = [0,0,0]; +} #endif /* we want to really use those set functions because they'll notify of any diff --git a/src/gs-entbase/shared/func_illusionary.qc b/src/gs-entbase/shared/func_illusionary.qc index c6da62ad..71f57b5c 100644 --- a/src/gs-entbase/shared/func_illusionary.qc +++ b/src/gs-entbase/shared/func_illusionary.qc @@ -77,12 +77,12 @@ func_illusionary::Respawn(void) super::Respawn(); /* func_illusionary specifics */ - SetAngles([0,0,0]); SetMovetype(MOVETYPE_NONE); SetSolid(SOLID_NOT); SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); SetSkin(0); + ClearAngles(); // TODO: Add support for (skin) -1 = Empty, -7 = Volumetric light if (skin < 0) { @@ -126,6 +126,7 @@ func_illusionary::Init(void) SetAngles([0,0,0]); SetMovetype(MOVETYPE_NONE); SetSolid(SOLID_NOT); + angles = [0,0,0]; if (skin == -1 && m_iRenderMode == RM_TEXTURE) SetRenderMode(RM_TRIGGER); diff --git a/src/gs-entbase/shared/func_ladder.qc b/src/gs-entbase/shared/func_ladder.qc index 1c523bfb..3872e971 100644 --- a/src/gs-entbase/shared/func_ladder.qc +++ b/src/gs-entbase/shared/func_ladder.qc @@ -74,13 +74,14 @@ func_ladder::Respawn(void) super::Respawn(); /* func_ladder specifics */ - SetAngles([0,0,0]); SetMovetype(MOVETYPE_NONE); SetSolid(SOLID_BSP); SetSkin(CONTENT_LADDER); SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); SetFrame(0); + ClearAngles(); + #ifdef GS_RENDERFX SetRenderMode(RM_TRIGGER); #endif @@ -122,6 +123,7 @@ func_ladder::Init(void) movetype = MOVETYPE_NONE; solid = SOLID_BSP; skin = CONTENT_LADDER; + angles = [0,0,0]; } #endif diff --git a/src/gs-entbase/shared/func_wall.qc b/src/gs-entbase/shared/func_wall.qc index 72fb9e97..8ee7d8c6 100644 --- a/src/gs-entbase/shared/func_wall.qc +++ b/src/gs-entbase/shared/func_wall.qc @@ -77,12 +77,12 @@ func_wall::Respawn(void) super::Respawn(); /* func_wall specifics */ - SetAngles([0,0,0]); SetMovetype(MOVETYPE_PUSH); SetSolid(SOLID_BSP); SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); SetFrame(0); + ClearAngles(); } #else float @@ -120,6 +120,7 @@ func_wall::Init(void) setorigin(this, origin); movetype = MOVETYPE_PUSH; solid = SOLID_BSP; + angles = [0,0,0]; MakeStatic(); } diff --git a/src/gs-entbase/shared/worldspawn.qc b/src/gs-entbase/shared/worldspawn.qc index d49a959f..b48289ce 100644 --- a/src/gs-entbase/shared/worldspawn.qc +++ b/src/gs-entbase/shared/worldspawn.qc @@ -83,7 +83,8 @@ worldspawn::SpawnKey(string strField, string strKey) { switch (strField) { case "startdark": - Fade_StartDark(); + if (stof(strKey) == 1) + Fade_StartDark(); break; case "chaptertitle": GameMessage_Setup(strKey, 0);