CBaseTrigger/s: Overhauled the system to keep proper track of its activators. This was important in some mods who'd e.g. call a trigger_camera over longer periods of time and expected to target the same player as before as part of a multi_manager.

This commit is contained in:
Marco Cawthorne 2020-08-10 12:32:18 +02:00
parent d8ce029466
commit d3b488b7bf
55 changed files with 190 additions and 206 deletions

View File

@ -257,6 +257,7 @@ CSQC_UpdateView(float w, float h, float focus)
setproperty(VF_CL_VIEWANGLES, view_angles);
setproperty(VF_ANGLES, view_angles);
} else {
pSeat->m_vecCameraOrigin = [0,0,0];
if (pl.health) {
if (autocvar_cl_thirdperson == TRUE) {
makevectors(view_angles);
@ -525,15 +526,25 @@ CSQC_Parse_Event(void)
GameMessage_Parse();
break;
case EV_CAMERATRIGGER:
pSeat->m_vecCameraOrigin[0] = readcoord();
pSeat->m_vecCameraOrigin[1] = readcoord();
pSeat->m_vecCameraOrigin[2] = readcoord();
vector cam_newpos;
cam_newpos[0] = readcoord();
cam_newpos[1] = readcoord();
cam_newpos[2] = readcoord();
pSeat->m_vecCameraAngle[0] = readcoord();
pSeat->m_vecCameraAngle[1] = readcoord();
pSeat->m_vecCameraAngle[2] = readcoord();
pSeat->m_flCameraTime = time + readfloat();
/* if the same camera as last-time (hack) is still active,
then make sure it becomes inactive... */
if (pSeat->m_vecCameraOrigin == cam_newpos) {
pSeat->m_flCameraTime = 0.0f;
} else {
pSeat->m_vecCameraOrigin = cam_newpos;
}
break;
case EV_ANGLE:
vector a;

View File

@ -6,6 +6,7 @@
#define VALVE
#define GEARBOX
#define GS_RENDERFX
#define CLASSIC_VGUI
#includelist
../../shared/fteextensions.qc

View File

@ -65,7 +65,7 @@ server/trigger_relay.cpp
server/env_shooter.cpp
server/gibshooter.cpp
server/env_beverage.cpp
server/env_global.cpp
//server/env_global.cpp
server/env_laser.cpp
server/item_food.cpp
server/speaker.cpp

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(TRIG_TOGGLE);
trigger.Trigger(this, TRIG_TOGGLE);
} else {
dprint(sprintf("^1CBaseMonster::^3FreeState^7: %s not a valid trigger\n", m_strRouteEnded));
}

View File

@ -40,9 +40,9 @@ class CBaseTrigger:CBaseEntity
void(void) CBaseTrigger;
virtual void(int) Trigger;
virtual void(int) UseTargets;
virtual void(int, float) UseTargets_Delay;
virtual void(entity, int) Trigger;
virtual void(entity, int) UseTargets;
virtual void(entity, int, float) UseTargets_Delay;
virtual int(void) GetValue;
virtual int(void) GetMaster;
virtual void(void) InitBrushTrigger;
@ -50,14 +50,14 @@ class CBaseTrigger:CBaseEntity
};
void
CBaseTrigger::UseTargets(int state)
CBaseTrigger::UseTargets(entity act, int state)
{
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, f.classname, trigger.m_strTargetName));
dprint(sprintf("^2%s::^3UseTargets^7: Triggering %s `%s` from %s\n",
this.classname, f.classname, trigger.m_strTargetName, act.classname));
if (trigger.Trigger != __NULL__) {
trigger.Trigger(state);
trigger.Trigger(act, state);
}
}
@ -66,8 +66,8 @@ CBaseTrigger::UseTargets(int state)
print(m_strMessage);
print("\n");
} else {
if (m_strMessage && eActivator.flags & FL_CLIENT) {
centerprint(eActivator, m_strMessage);
if (m_strMessage && act.flags & FL_CLIENT) {
centerprint(act, m_strMessage);
}
}*/
@ -80,11 +80,10 @@ CBaseTrigger::UseTargets(int state)
}
void
CBaseTrigger::UseTargets_Delay(int state, float fDelay)
CBaseTrigger::UseTargets_Delay(entity act, int state, float fDelay)
{
static void Entities_UseTargets_Delay_Think(void) {
eActivator = self.owner;
CBaseTrigger::UseTargets(self.health); /* ugly */
CBaseTrigger::UseTargets(self.owner, self.health); /* ugly */
remove(self);
}
@ -92,7 +91,7 @@ CBaseTrigger::UseTargets_Delay(int state, float fDelay)
this.classname, m_strTarget));
CBaseTrigger eTimer = spawn(CBaseTrigger);
eTimer.owner = eActivator;
eTimer.owner = act;
eTimer.think = Entities_UseTargets_Delay_Think;
eTimer.m_strTarget = m_strTarget;
eTimer.nextthink = time + fDelay;
@ -137,7 +136,7 @@ CBaseTrigger::GetMaster(void)
}
void
CBaseTrigger::Trigger(int state)
CBaseTrigger::Trigger(entity act, int state)
{
}

