From e79a03b5b87e2d9d203a5e8ac3737789593a1f70 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Tue, 3 Mar 2020 22:45:30 +0100 Subject: [PATCH] Added support for the 'message' key in triggers. --- src/gs-entbase/server/basetrigger.cpp | 15 ++++++-- src/gs-entbase/server/func_button.cpp | 1 + src/gs-entbase/server/func_door.cpp | 40 ++++++++++++++-------- src/gs-entbase/server/func_train.cpp | 9 +++-- src/gs-entbase/server/trigger_hurt.cpp | 30 ++++++++++------ src/gs-entbase/server/trigger_multiple.cpp | 8 ++++- src/gs-entbase/server/trigger_push.cpp | 2 ++ src/gs-entbase/server/trigger_teleport.cpp | 1 + 8 files changed, 75 insertions(+), 31 deletions(-) diff --git a/src/gs-entbase/server/basetrigger.cpp b/src/gs-entbase/server/basetrigger.cpp index 0256fb4e..9dc1afd3 100644 --- a/src/gs-entbase/server/basetrigger.cpp +++ b/src/gs-entbase/server/basetrigger.cpp @@ -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(); } diff --git a/src/gs-entbase/server/func_button.cpp b/src/gs-entbase/server/func_button.cpp index f0b01d8b..e4eec364 100644 --- a/src/gs-entbase/server/func_button.cpp +++ b/src/gs-entbase/server/func_button.cpp @@ -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)) { diff --git a/src/gs-entbase/server/func_door.cpp b/src/gs-entbase/server/func_door.cpp index 850089b4..6d5e2e3e 100644 --- a/src/gs-entbase/server/func_door.cpp +++ b/src/gs-entbase/server/func_door.cpp @@ -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) diff --git a/src/gs-entbase/server/func_train.cpp b/src/gs-entbase/server/func_train.cpp index 9391138e..52db8bfe 100644 --- a/src/gs-entbase/server/func_train.cpp +++ b/src/gs-entbase/server/func_train.cpp @@ -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; diff --git a/src/gs-entbase/server/trigger_hurt.cpp b/src/gs-entbase/server/trigger_hurt.cpp index f8e395ba..d18ddd39 100644 --- a/src/gs-entbase/server/trigger_hurt.cpp +++ b/src/gs-entbase/server/trigger_hurt.cpp @@ -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; diff --git a/src/gs-entbase/server/trigger_multiple.cpp b/src/gs-entbase/server/trigger_multiple.cpp index d271942b..39bc02ba 100644 --- a/src/gs-entbase/server/trigger_multiple.cpp +++ b/src/gs-entbase/server/trigger_multiple.cpp @@ -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; } diff --git a/src/gs-entbase/server/trigger_push.cpp b/src/gs-entbase/server/trigger_push.cpp index a1416e5e..75200e17 100644 --- a/src/gs-entbase/server/trigger_push.cpp +++ b/src/gs-entbase/server/trigger_push.cpp @@ -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: diff --git a/src/gs-entbase/server/trigger_teleport.cpp b/src/gs-entbase/server/trigger_teleport.cpp index 263680a5..31d433d9 100644 --- a/src/gs-entbase/server/trigger_teleport.cpp +++ b/src/gs-entbase/server/trigger_teleport.cpp @@ -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) {