trigger_once/multiple/teleport/camera, prop_rope: Save/Restore fixes

This commit is contained in:
Marco Cawthorne 2023-10-03 11:00:28 -07:00
parent 367289df84
commit 9110da2cec
Signed by: eukara
GPG key ID: CE2032F0A2882A22
5 changed files with 199 additions and 46 deletions

View file

@ -89,6 +89,9 @@ trigger_multiple::Save(float handle)
{ {
super::Save(handle); super::Save(handle);
SaveFloat(handle, "m_flWait", m_flWait); 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_strOnStartTouch", m_strOnStartTouch);
SaveString(handle, "m_strOnEndTouchAll", m_strOnEndTouchAll); SaveString(handle, "m_strOnEndTouchAll", m_strOnEndTouchAll);
SaveString(handle, "m_strOnTrigger", m_strOnTrigger); SaveString(handle, "m_strOnTrigger", m_strOnTrigger);
@ -101,6 +104,15 @@ trigger_multiple::Restore(string strKey, string strValue)
case "m_flWait": case "m_flWait":
m_flWait = ReadFloat(strValue); m_flWait = ReadFloat(strValue);
break; 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": case "m_strOnStartTouch":
m_strOnStartTouch = ReadString(strValue); m_strOnStartTouch = ReadString(strValue);
break; break;

View file

@ -95,20 +95,32 @@ void
trigger_once::Save(float handle) trigger_once::Save(float handle)
{ {
super::Save(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_strOnStartTouch", m_strOnStartTouch);
SaveString(handle, "m_strOnTrigger", m_strOnTrigger); SaveString(handle, "m_strOnTrigger", m_strOnTrigger);
SaveBool(handle, "m_bIsModern", m_bIsModern);
} }
void void
trigger_once::Restore(string strKey, string strValue) trigger_once::Restore(string strKey, string strValue)
{ {
switch (strKey) { switch (strKey) {
case "m_bStartDisabled":
m_bStartDisabled = ReadBool(strValue);
break;
case "m_bEnabled":
m_bEnabled = ReadBool(strValue);
break;
case "m_strOnStartTouch": case "m_strOnStartTouch":
m_strOnStartTouch = ReadString(strValue); m_strOnStartTouch = ReadString(strValue);
break; break;
case "m_strOnTrigger": case "m_strOnTrigger":
m_strOnTrigger = ReadString(strValue); m_strOnTrigger = ReadString(strValue);
break; break;
case "m_bIsModern":
m_bIsModern = ReadBool(strValue);
break;
default: default:
super::Restore(strKey, strValue); super::Restore(strKey, strValue);
} }

View file

@ -47,6 +47,8 @@ public:
virtual void Spawned(void); virtual void Spawned(void);
virtual void Respawn(void); virtual void Respawn(void);
virtual void SpawnKey(string, string); virtual void SpawnKey(string, string);
virtual void Save(float);
virtual void Restore(string,string);
nonvirtual bool CanPass(NSEntity); 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 bool
trigger_teleport::CanPass(NSEntity target) trigger_teleport::CanPass(NSEntity target)

View file

@ -53,12 +53,6 @@ This entity was introduced in The Wastes (2018).
*/ */
class prop_rope:NSEntity class prop_rope:NSEntity
{ {
string m_strShader;
PREDICTED_FLOAT(m_flSag)
PREDICTED_FLOAT(m_flSwingFactor)
PREDICTED_INT(m_iSegments)
PREDICTED_VECTOR(m_vecTarget)
public: public:
void prop_rope(void); void prop_rope(void);
@ -67,11 +61,20 @@ public:
virtual void ReceiveEntity(float,float); virtual void ReceiveEntity(float,float);
virtual void DrawSegment(vector, vector, vector); virtual void DrawSegment(vector, vector, vector);
#else #else
virtual void SpawnKey(string,string);
virtual void Respawn(void); virtual void Respawn(void);
virtual void Save(float);
virtual void Restore(string, string);
virtual void EvaluateEntity(void); virtual void EvaluateEntity(void);
virtual float SendEntity(entity,float); virtual float SendEntity(entity,float);
virtual void SpawnKey(string,string);
#endif #endif
private:
string m_strShader;
PREDICTED_FLOAT(m_flSag)
PREDICTED_FLOAT(m_flSwingFactor)
PREDICTED_INT(m_iSegments)
PREDICTED_VECTOR(m_vecTarget)
}; };
#ifdef CLIENT #ifdef CLIENT
@ -293,6 +296,42 @@ prop_rope::SpawnKey(string strKey, string strValue)
super::SpawnKey(strKey, 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 #endif
void void

View file

@ -44,22 +44,14 @@ This entity was introduced in Half-Life (1998).
*/ */
class trigger_camera:NSPointTrigger 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: public:
void trigger_camera(void); void trigger_camera(void);
#ifdef CLIENT #ifdef CLIENT
virtual void ReceiveEntity(float,float); virtual void ReceiveEntity(float,float);
#else #else
virtual void Save(float);
virtual void Restore(string, string);
virtual void NextPath(void); virtual void NextPath(void);
virtual void GoToTarget(void); virtual void GoToTarget(void);
virtual void Trigger(entity, triggermode_t); virtual void Trigger(entity, triggermode_t);
@ -68,16 +60,26 @@ public:
virtual float SendEntity(entity,float); virtual float SendEntity(entity,float);
virtual void EvaluateEntity(void); virtual void EvaluateEntity(void);
#endif #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 void
trigger_camera::trigger_camera(void) trigger_camera::trigger_camera(void)
{ {
#ifndef CLIENT
m_flWait = 4.0f; m_flWait = 4.0f;
m_eLooker = __NULL__;
#ifndef CLIENT
m_strAimAt = __NULL__; m_strAimAt = __NULL__;
m_strMoveTo = __NULL__; m_strMoveTo = __NULL__;
m_eLooker = __NULL__;
#endif #endif
} }
@ -85,28 +87,26 @@ trigger_camera::trigger_camera(void)
void void
trigger_camera::ReceiveEntity(float flNew, float flFlags) 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[0] = readcoord();
origin[1] = readcoord(); origin[1] = readcoord();
origin[2] = readcoord(); origin[2] = readcoord();
setorigin(this, origin); setorigin(this, origin);
} //}
if (flFlags & OCAMFL_CHANGED_ANGLES) { //if (flFlags & OCAMFL_CHANGED_ANGLES) {
angles[0] = readfloat(); angles[0] = readfloat();
angles[1] = readfloat(); angles[1] = readfloat();
angles[2] = readfloat(); angles[2] = readfloat();
} //}
if (flFlags & OCAMFL_CHANGED_VIEWER) { //if (flFlags & OCAMFL_CHANGED_VIEWER) {
m_eLooker = findfloat(world, ::entnum, readentitynum()); m_eLooker = findfloat(world, ::entnum, readentitynum());
} //}
if (flFlags & OCAMFL_CHANGED_WAIT) { //if (flFlags & OCAMFL_CHANGED_WAIT) {
flWait = readfloat(); m_flWait = readfloat();
} //}
int s = (float)getproperty(VF_ACTIVESEAT); int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &g_seats[s]; pSeat = &g_seats[s];
@ -118,15 +118,16 @@ trigger_camera::ReceiveEntity(float flNew, float flFlags)
pSeat->m_vecCameraOrigin = origin; pSeat->m_vecCameraOrigin = origin;
pSeat->m_vecCameraAngle = angles; pSeat->m_vecCameraAngle = angles;
if (flFlags & OCAMFL_CHANGED_WAIT) { //if (flFlags & OCAMFL_CHANGED_WAIT) {
if (flWait == -1) if (m_flWait == -1)
pSeat->m_flCameraTime = -1; pSeat->m_flCameraTime = -1;
else else
pSeat->m_flCameraTime = time + flWait; pSeat->m_flCameraTime = time + m_flWait;
g_view.SetCameraAngle(angles); g_view.SetCameraAngle(angles);
g_view.SetClientAngle(angles); g_view.SetClientAngle(angles);
} //error(sprintf("Wait! %f %f\n", time, pSeat->m_flCameraTime));
//}
classname = "trigger_camera"; classname = "trigger_camera";
} }
@ -158,7 +159,42 @@ trigger_camera::Respawn(void)
SetModel(GetSpawnModel()); SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin()); SetOrigin(GetSpawnOrigin());
m_eLooker = world; 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 float
@ -167,25 +203,25 @@ trigger_camera::SendEntity(entity ePEnt, float flFlags)
WriteByte(MSG_ENTITY, ENT_OLDCAMERA); WriteByte(MSG_ENTITY, ENT_OLDCAMERA);
WriteFloat(MSG_ENTITY, flFlags); WriteFloat(MSG_ENTITY, flFlags);
if (flFlags & OCAMFL_CHANGED_ORIGIN) { //if (flFlags & OCAMFL_CHANGED_ORIGIN) {
WriteCoord(MSG_ENTITY, origin[0]); WriteCoord(MSG_ENTITY, origin[0]);
WriteCoord(MSG_ENTITY, origin[1]); WriteCoord(MSG_ENTITY, origin[1]);
WriteCoord(MSG_ENTITY, origin[2]); WriteCoord(MSG_ENTITY, origin[2]);
} //}
if (flFlags & OCAMFL_CHANGED_ANGLES) { //if (flFlags & OCAMFL_CHANGED_ANGLES) {
WriteFloat(MSG_ENTITY, angles[0]); WriteFloat(MSG_ENTITY, angles[0]);
WriteFloat(MSG_ENTITY, angles[1]); WriteFloat(MSG_ENTITY, angles[1]);
WriteFloat(MSG_ENTITY, angles[2]); WriteFloat(MSG_ENTITY, angles[2]);
} // }
if (flFlags & OCAMFL_CHANGED_VIEWER) { //if (flFlags & OCAMFL_CHANGED_VIEWER) {
WriteEntity(MSG_ENTITY, m_eLooker); WriteEntity(MSG_ENTITY, m_eLooker);
} //}
if (flFlags & OCAMFL_CHANGED_WAIT) { //if (flFlags & OCAMFL_CHANGED_WAIT) {
WriteFloat(MSG_ENTITY, m_flWait); WriteFloat(MSG_ENTITY, m_flWait);
} //}
return (1); return (1);
} }
@ -193,7 +229,13 @@ trigger_camera::SendEntity(entity ePEnt, float flFlags)
void void
trigger_camera::EvaluateEntity(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) { if (t) {
angles = vectoangles(t.origin - origin); angles = vectoangles(t.origin - origin);
} }
@ -207,10 +249,14 @@ trigger_camera::EvaluateEntity(void)
if (ATTR_CHANGED(m_eLooker)) { if (ATTR_CHANGED(m_eLooker)) {
SetSendFlags(OCAMFL_CHANGED_VIEWER); SetSendFlags(OCAMFL_CHANGED_VIEWER);
} }
if (ATTR_CHANGED(m_flWait)) {
SetSendFlags(OCAMFL_CHANGED_WAIT);
}
SAVE_STATE(origin) SAVE_STATE(origin)
SAVE_STATE(angles) SAVE_STATE(angles)
SAVE_STATE(m_eLooker) SAVE_STATE(m_eLooker)
SAVE_STATE(m_flWait)
} }
void void
@ -245,6 +291,12 @@ void
trigger_camera::NextPath(void) trigger_camera::NextPath(void)
{ {
path_corner eNode; path_corner eNode;
if (target == "") {
return;
}
print(sprintf("Looking for target %S\n", target));
eNode = (path_corner)find(world, ::targetname, target); eNode = (path_corner)find(world, ::targetname, target);
if (!eNode) { if (!eNode) {
@ -288,7 +340,7 @@ trigger_camera::Trigger(entity act, triggermode_t state)
act = find(world, ::classname, "player"); 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 */ /* kill the other cams the player may be attached to */
for (trigger_camera cam = __NULL__; (cam = (trigger_camera)find(cam, ::classname, "trigger_camera"));) { 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 = act;
m_eLooker.view2 = this;
NSLog("Triggering it on %s\n", act.netname); NSLog("Triggering it on %s\n", act.netname);
SetOrigin(GetSpawnOrigin()); SetOrigin(GetSpawnOrigin());
ClearVelocity(); ClearVelocity();
@ -306,6 +359,7 @@ trigger_camera::Trigger(entity act, triggermode_t state)
SetTriggerTarget(m_strMoveTo); SetTriggerTarget(m_strMoveTo);
NextPath(); NextPath();
GoToTarget(); GoToTarget();
SetSendFlags(-1); SetSendFlags(0xFFFFFF);
pvsflags = PVSF_IGNOREPVS;
} }
#endif #endif