View File

@ -38,7 +38,7 @@ class button_target:CBaseTrigger
void(void) button_target;
virtual void(void) Respawn;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(int) Damage;
};
@ -47,7 +47,7 @@ button_target::Respawn(void)
{
/* yuck */
static void PUseWrapper(void) {
Trigger(TRIG_TOGGLE);
Trigger(eActivator, TRIG_TOGGLE);
}
SetMovetype(MOVETYPE_PUSH);
@ -69,20 +69,20 @@ button_target::Respawn(void)
}
void
button_target::Trigger(int status)
button_target::Trigger(entity act, int status)
{
/* make unusable */
PlayerUse = __NULL__;
takedamage = DAMAGE_NO;
frame = 1 - frame;
UseTargets(status);
UseTargets(act, status);
}
void
button_target::Damage(int hit)
{
Trigger(TRIG_TOGGLE); /* TODO: Set state? */
Trigger(g_dmg_eAttacker, TRIG_TOGGLE); /* TODO: Set state? */
}
void

View File

@ -46,11 +46,11 @@ class env_beverage:CBaseTrigger
int m_iReady;
int m_iSkin;
void(void) env_beverage;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
env_beverage::Trigger(int unused)
env_beverage::Trigger(entity act, int unused)
{
if (m_iReady == FALSE || m_iUses <= 0) {
return;

View File

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

View File

@ -40,10 +40,10 @@ class env_fade:CBaseTrigger
float m_flFadeHold;
void(void) env_fade;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void env_fade::Trigger(int state)
void env_fade::Trigger(entity act, int state)
{
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_FADE);
@ -54,7 +54,7 @@ void env_fade::Trigger(int state)
WriteFloat(MSG_MULTICAST, m_flFadeDuration);
WriteFloat(MSG_MULTICAST, m_flFadeHold);
WriteByte(MSG_MULTICAST, spawnflags);
msg_entity = eActivator;
msg_entity = act;
if (spawnflags & EVF_ONLYUSER) {
multicast([0,0,0], MULTICAST_ONE_R);

View File

@ -54,7 +54,7 @@ class env_laser:CBaseTrigger
void(void) env_laser;
virtual void(void) think;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
virtual void(void) ParentUpdate;
virtual float(entity, float) SendEntity;
@ -85,7 +85,7 @@ void env_laser::think(void)
}
}
void env_laser::Trigger(int state)
void env_laser::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:

View File

@ -41,11 +41,11 @@ class env_message:CBaseTrigger
void(void) env_message;
virtual void(int) Play;
virtual void(entity, int) Play;
virtual void(void) Respawn;
};
void env_message::Play(int state)
void env_message::Play(entity act, int state)
{
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_MESSAGE);
@ -58,7 +58,7 @@ void env_message::Play(int state)
msg_entity = this;
multicast(origin, MULTICAST_ALL);
} else {
msg_entity = eActivator;
msg_entity = act;
multicast(origin, MULTICAST_ONE_R);
}

View File

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

View File

