Added support for the triggers/think states across Save/Restore functionality

This commit is contained in:
Marco Cawthorne 2021-10-23 01:00:15 +02:00
parent 4c2b37c34d
commit f5a8ec8ef3
Signed by: eukara
GPG key ID: C196CD8BA993248A
6 changed files with 228 additions and 38 deletions

View file

@ -37,8 +37,50 @@ class multi_manager_sub:NSPointTrigger
entity m_eActivator;
int m_iValue;
float m_flUntilTriggered;
void(void) multi_manager_sub;
/* overrides */
virtual void(float) Save;
virtual void(string,string) Restore;
};
void
multi_manager_sub::Save(float handle)
{
SaveInt(handle, "m_iValue", m_iValue);
SaveFloat(handle, "m_eActivator", num_for_edict(m_eActivator));
SaveFloat(handle, "m_flUntilTriggered", m_flUntilTriggered);
super::Save(handle);
}
void
multi_manager_sub::Restore(string strKey, string strValue)
{
switch (strKey) {
case "m_iValue":
m_iValue = ReadInt(strValue);
break;
case "m_eActivator":
float num = ReadFloat(strValue);
if (num)
m_eActivator = edict_num(num);
break;
case "m_flUntilTriggered":
m_flUntilTriggered = ReadFloat(strValue);
break;
default:
super::Restore(strKey, strValue);
}
}
void
multi_manager_sub::multi_manager_sub(void)
{
super::NSPointTrigger();
}
class multi_manager:NSPointTrigger
{
multi_manager_sub m_eTriggers[16];
@ -46,10 +88,104 @@ class multi_manager:NSPointTrigger
int m_iBusy;
int m_iValue;
/* overrides */
virtual void(entity, int) Trigger;
virtual void(string, string) SpawnKey;
virtual void(float) Save;
virtual void(string,string) Restore;
};
void
multi_manager::Save(float handle)
{
SaveString(handle, "m_strBuffer", m_strBuffer);
SaveString(handle, "m_iBusy", m_iBusy);
SaveString(handle, "m_iValue", m_iValue);
SaveFloat(handle, "m_eTriggers_0", num_for_edict(m_eTriggers[0]));
SaveFloat(handle, "m_eTriggers_1", num_for_edict(m_eTriggers[1]));
SaveFloat(handle, "m_eTriggers_2", num_for_edict(m_eTriggers[2]));
SaveFloat(handle, "m_eTriggers_3", num_for_edict(m_eTriggers[3]));
SaveFloat(handle, "m_eTriggers_4", num_for_edict(m_eTriggers[4]));
SaveFloat(handle, "m_eTriggers_5", num_for_edict(m_eTriggers[5]));
SaveFloat(handle, "m_eTriggers_6", num_for_edict(m_eTriggers[6]));
SaveFloat(handle, "m_eTriggers_7", num_for_edict(m_eTriggers[7]));
SaveFloat(handle, "m_eTriggers_8", num_for_edict(m_eTriggers[8]));
SaveFloat(handle, "m_eTriggers_9", num_for_edict(m_eTriggers[9]));
SaveFloat(handle, "m_eTriggers_10", num_for_edict(m_eTriggers[10]));
SaveFloat(handle, "m_eTriggers_11", num_for_edict(m_eTriggers[11]));
SaveFloat(handle, "m_eTriggers_12", num_for_edict(m_eTriggers[12]));
SaveFloat(handle, "m_eTriggers_13", num_for_edict(m_eTriggers[13]));
SaveFloat(handle, "m_eTriggers_14", num_for_edict(m_eTriggers[14]));
SaveFloat(handle, "m_eTriggers_15", num_for_edict(m_eTriggers[15]));
super::Save(handle);
}
void
multi_manager::Restore(string strKey, string strValue)
{
switch (strKey) {
case "m_strBuffer":
m_strBuffer = strValue;
break;
case "m_iBusy":
m_iBusy = stoi(strValue);
break;
case "m_iValue":
m_iValue = stoi(strValue);
break;
case "m_eTriggers_0":
m_eTriggers[0] = edict_num(stof(strValue));
break;
case "m_eTriggers_1":
m_eTriggers[1] = edict_num(stof(strValue));
break;
case "m_eTriggers_2":
m_eTriggers[2] = edict_num(stof(strValue));
break;
case "m_eTriggers_3":
m_eTriggers[3] = edict_num(stof(strValue));
break;
case "m_eTriggers_4":
m_eTriggers[4] = edict_num(stof(strValue));
break;
case "m_eTriggers_5":
m_eTriggers[5] = edict_num(stof(strValue));
break;
case "m_eTriggers_6":
m_eTriggers[6] = edict_num(stof(strValue));
break;
case "m_eTriggers_7":
m_eTriggers[7] = edict_num(stof(strValue));
break;
case "m_eTriggers_8":
m_eTriggers[8] = edict_num(stof(strValue));
break;
case "m_eTriggers_9":
m_eTriggers[9] = edict_num(stof(strValue));
break;
case "m_eTriggers_10":
m_eTriggers[10] = edict_num(stof(strValue));
break;
case "m_eTriggers_11":
m_eTriggers[11] = edict_num(stof(strValue));
break;
case "m_eTriggers_12":
m_eTriggers[12] = edict_num(stof(strValue));
break;
case "m_eTriggers_13":
m_eTriggers[13] = edict_num(stof(strValue));
break;
case "m_eTriggers_14":
m_eTriggers[14] = edict_num(stof(strValue));
break;
case "m_eTriggers_15":
m_eTriggers[15] = edict_num(stof(strValue));
break;
default:
super::Restore(strKey, strValue);
}
}
void
multi_manager::Trigger(entity act, int state)

