CBaseTrigger: Merge UseTargets and UseTargets_Delay... to be continued.

This commit is contained in:
Marco Cawthorne 2020-09-21 18:10:31 +02:00
parent 5dcb79e30c
commit 8bde44b01c
27 changed files with 68 additions and 129 deletions

View File

@ -101,52 +101,44 @@ CBaseTrigger::Trigger(entity act, int state)
}
void
CBaseTrigger::UseTargets(entity act, int state)
CBaseTrigger::UseTargets(entity act, int state, float fDelay)
{
for (entity f = world; (f = find(f, ::targetname, target));) {
CBaseTrigger trigger = (CBaseTrigger)f;
dprint(sprintf("^2%s::^3UseTargets^7: Triggering %s `%s` from %s\n",
this.classname, f.classname, trigger.targetname, act.classname));
if (trigger.Trigger != __NULL__) {
trigger.Trigger(act, state);
}
}
/* hack: check to see if this is a sound file */
/*if (whichpack(m_strMessage)) {
print(m_strMessage);
print("\n");
} else {
if (m_strMessage && act.flags & FL_CLIENT) {
centerprint(act, m_strMessage);
}
}*/
if (m_strKillTarget) {
entity eKill = find(world, ::targetname, m_strKillTarget);
if (eKill) {
remove(eKill);
}
}
}
void
CBaseTrigger::UseTargets_Delay(entity act, int state, float fDelay)
{
static void Entities_UseTargets_Delay_Think(void) {
CBaseTrigger::UseTargets(self.owner, self.health); /* ugly */
static void Entities_UseTargets_Think(void) {
CBaseTrigger::UseTargets(self.owner, self.health, 0.0f);
remove(self);
}
dprint(sprintf("^2%s::^3UseTargets_Delay^7: Triggering `%s`\n",
this.classname, target));
if (fDelay > 0.0f) {
dprint(sprintf("^2%s::^3UseTargets^7: Triggering `%s`\n",
this.classname, target));
CBaseTrigger eTimer = spawn(CBaseTrigger);
eTimer.owner = act;
eTimer.think = Entities_UseTargets_Delay_Think;
eTimer.target = target;
eTimer.nextthink = time + fDelay;
eTimer.health = state; /* ugly */
CBaseTrigger eTimer = spawn(CBaseTrigger);
eTimer.owner = act;
eTimer.think = Entities_UseTargets_Think;
eTimer.target = target;
eTimer.nextthink = time + fDelay;
eTimer.health = state; /* ugly */
} else {
for (entity f = world; (f = find(f, ::targetname, target));) {
CBaseTrigger trigger = (CBaseTrigger)f;
dprint(sprintf("^2%s::^3UseTargets^7:" \
"Triggering %s `%s` from %s\n", \
this.classname, f.classname, \
trigger.targetname, act.classname));
if (trigger.Trigger != __NULL__) {
trigger.Trigger(act, state);
}
}
if (m_strKillTarget) {
entity eKill = find(world, ::targetname, m_strKillTarget);
if (eKill) {
remove(eKill);
}
}
}
}
int

View File

@ -48,8 +48,7 @@ class CBaseTrigger:CBaseEntity
/* legacy trigger architecture */
float m_flDelay;
virtual void(entity, int) Trigger;
virtual void(entity, int) UseTargets;
virtual void(entity, int, float) UseTargets_Delay;
virtual void(entity, int, float) UseTargets;
/* master feature */
virtual int(void) GetValue;

View File

@ -17,6 +17,7 @@
/*QUAKED button_target (0 .5 .8) ? BUTTA_USE BUTTA_TEXON
"targetname" Name
"target" Target when triggered.
"delay" Time until target is triggered."
Non-moving button that can either be used by hand, or shot.
@ -76,7 +77,7 @@ button_target::Trigger(entity act, int status)
takedamage = DAMAGE_NO;
frame = 1 - frame;
UseTargets(act, status);
UseTargets(act, status, m_flDelay);
}
void

View File

@ -168,8 +168,8 @@ 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(this, TRIG_TOGGLE);
CBaseEntity::Hide();
UseTargets(this, TRIG_TOGGLE, 0.0f); /* delay... ignored. */
Hide();
}
void
@ -220,8 +220,8 @@ func_breakable::Death(void)
} else {
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial);
/* TODO: ability to have whoever destroyed the crate be the activator */
CBaseTrigger::UseTargets(this, TRIG_TOGGLE);
CBaseEntity::Hide();
UseTargets(this, TRIG_TOGGLE, 0.0f);
Hide();
}
}

View File

@ -211,12 +211,7 @@ func_button::Trigger(entity act, int state)
Sound_Play(this, CHAN_VOICE, m_strSndPressed);
MoveAway();
if (m_flDelay) {
UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
UseTargets(act, TRIG_TOGGLE);
}
UseTargets(act, TRIG_TOGGLE, m_flDelay);
}
void

View File