@ -37,10 +37,10 @@ class env_shake:CBaseTrigger
float m_flFrequency;
void(void) env_shake;
virtual void(int) Trigger;
virtual void(entity act, int) Trigger;
};
void env_shake::Trigger(int state)
void env_shake::Trigger(entity act, int state)
{
for (entity e = world; (e = find(e, ::classname, "player"));) {
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
@ -54,7 +54,7 @@ void env_shake::Trigger(int state)
}
}
void env_shake::env_shake (void)
void env_shake::env_shake(void)
{
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {

View File

@ -48,7 +48,7 @@ class env_shooter:CBaseTrigger
void(void) env_shooter;
virtual void(void) Respawn;
virtual void(void) ShootGib;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
@ -79,7 +79,7 @@ env_shooter::ShootGib(void)
}
void
env_shooter::Trigger(int state)
env_shooter::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:
@ -92,9 +92,9 @@ env_shooter::Trigger(int state)
break;
default:
if (think == __NULL__)
Trigger(TRIG_ON);
Trigger(act, TRIG_ON);
else
Trigger(TRIG_OFF);
Trigger(act, TRIG_OFF);
}
}

View File

@ -51,7 +51,7 @@ class env_spark:CBaseTrigger
void(void) env_spark;
virtual void(void) CreateSpark;
virtual void(void) TimedSpark;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
};
@ -69,7 +69,7 @@ void env_spark::TimedSpark(void)
}
/* TODO: Implement state */
void env_spark::Trigger(int state)
void env_spark::Trigger(entity act, 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(int) Trigger;
virtual void(entity, int) Trigger;
virtual float(entity, float) Network;
};
@ -92,7 +92,7 @@ void env_sprite::NetworkOnce(void)
}
/* TODO: Implement state */
void env_sprite::Trigger(int state)
void env_sprite::Trigger(entity act, int state)
{
if (spawnflags & ENVS_PLAYONCE) {
NetworkOnce();

View File

@ -115,7 +115,7 @@ class func_breakable:CBaseTrigger
void(void) func_breakable;
virtual void(void) Respawn;
virtual void(void) Explode;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) PlayerTouch;
/*virtual void(void) PressureDeath;*/
virtual void(int) Pain;
@ -167,7 +167,7 @@ func_breakable::Explode(void)
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(TRIG_TOGGLE);
CBaseTrigger::UseTargets(this, TRIG_TOGGLE);
CBaseEntity::Hide();
}
@ -218,13 +218,14 @@ 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(TRIG_TOGGLE);
/* TODO: ability to have whoever destroyed the crate be the activator */
CBaseTrigger::UseTargets(this, TRIG_TOGGLE);
CBaseEntity::Hide();
}
}
void
func_breakable::Trigger(int state)
func_breakable::Trigger(entity act, int state)
{
if (health > 0)
func_breakable::Death(0);
@ -240,7 +241,8 @@ void
func_breakable::PlayerTouch(void)
{
static void TriggerWrap(void) {
Trigger(TRIG_TOGGLE);
/* TODO: 'this' should be the person who touched the ent instead */
Trigger(this, TRIG_TOGGLE);
}
if (other.classname == classname) {

View File

@ -133,7 +133,7 @@ class func_button:CBaseTrigger
virtual void(void) MoveAway;
virtual void(void) Touch;
virtual void(void) Blocked;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Use;
virtual void(int) Pain;
virtual void(int) Death;
@ -235,7 +235,7 @@ void func_button::MoveAway(void)
}
/* TODO: Handle state */
void func_button::Trigger(int state)
void func_button::Trigger(entity act, int state)
{
if (m_flNextTrigger > time) {
return;
@ -260,17 +260,16 @@ void func_button::Trigger(int state)
MoveAway();
if (m_flDelay) {
UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
UseTargets(TRIG_TOGGLE);
UseTargets(act, TRIG_TOGGLE);
}
}
void func_button::Touch(void)
{
if (other.movetype == MOVETYPE_WALK) {
eActivator = other;
Trigger(TRIG_TOGGLE);
Trigger(other, TRIG_TOGGLE);
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {
touch = __NULL__;
@ -280,7 +279,7 @@ void func_button::Touch(void)
void func_button::Use(void)
{
Trigger(TRIG_TOGGLE);
Trigger(eActivator, TRIG_TOGGLE);
}
void func_button::Pain (int body)
@ -290,7 +289,7 @@ void func_button::Pain (int body)
void func_button::Death (int body)
{
Trigger(TRIG_TOGGLE);
Trigger(g_dmg_eAttacker, TRIG_TOGGLE);
health = m_oldHealth;
}

View File

@ -33,7 +33,7 @@ class func_conveyor:CBaseTrigger
void(void) func_conveyor;
virtual void(void) Respawn;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) touch;
virtual void(void) SetMovementDirection;
};
@ -59,7 +59,7 @@ func_conveyor::touch(void)
/* TODO: Handle state? */
void
func_conveyor::Trigger(int state)
func_conveyor::Trigger(entity act, int state)
{
/* changes direction */
m_flSpeed = -m_flSpeed;

View File

@ -98,7 +98,7 @@ class func_door:CBaseTrigger
virtual void(void) Arrived;
virtual void(void) Returned;
virtual void(void) Respawn;
virtual void(int) Trigger;
virtual void(entity, 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(TRIG_TOGGLE);
Trigger(eActivator, TRIG_TOGGLE);
}
void
@ -154,7 +154,7 @@ func_door::Returned(void)
t = (CBaseTrigger)find(world, CBaseTrigger::m_strTargetName, m_strFire);
if (t) {
t.Trigger(TRIG_TOGGLE);
t.Trigger(this, TRIG_TOGGLE);
}
}
@ -205,7 +205,7 @@ func_door::MoveAway(void)
}
void
func_door::Trigger(int state)
func_door::Trigger(entity act, int state)
{
if (GetMaster() == 0)
return;
@ -220,9 +220,9 @@ func_door::Trigger(int state)
/* only trigger stuff once we are done moving */
if ((m_iState == DOORSTATE_RAISED) || (m_iState == DOORSTATE_LOWERED)) {
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
}
@ -252,8 +252,7 @@ func_door::Touch(void)
if (other.movetype == MOVETYPE_WALK) {
if (other.absmin[2] <= maxs[2] - 2) {
eActivator = other;
Trigger(TRIG_TOGGLE);
Trigger(other, TRIG_TOGGLE);
}
}
}
@ -267,9 +266,9 @@ func_door::Blocked(void)
if (m_flWait >= 0) {
if (m_iState == DOORSTATE_DOWN) {
MoveAway ();
MoveAway();
} else {
MoveBack ();
MoveBack();
}
}
}

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(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Use;
virtual void(void) Touch;
virtual void(void) Blocked;
@ -196,15 +196,15 @@ void func_door_rotating::Away(void)
RotToDest(m_vecPos2 * fDirection, Arrived);
}
void func_door_rotating::Trigger(int state)
void func_door_rotating::Trigger(entity act, int state)
{
if (GetMaster() == FALSE) {
return;
}
if (m_flNextAction > time) {
return;
}
m_flNextAction = time + m_flWait;
if (state == TRIG_TOGGLE) {
@ -222,16 +222,16 @@ void func_door_rotating::Trigger(int state)
if (m_flDelay) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
}
void func_door_rotating::Use(void)
{
eActivator.gflags &= ~GF_USE_RELEASED;
Trigger(TRIG_TOGGLE);
Trigger(eActivator, TRIG_TOGGLE);
}
void func_door_rotating::Touch(void)
@ -239,14 +239,12 @@ void func_door_rotating::Touch(void)
if (spawnflags & SF_ROT_USE) {
return;
}
if (m_iLocked) {
return;
}
if (other.movetype == MOVETYPE_WALK) {
eActivator = other;
Trigger(TRIG_TOGGLE);
Trigger(other, TRIG_TOGGLE);
}
touch = __NULL__;
}

View File

@ -37,7 +37,7 @@ class func_guntarget:CBaseTrigger
virtual void(void) NextPath;
virtual void(void) Move;
virtual void(void) Stop;
virtual void(int) Trigger;
virtual void(entity act, int) Trigger;
virtual void(int) Death;
};
@ -104,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(TRIG_TOGGLE);
trigger.Trigger(g_dmg_eAttacker, TRIG_TOGGLE);
}
}
@ -117,7 +117,7 @@ void func_guntarget::Stop(void)
}
/* TODO: Handle state? */
void func_guntarget::Trigger(int state)
void func_guntarget::Trigger(entity act, int state)
{
flags = (1 << FL_FROZEN) | flags;
@ -135,7 +135,7 @@ void func_guntarget::Trigger(int state)
void func_guntarget::Respawn(void)
{
static void ThinkWrap(void) {
Trigger(TRIG_TOGGLE);
Trigger(this, TRIG_TOGGLE);
}
SetSolid(SOLID_BSP);

View File

@ -45,7 +45,7 @@ class func_pendulum:CBaseTrigger
virtual void(void) customphysics;
virtual void(void) Respawn;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
@ -67,7 +67,7 @@ func_pendulum::customphysics(void)
}
void
func_pendulum::Trigger(int state)
func_pendulum::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:

View File

@ -52,7 +52,7 @@ class func_rotating:CBaseTrigger
void(void) func_rotating;
virtual void(void) Respawn;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Rotate;
virtual void(void) Blocked;
virtual void(void) SetMovementDirection;
@ -66,7 +66,7 @@ func_rotating::Rotate(void)
/* TODO: Handle state */
void
func_rotating::Trigger(int state)
func_rotating::Trigger(entity act, int state)
{
if (vlen(avelocity)) {
avelocity = [0,0,0];

View File

@ -31,7 +31,7 @@ class func_tracktrain:CBaseTrigger
virtual void(void) Find;
virtual void(void) NextPath;
virtual void(void) GoToTarget;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
};
@ -72,7 +72,7 @@ void func_tracktrain::NextPath(void)
GoToTarget();
}
void func_tracktrain::Trigger(int state)
void func_tracktrain::Trigger(entity act, 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(int) Trigger;
virtual void(entity, 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(TRIG_TOGGLE);
eNode.Trigger(this, TRIG_TOGGLE);
}
/* stuff for the ears */
@ -195,7 +195,7 @@ func_train::NextPath(void)
/* TODO: Handle state? */
void
func_train::Trigger(int state)
func_train::Trigger(entity act, int state)
{
GoToTarget();
}

View File

@ -24,11 +24,11 @@ On idTech 2 BSPs, it will change texture variants when triggered.
class func_wall:CBaseTrigger
{
void(void) func_wall;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
func_wall::Trigger(int state)
func_wall::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:

View File

@ -34,11 +34,11 @@ class func_wall_toggle:CBaseTrigger
void(void) func_wall_toggle;
virtual void(void) Respawn;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
func_wall_toggle::Trigger(int state)
func_wall_toggle::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:
@ -71,7 +71,7 @@ func_wall_toggle::Respawn(void)
m_oldmodelindex = modelindex;
if (spawnflags & FTW_STARTHIDDEN) {
Trigger(TRIG_OFF);
Trigger(this, TRIG_OFF);
}
}

View File

@ -61,10 +61,10 @@ class game_text:CBaseTrigger
void(void) game_text;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void game_text::Trigger(int state)
void game_text::Trigger(entity act, int state)
{
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_TEXT);
@ -88,7 +88,7 @@ void game_text::Trigger(int state)
msg_entity = this;
multicast(origin, MULTICAST_ALL);
} else {
msg_entity = eActivator;
msg_entity = act;
multicast(origin, MULTICAST_ONE_R);
}
}