View file

@ -345,26 +345,22 @@ NSEntity::Respawn(void)
SetAngles(GetSpawnAngles());
SetOrigin(GetSpawnOrigin());
SetModel(GetSpawnModel());
target = m_oldstrTarget;
target = m_oldstrTarget; /* FIXME: Move into NSTrigger::Respawn */
}
void
NSEntity::Save(float handle)
{
SaveVector(handle, "origin", origin);
SaveVector(handle, "absmin", absmin);
SaveVector(handle, "absmax", absmax);
SaveVector(handle, "mins", mins);
SaveVector(handle, "maxs", mins);
SaveString(handle, "model", model);
SaveVector(handle, "angles", angles);
SaveFloat(handle, "solid", solid);
SaveFloat(handle, "movetype", movetype);
SaveString(handle, "targetname", targetname);
SaveString(handle, "target", target);
SaveFloat(handle, "health", health);
SaveFloat(handle, "pvsflags", pvsflags);
SaveVector(handle, "mins", mins);
SaveVector(handle, "maxs", maxs);
SaveVector(handle, "origin", origin);
SaveVector(handle, "angles", angles);
SaveString(handle, "parentname", m_parent);
SaveFloat(handle, "ignorepvs", pvsflags);
SaveString(handle, "model", model);
super::Save(handle);
}
void
@ -373,6 +369,7 @@ NSEntity::Restore(string strKey, string strValue)
switch (strKey) {
case "origin":
origin = stov(strValue);
setorigin(this, origin);
break;
case "absmin":
absmin = stov(strValue);
@ -382,12 +379,15 @@ NSEntity::Restore(string strKey, string strValue)
break;
case "mins":
mins = stov(strValue);
setsize(this, mins, maxs);
break;
case "maxs":
maxs = stov(strValue);
setsize(this, mins, maxs);
break;
case "model":
model = strValue;
setmodel(this, model);
break;
case "angles":
angles = stov(strValue);
@ -398,20 +398,15 @@ NSEntity::Restore(string strKey, string strValue)
case "movetype":
movetype = stof(strValue);
break;
case "targetname":
targetname = strValue;
break;
case "target":
target = strValue;
break;
case "health":
health = stof(strValue);
break;
case "parentname":
SetParent(strValue);
if (strValue != "")
SetParent(strValue);
break;
case "ignorepvs":
pvsflags = PVSF_IGNOREPVS;
case "pvsflags":
pvsflags = stof(strValue);
break;
default:
super::Restore(strKey, strValue);
@ -477,12 +472,6 @@ NSEntity::SpawnKey(string strKey, string strValue)
case "solid":
solid = stof(strValue);
break;
case "targetname":
targetname = strValue;
break;
case "target":
target = strValue;
break;
#ifdef SERVER
case "health":
health = stof(strValue);

View file

@ -53,6 +53,10 @@ class NSIO
nonvirtual void(float, string, int) SaveInt;
nonvirtual void(float, string, string) SaveString;
nonvirtual void(float, string, vector) SaveVector;
nonvirtual float(string) ReadFloat;
nonvirtual int(string) ReadInt;
nonvirtual string(string) ReadString;
nonvirtual vector(string) ReadVector;
/* Handle incoming entities input messaging */
virtual void(entity, string, string) Input;

View file

@ -154,52 +154,100 @@ NSIO::Respawn(void)
void
NSIO::SaveFloat(float handle, string key, float value)
{
if (value)
fputs(handle, sprintf("%S \"%f\"\n", key, value));
}
void
NSIO::SaveInt(float handle, string key, int value)
{
if (value)
fputs(handle, sprintf("%S \"%i\"\n", key, value));
}
void
NSIO::SaveString(float handle, string key, string value)
{
if (value && value != "")
fputs(handle, sprintf("%S %S\n", key, value));
}
void
NSIO::SaveVector(float handle, string key, vector value)
{
if (value)
fputs(handle, sprintf("%S \"%v\"\n", key, value));
}
float
NSIO::ReadFloat(string strValue)
{
if (strValue && strValue != "")
return stof(strValue);
return __NULL__;
}
int
NSIO::ReadInt(string strValue)
{
if (strValue && strValue != "")
return stoi(strValue);
return __NULL__;
}
string
NSIO::ReadString(string strValue)
{
if (strValue && strValue != "")
return strValue;
return __NULL__;
}
vector
NSIO::ReadVector(string strValue)
{
if (strValue && strValue != "")
return stov(strValue);
return __NULL__;
}
void
NSIO::Save(float handle)
{
SaveFloat(handle, "nextthink", bound(0, (nextthink - time), nextthink));
SaveString(handle, "think", getentityfieldstring(findentityfield("think"), this));
SaveString(handle, "OnTrigger", m_strOnTrigger);
SaveString(handle, "OnUser1", m_strOnUser1);
SaveString(handle, "OnUser2", m_strOnUser2);
SaveString(handle, "OnUser3", m_strOnUser3);
SaveString(handle, "OnUser4", m_strOnUser4);
SaveString(handle, "targetname", targetname);
}
void
NSIO::Restore(string strKey, string strValue)
{
switch (strKey) {
case "targetname":
targetname = ReadString(strValue);
break;
case "nextthink":
float nt = ReadFloat(strValue);
if (nt)
nextthink = time + stof(strValue);
break;
case "think":
think = externvalue(-1, strValue);
break;
case "OnTrigger":
m_strOnTrigger = strValue;
m_strOnTrigger = ReadString(strValue);
break;
case "OnUser1":
m_strOnUser1 = strValue;
m_strOnUser1 = ReadString(strValue);
break;
case "OnUser1":
m_strOnUser1 = strValue;
m_strOnUser1 = ReadString(strValue);
break;
case "OnUser1":
m_strOnUser1 = strValue;
m_strOnUser1 = ReadString(strValue);
break;
case "OnUser1":
m_strOnUser1 = strValue;
m_strOnUser1 = ReadString(strValue);
break;
}
}
@ -224,6 +272,9 @@ NSIO::SpawnKey(string strKey, string strValue)
case "classname":
case "spawnflags":
break;
case "targetname":
targetname = strValue;
break;
#ifdef SERVER
/* Input/Output system */
case "OnTrigger":

View file

@ -31,6 +31,9 @@ NSTrigger::UseTargets(entity act, int state, float fDelay)
remove(self);
}
if (!target || target == "")
return;
if (fDelay > 0.0f) {
dprint(sprintf("^2%s::^3UseTargets^7: Triggering `%s`\n",
this.classname, target));
@ -55,7 +58,7 @@ NSTrigger::UseTargets(entity act, int state, float fDelay)
}
}
if (m_strKillTarget) {
if (m_strKillTarget && m_strKillTarget != "") {
entity eKill = find(world, ::targetname, m_strKillTarget);
if (eKill) {
remove(eKill);
@ -104,6 +107,7 @@ NSTrigger::GetMaster(void)
void
NSTrigger::Save(float handle)
{
SaveString(handle, "target", target);
SaveString(handle, "killtarget", m_strKillTarget);
SaveString(handle, "message", m_strMessage);
SaveString(handle, "master", m_strMaster);
@ -115,20 +119,23 @@ void
NSTrigger::Restore(string strKey, string strValue)
{
switch (strKey) {
case "target":
target = ReadString(strValue);
break;
case "killtarget":
m_strKillTarget = strValue;
m_strKillTarget = ReadString(strValue);
break;
case "message":
m_strMessage = strValue;
m_strMessage = ReadString(strValue);
break;
case "master":
m_strMaster = strValue;
m_strMaster = ReadString(strValue);
break;
case "team_no":
m_iTeam = stoi(strValue);
m_iTeam = ReadInt(strValue);
break;
case "delay":
m_flDelay = stof(strValue);
m_flDelay = ReadFloat(strValue);
break;
default:
super::Restore(strKey, strValue);
@ -139,6 +146,9 @@ void
NSTrigger::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "target":
target = strValue;
break;
case "killtarget":
m_strKillTarget = strValue;
break;

View file

@ -686,6 +686,7 @@ SV_PerformLoad(float fh)
#ifndef REEDICT
n = stof(argv(1));
e = edict_num(n);
print(sprintf("Creating edict num %d\n", n));
#else
entity e = spawn();
#endif
@ -712,7 +713,6 @@ SV_PerformLoad(float fh)
} else if (argv(0) == "{") {
} else if (argv(0) == "}") {
if (loadent) {
loadent.Respawn();
loadent = __NULL__;
}
} else {