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_hlversion "1110"
-set gameinfo_svonly "0"
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"
-set gameinfo_pkgname "cg_gearbox"
// you don't really want to change these
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_dl "http://www.frag-net.com/mods/hunger.fmf"
-set gameinfo_menutrack "sound/song/you_are.wav"
// 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
-set gameinfo_pkgname "cg_hunger"
// you don't really want to change these
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_hlversion "1110"
-set gameinfo_svonly "0"
// 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"
-set gameinfo_pkgname "cg_rewolf"
// you don't really want to change these
RTCBROKER master.frag-net.com:27950

View File

@ -24,10 +24,7 @@ BASEGAME scihunt
-set gameinfo_url_info "www.richwhitehouse.com"
-set gameinfo_url_dl "http://www.frag-net.com/mods/scihunt.fmf"
-set gameinfo_menutrack "sound/Hondo2/pca.wav"
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"
-set gameinfo_pkgname "cg_scihunt"
// you don't really want to change these
RTCBROKER master.frag-net.com:27950

View File

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

View File

@ -343,7 +343,7 @@ CBaseMonster::FreeState(void)
if (trigger.Trigger != __NULL__) {
dprint(sprintf("^2CBaseMonster::^3FreeState^7: %s triggered %f\n", m_strRouteEnded, time));
trigger.Trigger();
trigger.Trigger(TRIG_TOGGLE);
} else {
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 */
if (m_iSequenceState == SEQUENCESTATE_ENDING) {
input_angles = v_angle = m_vecSequenceAngle;
input_angles = v_angle = angles = m_vecSequenceAngle;
SetFrame(m_flSequenceEnd);
} else if (movetype == MOVETYPE_WALK) {
SeeThink();

View File

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

View File

@ -20,34 +20,44 @@ enum
USE_CONTINOUS
};
enum
{
TRIG_TOGGLE,
TRIG_OFF,
TRIG_ON
};
class CBaseTrigger:CBaseEntity
{
int m_strGlobalState;
string m_strKillTarget;
string m_strMessage;
string m_strMaster;
float m_flDelay;
int m_iUseType;
int m_iTeam;
int m_iValue;
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) GetMaster;
virtual void(float) UseTargets_Delay;
virtual void(void) InitBrushTrigger;
virtual void(void) InitPointTrigger;
};
void
CBaseTrigger::UseTargets(void)
CBaseTrigger::UseTargets(int state)
{
for (entity eFind = world; (eFind = find(eFind, CBaseTrigger::m_strTargetName, m_strTarget));) {
CBaseTrigger trigger = (CBaseTrigger) eFind;
for (entity f = world; (f = find(f, CBaseTrigger::m_strTargetName, m_strTarget));) {
CBaseTrigger trigger = (CBaseTrigger)f;
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__) {
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
CBaseTrigger::UseTargets_Delay (float fDelay)
CBaseTrigger::UseTargets_Delay(int state, float fDelay)
{
static void Entities_UseTargets_Delay_Think(void) {
eActivator = self.owner;
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(self.health); /* ugly */
remove(self);
}
@ -112,10 +96,48 @@ CBaseTrigger::UseTargets_Delay (float fDelay)
eTimer.think = Entities_UseTargets_Delay_Think;
eTimer.m_strTarget = m_strTarget;
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
CBaseTrigger::Trigger(void)
CBaseTrigger::Trigger(int state)
{
}

View File

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

View File

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

View File

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

View File

@ -40,10 +40,10 @@ class env_fade:CBaseTrigger
float m_flFadeHold;
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, EV_FADE);

View File

@ -45,7 +45,7 @@ class env_global:CBaseTrigger
int m_iInitialState;
void(void) env_global;
virtual void(void) Trigger;
virtual void(int) Trigger;
virtual int(string) GlobalPresent;
virtual void(string, int) AddNewGlobal;
@ -53,7 +53,9 @@ class env_global:CBaseTrigger
virtual int(string) GetGlobal;
};
void env_global::Trigger(void) {
void
env_global::Trigger(int state)
{
int iOldValue = GetGlobal(m_strGlobalState);
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) {
if (argv(i) == strName) {
return 1;
@ -93,11 +97,14 @@ int env_global::GlobalPresent (string strName) {
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));
}
void env_global::SetGlobal (string strName, int iValue) {
void
env_global::SetGlobal(string strName, int iValue) {
string strNewData = "";
for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) {
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));
}
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) {
if (argv(i) == strName) {
return stoi(argv(i+1));
@ -116,7 +125,8 @@ int env_global::GetGlobal (string strName) {
return 0;
}
void env_global::env_global(void)
void
env_global::env_global(void)
{
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {

View File

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

View File

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

View File

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

View File

@ -37,12 +37,12 @@ class env_shake:CBaseTrigger
float m_flFrequency;
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, EV_SHAKE);
WriteFloat(MSG_MULTICAST, m_flRadius);

View File

@ -48,10 +48,11 @@ class env_shooter:CBaseTrigger
void(void) env_shooter;
virtual void(void) Respawn;
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); }
@ -77,18 +78,34 @@ void env_shooter::ShootGib(void)
}
}
void env_shooter::Trigger(void)
void
env_shooter::Trigger(int state)
{
think = ShootGib;
nextthink = time + m_flVariance;
switch (state) {
case TRIG_OFF:
think = __NULL__;
nextthink = 0.0f;
break;
case TRIG_ON:
think = ShootGib;
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;
}
void env_shooter::env_shooter(void)
void
env_shooter::env_shooter(void)
{
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {

View File

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

View File

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

View File

@ -115,14 +115,15 @@ class func_breakable:CBaseTrigger
void(void) func_breakable;
virtual void(void) Respawn;
virtual void(void) Explode;
virtual void(void) Trigger;
virtual void(int) Trigger;
virtual void(void) PlayerTouch;
/*virtual void(void) PressureDeath;*/
virtual void(int) Pain;
virtual void(int) Death;
};
void func_breakable::Pain (int body)
void
func_breakable::Pain(int body)
{
if (spawnflags & SF_TRIGGER) {
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));
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial);
FX_Explosion(rp);
Damage_Radius(rp, this, m_flExplodeMag, m_flExplodeMag * 2.5f, TRUE, 0);
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseEntity::Hide();
}
void func_breakable::Death(int body)
void
func_breakable::Death(int body)
{
static void break_spawnobject(void) {
/* 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);
} else {
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial);
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseEntity::Hide();
}
}
void func_breakable::Trigger(void)
void
func_breakable::Trigger(int state)
{
if (health > 0)
func_breakable::Death(0);
}
/*void func_breakable::PressureDeath(void)
/*void
func_breakable::PressureDeath(void)
{
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) {
return;
}
@ -252,7 +262,7 @@ void func_breakable::PlayerTouch(void)
if ((spawnflags & SF_PRESSURE) && (other.absmin[2] >= maxs[2] - 2)) {
touch = __NULL__;
think = Trigger;
think = TriggerWrap;
if (m_flDelay == 0) {
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();
@ -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];
precache_model(model);

View File

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

View File

@ -33,12 +33,13 @@ class func_conveyor:CBaseTrigger
void(void) func_conveyor;
virtual void(void) Respawn;
virtual void(void) Trigger;
virtual void(int) Trigger;
virtual void(void) touch;
virtual void(void) SetMovementDirection;
};
void func_conveyor::SetMovementDirection(void)
void
func_conveyor::SetMovementDirection(void)
{
if (angles == [0,-1,0]) {
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;
}
void func_conveyor::Trigger(void)
/* TODO: Handle state? */
void
func_conveyor::Trigger(int state)
{
/* changes direction */
m_flSpeed = -m_flSpeed;
}
void func_conveyor::Respawn(void)
void
func_conveyor::Respawn(void)
{
m_vecMoveDir = [0,0,0];
angles = m_oldAngle;
@ -87,7 +92,8 @@ void func_conveyor::Respawn(void)
SetAngles([0,0,0]);
}
void func_conveyor::func_conveyor(void)
void
func_conveyor::func_conveyor(void)
{
CBaseTrigger::CBaseTrigger();
}

View File

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

View File

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

View File

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

View File

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

View File

@ -52,18 +52,21 @@ class func_rotating:CBaseTrigger
void(void) func_rotating;
virtual void(void) Respawn;
virtual void(void) Trigger;
virtual void(int) Trigger;
virtual void(void) Rotate;
virtual void(void) Blocked;
virtual void(void) SetMovementDirection;
};
void func_rotating::Rotate(void)
void
func_rotating::Rotate(void)
{
nextthink = ltime + 10.0f;
}
void func_rotating::Trigger(void)
/* TODO: Handle state */
void
func_rotating::Trigger(int state)
{
if (vlen(avelocity)) {
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]) {
return;
@ -92,7 +96,8 @@ void func_rotating::Blocked(void)
}
}
void func_rotating::Respawn(void)
void
func_rotating::Respawn(void)
{
#ifdef GS_DEVELOPER
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) {
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);
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) NextPath;
virtual void(void) GoToTarget;
virtual void(void) Trigger;
virtual void(int) Trigger;
virtual void(void) Respawn;
};
@ -72,7 +72,7 @@ void func_tracktrain::NextPath(void)
GoToTarget();
}
void func_tracktrain::Trigger(void)
void func_tracktrain::Trigger(int state)
{
GoToTarget();
}