View File

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

View File

@ -60,11 +60,11 @@ class light:CBaseTrigger
string m_strPattern;
void(void) light;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
};
void light::Trigger(int state)
void light::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:

View File

@ -49,31 +49,23 @@ class monstermaker:CBaseTrigger
int m_iTotalMonsters;
float m_flDelay;
int m_iMaxChildren;
int m_iEnabled;
string m_strChildName;
void(void) monstermaker;
virtual void(void) Spawner;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
virtual void(void) TurnOn;
virtual void(void) TurnOff;
virtual int(void) GetValue;
};
int
monstermaker::GetValue(void)
{
return m_iEnabled;
}
void
monstermaker::TurnOff(void)
{
think = __NULL__;
nextthink = 0;
m_iEnabled = 0;
m_iValue = 0;
}
void
@ -81,7 +73,7 @@ monstermaker::TurnOn(void)
{
think = Spawner;
nextthink = time + m_flDelay;
m_iEnabled = 1;
m_iValue = 1;
}
void
@ -142,7 +134,7 @@ monstermaker::Spawner(void)
m_iMonsterSpawned++;
if (m_strTarget) {
UseTargets(TRIG_TOGGLE);
UseTargets(this, TRIG_TOGGLE);
}
/* inherit the monsterclip flag */
@ -170,7 +162,7 @@ monstermaker::Spawner(void)
}
void
monstermaker::Trigger(int state)
monstermaker::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:
@ -180,7 +172,7 @@ monstermaker::Trigger(int state)
TurnOn();
break;
default:
if (m_iEnabled)
if (m_iValue)
TurnOff();
else
TurnOn();

