CBaseTrigger: Massive change that allows us to finally set states. This affected every entity that can be triggered. Things like the airlock check in c1a0d work now.

This commit is contained in:
Marco Cawthorne 2020-08-07 14:07:38 +02:00
parent 40d0ceedf5
commit d324259e72
61 changed files with 540 additions and 298 deletions

0
doc/faq Executable file → Normal file
View file

5
gearbox.fmf Executable file → Normal file
View file

@ -23,10 +23,7 @@ BASEGAME gearbox
-set gameinfo_cldll 1 -set gameinfo_cldll 1
-set gameinfo_hlversion "1110" -set gameinfo_hlversion "1110"
-set gameinfo_svonly "0" -set gameinfo_svonly "0"
-set gameinfo_pkgname "cg_gearbox"
DOWNLOADSURL http://www.frag-net.com/dl/gearbox_packages
UPDATEURL http://www.frag-net.com/mods/valve.fmf
INSTALL "gearbox_essential;valve_essential;free_essential;addons_essential"
// you don't really want to change these // you don't really want to change these
RTCBROKER master.frag-net.com:27950 RTCBROKER master.frag-net.com:27950

View file

@ -23,12 +23,7 @@ BASEGAME hunger
-set gameinfo_url_info "www.planethalflife.com/manke" -set gameinfo_url_info "www.planethalflife.com/manke"
-set gameinfo_url_dl "http://www.frag-net.com/mods/hunger.fmf" -set gameinfo_url_dl "http://www.frag-net.com/mods/hunger.fmf"
-set gameinfo_menutrack "sound/song/you_are.wav" -set gameinfo_menutrack "sound/song/you_are.wav"
-set gameinfo_pkgname "cg_hunger"
// download/update packaging information
// PACKAGE hunger/pak0.pak 0xc1cbd5c1 "http://www.frag-net.com/files/hunger_pak0.pak"
// do we want this? I don't want to automatically update it
// UPDATEURL http://www.frag-net.com/mods/hunger.fmf
// you don't really want to change these // you don't really want to change these
RTCBROKER master.frag-net.com:27950 RTCBROKER master.frag-net.com:27950

7
rewolf_demo.fmf Executable file → Normal file
View file

@ -22,12 +22,7 @@ BASEGAME rewolf_demo
-set gameinfo_cldll 1 -set gameinfo_cldll 1
-set gameinfo_hlversion "1110" -set gameinfo_hlversion "1110"
-set gameinfo_svonly "0" -set gameinfo_svonly "0"
-set gameinfo_pkgname "cg_rewolf"
// download/update packaging information
UPDATEURL http://www.frag-net.com/mods/rewolf_demo.fmf
PACKAGE rewolf_demo/pak0.pk3 0x105f03e9 "http://www.frag-net.com/dl/105f03e9/file.pk3"
PACKAGE logos/pakrm_logos.pk3 0xd318299 "http://www.frag-net.com/dl/d318299/file.pk3"
PACKAGE platform/pak0.pk3 0xd707e87f "http://www.frag-net.com/dl/707e87f/file.pk3"
// you don't really want to change these // you don't really want to change these
RTCBROKER master.frag-net.com:27950 RTCBROKER master.frag-net.com:27950

View file

@ -24,10 +24,7 @@ BASEGAME scihunt
-set gameinfo_url_info "www.richwhitehouse.com" -set gameinfo_url_info "www.richwhitehouse.com"
-set gameinfo_url_dl "http://www.frag-net.com/mods/scihunt.fmf" -set gameinfo_url_dl "http://www.frag-net.com/mods/scihunt.fmf"
-set gameinfo_menutrack "sound/Hondo2/pca.wav" -set gameinfo_menutrack "sound/Hondo2/pca.wav"
-set gameinfo_pkgname "cg_scihunt"
DOWNLOADSURL http://www.frag-net.com/dl/scihunt_packages
UPDATEURL http://www.frag-net.com/mods/scihunt.fmf
INSTALL "scihunt_essential;valve_essential;free_essential;addons_essential"
// you don't really want to change these // you don't really want to change these
RTCBROKER master.frag-net.com:27950 RTCBROKER master.frag-net.com:27950

View file

