]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_common.qc
Merge remote branch 'origin/master' into terencehill/maximized_radar
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_common.qc
index dfd5c77b6975566a6e9a29fe0013af30d1466d7c..08c56121b5c6a110661fe6c6977bc90edee2d992 100644 (file)
@@ -26,9 +26,9 @@ void W_GiveWeapon (entity e, float wep, string name)
 .vector railgunforce;
 void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, float mindist, float maxdist, float halflifedist, float forcehalflifedist, float deathtype)
 {
-       local vector hitloc, force, endpoint, dir;
-       local entity ent, endent;
-       local float endq3surfaceflags;
+       vector hitloc, force, endpoint, dir;
+       entity ent, endent;
+       float endq3surfaceflags;
        float totaldmg;
        entity o;
 
@@ -545,26 +545,42 @@ float W_CheckProjectileDamage(entity inflictor, entity projowner, float deathtyp
 {
        float is_from_contents = (deathtype == DEATH_SLIME || deathtype == DEATH_LAVA);
        float is_from_owner = (inflictor == projowner);
+       float is_from_exception = (exception != -1);
        
+       //print(strcat("from_contents ", ftos(is_from_contents), " : from_owner ", ftos(is_from_owner), " : exception ", strcat(ftos(is_from_exception), " (", ftos(exception), "). \n")));
+
        if(autocvar_g_projectiles_damage <= -2)
-                       return FALSE; // no damage to projectiles at all, not even with the exceptions
-                       
+       {
+               return FALSE; // no damage to projectiles at all, not even with the exceptions
+       }
        else if(autocvar_g_projectiles_damage == -1)
-               if not(exception)
-                       return FALSE; // no damage other than exceptions (electro combo, hagar join explode, minelayer mines)
-                       
+       {
+               if(is_from_exception)
+                       return (exception); // if exception is detected, allow it to override
+               else
+                       return FALSE; // otherwise, no other damage is allowed
+       }
        else if(autocvar_g_projectiles_damage == 0)
-               if not(is_from_contents || exception)
-                       return FALSE; // only damage from contents or exceptions is allowed
-                       
+       {
+               if(is_from_exception)
+                       return (exception); // if exception is detected, allow it to override
+               else if not(is_from_contents)
+                       return FALSE; // otherwise, only allow damage from contents
+       }       
        else if(autocvar_g_projectiles_damage == 1)
-               if not(is_from_contents || is_from_owner || exception)
-                       return FALSE; // only self damage or damage from contents or exceptions is allowed 
-       
-       // -2 or lower disables all damage including exceptions
-       // 2 or higher automatically allows all damage normally 
+       {
+               if(is_from_exception)
+                       return (exception); // if exception is detected, allow it to override
+               else if not(is_from_contents || is_from_owner)
+                       return FALSE; // otherwise, only allow self damage and damage from contents
+       }
+       else if(autocvar_g_projectiles_damage == 2) // allow any damage, but override for exceptions
+       {
+               if(is_from_exception)
+                       return (exception); // if exception is detected, allow it to override
+       }
 
-       return TRUE; // continue with the damage as planned
+       return TRUE; // if none of these return, then allow damage anyway.
 }
 
 void W_PrepareExplosionByDamage(entity attacker, void() explode)