View File

@ -29,16 +29,10 @@ again before it has finished triggering it's previous list of entities.
class multi_manager_sub:CBaseTrigger
{
entity m_eActivator;
int m_iValue;
virtual int(void) GetValue;
};
int
multi_manager_sub::GetValue(void)
{
return m_iValue;
}
class multi_manager:CBaseTrigger
{
multi_manager_sub m_eTriggers[16];
@ -46,18 +40,12 @@ class multi_manager:CBaseTrigger
int m_iBusy;
int m_iValue;
virtual void(int) Trigger;
virtual int(void) GetValue;
virtual void(entity, int) Trigger;
};
int
multi_manager::GetValue(void)
{
return m_iValue;
}
void
multi_manager::Trigger(int state)
multi_manager::Trigger(entity act, int state)
{
static void mm_enttrigger (void) {
multi_manager_sub wow = (multi_manager_sub)self;
@ -67,7 +55,7 @@ multi_manager::Trigger(int state)
dprint(sprintf("^2%s::^3Trigger^7: %s (%s)\n",
this.classname, wow.m_strTarget, eFind.classname));
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(wow.m_eActivator, TRIG_TOGGLE);
}
m_iValue = TRUE;
@ -95,6 +83,7 @@ multi_manager::Trigger(int state)
m_eTriggers[b].think = mm_enttrigger;
m_eTriggers[b].nextthink = time + stof(argv(i+1));
m_eTriggers[b].m_iValue = TRUE;
m_eTriggers[b].m_eActivator = act;
b++;
}
}

