From 9110da2cec1dce695f6a4f00b391a105017a68dd Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 3 Oct 2023 11:00:28 -0700 Subject: [PATCH] trigger_once/multiple/teleport/camera, prop_rope: Save/Restore fixes --- src/gs-entbase/server/trigger_multiple.qc | 12 ++ src/gs-entbase/server/trigger_once.qc | 12 ++ src/gs-entbase/server/trigger_teleport.qc | 36 ++++++ src/gs-entbase/shared/prop_rope.qc | 53 +++++++-- src/gs-entbase/shared/trigger_camera.qc | 132 +++++++++++++++------- 5 files changed, 199 insertions(+), 46 deletions(-) diff --git a/src/gs-entbase/server/trigger_multiple.qc b/src/gs-entbase/server/trigger_multiple.qc index 6ffc2a32..98d36a49 100644 --- a/src/gs-entbase/server/trigger_multiple.qc +++ b/src/gs-entbase/server/trigger_multiple.qc @@ -89,6 +89,9 @@ trigger_multiple::Save(float handle) { super::Save(handle); SaveFloat(handle, "m_flWait", m_flWait); + SaveBool(handle, "m_bStartDisabled", m_bStartDisabled); + SaveBool(handle, "m_bIsModern", m_bIsModern); + SaveBool(handle, "m_bEnabled", m_bEnabled); SaveString(handle, "m_strOnStartTouch", m_strOnStartTouch); SaveString(handle, "m_strOnEndTouchAll", m_strOnEndTouchAll); SaveString(handle, "m_strOnTrigger", m_strOnTrigger); @@ -101,6 +104,15 @@ trigger_multiple::Restore(string strKey, string strValue) case "m_flWait": m_flWait = ReadFloat(strValue); break; + case "m_bStartDisabled": + m_bStartDisabled = ReadBool(strValue); + break; + case "m_bIsModern": + m_bIsModern = ReadBool(strValue); + break; + case "m_bEnabled": + m_bEnabled = ReadBool(strValue); + break; case "m_strOnStartTouch": m_strOnStartTouch = ReadString(strValue); break; diff --git a/src/gs-entbase/server/trigger_once.qc b/src/gs-entbase/server/trigger_once.qc index 80377f2a..ba0e4e3e 100644 --- a/src/gs-entbase/server/trigger_once.qc +++ b/src/gs-entbase/server/trigger_once.qc @@ -95,20 +95,32 @@ void trigger_once::Save(float handle) { super::Save(handle); + SaveBool(handle, "m_bStartDisabled", m_bStartDisabled); + SaveBool(handle, "m_bEnabled", m_bEnabled); SaveString(handle, "m_strOnStartTouch", m_strOnStartTouch); SaveString(handle, "m_strOnTrigger", m_strOnTrigger); + SaveBool(handle, "m_bIsModern", m_bIsModern); } void trigger_once::Restore(string strKey, string strValue) { switch (strKey) { + case "m_bStartDisabled": + m_bStartDisabled = ReadBool(strValue); + break; + case "m_bEnabled": + m_bEnabled = ReadBool(strValue); + break; case "m_strOnStartTouch": m_strOnStartTouch = ReadString(strValue); break; case "m_strOnTrigger": m_strOnTrigger = ReadString(strValue); break; + case "m_bIsModern": + m_bIsModern = ReadBool(strValue); + break; default: super::Restore(strKey, strValue); } diff --git a/src/gs-entbase/server/trigger_teleport.qc b/src/gs-entbase/server/trigger_teleport.qc index 90e38eb6..bd89456a 100644 --- a/src/gs-entbase/server/trigger_teleport.qc +++ b/src/gs-entbase/server/trigger_teleport.qc @@ -47,6 +47,8 @@ public: virtual void Spawned(void); virtual void Respawn(void); virtual void SpawnKey(string, string); + virtual void Save(float); + virtual void Restore(string,string); nonvirtual bool CanPass(NSEntity); @@ -90,6 +92,40 @@ trigger_teleport::SpawnKey(string strKey, string strValue) } } +void +trigger_teleport::Save(float handle) +{ + super::Save(handle); + SaveBool(handle, "m_bEnabled", m_bEnabled); + SaveString(handle, "m_sndTeleport", m_sndTeleport); + SaveString(handle, "m_sndTeleportEnter", m_sndTeleportEnter); + SaveString(handle, "m_sndTeleportExit", m_sndTeleportExit); + SaveBool(handle, "m_bIsModern", m_bIsModern); +} + +void +trigger_teleport::Restore(string strKey, string strValue) +{ + switch (strKey) { + case "m_bEnabled": + m_bEnabled = ReadBool(strValue); + break; + case "m_sndTeleport": + m_sndTeleport = ReadString(strValue); + break; + case "m_sndTeleportEnter": + m_sndTeleportEnter = ReadString(strValue); + break; + case "m_sndTeleportExit": + m_sndTeleportExit = ReadString(strValue); + break; + case "m_bIsModern": + m_bIsModern = ReadBool(strValue); + break; + default: + super::Restore(strKey, strValue); + } +} bool trigger_teleport::CanPass(NSEntity target) diff --git a/src/gs-entbase/shared/prop_rope.qc b/src/gs-entbase/shared/prop_rope.qc index 1a90ceb1..75a0fff1 100644 --- a/src/gs-entbase/shared/prop_rope.qc +++ b/src/gs-entbase/shared/prop_rope.qc @@ -53,12 +53,6 @@ This entity was introduced in The Wastes (2018). */ class prop_rope:NSEntity { - string m_strShader; - PREDICTED_FLOAT(m_flSag) - PREDICTED_FLOAT(m_flSwingFactor) - PREDICTED_INT(m_iSegments) - PREDICTED_VECTOR(m_vecTarget) - public: void prop_rope(void); @@ -67,11 +61,20 @@ public: virtual void ReceiveEntity(float,float); virtual void DrawSegment(vector, vector, vector); #else + virtual void SpawnKey(string,string); virtual void Respawn(void); + virtual void Save(float); + virtual void Restore(string, string); virtual void EvaluateEntity(void); virtual float SendEntity(entity,float); - virtual void SpawnKey(string,string); #endif + +private: + string m_strShader; + PREDICTED_FLOAT(m_flSag) + PREDICTED_FLOAT(m_flSwingFactor) + PREDICTED_INT(m_iSegments) + PREDICTED_VECTOR(m_vecTarget) }; #ifdef CLIENT @@ -293,6 +296,42 @@ prop_rope::SpawnKey(string strKey, string strValue) super::SpawnKey(strKey, strValue); } } + +void +prop_rope::Save(float handle) +{ + super::Save(handle); + + SaveString(handle, "m_strShader", m_strShader); + SaveFloat(handle, "m_flSag", m_flSag); + SaveFloat(handle, "m_flSwingFactor", m_flSwingFactor); + SaveInt(handle, "m_iSegments", m_iSegments); + SaveVector(handle, "m_vecTarget", m_vecTarget); +} + +void +prop_rope::Restore(string strKey, string strValue) +{ + switch (strKey) { + case "m_strShader": + m_strShader = ReadString(strValue); + break; + case "m_flSag": + m_flSag = ReadFloat(strValue); + break; + case "m_flSwingFactor": + m_flSwingFactor = ReadFloat(strValue); + break; + case "m_iSegments": + m_iSegments = ReadInt(strValue); + break; + case "m_vecTarget": + m_vecTarget = ReadVector(strValue); + break; + default: + super::Restore(strKey, strValue); + } +} #endif void diff --git a/src/gs-entbase/shared/trigger_camera.qc b/src/gs-entbase/shared/trigger_camera.qc index db928c3a..09f788a2 100644 --- a/src/gs-entbase/shared/trigger_camera.qc +++ b/src/gs-entbase/shared/trigger_camera.qc @@ -44,22 +44,14 @@ This entity was introduced in Half-Life (1998). */ class trigger_camera:NSPointTrigger { - entity m_eLooker; -#ifdef CLIENT -#else - float m_flWait; - string m_strAimAt; - string m_strMoveTo; - entity m_eLooker_net; - float m_flSpeed; -#endif - public: void trigger_camera(void); #ifdef CLIENT virtual void ReceiveEntity(float,float); #else + virtual void Save(float); + virtual void Restore(string, string); virtual void NextPath(void); virtual void GoToTarget(void); virtual void Trigger(entity, triggermode_t); @@ -68,16 +60,26 @@ public: virtual float SendEntity(entity,float); virtual void EvaluateEntity(void); #endif + +private: + NETWORKED_FLOAT(m_flWait) + entity m_eLooker; +#ifdef SERVER + string m_strAimAt; + string m_strMoveTo; + entity m_eLooker_net; + float m_flSpeed; +#endif }; void trigger_camera::trigger_camera(void) { -#ifndef CLIENT m_flWait = 4.0f; + m_eLooker = __NULL__; +#ifndef CLIENT m_strAimAt = __NULL__; m_strMoveTo = __NULL__; - m_eLooker = __NULL__; #endif } @@ -85,28 +87,26 @@ trigger_camera::trigger_camera(void) void trigger_camera::ReceiveEntity(float flNew, float flFlags) { - float flWait = 0.0f; - - if (flFlags & OCAMFL_CHANGED_ORIGIN) { + //if (flFlags & OCAMFL_CHANGED_ORIGIN) { origin[0] = readcoord(); origin[1] = readcoord(); origin[2] = readcoord(); setorigin(this, origin); - } + //} - if (flFlags & OCAMFL_CHANGED_ANGLES) { + //if (flFlags & OCAMFL_CHANGED_ANGLES) { angles[0] = readfloat(); angles[1] = readfloat(); angles[2] = readfloat(); - } + //} - if (flFlags & OCAMFL_CHANGED_VIEWER) { + //if (flFlags & OCAMFL_CHANGED_VIEWER) { m_eLooker = findfloat(world, ::entnum, readentitynum()); - } + //} - if (flFlags & OCAMFL_CHANGED_WAIT) { - flWait = readfloat(); - } + //if (flFlags & OCAMFL_CHANGED_WAIT) { + m_flWait = readfloat(); + //} int s = (float)getproperty(VF_ACTIVESEAT); pSeat = &g_seats[s]; @@ -118,15 +118,16 @@ trigger_camera::ReceiveEntity(float flNew, float flFlags) pSeat->m_vecCameraOrigin = origin; pSeat->m_vecCameraAngle = angles; - if (flFlags & OCAMFL_CHANGED_WAIT) { - if (flWait == -1) + //if (flFlags & OCAMFL_CHANGED_WAIT) { + if (m_flWait == -1) pSeat->m_flCameraTime = -1; else - pSeat->m_flCameraTime = time + flWait; + pSeat->m_flCameraTime = time + m_flWait; g_view.SetCameraAngle(angles); g_view.SetClientAngle(angles); - } + //error(sprintf("Wait! %f %f\n", time, pSeat->m_flCameraTime)); + //} classname = "trigger_camera"; } @@ -158,7 +159,42 @@ trigger_camera::Respawn(void) SetModel(GetSpawnModel()); SetOrigin(GetSpawnOrigin()); m_eLooker = world; - pvsflags = PVSF_IGNOREPVS; +} + +void +trigger_camera::Save(float handle) +{ + super::Save(handle); + + SaveFloat(handle, "m_flWait", m_flWait); + SaveEntity(handle, "m_eLooker", m_eLooker); + SaveString(handle, "m_strAimAt", m_strAimAt); + SaveString(handle, "m_strMoveTo", m_strMoveTo); + SaveFloat(handle, "m_flSpeed", m_flSpeed); +} + +void +trigger_camera::Restore(string strKey, string strValue) +{ + switch (strKey) { + case "m_flWait": + m_flWait = ReadFloat(strValue); + break; + case "m_eLooker": + m_eLooker = ReadEntity(strValue); + break; + case "m_strAimAt": + m_strAimAt = ReadString(strValue); + break; + case "m_strMoveTo": + m_strMoveTo = ReadString(strValue); + break; + case "m_flSpeed": + m_flSpeed = ReadFloat(strValue); + break; + default: + super::Restore(strKey, strValue); + } } float @@ -167,25 +203,25 @@ trigger_camera::SendEntity(entity ePEnt, float flFlags) WriteByte(MSG_ENTITY, ENT_OLDCAMERA); WriteFloat(MSG_ENTITY, flFlags); - if (flFlags & OCAMFL_CHANGED_ORIGIN) { + //if (flFlags & OCAMFL_CHANGED_ORIGIN) { WriteCoord(MSG_ENTITY, origin[0]); WriteCoord(MSG_ENTITY, origin[1]); WriteCoord(MSG_ENTITY, origin[2]); - } + //} - if (flFlags & OCAMFL_CHANGED_ANGLES) { + //if (flFlags & OCAMFL_CHANGED_ANGLES) { WriteFloat(MSG_ENTITY, angles[0]); WriteFloat(MSG_ENTITY, angles[1]); WriteFloat(MSG_ENTITY, angles[2]); - } +// } - if (flFlags & OCAMFL_CHANGED_VIEWER) { + //if (flFlags & OCAMFL_CHANGED_VIEWER) { WriteEntity(MSG_ENTITY, m_eLooker); - } + //} - if (flFlags & OCAMFL_CHANGED_WAIT) { + //if (flFlags & OCAMFL_CHANGED_WAIT) { WriteFloat(MSG_ENTITY, m_flWait); - } + //} return (1); } @@ -193,7 +229,13 @@ trigger_camera::SendEntity(entity ePEnt, float flFlags) void trigger_camera::EvaluateEntity(void) { - entity t = find(world, ::targetname, m_strAimAt); + entity t; + + if (!m_eLooker) + return; + + t = find(world, ::targetname, m_strAimAt); + if (t) { angles = vectoangles(t.origin - origin); } @@ -207,10 +249,14 @@ trigger_camera::EvaluateEntity(void) if (ATTR_CHANGED(m_eLooker)) { SetSendFlags(OCAMFL_CHANGED_VIEWER); } + if (ATTR_CHANGED(m_flWait)) { + SetSendFlags(OCAMFL_CHANGED_WAIT); + } SAVE_STATE(origin) SAVE_STATE(angles) SAVE_STATE(m_eLooker) + SAVE_STATE(m_flWait) } void @@ -245,6 +291,12 @@ void trigger_camera::NextPath(void) { path_corner eNode; + + if (target == "") { + return; + } + + print(sprintf("Looking for target %S\n", target)); eNode = (path_corner)find(world, ::targetname, target); if (!eNode) { @@ -288,7 +340,7 @@ trigger_camera::Trigger(entity act, triggermode_t state) act = find(world, ::classname, "player"); } - NSLog("trigger_camera for %S is now %S\n", act.netname, targetname); + NSLog("trigger_camera for %s %S is now %S\n", act.classname, act.netname, targetname); /* kill the other cams the player may be attached to */ for (trigger_camera cam = __NULL__; (cam = (trigger_camera)find(cam, ::classname, "trigger_camera"));) { @@ -299,6 +351,7 @@ trigger_camera::Trigger(entity act, triggermode_t state) } m_eLooker = act; + m_eLooker.view2 = this; NSLog("Triggering it on %s\n", act.netname); SetOrigin(GetSpawnOrigin()); ClearVelocity(); @@ -306,6 +359,7 @@ trigger_camera::Trigger(entity act, triggermode_t state) SetTriggerTarget(m_strMoveTo); NextPath(); GoToTarget(); - SetSendFlags(-1); + SetSendFlags(0xFFFFFF); + pvsflags = PVSF_IGNOREPVS; } #endif