View File

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

View File

@ -24,10 +24,26 @@ On idTech 2 BSPs, it will change texture variants when triggered.
class func_wall:CBaseTrigger
{
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);
//angles = [0,0,0];
@ -37,8 +53,3 @@ void func_wall::func_wall(void)
SetOrigin(origin);
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;
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)
{
m_iVisible = 1 - m_iVisible;
switch (state) {
case TRIG_OFF:
m_iVisible = 0;
break;
case TRIG_ON:
m_iVisible = 1;
break;
default:
m_iVisible = 1 - m_iVisible;
}
if (m_iVisible) {
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;
solid = SOLID_BSP;
@ -60,11 +71,12 @@ void func_wall_toggle::Respawn(void)
m_oldmodelindex = modelindex;
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);
CBaseTrigger::CBaseTrigger();

View File

@ -61,10 +61,10 @@ class game_text:CBaseTrigger
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, EV_TEXT);

View File

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

View File

@ -60,18 +60,27 @@ class light:CBaseTrigger
string m_strPattern;
void(void) light;
virtual void(void) Trigger;
virtual void(int) Trigger;
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");
m_iEnabled = FALSE;
} else {
lightstyle(m_flStyle, m_strPattern);
m_iEnabled = TRUE;
}
}
@ -79,10 +88,10 @@ void light::Respawn(void)
{
if (spawnflags & 1) {
lightstyle(m_flStyle, "a");
m_iEnabled = FALSE;
m_iEnabled = 0;
} else {
lightstyle(m_flStyle, m_strPattern);
m_iEnabled = TRUE;
m_iEnabled = 1;
}
}