View File

@ -28,7 +28,7 @@ class multisource:CBaseTrigger
virtual void(void) Respawn;
virtual int(void) QueryTargets;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
int
@ -63,7 +63,7 @@ multisource::QueryTargets(void)
}
void
multisource::Trigger(int unused)
multisource::Trigger(entity act, int unused)
{
if (QueryTargets() == FALSE) {
dprint(sprintf("[^1MULTISOURCE^7] %s is inactive.\n", m_strTargetName));
@ -73,7 +73,7 @@ multisource::Trigger(int unused)
dprint(sprintf("[^1MULTISOURCE^7] %s is now active.\n", m_strTargetName));
m_iValue = TRUE;
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
void

View File

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

View File

@ -36,7 +36,7 @@ class player_loadsaved:CBaseTrigger
float m_flFadeHold;
void(void) player_loadsaved;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) ReloadSave;
};
@ -47,7 +47,7 @@ player_loadsaved::ReloadSave(void)
}
void
player_loadsaved::Trigger(int unused)
player_loadsaved::Trigger(entity act, int unused)
{
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_FADE);
@ -60,7 +60,7 @@ player_loadsaved::Trigger(int unused)
WriteByte(MSG_MULTICAST, 0);
msg_entity = world;
multicast([0,0,0], MULTICAST_ALL);
env_message_single(eActivator, m_strMessage);
env_message_single(act, m_strMessage);
think = ReloadSave;
nextthink = time + m_flLoadTime;

