From 449a44bc0d2a9773604f12ffee4c1a0f97b29c60 Mon Sep 17 00:00:00 2001 From: div0 Date: Thu, 22 Jan 2009 08:15:16 +0000 Subject: [PATCH] new entities: trigger_relay_teamcheck, trigger_disablerelay git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5625 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/arena.qc | 20 ++++++-- data/qcsrc/server/assault.qc | 29 ++++------- data/qcsrc/server/defs.qh | 3 ++ data/qcsrc/server/func_breakable.qc | 2 + data/qcsrc/server/g_triggers.qc | 74 ++++++++++++++++++++++++++++- data/scripts/entities.def | 27 +++++++++++ 6 files changed, 129 insertions(+), 26 deletions(-) diff --git a/data/qcsrc/server/arena.qc b/data/qcsrc/server/arena.qc index bac809e3f..09e2b6138 100644 --- a/data/qcsrc/server/arena.qc +++ b/data/qcsrc/server/arena.qc @@ -42,6 +42,12 @@ void reset_map() for(self = world; (self = nextent(self)); ) if(clienttype(self) == CLIENTTYPE_NOTACLIENT) { + if(self.team_saved) + self.team = self.team_saved; + + if(self.use == SUB_DontUseTargets) + self.use = SUB_UseTargets; + if(self.classname == STR_ITEM_KH_KEY) { kh_Key_AssignTo(self, world); @@ -106,10 +112,6 @@ void reset_map() } // TODO properly reset Assault // General teambased game modes - else if(self.classname == "info_player_deathmatch") - { - self.team = self.team_saved; - } else if(self.classname == "func_breakable") { func_breakable_reset(); @@ -141,6 +143,16 @@ void reset_map() { self.use(); } + else if(self.classname == "trigger_gamestart") + { + if(self.wait) + { + self.think = self.use; + self.nextthink = game_starttime + self.wait; + } + else + self.use(); + } } // Moving the player reset code here since the player-reset depends diff --git a/data/qcsrc/server/assault.qc b/data/qcsrc/server/assault.qc index 378704da0..b1a54f2fa 100644 --- a/data/qcsrc/server/assault.qc +++ b/data/qcsrc/server/assault.qc @@ -269,28 +269,17 @@ void assault_new_round() { assault_attacker_team = COLOR_TEAM1; } - // swap spawn point teams - local entity ent; - ent = find(world, classname, "info_player_deathmatch"); - while (ent) - { - if(ent.team_saved == COLOR_TEAM1) - ent.team_saved = COLOR_TEAM2; - else if(ent.team_saved == COLOR_TEAM2) - ent.team_saved = COLOR_TEAM1; - ent.team = ent.team_saved; - ent = find(ent, classname, "info_player_deathmatch"); - } - // swap all destructibles - ent = find(world, classname, "func_assault_destructible"); - while (ent) + local entity ent; + for(ent = world; (ent = nextent(ent)); ) { - if(ent.team == COLOR_TEAM1) - ent.team = COLOR_TEAM2; - else if(ent.team == COLOR_TEAM2) - ent.team = COLOR_TEAM1; - ent = find(ent, classname, "func_assault_destructible"); + if(clienttype(ent) == CLIENTTYPE_NOTACLIENT) + { + if(ent.team_saved == COLOR_TEAM1) + ent.team_saved = COLOR_TEAM2; + else if(ent.team_saved == COLOR_TEAM2) + ent.team_saved = COLOR_TEAM1; + } } // reset the level with a countdown diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 70dd701c3..1b8127332 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -525,3 +525,6 @@ void target_voicescript_clear(entity pl); .string target3; .string target4; .float trigger_reverse; + +void SUB_DontUseTargets(); +void SUB_UseTargets(); diff --git a/data/qcsrc/server/func_breakable.qc b/data/qcsrc/server/func_breakable.qc index 8aaada2e3..241578896 100644 --- a/data/qcsrc/server/func_breakable.qc +++ b/data/qcsrc/server/func_breakable.qc @@ -203,5 +203,7 @@ void spawnfunc_func_breakable() { if(self.noise) precache_sound(self.noise); + self.team_saved = self.team; + func_breakable_reset(); } diff --git a/data/qcsrc/server/g_triggers.qc b/data/qcsrc/server/g_triggers.qc index 01ed653b6..2c53b752c 100644 --- a/data/qcsrc/server/g_triggers.qc +++ b/data/qcsrc/server/g_triggers.qc @@ -1,3 +1,7 @@ +void SUB_DontUseTargets() +{ +} + void() SUB_UseTargets; @@ -252,6 +256,8 @@ void spawnfunc_trigger_multiple() EXACTTRIGGER_INIT; + self.team_saved = self.team; + if (self.health) { if (self.spawnflags & SPAWNFLAG_NOTOUCH) @@ -1340,10 +1346,12 @@ void gamestart_use() { } void spawnfunc_trigger_gamestart() { + self.use = gamestart_use; + if(self.wait) { - self.think = gamestart_use; - self.nextthink = self.wait; + self.think = self.use; + self.nextthink = game_starttime + self.wait; } else InitializeEntity(self, gamestart_use, INITPRIO_FINDTARGET); @@ -1438,3 +1446,65 @@ void spawnfunc_target_voicescript() precache_sound(strcat(self.netname, "/", argv(i), ".wav")); } } + + + +void trigger_relay_teamcheck_use() +{ + if(activator.team) + { + if(self.spawnflags & 2) + { + if(activator.team != self.team) + SUB_UseTargets(); + } + else + { + if(activator.team == self.team) + SUB_UseTargets(); + } + } + else + { + if(self.spawnflags & 1) + SUB_UseTargets(); + } +} + +void spawnfunc_trigger_relay_teamcheck() +{ + self.team_saved = self.team; + self.use = trigger_relay_teamcheck_use; +} + + + +void trigger_disablerelay_use() +{ + entity e; + + float a, b; + a = b = 0; + + for(e = world; (e = find(e, targetname, self.target)); ) + { + if(e.use == SUB_UseTargets) + { + e.use = SUB_DontUseTargets; + ++a; + } + else if(e.use == SUB_DontUseTargets) + { + e.use = SUB_UseTargets; + ++b; + } + } + + if(!a == !b) + print("Invalid use of trigger_disablerelay: ", ftos(a), " relays were on, ", ftos(b), " relays were off!\n"); +} + +void spawnfunc_trigger_disablerelay() +{ + self.use = trigger_disablerelay_use; +} diff --git a/data/scripts/entities.def b/data/scripts/entities.def index 96b92f8ee..443a5b5aa 100644 --- a/data/scripts/entities.def +++ b/data/scripts/entities.def @@ -897,6 +897,9 @@ One possible use is to trigger entities with more than one targetname on an acti More than one "trigger event" can be delayed at once, as opposed to trigger_delay. -------- KEYS -------- target: trigger all entities with this targetname when triggered +target2: trigger all entities with this targetname when triggered +target3: trigger all entities with this targetname when triggered +target4: trigger all entities with this targetname when triggered targetname: name that identifies this entity so it can be triggered delay: delay the triggering by the given time message: print this message to the player who activated the trigger @@ -1363,3 +1366,27 @@ PROJECT_ON_TARGET2NORMAL: target2's origin is projected onto the given direction PROJECT_ON_TARGET3NORMAL: target3's origin is projected onto the given direction vector, not on the plane perpendicular to it PROJECT_ON_TARGET4NORMAL: target4's origin is projected onto the given direction vector, not on the plane perpendicular to it */ + +/*QUAKED trigger_relay_teamcheck (.5 .5 .5) (-8 -8 -8) (8 8 8) NOTEAM_TOO INVERT +Works similar to trigger_relay, but only relays trigger events if the team of the activator matches this entity's team +-------- KEYS -------- +target: trigger all entities with this targetname when triggered +target2: trigger all entities with this targetname when triggered +target3: trigger all entities with this targetname when triggered +target4: trigger all entities with this targetname when triggered +targetname: name that identifies this entity so it can be triggered +delay: delay the triggering by the given time +message: print this message to the player who activated the trigger +killtarget: remove all entities with this targetname when triggered +team: 5 for red, 14 for blue, 13 for yellow, 10 for pink team +-------- SPAWNFLAGS -------- +NOTEAM_TOO: also relay events if the activator has no team set +INVERT: only relay the event if this entity has the matching team +*/ + +/*QUAKED trigger_disablerelay (.5 .5 .5) (-8 -8 -8) (8 8 8) +Disables a trigger_relay temporarily (until triggered again) +-------- KEYS -------- +target: disable/enable all relays with this targetname when triggered +targetname: name that identifies this entity so it can be triggered +*/ -- 2.39.2