]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_damage.qc
merge some changes from my autocvarizer branch that change nothing but make code...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_damage.qc
index 460c608dcf357d944829978620b3e21247f61724..52f756ea7386810a84aaf30fa670caf7bbc0cc35 100644 (file)
@@ -120,12 +120,14 @@ void GiveFrags (entity attacker, entity targ, float f)
                {
                        // teamkill
                        PlayerScore_Add(attacker, SP_KILLS, -1); // or maybe add a teamkills field?
+                       PlayerStats_Event(attacker, PLAYERSTATS_KILLS, -1);
                }
        }
        else
        {
                // regular frag
                PlayerScore_Add(attacker, SP_KILLS, 1);
+               PlayerStats_Event(attacker, PLAYERSTATS_KILLS, 1);
        }
 
        PlayerScore_Add(targ, SP_DEATHS, 1);
@@ -623,7 +625,17 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        force = force * g_weaponforcefactor;
                        mirrorforce *= g_weaponforcefactor;
                }
-
+               
+               // should this be changed at all? If so, in what way?
+               frag_attacker = attacker;
+               frag_target = targ;
+               frag_damage = damage;
+               frag_force = force;
+        frag_deathtype = deathtype;
+               MUTATOR_CALLHOOK(PlayerDamage_Calculate);
+               damage = frag_damage;
+               force = frag_force;
+               
                // apply strength multiplier
                if ((attacker.items & IT_STRENGTH) && !g_minstagib)
                {
@@ -844,19 +856,6 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
        }
 }
 
-void Damage_RecordDamage(entity attacker, float deathtype, float damage)
-{
-       float weaponid;
-       weaponid = DEATH_WEAPONOF(deathtype);
-
-       if not(inWarmupStage)
-       if (weaponid)
-       if ((clienttype(attacker) == CLIENTTYPE_REAL) | (clienttype(attacker) == CLIENTTYPE_BOT)) {
-               attacker.stats_hit[weaponid - 1] += damage;
-               attacker.stat_hit = weaponid + 64 * floor(attacker.stats_hit[weaponid - 1]);
-       }
-}
-
 float RadiusDamage_running;
 float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)
 // Returns total damage applies to creatures
@@ -875,18 +874,10 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
        float   tfloorforce;
 
        float stat_damagedone;
-       float stat_maxdamage;
 
        if(RadiusDamage_running)
        {
-               string save;
-               print("RadiusDamage called recursively!\n");
-               print("Expect stuff to go HORRIBLY wrong.\n");
-               print("Causing a stack trace...\n");
-               save = cvar_string("prvm_backtraceforwarnings");
-               cvar_set("prvm_backtraceforwarnings", "1");
-               fclose(-1); // calls VM_Warning
-               cvar_set("prvm_backtraceforwarnings", save);
+               backtrace("RadiusDamage called recursively! Expect stuff to go HORRIBLY wrong.");
                return 0;
        }
 
@@ -913,7 +904,6 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
        }
 
        stat_damagedone = 0;
-       stat_maxdamage = 0;
 
        targ = WarpZone_FindRadius (blastorigin, rad, FALSE);
        while (targ)
@@ -1031,14 +1021,8 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
                                                        {
                                                                total_damage_to_creatures += finaldmg;
 
-                                                               if(targ.flags & FL_CLIENT)
-                                                               if(targ.deadflag == DEAD_NO)
-                                                               if(targ != attacker)
-                                                               if(!teamplay || targ.team != attacker.team)
-                                                               {
+                                                               if(accuracy_isgooddamage(attacker, targ))
                                                                        stat_damagedone += finaldmg;
-                                                                       stat_maxdamage += coredamage;
-                                                               }
                                                        }
 
                                                        if(targ == directhitentity || DEATH_ISSPECIAL(deathtype))
@@ -1054,7 +1038,8 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e
 
        RadiusDamage_running = 0;
 
-       Damage_RecordDamage(attacker, deathtype, min(stat_maxdamage, stat_damagedone));
+       if(!DEATH_ISSPECIAL(deathtype))
+               accuracy_add(attacker, DEATH_WEAPONOFWEAPONDEATH(deathtype), 0, min(coredamage, stat_damagedone));
 
        return total_damage_to_creatures;
 }
@@ -1157,6 +1142,8 @@ float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
                                        e.fire_hitsound = FALSE;
                                }
                        }
+                       if(accuracy_isgooddamage(o, e))
+                               accuracy_add(o, DEATH_WEAPONOFWEAPONDEATH(dt), 0, max(0, totaldamage - mindamage));
                        return max(0, totaldamage - mindamage); // can never be negative, but to make sure
                }
                else
@@ -1169,6 +1156,8 @@ float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
                e.fire_deathtype = dt;
                e.fire_owner = o;
                e.fire_hitsound = FALSE;
+               if(accuracy_isgooddamage(o, e))
+                       accuracy_add(o, DEATH_WEAPONOFWEAPONDEATH(dt), 0, d);
                return d;
        }
 }
@@ -1203,8 +1192,6 @@ void Fire_ApplyDamage(entity e)
        }
        e.fire_hitsound = TRUE;
 
-       Damage_RecordDamage(e.fire_owner, e.fire_deathtype, d);
-
        if not(IS_INDEPENDENT_PLAYER(e))
        FOR_EACH_PLAYER(other) if(e != other)
        {