View File

@ -23,19 +23,19 @@ Strips the activator of all of its weapons.
class player_weaponstrip:CBaseTrigger
{
void(void) player_weaponstrip;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
player_weaponstrip::Trigger(int unused)
player_weaponstrip::Trigger(entity act, int unused)
{
base_player pl;
if (!(eActivator.flags & FL_CLIENT)) {
if (!(act.flags & FL_CLIENT)) {
return;
}
pl = (base_player)eActivator;
pl = (base_player)act;
for (int i = 1; i < Weapon_GetCount(); i++) {
pl.g_items &= ~Weapon_GetBitID(i);

View File

@ -38,11 +38,11 @@ class scripted_sentence:CBaseTrigger
float m_flDuration;
void(void) scripted_sentence;
virtual void(int state) Trigger;
virtual void(entity, int) Trigger;
};
void
scripted_sentence::Trigger(int unused)
scripted_sentence::Trigger(entity act, 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(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) InitIdle;
virtual void(void) Respawn;
};
void
scripted_sequence::Trigger(int unused)
scripted_sequence::Trigger(entity act, int unused)
{
CBaseMonster f;
float duration;

View File

@ -41,7 +41,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_iTriggerState, m_flDelay);
CBaseTrigger::UseTargets_Delay(this, m_iTriggerState, m_flDelay);
if (spawnflags & 1) {
dprint(sprintf("^2trigger_auto::^3think^7: %s triggerer removed self\n", m_strTarget));

View File

@ -33,8 +33,6 @@ class trigger_autosave:CBaseTrigger
void
trigger_autosave::touch(void)
{
eActivator = other;
/* saved text */
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_MESSAGE);
@ -48,13 +46,13 @@ trigger_autosave::touch(void)
dprint(sprintf("^2trigger_autosave::^3touch^7: %s called autosave\n",
other.netname));
//localcmd("save autosave\n");
//readcmd("save autosave\n");
Hide();
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
solid = SOLID_NOT;
}

View File

@ -30,16 +30,16 @@ class trigger_camera:CBaseTrigger
float m_flWait;
void(void) trigger_camera;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
};
void
trigger_camera::Trigger(int state)
trigger_camera::Trigger(entity act, int state)
{
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
if (m_strMoveTo) {
@ -49,7 +49,7 @@ trigger_camera::Trigger(int state)
}
}
Client_TriggerCamera(eActivator, origin, angles, m_flWait);
Client_TriggerCamera(act, origin, angles, m_flWait);
//eActivator.view2 = this;
dprint(sprintf("^2trigger_camera::^3Trigger^7: Camera at %v, %v, for %f sec/s requested\n",

View File

@ -26,15 +26,15 @@ class trigger_cdaudio:CBaseTrigger
int m_iCDTrack;
void(void) trigger_cdaudio;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
virtual void(void) touch;
};
void
trigger_cdaudio::Trigger(int unused)
trigger_cdaudio::Trigger(entity act, int unused)
{
if (!(other.flags & FL_CLIENT)) {
if (!(act.flags & FL_CLIENT)) {
return;
}
@ -53,7 +53,7 @@ trigger_cdaudio::Trigger(int unused)
void
trigger_cdaudio::touch(void)
{
Trigger(TRIG_TOGGLE);
Trigger(other, TRIG_TOGGLE);
}
void

View File

@ -53,7 +53,7 @@ class trigger_changelevel:CBaseTrigger
void(void) trigger_changelevel;
virtual void(void) Change;
virtual void(int) Trigger;
virtual void(entity, 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(int unused)
trigger_changelevel::Trigger(entity act, int unused)
{
/* this means a delayed trigger is active */
if (nextthink > 0.0f)
@ -122,8 +122,7 @@ trigger_changelevel::Trigger(int unused)
void
trigger_changelevel::TouchTrigger(void)
{
eActivator = other;
Trigger(TRIG_TOGGLE);
Trigger(other, TRIG_TOGGLE);
}
void

View File

@ -45,13 +45,13 @@ class trigger_hurt:CBaseTrigger
float m_flDelay;
void(void) trigger_hurt;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) touch;
virtual void(void) Respawn;
};
void
trigger_hurt::Trigger(int state)
trigger_hurt::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:
@ -63,9 +63,9 @@ trigger_hurt::Trigger(int state)
break;
default:
if (solid == SOLID_NOT)
Trigger(TRIG_ON);
Trigger(act, TRIG_ON);
else
Trigger(TRIG_OFF);
Trigger(act, TRIG_OFF);
}
}
@ -87,17 +87,17 @@ trigger_hurt::touch(void)
if (other.flags & FL_CLIENT) {
eActivator = other;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
}
} else {
eActivator = other;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
}
}
@ -109,7 +109,7 @@ trigger_hurt::touch(void)
/* shut it down if used once */
if (spawnflags & SF_HURT_ONCE) {
Trigger(TRIG_OFF);
Trigger(other, TRIG_OFF);
}
m_flNextTrigger = time + m_flNextDmg;
@ -122,9 +122,9 @@ trigger_hurt::Respawn(void)
m_flNextTrigger = 0.0f;
if (spawnflags & SF_HURT_OFF) {
Trigger(TRIG_OFF);
Trigger(this, TRIG_OFF);
} else {
Trigger(TRIG_ON);
Trigger(this, TRIG_ON);
}
}

