From 09303363e283b8735ce5c28543ea6c9e43e94561 Mon Sep 17 00:00:00 2001 From: div0 Date: Mon, 27 Oct 2008 08:10:22 +0000 Subject: [PATCH] make removing entities safer by clearing ALL their fields before removing (can't the engine do this?); fix TAG Seeker aiming at respawning players git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4905 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/g_world.qc | 1 + data/qcsrc/server/miscfunctions.qc | 5 +++-- data/qcsrc/server/w_seeker.qc | 15 +++++++++++---- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/data/qcsrc/server/g_world.qc b/data/qcsrc/server/g_world.qc index 3dc7f10f5..5936e054f 100644 --- a/data/qcsrc/server/g_world.qc +++ b/data/qcsrc/server/g_world.qc @@ -209,6 +209,7 @@ void spawnfunc_worldspawn (void) world_already_spawned = TRUE; remove = remove_safely; // during spawning, watch what you remove! + remove_empty_template = spawn(); // make an empty entity compressShortVector_init(); diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 2f2493519..ddc2afd74 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1293,9 +1293,10 @@ void objerror(string s) objerror_builtin(s); } +entity remove_empty_template; void remove_unsafely(entity e) -{ - e.classname = ""; +{ + copyentity(remove_empty_template, e); // zero all fields remove_builtin(e); } diff --git a/data/qcsrc/server/w_seeker.qc b/data/qcsrc/server/w_seeker.qc index bbbcabd59..0b100e613 100644 --- a/data/qcsrc/server/w_seeker.qc +++ b/data/qcsrc/server/w_seeker.qc @@ -50,6 +50,10 @@ void Seeker_Missile_Think() if (self.switchweapon > cvar("g_balance_seeker_missile_speed_max")) self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_decel"); + if (self.enemy != world) + if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO) + self.enemy = world; + if (self.enemy != world) { e = self.enemy; @@ -144,8 +148,13 @@ void Seeker_Missile_Animate() self.frame = self.frame +1; self.nextthink = time + 0.05; + if (self.enemy != world) + if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO) + self.enemy = world; + if(self.frame == 5) - { self.think = Seeker_Missile_Think; + { + self.think = Seeker_Missile_Think; self.nextthink = time + cvar("g_balance_seeker_missile_activate_delay"); self.effects = EF_LOWPRECISION | EF_NOSHADOW | EF_ROCKET; @@ -153,7 +162,6 @@ void Seeker_Missile_Animate() self.movetype = MOVETYPE_BOUNCEMISSILE; else self.movetype = MOVETYPE_FLYMISSILE; - } } @@ -295,9 +303,8 @@ void Seeker_Tag_Touch() self.event_damage = SUB_Null; sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", 1, ATTN_NORM); - if (other.classname == "player") + if (other.takedamage && other.deadflag == DEAD_NO) { - entity e; e = spawn(); e.cnt = cvar("g_balance_seeker_missile_count"); -- 2.39.2