Added support for the triggers/think states across Save/Restore functionality
This commit is contained in:
parent
4c2b37c34d
commit
f5a8ec8ef3
6 changed files with 228 additions and 38 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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":
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue