]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_nades.qc
Fix some bugs with nades, allow lasering a nade around
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_nades.qc
index 47eb24875c1e7118d31b22cd02364cfc71a92597..b5e1559988c39bed59860284a1e4f08ae727ced6 100644 (file)
@@ -526,6 +526,8 @@ void nade_boom()
        sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
        sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM);
 
+       self.event_damage = func_null; // prevent somehow calling damage in the next call
+
        if(nade_blast)
        {
                RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage,
@@ -533,7 +535,7 @@ void nade_boom()
                Damage_DamageInfo(self.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, self.projectiledeathtype, 0, self);
        }
 
-       if(self.health != -1337)
+       if(self.takedamage)
        switch ( self.nade_type )
        {
                case NADE_TYPE_NAPALM: nade_napalm_boom(); break;
@@ -549,7 +551,12 @@ void nade_boom()
 
 void nade_touch()
 {
-       if(ITEM_TOUCH_NEEDKILL())
+       float is_weapclip = 0;
+       if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NODRAW)
+       if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NONSOLID))
+       if (!(trace_dphitcontents & DPCONTENTS_OPAQUE))
+               is_weapclip = 1;
+       if(ITEM_TOUCH_NEEDKILL() || is_weapclip)
        {
                remove(self);
                return;
@@ -580,7 +587,7 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp
 {
        if(ITEM_DAMAGE_NEEDKILL(deathtype))
        {
-               self.health = -1337; // hack
+               self.takedamage = DAMAGE_NO;
                nade_boom();
                return;
        }
@@ -589,7 +596,10 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp
                return;
 
        if(DEATH_ISWEAPON(deathtype, WEP_BLASTER) || (DEATH_ISWEAPON(deathtype, WEP_VAPORIZER) && (deathtype & HITTYPE_SECONDARY)))
-               return;
+       {
+               force *= 1.5;
+               damage = 0;
+       }
 
        if(DEATH_ISWEAPON(deathtype, WEP_VORTEX) || DEATH_ISWEAPON(deathtype, WEP_VAPORIZER))
        {
@@ -610,6 +620,7 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp
                damage = self.max_health * 1.15;
 
        self.velocity += force;
+       UpdateCSQCProjectile(self);
 
        if(damage <= 0 || ((self.flags & FL_ONGROUND) && IS_PLAYER(attacker)))
                return;
@@ -676,7 +687,6 @@ void toss_nade(entity e, vector _velocity, float _time)
        _nade.event_damage = nade_damage;
        _nade.customizeentityforclient = func_null;
        _nade.exteriormodeltoclient = world;
-       _nade.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
        _nade.traileffectnum = 0;
        _nade.teleportable = TRUE;
        _nade.pushable = TRUE;
@@ -689,6 +699,11 @@ void toss_nade(entity e, vector _velocity, float _time)
        _nade.toss_time = time;
        _nade.solid = SOLID_CORPSE; //((_nade.nade_type == NADE_TYPE_TRANSLOCATE) ? SOLID_CORPSE : SOLID_BBOX);
 
+       if(_nade.nade_type == NADE_TYPE_TRANSLOCATE || _nade.nade_type == NADE_TYPE_SPAWN)
+               _nade.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_PLAYERCLIP | DPCONTENTS_BOTCLIP;
+       else
+               _nade.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY;
+
        nade_spawn(_nade);
 
        if(_time)