func_areaportal: Make work on Source Engine BSP by shoving the "portalnumber" key into .style

This commit is contained in:
Marco Cawthorne 2023-09-18 19:37:36 -07:00
parent c3f5e7a1c2
commit e44f56a56d
Signed by: eukara
GPG key ID: CE2032F0A2882A22

View file

@ -34,39 +34,80 @@ This entity was introduced in Quake II (1997).
class class
func_areaportal:NSEntity func_areaportal:NSEntity
{ {
int m_iPortalState; bool m_bPortalState;
int m_iStartOpen; bool m_bStartOpen;
int m_iPortalNumber; /* Source Engine only */
bool m_bSourcePortal;
public: public:
void func_areaportal(void); void func_areaportal(void);
/* overrides */ /* overrides */
virtual void Respawn(void); virtual void Spawned(void);
virtual void SpawnKey(string,string); virtual void SpawnKey(string,string);
virtual void Trigger(entity, triggermode_t); virtual void Trigger(entity, triggermode_t);
virtual void Input(entity,string,string); virtual void Input(entity,string,string);
virtual void Save(float);
virtual void Restore(string, string);
virtual void PortalOpen(void); nonvirtual void PortalOpen(void);
virtual void PortalClose(void); nonvirtual void PortalClose(void);
}; };
void void
func_areaportal::func_areaportal(void) func_areaportal::func_areaportal(void)
{ {
m_iPortalState = 0i; m_bPortalState = true;
m_iStartOpen = 0i; m_bStartOpen = false;
m_iPortalNumber = 0i;
m_bSourcePortal = false;
} }
void void
func_areaportal::Respawn(void) func_areaportal::Save(float handle)
{ {
super::Save(handle);
SaveBool(handle, "m_bPortalState", m_bPortalState);
SaveBool(handle, "m_bStartOpen", m_bStartOpen);
SaveInt(handle, "m_iPortalNumber", m_iPortalNumber);
SaveBool(handle, "m_bSourcePortal", m_bSourcePortal);
}
void
func_areaportal::Restore(string strKey, string strValue)
{
switch (strKey) {
case "m_bPortalState":
m_bPortalState = ReadBool(strValue);
break;
case "m_bStartOpen":
m_bStartOpen = ReadBool(strValue);
break;
case "m_iPortalNumber":
m_iPortalNumber = ReadInt(strValue);
break;
case "m_bSourcePortal":
m_bSourcePortal = ReadBool(strValue);
break;
default:
super::Restore(strKey, strValue);
}
}
void
func_areaportal::Spawned(void)
{
super::Spawned();
SetModel(GetSpawnModel()); SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin()); SetOrigin(GetSpawnOrigin());
Hide(); Hide();
SetSolid(SOLID_NOT); SetSolid(SOLID_NOT);
if (!m_iStartOpen) if (m_bSourcePortal)
style = (float)m_iPortalNumber;
if (m_bStartOpen == false)
PortalClose(); PortalClose();
else else
PortalOpen(); PortalOpen();
@ -75,11 +116,13 @@ func_areaportal::Respawn(void)
void void
func_areaportal::SpawnKey(string strKey, string strValue) func_areaportal::SpawnKey(string strKey, string strValue)
{ {
switch (strKey) { switch (strKey) {
case "StartOpen": case "StartOpen":
m_iStartOpen = stoi(strValue); m_bStartOpen = ReadBool(strValue);
break; break;
case "portalnumber":
m_iPortalNumber = ReadInt(strValue);
m_bSourcePortal = true;
default: default:
super::SpawnKey(strKey, strValue); super::SpawnKey(strKey, strValue);
} }
@ -93,7 +136,7 @@ func_areaportal::Trigger(entity act, triggermode_t state)
} else if (state == TRIG_ON) { } else if (state == TRIG_ON) {
PortalOpen(); PortalOpen();
} else { } else {
if (m_iPortalState == 1) if (m_bPortalState == true)
PortalClose(); PortalClose();
else else
PortalOpen(); PortalOpen();
@ -104,9 +147,11 @@ void
func_areaportal::Input(entity eAct, string strInput, string strData) func_areaportal::Input(entity eAct, string strInput, string strData)
{ {
switch (strInput) { switch (strInput) {
case "TurnOn":
case "Open": case "Open":
Trigger(eAct, TRIG_ON); Trigger(eAct, TRIG_ON);
break; break;
case "TurnOff":
case "Close": case "Close":
Trigger(eAct, TRIG_OFF); Trigger(eAct, TRIG_OFF);
break; break;
@ -121,10 +166,7 @@ func_areaportal::Input(entity eAct, string strInput, string strData)
void void
func_areaportal::PortalOpen(void) func_areaportal::PortalOpen(void)
{ {
if (m_iPortalState == 1) m_bPortalState = true;
return;
m_iPortalState = 1;
setorigin(this, origin); setorigin(this, origin);
openportal(this, AREAPORTAL_OPEN); openportal(this, AREAPORTAL_OPEN);
} }
@ -132,10 +174,7 @@ func_areaportal::PortalOpen(void)
void void
func_areaportal::PortalClose(void) func_areaportal::PortalClose(void)
{ {
if (m_iPortalState == 0) m_bPortalState = false;
return;
m_iPortalState = 0;
setorigin(this, origin); setorigin(this, origin);
openportal(this, AREAPORTAL_CLOSED); openportal(this, AREAPORTAL_CLOSED);
} }