X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fw_minelayer.qc;h=b4ecb9b5519620411ac834deb9098cff4c615b45;hb=0cb3657fcecaadef31226c4181f07c871da3baf1;hp=14c6506faa0d13111f35402e3a8f109ac8384f63;hpb=5d7727e34f57b35e91f5213eff03cc958ca618d0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/w_minelayer.qc b/qcsrc/server/w_minelayer.qc index 14c6506fa..b4ecb9b55 100644 --- a/qcsrc/server/w_minelayer.qc +++ b/qcsrc/server/w_minelayer.qc @@ -11,7 +11,7 @@ void spawnfunc_weapon_minelayer (void) weapon_defaultspawnfunc(WEP_MINE_LAYER); } -void W_Mine_Stick () +void W_Mine_Stick (entity to) { spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM); @@ -30,6 +30,8 @@ void W_Mine_Stick () setmodel(newmine, "models/mine.md3"); newmine.angles = vectoangles(-trace_plane_normal); // face against the surface + newmine.oldvelocity = self.velocity; + newmine.takedamage = self.takedamage; newmine.damageforcescale = self.damageforcescale; newmine.health = self.health; @@ -49,6 +51,9 @@ void W_Mine_Stick () remove(self); self = newmine; + + if(to) + SetMovetypeFollow(self, to); } void W_Mine_Explode () @@ -56,8 +61,9 @@ void W_Mine_Explode () if(other.takedamage == DAMAGE_AIM) if(other.classname == "player") if(IsDifferentTeam(self.owner, other)) - if(IsFlying(other)) - AnnounceTo(self.owner, "airshot"); + if(other.deadflag == DEAD_NO) + if(IsFlying(other)) + AnnounceTo(self.owner, "airshot"); self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; @@ -86,6 +92,9 @@ void W_Mine_DoRemoteExplode () self.event_damage = SUB_Null; self.takedamage = DAMAGE_NO; + if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW) + self.velocity = self.oldvelocity; + RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world); if (self.owner.weapon == WEP_MINE_LAYER) @@ -151,6 +160,15 @@ void W_Mine_Think (void) entity head; self.nextthink = time; + + if(self.movetype == MOVETYPE_FOLLOW) + { + if(LostMovetypeFollow(self)) + { + UnsetMovetypeFollow(self); + self.movetype = MOVETYPE_NONE; + } + } // our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this // TODO: replace this mine_trigger.wav sound with a real countdown @@ -202,11 +220,20 @@ void W_Mine_Think (void) void W_Mine_Touch (void) { + if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW) + return; // we're already a stuck mine, why do we get called? TODO does this even happen? + PROJECTILE_TOUCH; - if(!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE)) - W_Mine_Stick(); - else if(self.movetype != MOVETYPE_NONE) // don't unstick a locked mine when someone touches it - self.velocity = '0 0 0'; + + if(other && other.classname == "player" && other.deadflag == DEAD_NO) + { + // hit a player + // don't stick + } + else + { + W_Mine_Stick(other); + } } void W_Mine_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) @@ -350,7 +377,7 @@ float w_minelayer(float req) // count potential damage according to type of target if (targ == self) selfdamage = selfdamage + d; - else if (targ.team == self.team && teams_matter) + else if (targ.team == self.team && teamplay) teamdamage = teamdamage + d; else if (bot_shouldattack(targ)) enemydamage = enemydamage + d; @@ -362,7 +389,7 @@ float w_minelayer(float req) desirabledamage = enemydamage; if (time > self.invincible_finished && time > self.spawnshieldtime) desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent; - if (teams_matter && self.team) + if (teamplay && self.team) desirabledamage = desirabledamage - teamdamage; mine = find(world, classname, "mine");