View File

@ -89,9 +89,9 @@ trigger_look::Touch(void)
/* trigger and disable entity, for now */
if (m_flDelay > 0) {
UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
UseTargets(TRIG_TOGGLE);
UseTargets(other, TRIG_TOGGLE);
}
solid = SOLID_NOT;
}

View File

@ -46,8 +46,6 @@ class trigger_multiple:CBaseTrigger
void
trigger_multiple::touch(void)
{
eActivator = other;
if (GetMaster() == FALSE)
return;
@ -62,9 +60,9 @@ trigger_multiple::touch(void)
}
if (m_flDelay > 0) {
UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
UseTargets(TRIG_TOGGLE);
UseTargets(other, TRIG_TOGGLE);
}
/* This is effectively a trigger_once...*/

View File

@ -51,14 +51,13 @@ trigger_once::touch(void)
if (GetMaster() == FALSE)
return;
eActivator = other;
solid = SOLID_NOT; /* make inactive */
m_iValue = 1;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay);
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
}

View File

@ -40,7 +40,7 @@ class trigger_push:CBaseTrigger
virtual void(void) touch;
virtual void(void) Respawn;
virtual void(int state) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) SetMovementDirection;
};
@ -60,7 +60,7 @@ trigger_push::SetMovementDirection(void)
}
void
trigger_push::Trigger(int state)
trigger_push::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:

View File

@ -39,12 +39,12 @@ class trigger_relay:CBaseTrigger
int m_iEnabled;
void(void) trigger_relay;
virtual void(int) Trigger;
virtual void(entity, int) Trigger;
virtual void(void) Respawn;
};
void
trigger_relay::Trigger(int state)
trigger_relay::Trigger(entity act, int state)
{
if (m_iEnabled == FALSE)
return;
@ -52,9 +52,9 @@ trigger_relay::Trigger(int state)
m_iEnabled = FALSE;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_iTriggerState, m_flDelay);
CBaseTrigger::UseTargets_Delay(act, m_iTriggerState, m_flDelay);
} else {
CBaseTrigger::UseTargets(m_iTriggerState);
CBaseTrigger::UseTargets(act, m_iTriggerState);
}
}

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(TRIG_TOGGLE);
trigger.Trigger(this, 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(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, 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(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
if (real_owner || cvar("sv_playerslots") == 1) {
remove(self);

View File

@ -47,7 +47,7 @@ void item_suit::touch(void)
pl.g_items |= ITEM_SUIT;
m_iValue = TRUE;
CBaseTrigger::UseTargets(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
if (real_owner || cvar("sv_playerslots") == 1) {
remove(self);

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(TRIG_TOGGLE);
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
if (real_owner || m_iWasDropped == 1 || cvar("sv_playerslots") == 1) {
remove(self);