View File

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

View File

@ -46,7 +46,7 @@ class multi_manager:CBaseTrigger
int m_iBusy;
int m_iValue;
virtual void(void) Trigger;
virtual void(int) Trigger;
virtual int(void) GetValue;
};
@ -57,7 +57,7 @@ multi_manager::GetValue(void)
}
void
multi_manager::Trigger(void)
multi_manager::Trigger(int state)
{
static void mm_enttrigger (void) {
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",
this.classname, wow.m_strTarget, eFind.classname));
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
}
m_iValue = TRUE;

View File

@ -26,12 +26,13 @@ class multisource:CBaseTrigger
{
void(void) multisource;
virtual int(void) GetValue;
virtual void(void) Trigger;
virtual void(void) Respawn;
virtual int(void) QueryTargets;
virtual void(int) Trigger;
};
int
multisource::GetValue(void)
multisource::QueryTargets(void)
{
entity a;
int out = TRUE;
@ -39,36 +40,46 @@ multisource::GetValue(void)
/* normal triggers */
for (a = world; (a = find(a, CBaseTrigger::m_strTarget, m_strTargetName));) {
CBaseTrigger tTemp = (CBaseTrigger) a;
#ifdef GS_DEVELOPER
dprint("[^1MULTISOURCE^7] ");
dprint(tTemp.classname);
if (tTemp.GetValue() == FALSE) {
dprint(" is ^1OFF^7, name: ");
out = FALSE;
if (cvar("developer") == 1) {
dprint("[^1MULTISOURCE^7] ");
dprint(tTemp.classname);
if (tTemp.GetValue() == FALSE) {
dprint(" is ^1OFF^7, name: ");
out = FALSE;
} else {
dprint(" is ^2ON^7, name: ");
}
dprint(tTemp.m_strTargetName);
dprint("\n");
} else {
dprint(" is ^2ON^7, name: ");
/* exit out immediately as there's no point unless in-dev */
if (tTemp.GetValue() == FALSE) {
return FALSE;
}
}
dprint(tTemp.m_strTargetName);
dprint("\n");
#else
/* exit out immediately as there's no point unless in-dev */
if (tTemp.GetValue() == FALSE) {
return FALSE;
}
#endif
}
return out;
}
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;
}
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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -40,7 +40,7 @@ trigger_auto::Processing(void)
// This is weird, because ents may not be spawned yet.
// However, Half-Life doesn't care about this, either.
// So why should we?
CBaseTrigger::UseTargets_Delay(m_flDelay);
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
if (spawnflags & 1) {
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",
other.netname));
localcmd("save autosave\n");
//localcmd("save autosave\n");
Hide();
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay);
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
}
solid = SOLID_NOT;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -40,7 +40,7 @@ class trigger_push:CBaseTrigger
virtual void(void) touch;
virtual void(void) Respawn;
virtual void(void) Trigger;
virtual void(int state) Trigger;
virtual void(void) SetMovementDirection;
};
@ -60,12 +60,17 @@ trigger_push::SetMovementDirection(void)
}
void
trigger_push::Trigger(void)
trigger_push::Trigger(int state)
{
if (solid == SOLID_NOT) {
solid = SOLID_TRIGGER;
} else {
switch (state) {
case TRIG_OFF:
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.
*/
/*QUAKED trigger_relay (0 .5 .8) ?
/*QUAKED trigger_relay (0 .5 .8) ? TRLY_ONCE
"targetname" Name
"target" Target 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"));) {
CBaseTrigger trigger = (CBaseTrigger)e;
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);
pl.g_items |= ITEM_SUIT;
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (cvar("sv_playerslots") == 1) {
remove(self);

View File

@ -47,7 +47,7 @@ void item_longjump::touch(void)
sound(other, CHAN_VOICE, "fvox/powermove_on.wav", 1, ATTN_NORM);
pl.g_items |= ITEM_LONGJUMP;
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (real_owner || cvar("sv_playerslots") == 1) {
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_VOICE, "fvox/hev_logon.wav", 1, ATTN_NORM);
pl.g_items |= ITEM_SUIT;
m_iValue = TRUE;
CBaseTrigger::UseTargets();
CBaseTrigger::UseTargets(TRIG_TOGGLE);
if (real_owner || cvar("sv_playerslots") == 1) {
remove(self);
@ -64,6 +65,7 @@ void item_suit::Respawn(void)
SetSize(VEC_HULL_MIN, VEC_HULL_MAX);
SetOrigin(m_oldOrigin);
SetModel(m_oldModel);
m_iValue = FALSE;
think = __NULL__;
nextthink = -1;

View File

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

View File

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