@ -57,8 +57,8 @@ class ambient_generic:CBaseTrigger
void(void) ambient_generic; void(void) ambient_generic;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) UseNormal; virtual void(int) UseNormal;
virtual void(void) UseLoop; virtual void(int) UseLoop;
virtual float(entity, float) SendEntity; virtual float(entity, float) SendEntity;
}; };
@ -91,7 +91,7 @@ ambient_generic::SendEntity(entity ePEnt, float fChanged)
} }
void void
ambient_generic::UseNormal(void) ambient_generic::UseNormal(int state)
{ {
sound(this, CHAN_VOICE, m_strActivePath, m_flVolume, m_flRadius, m_flPitch); sound(this, CHAN_VOICE, m_strActivePath, m_flVolume, m_flRadius, m_flPitch);
dprint(sprintf("^2ambient_generic::^3UseNormal^7: %s plays `%s`\n", dprint(sprintf("^2ambient_generic::^3UseNormal^7: %s plays `%s`\n",
@ -99,7 +99,7 @@ ambient_generic::UseNormal(void)
} }
void void
ambient_generic::UseLoop(void) ambient_generic::UseLoop(int state)
{ {
if (m_iToggleSwitch == TRUE) { if (m_iToggleSwitch == TRUE) {
dprint(sprintf("^2ambient_generic::^3UseLoop^7: %s stops `%s`\n", dprint(sprintf("^2ambient_generic::^3UseLoop^7: %s stops `%s`\n",

View file

@ -343,7 +343,7 @@ CBaseMonster::FreeState(void)
if (trigger.Trigger != __NULL__) { if (trigger.Trigger != __NULL__) {
dprint(sprintf("^2CBaseMonster::^3FreeState^7: %s triggered %f\n", m_strRouteEnded, time)); dprint(sprintf("^2CBaseMonster::^3FreeState^7: %s triggered %f\n", m_strRouteEnded, time));
trigger.Trigger(); trigger.Trigger(TRIG_TOGGLE);
} else { } else {
dprint(sprintf("^1CBaseMonster::^3FreeState^7: %s not a valid trigger\n", m_strRouteEnded)); dprint(sprintf("^1CBaseMonster::^3FreeState^7: %s not a valid trigger\n", m_strRouteEnded));
} }
@ -509,7 +509,7 @@ CBaseMonster::Physics(void)
/* override whatever we did above with this */ /* override whatever we did above with this */
if (m_iSequenceState == SEQUENCESTATE_ENDING) { if (m_iSequenceState == SEQUENCESTATE_ENDING) {
input_angles = v_angle = m_vecSequenceAngle; input_angles = v_angle = angles = m_vecSequenceAngle;
SetFrame(m_flSequenceEnd); SetFrame(m_flSequenceEnd);
} else if (movetype == MOVETYPE_WALK) { } else if (movetype == MOVETYPE_WALK) {
SeeThink(); SeeThink();

View file

@ -447,7 +447,7 @@ CBaseNPC::Physics(void)
/* override whatever we did above with this */ /* override whatever we did above with this */
if (m_iSequenceState == SEQUENCESTATE_ENDING) { if (m_iSequenceState == SEQUENCESTATE_ENDING) {
input_angles = v_angle = m_vecSequenceAngle; input_angles = v_angle = angles = m_vecSequenceAngle;
SetFrame(m_flSequenceEnd); SetFrame(m_flSequenceEnd);
} else { } else {
if (style != MONSTER_DEAD) { if (style != MONSTER_DEAD) {

View file

@ -20,34 +20,44 @@ enum
USE_CONTINOUS USE_CONTINOUS
}; };
enum
{
TRIG_TOGGLE,
TRIG_OFF,
TRIG_ON
};
class CBaseTrigger:CBaseEntity class CBaseTrigger:CBaseEntity
{ {
int m_strGlobalState; int m_strGlobalState;
string m_strKillTarget; string m_strKillTarget;
string m_strMessage; string m_strMessage;
string m_strMaster; string m_strMaster;
float m_flDelay;
int m_iUseType; int m_iUseType;
int m_iTeam; int m_iTeam;
int m_iValue;
void(void) CBaseTrigger; void(void) CBaseTrigger;
virtual void(void) Trigger;
virtual void(void) UseTargets; virtual void(int) Trigger;
virtual void(int) UseTargets;
virtual void(int, float) UseTargets_Delay;
virtual int(void) GetValue; virtual int(void) GetValue;
virtual int(void) GetMaster; virtual int(void) GetMaster;
virtual void(float) UseTargets_Delay;
virtual void(void) InitBrushTrigger; virtual void(void) InitBrushTrigger;
virtual void(void) InitPointTrigger; virtual void(void) InitPointTrigger;
}; };
void void
CBaseTrigger::UseTargets(void) CBaseTrigger::UseTargets(int state)
{ {
for (entity eFind = world; (eFind = find(eFind, CBaseTrigger::m_strTargetName, m_strTarget));) { for (entity f = world; (f = find(f, CBaseTrigger::m_strTargetName, m_strTarget));) {
CBaseTrigger trigger = (CBaseTrigger) eFind; CBaseTrigger trigger = (CBaseTrigger)f;
dprint(sprintf("^2%s::^3UseTargets^7: Triggering %s `%s`\n", dprint(sprintf("^2%s::^3UseTargets^7: Triggering %s `%s`\n",
this.classname, eFind.classname, trigger.m_strTargetName)); this.classname, f.classname, trigger.m_strTargetName));
if (trigger.Trigger != __NULL__) { if (trigger.Trigger != __NULL__) {
trigger.Trigger(); trigger.Trigger(state);
} }
} }
@ -69,38 +79,12 @@ CBaseTrigger::UseTargets(void)
} }
} }
int
CBaseTrigger::GetValue(void)
{
return TRUE;
}
int
CBaseTrigger::GetMaster(void)
{
CBaseTrigger t;
/* default to success */
if (!m_strMaster) {
return TRUE;
}
t = (CBaseTrigger)find(world, CBaseTrigger::m_strTarget, m_strMaster);
/* we couldn't find it, so let's not even bother going further */
if (!t) {
return FALSE;
}
return t.GetValue();
}
void void
CBaseTrigger::UseTargets_Delay (float fDelay) CBaseTrigger::UseTargets_Delay(int state, float fDelay)
{ {
static void Entities_UseTargets_Delay_Think(void) { static void Entities_UseTargets_Delay_Think(void) {
eActivator = self.owner; eActivator = self.owner;
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(self.health); /* ugly */
remove(self); remove(self);
} }
@ -112,10 +96,48 @@ CBaseTrigger::UseTargets_Delay (float fDelay)
eTimer.think = Entities_UseTargets_Delay_Think; eTimer.think = Entities_UseTargets_Delay_Think;
eTimer.m_strTarget = m_strTarget; eTimer.m_strTarget = m_strTarget;
eTimer.nextthink = time + fDelay; eTimer.nextthink = time + fDelay;
eTimer.health = state; /* ugly */
}
int
CBaseTrigger::GetValue(void)
{
return m_iValue;
}
int
CBaseTrigger::GetMaster(void)
{
CBaseTrigger t;
/* default to success */
if (!m_strMaster) {
dprint(sprintf("^2%s::^3GetMaster^7: No master, return success\n",
this.classname));
return TRUE;
}
t = (CBaseTrigger)find(world, CBaseTrigger::m_strTarget, m_strMaster);
/* we couldn't find it, so let's not even bother going further */
if (!t) {
dprint(sprintf("^2%s::^3GetMaster^7: Invalid master, return success\n",
this.classname));
return TRUE;
}
if (t.GetValue() == 1)
dprint(sprintf("^2%s::^3GetMaster^7: %s learns %s ^2POSITIVE\n",
this.classname, m_strTargetName, m_strMaster));
else
dprint(sprintf("^2%s::^3GetMaster^7: %s learns %s ^1NEGATIVE\n",
this.classname, m_strTargetName, m_strMaster));
return t.GetValue();
} }
void void
CBaseTrigger::Trigger(void) CBaseTrigger::Trigger(int state)
{ {
} }

View file

@ -38,13 +38,18 @@ class button_target:CBaseTrigger
void(void) button_target; void(void) button_target;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(int) Damage; virtual void(int) Damage;
}; };
void void
button_target::Respawn(void) button_target::Respawn(void)
{ {
/* yuck */
static void PUseWrapper(void) {
Trigger(TRIG_TOGGLE);
}
SetMovetype(MOVETYPE_PUSH); SetMovetype(MOVETYPE_PUSH);
SetSolid(SOLID_BSP); SetSolid(SOLID_BSP);
SetModel(m_oldModel); SetModel(m_oldModel);
@ -52,7 +57,7 @@ button_target::Respawn(void)
/* it's either one or the other */ /* it's either one or the other */
if (spawnflags & BUTTA_USE) { if (spawnflags & BUTTA_USE) {
PlayerUse = Trigger; PlayerUse = PUseWrapper;
} else { } else {
health = 1; health = 1;
takedamage = DAMAGE_YES; takedamage = DAMAGE_YES;
@ -64,20 +69,20 @@ button_target::Respawn(void)
} }
void void
button_target::Trigger(void) button_target::Trigger(int status)
{ {
/* make unusable */ /* make unusable */
PlayerUse = __NULL__; PlayerUse = __NULL__;
takedamage = DAMAGE_NO; takedamage = DAMAGE_NO;
frame = 1 - frame; frame = 1 - frame;
UseTargets(); UseTargets(status);
} }
void void
button_target::Damage(int hit) button_target::Damage(int hit)
{ {
Trigger(); Trigger(TRIG_TOGGLE); /* TODO: Set state? */
} }
void void

View file

@ -46,10 +46,11 @@ class env_beverage:CBaseTrigger
int m_iReady; int m_iReady;
int m_iSkin; int m_iSkin;
void(void) env_beverage; void(void) env_beverage;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void env_beverage::Trigger(void) void
env_beverage::Trigger(int unused)
{ {
if (m_iReady == FALSE || m_iUses <= 0) { if (m_iReady == FALSE || m_iUses <= 0) {
return; return;
@ -66,7 +67,8 @@ void env_beverage::Trigger(void)
m_iReady = FALSE; m_iReady = FALSE;
} }
void env_beverage::env_beverage(void) void
env_beverage::env_beverage(void)
{ {
precache_model("models/can.mdl"); precache_model("models/can.mdl");
precache_sound("weapons/g_bounce3.wav"); precache_sound("weapons/g_bounce3.wav");

View file

@ -39,7 +39,7 @@ class env_explosion:CBaseTrigger
float m_flMaxDelay; float m_flMaxDelay;
void(void) env_explosion; void(void) env_explosion;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void env_explosion::env_explosion(void) void env_explosion::env_explosion(void)
@ -56,7 +56,7 @@ void env_explosion::env_explosion(void)
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();
} }
void env_explosion::Trigger(void) void env_explosion::Trigger(int state)
{ {
FX_Explosion(origin); FX_Explosion(origin);

View file

@ -40,10 +40,10 @@ class env_fade:CBaseTrigger
float m_flFadeHold; float m_flFadeHold;
void(void) env_fade; void(void) env_fade;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void env_fade::Trigger (void) void env_fade::Trigger(int state)
{ {
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_FADE); WriteByte(MSG_MULTICAST, EV_FADE);

View file

@ -45,7 +45,7 @@ class env_global:CBaseTrigger
int m_iInitialState; int m_iInitialState;
void(void) env_global; void(void) env_global;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual int(string) GlobalPresent; virtual int(string) GlobalPresent;
virtual void(string, int) AddNewGlobal; virtual void(string, int) AddNewGlobal;
@ -53,7 +53,9 @@ class env_global:CBaseTrigger
virtual int(string) GetGlobal; virtual int(string) GetGlobal;
}; };
void env_global::Trigger(void) { void
env_global::Trigger(int state)
{
int iOldValue = GetGlobal(m_strGlobalState); int iOldValue = GetGlobal(m_strGlobalState);
int iNewValue = 0; int iNewValue = 0;
@ -84,7 +86,9 @@ void env_global::Trigger(void) {
} }
} }
int env_global::GlobalPresent (string strName) { int
env_global::GlobalPresent(string strName)
{
for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) { for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) {
if (argv(i) == strName) { if (argv(i) == strName) {
return 1; return 1;
@ -93,11 +97,14 @@ int env_global::GlobalPresent (string strName) {
return 0; return 0;
} }
void env_global::AddNewGlobal (string strName, int iValue) { void
env_global::AddNewGlobal(string strName, int iValue)
{
cvar_set(CENVGLOBAL_CVAR, sprintf("%s %s %i", cvar_string(CENVGLOBAL_CVAR), strName, iValue)); cvar_set(CENVGLOBAL_CVAR, sprintf("%s %s %i", cvar_string(CENVGLOBAL_CVAR), strName, iValue));
} }
void env_global::SetGlobal (string strName, int iValue) { void
env_global::SetGlobal(string strName, int iValue) {
string strNewData = ""; string strNewData = "";
for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) { for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) {
if (argv(i) != strName) { if (argv(i) != strName) {
@ -107,7 +114,9 @@ void env_global::SetGlobal (string strName, int iValue) {
cvar_set(CENVGLOBAL_CVAR, sprintf("%s %s %i", strNewData, strName, iValue)); cvar_set(CENVGLOBAL_CVAR, sprintf("%s %s %i", strNewData, strName, iValue));
} }
int env_global::GetGlobal (string strName) { int
env_global::GetGlobal(string strName)
{
for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) { for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) {
if (argv(i) == strName) { if (argv(i) == strName) {
return stoi(argv(i+1)); return stoi(argv(i+1));
@ -116,7 +125,8 @@ int env_global::GetGlobal (string strName) {
return 0; return 0;
} }
void env_global::env_global(void) void
env_global::env_global(void)
{ {
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) { switch (argv(i)) {

View file

@ -54,7 +54,7 @@ class env_laser:CBaseTrigger
void(void) env_laser; void(void) env_laser;
virtual void(void) think; virtual void(void) think;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) ParentUpdate; virtual void(void) ParentUpdate;
virtual float(entity, float) SendEntity; virtual float(entity, float) SendEntity;
@ -85,9 +85,18 @@ void env_laser::think(void)
} }
} }
void env_laser::Trigger(void) void env_laser::Trigger(int state)
{ {
switch (state) {
case TRIG_OFF:
m_iState = 0;
break;
case TRIG_ON:
m_iState = 1;
break;
default:
m_iState = 1 - m_iState; m_iState = 1 - m_iState;
}
if (m_iState) { if (m_iState) {
nextthink = time; nextthink = time;

View file

@ -41,11 +41,11 @@ class env_message:CBaseTrigger
void(void) env_message; void(void) env_message;
virtual void(void) Play; virtual void(int) Play;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void env_message::Play(void) void env_message::Play(int state)
{ {
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_MESSAGE); WriteByte(MSG_MULTICAST, EV_MESSAGE);

View file

@ -36,11 +36,11 @@ enumflags
class env_render:CBaseTrigger class env_render:CBaseTrigger
{ {
void(void) env_render; void(void) env_render;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void void
env_render::Trigger(void) env_render::Trigger(int state)
{ {
for (entity e = world; for (entity e = world;
(e = find(e, CBaseEntity::m_strTargetName, m_strTarget));) { (e = find(e, CBaseEntity::m_strTargetName, m_strTarget));) {

View file

@ -37,12 +37,12 @@ class env_shake:CBaseTrigger
float m_flFrequency; float m_flFrequency;
void(void) env_shake; void(void) env_shake;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void env_shake::Trigger (void) void env_shake::Trigger(int state)
{ {
for (entity e = world; (e = find(e, ::classname, "Player"));) { for (entity e = world; (e = find(e, ::classname, "player"));) {
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_SHAKE); WriteByte(MSG_MULTICAST, EV_SHAKE);
WriteFloat(MSG_MULTICAST, m_flRadius); WriteFloat(MSG_MULTICAST, m_flRadius);

View file

@ -48,10 +48,11 @@ class env_shooter:CBaseTrigger
void(void) env_shooter; void(void) env_shooter;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) ShootGib; virtual void(void) ShootGib;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void env_shooter::ShootGib(void) void
env_shooter::ShootGib(void)
{ {
static void Gib_Remove(void) { remove(self); } static void Gib_Remove(void) { remove(self); }
@ -77,18 +78,34 @@ void env_shooter::ShootGib(void)
} }
} }
void env_shooter::Trigger(void) void
env_shooter::Trigger(int state)
{ {
switch (state) {
case TRIG_OFF:
think = __NULL__;
nextthink = 0.0f;
break;
case TRIG_ON:
think = ShootGib; think = ShootGib;
nextthink = time + m_flVariance; nextthink = time + m_flVariance;
break;
default:
if (think == __NULL__)
Trigger(TRIG_ON);
else
Trigger(TRIG_OFF);
}
} }
void env_shooter::Respawn(void) void
env_shooter::Respawn(void)
{ {
m_iGibsLeft = m_iGibs; m_iGibsLeft = m_iGibs;
} }
void env_shooter::env_shooter(void) void
env_shooter::env_shooter(void)
{ {
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) { switch (argv(i)) {

View file

@ -51,7 +51,7 @@ class env_spark:CBaseTrigger
void(void) env_spark; void(void) env_spark;
virtual void(void) CreateSpark; virtual void(void) CreateSpark;
virtual void(void) TimedSpark; virtual void(void) TimedSpark;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
@ -68,7 +68,8 @@ void env_spark::TimedSpark(void)
nextthink = time + (random() * m_flMaxDelay); nextthink = time + (random() * m_flMaxDelay);
} }
void env_spark::Trigger(void) /* TODO: Implement state */
void env_spark::Trigger(int state)
{ {
if (spawnflags & EVSPARK_TOGGLE) { if (spawnflags & EVSPARK_TOGGLE) {
if (think != __NULL__) { if (think != __NULL__) {

View file

@ -44,7 +44,7 @@ class env_sprite:CBaseTrigger
float m_flEffects; float m_flEffects;
void(void) env_sprite; void(void) env_sprite;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual float(entity, float) Network; virtual float(entity, float) Network;
}; };
@ -91,7 +91,8 @@ void env_sprite::NetworkOnce(void)
multicast(origin, MULTICAST_PVS); multicast(origin, MULTICAST_PVS);
} }
void env_sprite::Trigger(void) /* TODO: Implement state */
void env_sprite::Trigger(int state)
{ {
if (spawnflags & ENVS_PLAYONCE) { if (spawnflags & ENVS_PLAYONCE) {
NetworkOnce(); NetworkOnce();

View file

@ -115,14 +115,15 @@ class func_breakable:CBaseTrigger
void(void) func_breakable; void(void) func_breakable;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Explode; virtual void(void) Explode;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) PlayerTouch; virtual void(void) PlayerTouch;
/*virtual void(void) PressureDeath;*/ /*virtual void(void) PressureDeath;*/
virtual void(int) Pain; virtual void(int) Pain;
virtual void(int) Death; virtual void(int) Death;
}; };
void func_breakable::Pain (int body) void
func_breakable::Pain(int body)
{ {
if (spawnflags & SF_TRIGGER) { if (spawnflags & SF_TRIGGER) {
return; return;
@ -159,17 +160,19 @@ void func_breakable::Pain (int body)
} }
void func_breakable::Explode(void) void
func_breakable::Explode(void)
{ {
vector rp = absmin + (0.5 * (absmax - absmin)); vector rp = absmin + (0.5 * (absmax - absmin));
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial); FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial);
FX_Explosion(rp); FX_Explosion(rp);
Damage_Radius(rp, this, m_flExplodeMag, m_flExplodeMag * 2.5f, TRUE, 0); Damage_Radius(rp, this, m_flExplodeMag, m_flExplodeMag * 2.5f, TRUE, 0);
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseEntity::Hide(); CBaseEntity::Hide();
} }
void func_breakable::Death(int body) void
func_breakable::Death(int body)
{ {
static void break_spawnobject(void) { static void break_spawnobject(void) {
/* these might get overwritten by the entity spawnfunction */ /* these might get overwritten by the entity spawnfunction */
@ -215,24 +218,31 @@ void func_breakable::Death(int body)
nextthink = time + random(0.0,0.5); nextthink = time + random(0.0,0.5);
} else { } else {
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial); FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial);
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseEntity::Hide(); CBaseEntity::Hide();
} }
} }
void func_breakable::Trigger(void) void
func_breakable::Trigger(int state)
{ {
if (health > 0) if (health > 0)
func_breakable::Death(0); func_breakable::Death(0);
} }
/*void func_breakable::PressureDeath(void) /*void
func_breakable::PressureDeath(void)
{ {
func_breakable::Death(m_pressAttacker, m_pressType, m_pressDamage); func_breakable::Death(m_pressAttacker, m_pressType, m_pressDamage);
}*/ }*/
void func_breakable::PlayerTouch(void) void
func_breakable::PlayerTouch(void)
{ {
static void TriggerWrap(void) {
Trigger(TRIG_TOGGLE);
}
if (other.classname == classname) { if (other.classname == classname) {
return; return;
} }
@ -252,7 +262,7 @@ void func_breakable::PlayerTouch(void)
if ((spawnflags & SF_PRESSURE) && (other.absmin[2] >= maxs[2] - 2)) { if ((spawnflags & SF_PRESSURE) && (other.absmin[2] >= maxs[2] - 2)) {
touch = __NULL__; touch = __NULL__;
think = Trigger; think = TriggerWrap;
if (m_flDelay == 0) { if (m_flDelay == 0) {
m_flDelay = 0.1f; m_flDelay = 0.1f;
@ -263,7 +273,8 @@ void func_breakable::PlayerTouch(void)
} }
void func_breakable::Respawn(void) void
func_breakable::Respawn(void)
{ {
CBaseEntity::Respawn(); CBaseEntity::Respawn();
@ -293,7 +304,8 @@ void func_breakable::Respawn(void)
} }
} }
void func_breakable::func_breakable(void) void
func_breakable::func_breakable(void)
{ {
vector vvm_angles = [0,0,0]; vector vvm_angles = [0,0,0];
precache_model(model); precache_model(model);

View file

@ -133,7 +133,7 @@ class func_button:CBaseTrigger
virtual void(void) MoveAway; virtual void(void) MoveAway;
virtual void(void) Touch; virtual void(void) Touch;
virtual void(void) Blocked; virtual void(void) Blocked;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Use; virtual void(void) Use;
virtual void(int) Pain; virtual void(int) Pain;
virtual void(int) Death; virtual void(int) Death;
@ -194,6 +194,7 @@ void func_button::MoveBack(void)
{ {
touch = __NULL__; touch = __NULL__;
m_iState = STATE_DOWN; m_iState = STATE_DOWN;
m_iValue = 0;
if (m_strSndUnpressed) { if (m_strSndUnpressed) {
if (m_iSoundCompat) if (m_iSoundCompat)
@ -229,10 +230,12 @@ void func_button::MoveAway(void)
Arrived(); Arrived();
} }
m_iValue = 1;
SetFrame(FRAME_ON); SetFrame(FRAME_ON);
} }
void func_button::Trigger(void) /* TODO: Handle state */
void func_button::Trigger(int state)
{ {
if (m_flNextTrigger > time) { if (m_flNextTrigger > time) {
return; return;
@ -257,9 +260,9 @@ void func_button::Trigger(void)
MoveAway(); MoveAway();
if (m_flDelay) { if (m_flDelay) {
UseTargets_Delay(m_flDelay); UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
UseTargets(); UseTargets(TRIG_TOGGLE);
} }
} }
@ -267,7 +270,7 @@ void func_button::Touch(void)
{ {
if (other.movetype == MOVETYPE_WALK) { if (other.movetype == MOVETYPE_WALK) {
eActivator = other; eActivator = other;
Trigger(); Trigger(TRIG_TOGGLE);
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) { if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
touch = __NULL__; touch = __NULL__;
@ -277,17 +280,17 @@ void func_button::Touch(void)
void func_button::Use(void) void func_button::Use(void)
{ {
Trigger(); Trigger(TRIG_TOGGLE);
} }
void func_button::Pain (int body) void func_button::Pain (int body)
{ {
Trigger(); Trigger(TRIG_TOGGLE);
} }
void func_button::Death (int body) void func_button::Death (int body)
{ {
Trigger(); Trigger(TRIG_TOGGLE);
} }
void func_button::Blocked(void) void func_button::Blocked(void)

View file

@ -33,12 +33,13 @@ class func_conveyor:CBaseTrigger
void(void) func_conveyor; void(void) func_conveyor;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) touch; virtual void(void) touch;
virtual void(void) SetMovementDirection; virtual void(void) SetMovementDirection;
}; };
void func_conveyor::SetMovementDirection(void) void
func_conveyor::SetMovementDirection(void)
{ {
if (angles == [0,-1,0]) { if (angles == [0,-1,0]) {
m_vecMoveDir = [0,0,1]; m_vecMoveDir = [0,0,1];
@ -50,18 +51,22 @@ void func_conveyor::SetMovementDirection(void)
} }
} }
void func_conveyor::touch(void) void
func_conveyor::touch(void)
{ {
other.basevelocity = m_vecMoveDir * m_flSpeed; other.basevelocity = m_vecMoveDir * m_flSpeed;
} }
void func_conveyor::Trigger(void) /* TODO: Handle state? */
void
func_conveyor::Trigger(int state)
{ {
/* changes direction */ /* changes direction */
m_flSpeed = -m_flSpeed; m_flSpeed = -m_flSpeed;
} }
void func_conveyor::Respawn(void) void
func_conveyor::Respawn(void)
{ {
m_vecMoveDir = [0,0,0]; m_vecMoveDir = [0,0,0];
angles = m_oldAngle; angles = m_oldAngle;
@ -87,7 +92,8 @@ void func_conveyor::Respawn(void)
SetAngles([0,0,0]); SetAngles([0,0,0]);
} }
void func_conveyor::func_conveyor(void) void
func_conveyor::func_conveyor(void)
{ {
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();
} }

View file

@ -98,7 +98,7 @@ class func_door:CBaseTrigger
virtual void(void) Arrived; virtual void(void) Arrived;
virtual void(void) Returned; virtual void(void) Returned;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Blocked; virtual void(void) Blocked;
virtual void(void) Touch; virtual void(void) Touch;
virtual void(void) Use; virtual void(void) Use;
@ -109,7 +109,7 @@ void
func_door::Use(void) func_door::Use(void)
{ {
eActivator.gflags &= ~GF_USE_RELEASED; eActivator.gflags &= ~GF_USE_RELEASED;
Trigger(); Trigger(TRIG_TOGGLE);
} }
void void
@ -154,7 +154,7 @@ func_door::Returned(void)
t = (CBaseTrigger)find(world, CBaseTrigger::m_strTargetName, m_strFire); t = (CBaseTrigger)find(world, CBaseTrigger::m_strTargetName, m_strFire);
if (t) { if (t) {
t.Trigger(); t.Trigger(TRIG_TOGGLE);
} }
} }
@ -174,6 +174,7 @@ func_door::MoveBack(void)
touch = __NULL__; touch = __NULL__;
} }
m_iValue = 0;
m_iState = DOORSTATE_DOWN; m_iState = DOORSTATE_DOWN;
MoveToDestination(m_vecPos1, Returned); MoveToDestination(m_vecPos1, Returned);
} }
@ -198,13 +199,17 @@ func_door::MoveAway(void)
} }
} }
m_iValue = 1;
m_iState = DOORSTATE_UP; m_iState = DOORSTATE_UP;
MoveToDestination(m_vecPos2, Arrived); MoveToDestination(m_vecPos2, Arrived);
} }
void void
func_door::Trigger(void) func_door::Trigger(int state)
{ {
if (GetMaster() == 0)
return;
if (m_flNextTrigger > time) { if (m_flNextTrigger > time) {
if (!(spawnflags & SF_MOV_TOGGLE)) { if (!(spawnflags & SF_MOV_TOGGLE)) {
return; return;
@ -215,9 +220,9 @@ func_door::Trigger(void)
/* only trigger stuff once we are done moving */ /* only trigger stuff once we are done moving */
if ((m_iState == DOORSTATE_RAISED) || (m_iState == DOORSTATE_LOWERED)) { if ((m_iState == DOORSTATE_RAISED) || (m_iState == DOORSTATE_LOWERED)) {
if (m_flDelay > 0) { if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
} }
@ -243,7 +248,7 @@ func_door::Touch(void)
if (other.movetype == MOVETYPE_WALK) { if (other.movetype == MOVETYPE_WALK) {
if (other.absmin[2] <= maxs[2] - 2) { if (other.absmin[2] <= maxs[2] - 2) {
eActivator = other; eActivator = other;
Trigger(); Trigger(TRIG_TOGGLE);
} }
} }
} }
@ -368,6 +373,7 @@ func_door::Respawn(void)
PlayerUse = __NULL__; PlayerUse = __NULL__;
} }
m_iValue = 0;
m_iState = DOORSTATE_LOWERED; m_iState = DOORSTATE_LOWERED;
m_vecPos1 = m_oldOrigin; m_vecPos1 = m_oldOrigin;
m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip)); m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip));
@ -376,6 +382,7 @@ func_door::Respawn(void)
SetOrigin(m_vecPos2); SetOrigin(m_vecPos2);
m_vecPos2 = m_vecPos1; m_vecPos2 = m_vecPos1;
m_vecPos1 = origin; m_vecPos1 = origin;
m_iValue = 1;
} }
if (m_strTargetName) { if (m_strTargetName) {

View file

@ -64,7 +64,7 @@ class func_door_rotating:CBaseTrigger
virtual void(void) Returned; virtual void(void) Returned;
virtual void(void) Back; virtual void(void) Back;
virtual void(void) Away; virtual void(void) Away;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Use; virtual void(void) Use;
virtual void(void) Touch; virtual void(void) Touch;
virtual void(void) Blocked; virtual void(void) Blocked;
@ -196,7 +196,8 @@ void func_door_rotating::Away(void)
RotToDest(m_vecPos2 * fDirection, Arrived); RotToDest(m_vecPos2 * fDirection, Arrived);
} }
void func_door_rotating::Trigger(void) /* TODO: Handle state */
void func_door_rotating::Trigger(int state)
{ {
if (GetMaster() == FALSE) { if (GetMaster() == FALSE) {
return; return;
@ -215,16 +216,16 @@ void func_door_rotating::Trigger(void)
Away(); Away();
if (m_flDelay) { if (m_flDelay) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
} }
void func_door_rotating::Use(void) void func_door_rotating::Use(void)
{ {
eActivator.gflags &= ~GF_USE_RELEASED; eActivator.gflags &= ~GF_USE_RELEASED;
Trigger(); Trigger(TRIG_TOGGLE);
} }
void func_door_rotating::Touch(void) void func_door_rotating::Touch(void)
@ -239,7 +240,7 @@ void func_door_rotating::Touch(void)
if (other.movetype == MOVETYPE_WALK) { if (other.movetype == MOVETYPE_WALK) {
eActivator = other; eActivator = other;
Trigger(); Trigger(TRIG_TOGGLE);
} }
touch = __NULL__; touch = __NULL__;
} }

View file

@ -37,20 +37,10 @@ class func_guntarget:CBaseTrigger
virtual void(void) NextPath; virtual void(void) NextPath;
virtual void(void) Move; virtual void(void) Move;
virtual void(void) Stop; virtual void(void) Stop;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(int) Death; virtual void(int) Death;
virtual int(void) GetValue;
}; };
int func_guntarget::GetValue(void)
{
if (health <= 0) {
return TRUE;
} else {
return FALSE;
}
}
void func_guntarget::Move(void) void func_guntarget::Move(void)
{ {
float flTravelTime; float flTravelTime;
@ -114,7 +104,7 @@ void func_guntarget::Death(int iHitBody)
for (a = world; (a = find(a, CBaseTrigger::m_strTargetName, m_strFire));) { for (a = world; (a = find(a, CBaseTrigger::m_strTargetName, m_strFire));) {
CBaseTrigger trigger = (CBaseTrigger)a; CBaseTrigger trigger = (CBaseTrigger)a;
trigger.Trigger(); trigger.Trigger(TRIG_TOGGLE);
} }
} }
@ -126,28 +116,35 @@ void func_guntarget::Stop(void)
think = __NULL__; think = __NULL__;
} }
void func_guntarget::Trigger(void) /* TODO: Handle state? */
void func_guntarget::Trigger(int state)
{ {
flags = (1 << FL_FROZEN) | flags; flags = (1 << FL_FROZEN) | flags;
if (flags & FL_FROZEN) { if (flags & FL_FROZEN) {
takedamage = DAMAGE_NO; takedamage = DAMAGE_NO;
Stop(); Stop();
m_iValue = 1;
} else { } else {
takedamage = DAMAGE_YES; takedamage = DAMAGE_YES;
NextPath(); NextPath();
m_iValue = 0;
} }
} }
void func_guntarget::Respawn(void) void func_guntarget::Respawn(void)
{ {
static void ThinkWrap(void) {
Trigger(TRIG_TOGGLE);
}
SetSolid(SOLID_BSP); SetSolid(SOLID_BSP);
SetMovetype(MOVETYPE_PUSH); SetMovetype(MOVETYPE_PUSH);
SetModel(m_oldModel); SetModel(m_oldModel);
SetOrigin(m_oldOrigin); SetOrigin(m_oldOrigin);
if (spawnflags & SF_GUNTARGET_ON) { if (spawnflags & SF_GUNTARGET_ON) {
think = Trigger; think = ThinkWrap;
nextthink = ltime + 0.25f; nextthink = ltime + 0.25f;
} }
} }

View file

@ -45,10 +45,11 @@ class func_pendulum:CBaseTrigger
virtual void(void) customphysics; virtual void(void) customphysics;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void func_pendulum::customphysics(void) void
func_pendulum::customphysics(void)
{ {
if (!m_iActive) if (!m_iActive)
return; return;
@ -65,15 +66,26 @@ void func_pendulum::customphysics(void)
angles *= m_flDistance; angles *= m_flDistance;
} }
void func_pendulum::Trigger(void) void
func_pendulum::Trigger(int state)
{ {
switch (state) {
case TRIG_OFF:
m_iActive = 0;
break;
case TRIG_ON:
m_iActive = 1;
break;
default:
m_iActive = 1 - m_iActive; m_iActive = 1 - m_iActive;
}
if (m_iActive == FALSE && spawnflags & FUNCPEND_RETURNONTRIGGER) if (m_iActive == 0 && spawnflags & FUNCPEND_RETURNONTRIGGER)
angles = [0,0,0]; angles = [0,0,0];
} }
void func_pendulum::Respawn(void) void
func_pendulum::Respawn(void)
{ {
if (spawnflags & FUNCPEND_STARTON) if (spawnflags & FUNCPEND_STARTON)
m_iActive = TRUE; m_iActive = TRUE;
@ -88,7 +100,8 @@ void func_pendulum::Respawn(void)
SetOrigin(origin); SetOrigin(origin);
} }
void func_pendulum::func_pendulum(void) void
func_pendulum::func_pendulum(void)
{ {
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();

View file

@ -52,18 +52,21 @@ class func_rotating:CBaseTrigger
void(void) func_rotating; void(void) func_rotating;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Rotate; virtual void(void) Rotate;
virtual void(void) Blocked; virtual void(void) Blocked;
virtual void(void) SetMovementDirection; virtual void(void) SetMovementDirection;
}; };
void func_rotating::Rotate(void) void
func_rotating::Rotate(void)
{ {
nextthink = ltime + 10.0f; nextthink = ltime + 10.0f;
} }
void func_rotating::Trigger(void) /* TODO: Handle state */
void
func_rotating::Trigger(int state)
{ {
if (vlen(avelocity)) { if (vlen(avelocity)) {
avelocity = [0,0,0]; avelocity = [0,0,0];
@ -81,7 +84,8 @@ void func_rotating::Trigger(void)
} }
} }
void func_rotating::Blocked(void) void
func_rotating::Blocked(void)
{ {
if (avelocity == [0,0,0]) { if (avelocity == [0,0,0]) {
return; return;
@ -92,7 +96,8 @@ void func_rotating::Blocked(void)
} }
} }
void func_rotating::Respawn(void) void
func_rotating::Respawn(void)
{ {
#ifdef GS_DEVELOPER #ifdef GS_DEVELOPER
if (autocvar_dev_rotspeed != 0) { if (autocvar_dev_rotspeed != 0) {
@ -120,7 +125,8 @@ void func_rotating::Respawn(void)
} }
} }
void func_rotating::SetMovementDirection(void) void
func_rotating::SetMovementDirection(void)
{ {
if (spawnflags & FR_ZAXIS) { if (spawnflags & FR_ZAXIS) {
m_vecMoveDir = [0,0,1]; m_vecMoveDir = [0,0,1];
@ -135,7 +141,8 @@ void func_rotating::SetMovementDirection(void)
} }
} }
void func_rotating::func_rotating(void) void
func_rotating::func_rotating(void)
{ {
precache_model(model); precache_model(model);
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {

View file

@ -31,7 +31,7 @@ class func_tracktrain:CBaseTrigger
virtual void(void) Find; virtual void(void) Find;
virtual void(void) NextPath; virtual void(void) NextPath;
virtual void(void) GoToTarget; virtual void(void) GoToTarget;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
@ -72,7 +72,7 @@ void func_tracktrain::NextPath(void)
GoToTarget(); GoToTarget();
} }
void func_tracktrain::Trigger(void) void func_tracktrain::Trigger(int state)
{ {
GoToTarget(); GoToTarget();
} }

View file

@ -83,7 +83,7 @@ class func_train:CBaseTrigger
void(void) func_train; void(void) func_train;
virtual void(void) NextPath; virtual void(void) NextPath;
virtual void(void) GoToTarget; virtual void(void) GoToTarget;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Blocked; virtual void(void) Blocked;
}; };
@ -154,7 +154,7 @@ func_train::NextPath(void)
/* fire the path_corners' target */ /* fire the path_corners' target */
if (eNode.m_strMessage) { if (eNode.m_strMessage) {
eNode.Trigger(); eNode.Trigger(TRIG_TOGGLE);
} }
/* stuff for the ears */ /* stuff for the ears */
@ -193,8 +193,9 @@ func_train::NextPath(void)
} }
} }
/* TODO: Handle state? */
void void
func_train::Trigger(void) func_train::Trigger(int state)
{ {
GoToTarget(); GoToTarget();
} }

View file

@ -24,10 +24,26 @@ On idTech 2 BSPs, it will change texture variants when triggered.
class func_wall:CBaseTrigger class func_wall:CBaseTrigger
{ {
void(void) func_wall; void(void) func_wall;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void func_wall::func_wall(void) void
func_wall::Trigger(int state)
{
switch (state) {
case TRIG_OFF:
frame = 0;
break;
case TRIG_ON:
frame = 1;
break;
default:
frame = 1 - frame;
}
}
void
func_wall::func_wall(void)
{ {
precache_model(model); precache_model(model);
//angles = [0,0,0]; //angles = [0,0,0];
@ -37,8 +53,3 @@ void func_wall::func_wall(void)
SetOrigin(origin); SetOrigin(origin);
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();
} }
void func_wall::Trigger(void)
{
frame = 1 - frame;
}

View file

@ -34,12 +34,22 @@ class func_wall_toggle:CBaseTrigger
void(void) func_wall_toggle; void(void) func_wall_toggle;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void func_wall_toggle::Trigger(void) void
func_wall_toggle::Trigger(int state)
{ {
switch (state) {
case TRIG_OFF:
m_iVisible = 0;
break;
case TRIG_ON:
m_iVisible = 1;
break;
default:
m_iVisible = 1 - m_iVisible; m_iVisible = 1 - m_iVisible;
}
if (m_iVisible) { if (m_iVisible) {
modelindex = m_oldmodelindex; modelindex = m_oldmodelindex;
@ -50,7 +60,8 @@ void func_wall_toggle::Trigger(void)
} }
} }
void func_wall_toggle::Respawn(void) void
func_wall_toggle::Respawn(void)
{ {
movetype = MOVETYPE_PUSH; movetype = MOVETYPE_PUSH;
solid = SOLID_BSP; solid = SOLID_BSP;
@ -60,11 +71,12 @@ void func_wall_toggle::Respawn(void)
m_oldmodelindex = modelindex; m_oldmodelindex = modelindex;
if (spawnflags & FTW_STARTHIDDEN) { if (spawnflags & FTW_STARTHIDDEN) {
Trigger(); Trigger(TRIG_OFF);
} }
} }
void func_wall_toggle::func_wall_toggle(void) void
func_wall_toggle::func_wall_toggle(void)
{ {
precache_model(model); precache_model(model);
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();

View file

@ -61,10 +61,10 @@ class game_text:CBaseTrigger
void(void) game_text; void(void) game_text;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void game_text::Trigger(void) void game_text::Trigger(int state)
{ {
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_TEXT); WriteByte(MSG_MULTICAST, EV_TEXT);

View file

@ -35,12 +35,13 @@ class infodecal:CBaseTrigger
string m_strTexture; string m_strTexture;
void(void) infodecal; void(void) infodecal;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
/* TODO: Handle state? */
void void
infodecal::Trigger(void) infodecal::Trigger(int state)
{ {
decal new = spawn(decal); decal new = spawn(decal);
new.Place(origin, m_strTexture); new.Place(origin, m_strTexture);
@ -53,7 +54,7 @@ infodecal::Respawn(void)
/* this will be invisible by default */ /* this will be invisible by default */
if (!m_strTargetName) { if (!m_strTargetName) {
/* spawn automatically, remove self */ /* spawn automatically, remove self */
Trigger(); Trigger(TRIG_TOGGLE);
} }
} }

View file

@ -60,18 +60,27 @@ class light:CBaseTrigger
string m_strPattern; string m_strPattern;
void(void) light; void(void) light;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void light::Trigger(void) void light::Trigger(int state)
{ {
if (m_iEnabled == TRUE) { switch (state) {
case TRIG_OFF:
m_iEnabled = 0;
break;
case TRIG_ON:
m_iEnabled = 1;
break;
default:
m_iEnabled = 1 - m_iEnabled;
}
if (m_iEnabled == 0) {
lightstyle(m_flStyle, "a"); lightstyle(m_flStyle, "a");
m_iEnabled = FALSE;
} else { } else {
lightstyle(m_flStyle, m_strPattern); lightstyle(m_flStyle, m_strPattern);
m_iEnabled = TRUE;
} }
} }
@ -79,10 +88,10 @@ void light::Respawn(void)
{ {
if (spawnflags & 1) { if (spawnflags & 1) {
lightstyle(m_flStyle, "a"); lightstyle(m_flStyle, "a");
m_iEnabled = FALSE; m_iEnabled = 0;
} else { } else {
lightstyle(m_flStyle, m_strPattern); lightstyle(m_flStyle, m_strPattern);
m_iEnabled = TRUE; m_iEnabled = 1;
} }
} }

View file

@ -55,7 +55,7 @@ class monstermaker:CBaseTrigger
void(void) monstermaker; void(void) monstermaker;
virtual void(void) Spawner; virtual void(void) Spawner;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) TurnOn; virtual void(void) TurnOn;
virtual void(void) TurnOff; virtual void(void) TurnOff;
@ -142,7 +142,7 @@ monstermaker::Spawner(void)
m_iMonsterSpawned++; m_iMonsterSpawned++;
if (m_strTarget) { if (m_strTarget) {
UseTargets(); UseTargets(TRIG_TOGGLE);
} }
/* inherit the monsterclip flag */ /* inherit the monsterclip flag */
@ -170,13 +170,22 @@ monstermaker::Spawner(void)
} }
void void
monstermaker::Trigger(void) monstermaker::Trigger(int state)
{ {
switch (state) {
case TRIG_OFF:
TurnOff();
break;
case TRIG_ON:
TurnOn();
break;
default:
if (m_iEnabled) if (m_iEnabled)
TurnOff(); TurnOff();
else else
TurnOn(); TurnOn();
} }
}
void void
monstermaker::Respawn(void) monstermaker::Respawn(void)

View file

@ -46,7 +46,7 @@ class multi_manager:CBaseTrigger
int m_iBusy; int m_iBusy;
int m_iValue; int m_iValue;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual int(void) GetValue; virtual int(void) GetValue;
}; };
@ -57,7 +57,7 @@ multi_manager::GetValue(void)
} }
void void
multi_manager::Trigger(void) multi_manager::Trigger(int state)
{ {
static void mm_enttrigger (void) { static void mm_enttrigger (void) {
multi_manager_sub wow = (multi_manager_sub)self; multi_manager_sub wow = (multi_manager_sub)self;
@ -67,7 +67,7 @@ multi_manager::Trigger(void)
dprint(sprintf("^2%s::^3Trigger^7: %s (%s)\n", dprint(sprintf("^2%s::^3Trigger^7: %s (%s)\n",
this.classname, wow.m_strTarget, eFind.classname)); this.classname, wow.m_strTarget, eFind.classname));
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
m_iValue = TRUE; m_iValue = TRUE;

View file

@ -26,12 +26,13 @@ class multisource:CBaseTrigger
{ {
void(void) multisource; void(void) multisource;
virtual int(void) GetValue; virtual void(void) Respawn;
virtual void(void) Trigger; virtual int(void) QueryTargets;
virtual void(int) Trigger;
}; };
int int
multisource::GetValue(void) multisource::QueryTargets(void)
{ {
entity a; entity a;
int out = TRUE; int out = TRUE;
@ -39,7 +40,7 @@ multisource::GetValue(void)
/* normal triggers */ /* normal triggers */
for (a = world; (a = find(a, CBaseTrigger::m_strTarget, m_strTargetName));) { for (a = world; (a = find(a, CBaseTrigger::m_strTarget, m_strTargetName));) {
CBaseTrigger tTemp = (CBaseTrigger) a; CBaseTrigger tTemp = (CBaseTrigger) a;
#ifdef GS_DEVELOPER if (cvar("developer") == 1) {
dprint("[^1MULTISOURCE^7] "); dprint("[^1MULTISOURCE^7] ");
dprint(tTemp.classname); dprint(tTemp.classname);
if (tTemp.GetValue() == FALSE) { if (tTemp.GetValue() == FALSE) {
@ -50,25 +51,35 @@ multisource::GetValue(void)
} }
dprint(tTemp.m_strTargetName); dprint(tTemp.m_strTargetName);
dprint("\n"); dprint("\n");
#else } else {
/* exit out immediately as there's no point unless in-dev */ /* exit out immediately as there's no point unless in-dev */
if (tTemp.GetValue() == FALSE) { if (tTemp.GetValue() == FALSE) {
return FALSE; return FALSE;
} }
#endif }
} }
return out; return out;
} }
void void
multisource::Trigger(void) multisource::Trigger(int unused)
{ {
if (GetValue() == FALSE) { if (QueryTargets() == FALSE) {
dprint(sprintf("[^1MULTISOURCE^7] %s is inactive.\n", m_strTargetName));
m_iValue = FALSE;
return; return;
} }
CBaseTrigger::UseTargets(); dprint(sprintf("[^1MULTISOURCE^7] %s is now active.\n", m_strTargetName));
m_iValue = TRUE;
CBaseTrigger::UseTargets(TRIG_TOGGLE);
}
void
multisource::Respawn(void)
{
m_iValue = FALSE;
} }
void void

View file

@ -53,12 +53,12 @@ class path_corner:CBaseTrigger
float m_flWait; float m_flWait;
void(void) path_corner; void(void) path_corner;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void void
path_corner::Trigger(void) path_corner::Trigger(int state)
{ {
entity a; entity a;
@ -68,7 +68,7 @@ path_corner::Trigger(void)
for (a = world; (a = find(a, CBaseTrigger::m_strTargetName, m_strMessage));) { for (a = world; (a = find(a, CBaseTrigger::m_strTargetName, m_strMessage));) {
CBaseTrigger trigger = (CBaseTrigger)a; CBaseTrigger trigger = (CBaseTrigger)a;
trigger.Trigger(); trigger.Trigger(state);
m_iFired = TRUE; m_iFired = TRUE;
} }
} }

View file

@ -36,7 +36,7 @@ class player_loadsaved:CBaseTrigger
float m_flFadeHold; float m_flFadeHold;
void(void) player_loadsaved; void(void) player_loadsaved;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) ReloadSave; virtual void(void) ReloadSave;
}; };
@ -47,7 +47,7 @@ player_loadsaved::ReloadSave(void)
} }
void void
player_loadsaved::Trigger(void) player_loadsaved::Trigger(int unused)
{ {
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_FADE); WriteByte(MSG_MULTICAST, EV_FADE);

View file

@ -23,11 +23,11 @@ Strips the activator of all of its weapons.
class player_weaponstrip:CBaseTrigger class player_weaponstrip:CBaseTrigger
{ {
void(void) player_weaponstrip; void(void) player_weaponstrip;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void void
player_weaponstrip::Trigger(void) player_weaponstrip::Trigger(int unused)
{ {
base_player pl; base_player pl;

View file

@ -38,11 +38,11 @@ class scripted_sentence:CBaseTrigger
float m_flDuration; float m_flDuration;
void(void) scripted_sentence; void(void) scripted_sentence;
virtual void(void) Trigger; virtual void(int state) Trigger;
}; };
void void
scripted_sentence::Trigger(void) scripted_sentence::Trigger(int unused)
{ {
entity speaker = find(world, CBaseEntity::m_strTargetName, m_strSpeaker); entity speaker = find(world, CBaseEntity::m_strTargetName, m_strSpeaker);

View file

@ -92,13 +92,13 @@ class scripted_sequence:CBaseTrigger
int m_iMove; int m_iMove;
void(void) scripted_sequence; void(void) scripted_sequence;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) InitIdle; virtual void(void) InitIdle;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void void
scripted_sequence::Trigger(void) scripted_sequence::Trigger(int unused)
{ {
CBaseMonster f; CBaseMonster f;
float duration; float duration;

View file

@ -40,7 +40,7 @@ trigger_auto::Processing(void)
// This is weird, because ents may not be spawned yet. // This is weird, because ents may not be spawned yet.
// However, Half-Life doesn't care about this, either. // However, Half-Life doesn't care about this, either.
// So why should we? // So why should we?
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
if (spawnflags & 1) { if (spawnflags & 1) {
dprint(sprintf("^2trigger_auto::^3think^7: %s triggerer removed self\n", dprint(sprintf("^2trigger_auto::^3think^7: %s triggerer removed self\n",

View file

@ -48,13 +48,13 @@ trigger_autosave::touch(void)
dprint(sprintf("^2trigger_autosave::^3touch^7: %s called autosave\n", dprint(sprintf("^2trigger_autosave::^3touch^7: %s called autosave\n",
other.netname)); other.netname));
localcmd("save autosave\n"); //localcmd("save autosave\n");
Hide(); Hide();
if (m_flDelay > 0) { if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
solid = SOLID_NOT; solid = SOLID_NOT;
} }

View file

@ -30,16 +30,16 @@ class trigger_camera:CBaseTrigger
float m_flWait; float m_flWait;
void(void) trigger_camera; void(void) trigger_camera;
virtual void(void) Trigger; virtual void(int) Trigger;
}; };
void void
trigger_camera::Trigger(void) trigger_camera::Trigger(int state)
{ {
if (m_flDelay > 0) { if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
if (m_strMoveTo) { if (m_strMoveTo) {

View file

@ -26,12 +26,13 @@ class trigger_cdaudio:CBaseTrigger
int m_iCDTrack; int m_iCDTrack;
void(void) trigger_cdaudio; void(void) trigger_cdaudio;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) touch;
}; };
void void
trigger_cdaudio::Trigger(void) trigger_cdaudio::Trigger(int unused)
{ {
if (!(other.flags & FL_CLIENT)) { if (!(other.flags & FL_CLIENT)) {
return; return;
@ -49,6 +50,12 @@ trigger_cdaudio::Trigger(void)
remove(this); remove(this);
} }
void
trigger_cdaudio::touch(void)
{
Trigger(TRIG_TOGGLE);
}
void void
trigger_cdaudio::Respawn(void) trigger_cdaudio::Respawn(void)
{ {
@ -69,5 +76,4 @@ trigger_cdaudio::trigger_cdaudio(void)
} }
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();
CBaseTrigger::InitBrushTrigger(); CBaseTrigger::InitBrushTrigger();
touch = Trigger;
} }

View file

@ -53,7 +53,7 @@ class trigger_changelevel:CBaseTrigger
void(void) trigger_changelevel; void(void) trigger_changelevel;
virtual void(void) Change; virtual void(void) Change;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) TouchTrigger; virtual void(void) TouchTrigger;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual int(entity, entity) IsInside; virtual int(entity, entity) IsInside;
@ -97,7 +97,7 @@ trigger_changelevel::Change(void)
} }
void void
trigger_changelevel::Trigger(void) trigger_changelevel::Trigger(int unused)
{ {
/* this means a delayed trigger is active */ /* this means a delayed trigger is active */
if (nextthink > 0.0f) if (nextthink > 0.0f)
@ -123,7 +123,7 @@ void
trigger_changelevel::TouchTrigger(void) trigger_changelevel::TouchTrigger(void)
{ {
eActivator = other; eActivator = other;
Trigger(); Trigger(TRIG_TOGGLE);
} }
void void

View file

@ -45,29 +45,32 @@ class trigger_hurt:CBaseTrigger
float m_flDelay; float m_flDelay;
void(void) trigger_hurt; void(void) trigger_hurt;
virtual void(void) Trigger; virtual void(int) Trigger;
virtual void(void) Touch; virtual void(void) touch;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void void
trigger_hurt::Trigger(void) trigger_hurt::Trigger(int state)
{ {
if (solid != SOLID_NOT) { switch (state) {
dprint(sprintf("trigger_hurt::^3Trigger: %s deactivated\n", case TRIG_OFF:
m_strTargetName));
solid = SOLID_NOT; solid = SOLID_NOT;
touch = __NULL__; break;
} else { case TRIG_ON:
dprint(sprintf("trigger_hurt::^3Trigger: %s activated\n", solid = SOLID_TRIGGER;
m_strTargetName));
InitBrushTrigger(); InitBrushTrigger();
touch = Touch; break;
default:
if (solid == SOLID_NOT)
Trigger(TRIG_ON);
else
Trigger(TRIG_OFF);
} }
} }
void void
trigger_hurt::Touch(void) trigger_hurt::touch(void)
{ {
if (m_flNextTrigger > time) { if (m_flNextTrigger > time) {
return; return;
@ -84,17 +87,17 @@ trigger_hurt::Touch(void)
if (other.flags & FL_CLIENT) { if (other.flags & FL_CLIENT) {
eActivator = other; eActivator = other;
if (m_flDelay > 0) { if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
} }
} else { } else {
eActivator = other; eActivator = other;
if (m_flDelay > 0) { if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
} }
} }
@ -106,7 +109,7 @@ trigger_hurt::Touch(void)
/* shut it down if used once */ /* shut it down if used once */
if (spawnflags & SF_HURT_ONCE) { if (spawnflags & SF_HURT_ONCE) {
Trigger(); Trigger(TRIG_OFF);
} }
m_flNextTrigger = time + m_flNextDmg; m_flNextTrigger = time + m_flNextDmg;
@ -119,10 +122,9 @@ trigger_hurt::Respawn(void)
m_flNextTrigger = 0.0f; m_flNextTrigger = 0.0f;
if (spawnflags & SF_HURT_OFF) { if (spawnflags & SF_HURT_OFF) {
solid = SOLID_NOT; Trigger(TRIG_OFF);
} else { } else {
InitBrushTrigger(); Trigger(TRIG_ON);
touch = Touch;
} }
} }

View file

@ -53,6 +53,9 @@ trigger_look::Touch(void)
float dot; float dot;
entity lt; entity lt;
if (GetMaster() == FALSE)
return;
if (!(other.flags & FL_CLIENT)) { if (!(other.flags & FL_CLIENT)) {
/* FIXME: could this conflict with other entities? probably. */ /* FIXME: could this conflict with other entities? probably. */
m_flLooked = 0.0f; m_flLooked = 0.0f;
@ -86,9 +89,9 @@ trigger_look::Touch(void)
/* trigger and disable entity, for now */ /* trigger and disable entity, for now */
if (m_flDelay > 0) { if (m_flDelay > 0) {
UseTargets_Delay(m_flDelay); UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
UseTargets(); UseTargets(TRIG_TOGGLE);
} }
solid = SOLID_NOT; solid = SOLID_NOT;
} }

View file

@ -48,6 +48,9 @@ trigger_multiple::touch(void)
{ {
eActivator = other; eActivator = other;
if (GetMaster() == FALSE)
return;
if (Rules_IsTeamPlay() == TRUE) { if (Rules_IsTeamPlay() == TRUE) {
if (m_iTeam > 0 && eActivator.team != m_iTeam + 1) { if (m_iTeam > 0 && eActivator.team != m_iTeam + 1) {
return; return;
@ -59,9 +62,9 @@ trigger_multiple::touch(void)
} }
if (m_flDelay > 0) { if (m_flDelay > 0) {
UseTargets_Delay(m_flDelay); UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
UseTargets(); UseTargets(TRIG_TOGGLE);
} }
/* This is effectively a trigger_once...*/ /* This is effectively a trigger_once...*/

View file

@ -35,7 +35,6 @@ enumflags
class trigger_once:CBaseTrigger class trigger_once:CBaseTrigger
{ {
float m_flDelay;
void(void) trigger_once; void(void) trigger_once;
virtual void(void) touch; virtual void(void) touch;
@ -49,22 +48,27 @@ trigger_once::touch(void)
return; return;
if (spawnflags & TO_NOCLIENTS && other.spawnflags & FL_CLIENT) if (spawnflags & TO_NOCLIENTS && other.spawnflags & FL_CLIENT)
return; return;
if (GetMaster() == FALSE)
return;
eActivator = other; eActivator = other;
solid = SOLID_NOT; /* make inactive */ solid = SOLID_NOT; /* make inactive */
m_iValue = 1;
if (m_flDelay > 0) { if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay); CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else { } else {
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
} }
} }
void void
trigger_once::Respawn(void) trigger_once::Respawn(void)
{ {
m_iValue = 0;
solid = SOLID_TRIGGER; solid = SOLID_TRIGGER;
SetRenderMode(RM_TRIGGER); SetRenderMode(RM_TRIGGER);
InitBrushTrigger();
} }
void void
@ -81,5 +85,4 @@ trigger_once::trigger_once(void)
} }
CBaseTrigger::CBaseTrigger(); CBaseTrigger::CBaseTrigger();
InitBrushTrigger();
} }

View file

@ -40,7 +40,7 @@ class trigger_push:CBaseTrigger
virtual void(void) touch; virtual void(void) touch;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Trigger; virtual void(int state) Trigger;
virtual void(void) SetMovementDirection; virtual void(void) SetMovementDirection;
}; };
@ -60,12 +60,17 @@ trigger_push::SetMovementDirection(void)
} }
void void
trigger_push::Trigger(void) trigger_push::Trigger(int state)
{ {
if (solid == SOLID_NOT) { switch (state) {
solid = SOLID_TRIGGER; case TRIG_OFF:
} else {
solid = SOLID_NOT; solid = SOLID_NOT;
break;
case TRIG_ON:
solid = SOLID_TRIGGER;
break;
default:
solid = (solid == SOLID_NOT) ? SOLID_TRIGGER : SOLID_NOT;
} }
} }

View file

@ -14,12 +14,78 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
/*QUAKED trigger_relay (0 .5 .8) ? /*QUAKED trigger_relay (0 .5 .8) ? TRLY_ONCE
"targetname" Name "targetname" Name
"target" Target when triggered. "target" Target when triggered.
"killtarget" Target to kill when triggered. "killtarget" Target to kill when triggered.
"delay" Delay til the target is triggered.
"triggerstate" Desired state of the triggered entity.
See trigger_once. This is an inbetween trigger that forces a desired output state
instead of toggling e.g. a door open.
When the spawnflag TRLY_ONCE is set, the trigger_relay will be removed upon
triggering its targets.
*/ */
CLASSEXPORT(trigger_relay, trigger_once) enumflags
{
TRLY_ONCE,
};
enum
{
TRL_STATE_OFF,
TRL_STATE_ON,
TRL_STATE_TOGGLE
};
class trigger_relay:CBaseTrigger
{
int m_iTriggerState;
int m_iEnabled;
void(void) trigger_relay;
virtual void(int) Trigger;
virtual void(void) Respawn;
};
void
trigger_relay::Trigger(int state)
{
if (m_iEnabled == FALSE)
return;
if (spawnflags & TRLY_ONCE)
m_iEnabled = FALSE;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_iTriggerState, m_flDelay);
} else {
CBaseTrigger::UseTargets(m_iTriggerState);
}
}
void
trigger_relay::Respawn(void)
{
m_iEnabled = TRUE;
}
void
trigger_relay::trigger_relay(void)
{
CBaseTrigger::CBaseTrigger();
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {
case "delay":
m_flDelay = stof(argv(i+1));
break;
case "triggerstate":
m_iTriggerState = stoi(argv(i+1));
break;
default:
break;
}
}
}

View file

@ -94,7 +94,7 @@ item_c4::Logic(void)
for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) { for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) {
CBaseTrigger trigger = (CBaseTrigger)e; CBaseTrigger trigger = (CBaseTrigger)e;
if (trigger.Trigger != __NULL__) { if (trigger.Trigger != __NULL__) {
trigger.Trigger(); trigger.Trigger(TRIG_TOGGLE);
} }
} }

View file

@ -37,7 +37,7 @@ void item_suit::touch(void)
sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM);
pl.g_items |= ITEM_SUIT; pl.g_items |= ITEM_SUIT;
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (cvar("sv_playerslots") == 1) { if (cvar("sv_playerslots") == 1) {
remove(self); remove(self);

View file

@ -47,7 +47,7 @@ void item_longjump::touch(void)
sound(other, CHAN_VOICE, "fvox/powermove_on.wav", 1, ATTN_NORM); sound(other, CHAN_VOICE, "fvox/powermove_on.wav", 1, ATTN_NORM);
pl.g_items |= ITEM_LONGJUMP; pl.g_items |= ITEM_LONGJUMP;
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (real_owner || cvar("sv_playerslots") == 1) { if (real_owner || cvar("sv_playerslots") == 1) {
remove(self); remove(self);

View file

@ -45,8 +45,9 @@ void item_suit::touch(void)
sound(other, CHAN_ITEM, "fvox/bell.wav", 1, ATTN_NORM); sound(other, CHAN_ITEM, "fvox/bell.wav", 1, ATTN_NORM);
sound(other, CHAN_VOICE, "fvox/hev_logon.wav", 1, ATTN_NORM); sound(other, CHAN_VOICE, "fvox/hev_logon.wav", 1, ATTN_NORM);
pl.g_items |= ITEM_SUIT; pl.g_items |= ITEM_SUIT;
m_iValue = TRUE;
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (real_owner || cvar("sv_playerslots") == 1) { if (real_owner || cvar("sv_playerslots") == 1) {
remove(self); remove(self);
@ -64,6 +65,7 @@ void item_suit::Respawn(void)
SetSize(VEC_HULL_MIN, VEC_HULL_MAX); SetSize(VEC_HULL_MIN, VEC_HULL_MAX);
SetOrigin(m_oldOrigin); SetOrigin(m_oldOrigin);
SetModel(m_oldModel); SetModel(m_oldModel);
m_iValue = FALSE;
think = __NULL__; think = __NULL__;
nextthink = -1; nextthink = -1;

View file

@ -28,7 +28,7 @@ void item_pickup::touch(void)
Logging_Pickup(other, this, __NULL__); Logging_Pickup(other, this, __NULL__);
Sound_Play(other, CHAN_ITEM, "weapon.pickup"); Sound_Play(other, CHAN_ITEM, "weapon.pickup");
CBaseTrigger::UseTargets(); CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (real_owner || m_iWasDropped == 1 || cvar("sv_playerslots") == 1) { if (real_owner || m_iWasDropped == 1 || cvar("sv_playerslots") == 1) {
remove(self); remove(self);

View file

@ -83,6 +83,7 @@ monster_houndeye::AttackMelee(void)
think = AttackBlast; think = AttackBlast;
nextthink = m_flAnimTime; nextthink = m_flAnimTime;
return TRUE;
} }
void void