@ -225,11 +225,7 @@ func_door::Trigger(entity act, 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(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
UseTargets(act, TRIG_TOGGLE, m_flDelay);
}
if (state == TRIG_OFF) {

View File

@ -223,12 +223,7 @@ void func_door_rotating::Trigger(entity act, int state)
Away();
}
if (m_flDelay) {
CBaseTrigger::UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
UseTargets(act, TRIG_TOGGLE, m_flDelay);
}
void func_door_rotating::Use(void)

View File

@ -74,11 +74,7 @@ class func_rot_button:CBaseTrigger
void
func_rot_button::TriggerTargets(void)
{
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(this, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(this, TRIG_TOGGLE);
}
UseTargets(this, TRIG_TOGGLE, m_flDelay);
}
void

View File

@ -165,7 +165,7 @@ func_tank::PlayerInput(void)
spos += v_right * m_vecTipPos[1];
spos += v_up * m_vecTipPos[2];
CBaseTrigger::UseTargets(this, TRIG_ON);
UseTargets(this, TRIG_ON, m_flDelay);
func_tank_shootsingle(m_eDriver, spos, m_vecSpread, m_iDamage);
m_flFireTime = time + m_flFireRate;

View File

@ -184,7 +184,7 @@ func_tankmortar::PlayerInput(void)
SpriteSmoke(spos);
SpriteFlash(spos);
CBaseTrigger::UseTargets(this, TRIG_ON);
UseTargets(this, TRIG_ON, m_flDelay);
m_flFireTime = time + m_flFireRate;
}

View File

@ -135,7 +135,7 @@ monstermaker::Spawner(void)
m_iMonsterSpawned++;
if (target) {
UseTargets(this, TRIG_TOGGLE);
UseTargets(this, TRIG_TOGGLE, 0.0f);
}
/* inherit the monsterclip flag */

View File

@ -56,7 +56,7 @@ multi_manager::Trigger(entity act, int state)
dprint(sprintf("^2%s::^3Trigger^7: %s (%s)\n",
this.classname, wow.target, eFind.classname));
CBaseTrigger::UseTargets(wow.m_eActivator, TRIG_TOGGLE);
CBaseTrigger::UseTargets(wow.m_eActivator, TRIG_TOGGLE, 0.0f);
}
if (GetMaster() == FALSE)

View File

@ -18,6 +18,7 @@
"targetname" Name
"target" Target when triggered.
"killtarget" Target to kill when triggered.
"delay" Delay until we trigger our target
STUB!
*/
@ -73,7 +74,7 @@ multisource::Trigger(entity act, int unused)
dprint(sprintf("[^1MULTISOURCE^7] %s is now active.\n", targetname));
m_iValue = TRUE;
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
UseTargets(act, TRIG_TOGGLE, m_flDelay);
}
void

View File

@ -53,7 +53,7 @@ random_trigger::Trigger(entity act, int state)
return;
r = time + m_flMinTime + random(m_flRandMin, m_flRandMax);
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, r);
UseTargets(other, TRIG_TOGGLE, r);
}
void

View File

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

View File

@ -48,13 +48,9 @@ trigger_autosave::touch(void)
//readcmd("save autosave\n");
Hide();
SetSolid(SOLID_NOT);
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
solid = SOLID_NOT;
CBaseTrigger::UseTargets(other, TRIG_TOGGLE, m_flDelay);
}
void

View File

@ -37,11 +37,7 @@ class trigger_camera:CBaseTrigger
void
trigger_camera::Trigger(entity act, int state)
{
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
UseTargets(act, TRIG_TOGGLE, m_flDelay);
if (m_strMoveTo) {
entity e = find(world, ::targetname, m_strMoveTo);

View File

@ -69,14 +69,10 @@ trigger_counter::Trigger(entity act, int state)
if (m_iCounted < m_iMaxCount)
return;
solid = SOLID_NOT; /* make inactive */
SetSolid(SOLID_NOT); /* make inactive */
m_iValue = 1;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(act, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(act, TRIG_TOGGLE);
}
UseTargets(act, TRIG_TOGGLE, m_flDelay);
}
void

View File

@ -87,19 +87,11 @@ trigger_hurt::touch(void)
if (spawnflags & SF_HURT_FIREONPLAYER) {
if (other.flags & FL_CLIENT) {
eActivator = other;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
UseTargets(other, TRIG_TOGGLE, m_flDelay);
}
} else {
eActivator = other;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
UseTargets(other, TRIG_TOGGLE, m_flDelay);
}
}

View File

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

View File

@ -69,11 +69,7 @@ trigger_multiple::touch(void)
}
/* legacy */
if (m_flDelay > 0) {
UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
UseTargets(other, TRIG_TOGGLE);
}
UseTargets(other, TRIG_TOGGLE, m_flDelay);
/* This is effectively a trigger_once...*/
if (m_flWait != -1) {

View File

@ -62,11 +62,7 @@ trigger_once::touch(void)
return;
}
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, m_flDelay);
} else {
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
}
UseTargets(other, TRIG_TOGGLE, m_flDelay);
}
void

View File

@ -52,11 +52,7 @@ trigger_relay::Trigger(entity act, int state)
if (spawnflags & TRLY_ONCE)
m_iEnabled = FALSE;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(act, m_iTriggerState, m_flDelay);
} else {
CBaseTrigger::UseTargets(act, m_iTriggerState);
}
UseTargets(act, m_iTriggerState, m_flDelay);
}
void

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

View File

@ -54,7 +54,7 @@ void item_suit::touch(void)
UseOutput(other, m_strOnPlayerTouch);
return;
} else {
CBaseTrigger::UseTargets(other, TRIG_TOGGLE);
UseTargets(other, TRIG_TOGGLE, m_flDelay);
}
if (real_owner || cvar("sv_playerslots") == 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(other, TRIG_TOGGLE);
UseTargets(other, TRIG_TOGGLE, m_flDelay);
if (real_owner || m_iWasDropped == 1 || cvar("sv_playerslots") == 1) {
remove(self);