]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_nades.qc
Drop nade if the player is looking down when they toss, rather than crouching
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_nades.qc
index 3f90b46f53fc64187c03d994d61dcec9bbf3298f..d7220908365fbcdab6fd1f2fed304df30c0f0b99 100644 (file)
@@ -51,7 +51,7 @@ void nade_spawn(entity _nade)
        
 }
 
-void nade_boom() // TODO: DamageInfo
+void nade_boom()
 {
        string expef;
        
@@ -64,8 +64,8 @@ void nade_boom() // TODO: DamageInfo
                default:                 expef = "nade_explode"; break;
        }
        
-       sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
-       sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+       sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTEN_NORM);
+       sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM);
        pointparticles(particleeffectnum(expef), self.origin + '0 0 1', '0 0 0', 1);
        
        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);
@@ -82,9 +82,9 @@ void nade_touch()
        PROJECTILE_TOUCH;
        //setsize(self, '-2 -2 -2', '2 2 2');
        //UpdateCSQCProjectile(self);
-       if(self.health == autocvar_g_nades_nade_health)
+       if(self.health == self.max_health)
        {
-               spamsound(self, CH_SHOTS, strcat("weapons/grenade_bounce", ftos(1 + rint(random() * 5)), ".wav"), VOL_BASE, ATTN_NORM);
+               spamsound(self, CH_SHOTS, strcat("weapons/grenade_bounce", ftos(1 + rint(random() * 5)), ".wav"), VOL_BASE, ATTEN_NORM);
                return;
        }
 
@@ -94,7 +94,7 @@ void nade_touch()
 
 void nade_beep()
 {
-       sound(self, CH_SHOTS_SINGLE, "overkill/grenadebip.ogg", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX));
+       sound(self, CH_SHOTS_SINGLE, "overkill/grenadebip.ogg", VOL_BASE, 0.5 *(ATTEN_LARGE + ATTEN_MAX));
        self.think = nade_boom;
        self.nextthink = max(self.wait, time);
 }
@@ -107,29 +107,29 @@ void nade_damage(entity inflictor, entity attacker, float damage, float deathtyp
        if(DEATH_ISWEAPON(deathtype, WEP_NEX) || DEATH_ISWEAPON(deathtype, WEP_MINSTANEX))
        {
                force *= 6;
-               damage = autocvar_g_nades_nade_health * 0.55;
+               damage = self.max_health * 0.55;
        }
 
        if(DEATH_ISWEAPON(deathtype, WEP_UZI))
-               damage = autocvar_g_nades_nade_health * 0.1;
+               damage = self.max_health * 0.1;
 
        if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && !(deathtype & HITTYPE_SECONDARY))
-               damage = autocvar_g_nades_nade_health * 1.1;
+               damage = self.max_health * 1.1;
                
        if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && (deathtype & HITTYPE_SECONDARY))
        {
-               damage = autocvar_g_nades_nade_health * 0.1;
+               damage = self.max_health * 0.1;
                force *= 15;
        }
        
        self.velocity += force;
 
-       if(!damage)
+       if(!damage || (self.flags & FL_ONGROUND && IS_PLAYER(attacker)))
                return;
 
-       if(self.health == autocvar_g_nades_nade_health)
+       if(self.health == self.max_health)
        {
-               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX));
+               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, 0.5 *(ATTEN_LARGE + ATTEN_MAX));
                self.nextthink = max(time + autocvar_g_nades_nade_lifetime, time);
                self.think = nade_beep;
        }
@@ -158,7 +158,7 @@ void toss_nade(entity e, vector _velocity, float _time)
        Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_NADES);
        
        //setorigin(_nade, CENTER_OR_VIEWOFS(e) + (v_right * 10) * -1);
-       setorigin(_nade, w_shotorg + (v_right * 10) * -1);
+       setorigin(_nade, w_shotorg + (v_right * 25) * -1);
        setmodel(_nade, "models/weapons/v_ok_grenade.md3");
        setattachment(_nade, world, "");
        PROJECTILE_MAKETRIGGER(_nade);
@@ -169,8 +169,8 @@ void toss_nade(entity e, vector _velocity, float _time)
        if (trace_startsolid)
                setorigin(_nade, e.origin);
        
-       if(e.crouch)
-               _nade.velocity = '0 0 -10';
+       if(self.v_angle_x >= 70)
+               _nade.velocity = '0 0 100';
        else if(autocvar_g_nades_nade_newton_style == 1)
                _nade.velocity = e.velocity + _velocity;
        else if(autocvar_g_nades_nade_newton_style == 2)
@@ -181,6 +181,7 @@ void toss_nade(entity e, vector _velocity, float _time)
        //_nade.solid = SOLID_BBOX; // TODO: remember why this was needed
        _nade.touch = nade_touch;
        _nade.health = autocvar_g_nades_nade_health;
+       _nade.max_health = _nade.health;
        _nade.takedamage = DAMAGE_AIM;
        _nade.event_damage = nade_damage;
        _nade.teleportable = TRUE;
@@ -295,7 +296,7 @@ MUTATOR_HOOKFUNCTION(nades_VehicleEnter)
 
 MUTATOR_HOOKFUNCTION(nades_PlayerPreThink)
 {
-       float key_pressed = ((g_grappling_hook || client_hasweapon(self, WEP_HOOK, FALSE, FALSE) || WEPSET_CONTAINS_AW(weaponsInMap, WEP_HOOK)) ? self.button16 : self.BUTTON_HOOK);
+       float key_pressed = ((g_grappling_hook || client_hasweapon(self, WEP_HOOK, FALSE, FALSE) || (weaponsInMap & WEPSET_HOOK)) ? self.button16 : self.BUTTON_HOOK);
        
        if(self.nade)
                if(self.nade.wait - 0.1 <= time)