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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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