Added support for the 'message' key in triggers.

This commit is contained in:
Marco Cawthorne 2020-03-03 22:45:30 +01:00
parent d25aead1a7
commit e79a03b5b8
8 changed files with 75 additions and 31 deletions

View file

@ -26,6 +26,7 @@ class CBaseTrigger : CBaseEntity
string m_strMessage;
string m_strMaster;
int m_iUseType;
int m_iTeam;
void() CBaseTrigger;
virtual void() Trigger;
@ -48,6 +49,10 @@ void CBaseTrigger :: UseTargets ( void )
trigger.Trigger();
}
if (m_strMessage && eActivator.flags & FL_CLIENT) {
centerprint(eActivator, m_strMessage);
}
if ( m_strKillTarget ) {
entity eKill = find( world, CBaseTrigger::m_strTargetName, m_strKillTarget );
if ( eKill ) {
@ -83,6 +88,7 @@ int CBaseTrigger :: GetMaster ( void )
void CBaseTrigger :: UseTargets_Delay ( float fDelay )
{
static void Entities_UseTargets_Delay_Think( void ) {
eActivator = self.owner;
CBaseTrigger::UseTargets();
remove( self );
}
@ -92,7 +98,7 @@ void CBaseTrigger :: UseTargets_Delay ( float fDelay )
#endif
CBaseTrigger eTimer = spawn( CBaseTrigger );
eTimer.owner = self;
eTimer.owner = eActivator;
eTimer.think = Entities_UseTargets_Delay_Think;
eTimer.m_strTarget = m_strTarget;
eTimer.nextthink = time + fDelay;
@ -126,6 +132,9 @@ void CBaseTrigger :: InitBrushTrigger ( void )
void CBaseTrigger :: CBaseTrigger ( void )
{
CBaseEntity::CBaseEntity();
m_strMessage = "";
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
switch ( argv( i ) ) {
case "killtarget":
@ -137,9 +146,11 @@ void CBaseTrigger :: CBaseTrigger ( void )
case "master":
m_strMaster = argv(i+1);
break;
case "team_no":
m_iTeam = stoi(argv(i+1));
break;
default:
break;
}
}
CBaseEntity::CBaseEntity();
}

View file

@ -246,6 +246,7 @@ void func_button::Trigger(void)
void func_button::Touch(void)
{
if (other.movetype == MOVETYPE_WALK) {
eActivator = other;
func_button::Trigger();
if (!(spawnflags & SF_BTT_TOUCH_ONLY)) {

View file

@ -64,6 +64,7 @@ class func_door:CBaseTrigger
virtual void() Precache;
virtual void() Arrived;
virtual void() Returned;
virtual void() Respawn;
virtual void() Trigger;
virtual void() Blocked;
virtual void() Touch;
@ -222,6 +223,7 @@ void func_door::Touch(void)
if (other.movetype == MOVETYPE_WALK) {
if (other.absmin[2] <= maxs[2] - 2) {
eActivator = other;
Trigger();
}
}
@ -299,17 +301,25 @@ void func_door::MoveToDestination(vector vDestination, void() func)
void func_door::Respawn(void)
{
func_door::SetMovementDirection();
/* reset */
origin = m_oldOrigin;
angles = m_oldAngle;
m_vecPos1 = [0,0,0];
m_vecPos2 = [0,0,0];
m_vecDest = [0,0,0];
m_vecMoveDir = [0,0,0];
solid = SOLID_BSP;
movetype = MOVETYPE_PUSH;
setorigin(this, m_oldOrigin);
setmodel(this, m_oldModel);
think = __NULL__;
nextthink = -1;
m_pMove = 0;
/* angles to vecMoveDir */
SetMovementDirection();
blocked = Blocked;
solid = SOLID_BSP;
movetype = MOVETYPE_PUSH;
setmodel(this, model);
setorigin(this, origin);
think = __NULL__;
nextthink = 0;
m_pMove = 0;
if (m_flWait == -1) {
spawnflags |= SF_MOV_TOGGLE;
@ -340,10 +350,17 @@ void func_door::Respawn(void)
m_vecPos2 = m_vecPos1;
m_vecPos1 = origin;
}
if (m_strTargetName) {
m_iLocked = TRUE;
}
angles = [0,0,0];
}
void func_door::func_door(void)
{
CBaseTrigger::CBaseTrigger();
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {
case "speed":
@ -375,15 +392,8 @@ void func_door::func_door(void)
}
}
CBaseTrigger::CBaseTrigger();
func_door::Precache();
func_door::Respawn();
angles = [0,0,0];
if (m_strTargetName) {
m_iLocked = TRUE;
}
}
void func_water(void)

View file

@ -77,6 +77,7 @@ class func_train:CBaseTrigger
float m_flDamage;
string m_strMoveSnd;
string m_strStopSnd;
string m_strOldTarget; /* specific to trains? */
void() func_train;
virtual void() NextPath;
@ -118,8 +119,8 @@ func_train::GoToTarget(void)
return;
}
vecWorldPos[0] = absmin[0] + (0.5 * (absmax[0] - absmin[0]));
vecWorldPos[1] = absmin[1] + (0.5 * (absmax[1] - absmin[1]));
vecWorldPos[0] = absmin[0] + (0.5 * (absmax[0] - absmin[0]));
vecWorldPos[1] = absmin[1] + (0.5 * (absmax[1] - absmin[1]));
vecWorldPos[2] = absmin[2] + (0.5 * (absmax[2] - absmin[2]));
vecVelocity = (eNode.origin - vecWorldPos);
@ -206,6 +207,7 @@ func_train::Respawn(void)
/* let's wait 1/4 a second to give the path_corner entities a chance to
* spawn in case they're after us in the ent lump */
m_strTarget = m_strOldTarget;
think = NextPath;
nextthink = ltime + 0.25f;
}
@ -216,6 +218,9 @@ func_train::func_train(void)
int a;
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
switch (argv(i)) {
case "target":
m_strOldTarget = argv(i+1);
break;
case "dmg":
m_flDamage = stof(argv(i+1));
break;

View file

@ -40,7 +40,8 @@ activates it.
class trigger_hurt:CBaseTrigger
{
float m_flNextTrigger;
int m_iDamage;
float m_flNextDmg;
int m_iDamage;
float m_flDelay;
void() trigger_hurt;
@ -78,20 +79,24 @@ void trigger_hurt::Touch(void)
return;
}
if (spawnflags & SF_HURT_FIREONPLAYER) {
if (other.flags & FL_CLIENT) {
if (m_strTarget) {
if (spawnflags & SF_HURT_FIREONPLAYER) {
if (other.flags & FL_CLIENT) {
eActivator = other;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay);
} else {
CBaseTrigger::UseTargets();
}
}
} else {
eActivator = other;
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay);
} else {
CBaseTrigger::UseTargets();
}
}
} else {
if (m_flDelay > 0) {
CBaseTrigger::UseTargets_Delay(m_flDelay);
} else {
CBaseTrigger::UseTargets();
}
}
Damage_Apply(other, this, m_iDamage, 0, DMG_GENERIC);
@ -101,7 +106,7 @@ void trigger_hurt::Touch(void)
Trigger();
}
m_flNextTrigger = time + 0.5;
m_flNextTrigger = time + m_flNextDmg;
}
void trigger_hurt::Respawn(void)
@ -110,7 +115,9 @@ void trigger_hurt::Respawn(void)
alpha = 0.5f;
#endif
m_flNextTrigger = 0;
/* reset */
m_flNextDmg = 0.5f;
m_flNextTrigger = 0.0f;
if (spawnflags & SF_HURT_OFF) {
solid = SOLID_NOT;
@ -129,6 +136,7 @@ void trigger_hurt::trigger_hurt(void)
m_iDamage = stoi(argv(i+1));
break;
case "wait":
m_flNextDmg = stof(argv(i+1));
case "delay":
m_flDelay = stof(argv(i+1));
break;

View file

@ -46,7 +46,13 @@ class trigger_multiple:CBaseTrigger
void trigger_multiple::touch(void)
{
eActivator = other;
if (Rules_IsTeamPlay() == TRUE) {
if (m_iTeam > 0 && eActivator.team != m_iTeam + 1) {
return;
}
}
if (other.movetype != MOVETYPE_WALK) {
return;
}

View file

@ -69,6 +69,8 @@ void trigger_push::Trigger(void)
void trigger_push::touch(void)
{
eActivator = other;
switch(other.movetype) {
case MOVETYPE_NONE:
case MOVETYPE_PUSH:

View file

@ -33,6 +33,7 @@ class trigger_teleport:CBaseTrigger
void trigger_teleport::touch(void)
{
if (other.health > 0 || other.solid == SOLID_SLIDEBOX) {
eActivator = other;
entity eTarget = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
if (eTarget) {