]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
a little bit of refactoring
authordrjaska <drjaska83@gmail.com>
Mon, 17 Jan 2022 22:09:58 +0000 (00:09 +0200)
committerdrjaska <drjaska83@gmail.com>
Mon, 17 Jan 2022 22:09:58 +0000 (00:09 +0200)
qcsrc/common/gamemodes/gamemode/mayhem/sv_mayhem.qc

index 573e53352b4bbb42d633897dc39564912bbf6c1b..aeca56e409fd909cfcbe7cea23942fcede89df14 100644 (file)
@@ -27,7 +27,6 @@ float autocvar_g_mayhem_start_ammo_plasma = 180;
 float autocvar_g_mayhem_start_ammo_fuel = 0;
 
 .float total_damage_dealt;
-.float total_friendly_damage_dealt;
 
 void mayhem_DelayedInit(entity this)
 {
@@ -131,7 +130,7 @@ MUTATOR_HOOKFUNCTION(mayhem, Damage_Calculate)
        M_ARGV(4, float) = frag_damage;
 }
 
-void CalculatePlayerScore(entity frag_attacker, entity frag_target){
+void CalculatePlayerScore(entity scorer){
        switch (autocvar_g_mayhem_scoringmethod)
        {
                default:
@@ -142,44 +141,45 @@ void CalculatePlayerScore(entity frag_attacker, entity frag_target){
                        //give a different weight for suicides if scoring method 1 doesn't have selfdamage2score enabled to harshly punish for suicides to avoid exploiting
                        float suicide_weight = 1 + (autocvar_g_mayhem_scoringmethod_1_disable_selfdamage2score * (1/autocvar_g_mayhem_scoringmethod_1_frag_weight));
 
-                       //total damage dealt to opponents minus total damage dealt to self
-                       float totaldamagedealt = (frag_attacker.total_damage_dealt - frag_attacker.total_friendly_damage_dealt);
-
                        //total damage divided by player start health&armor to get how many lives worth of damage they've dealt, then how much that is out of the fraglimit, then calculate new value affected by weight
-                       float playerdamagescore = (((((totaldamagedealt/(start_health + start_armorvalue)) * 100)/autocvar_g_mayhem_fraglimit) * autocvar_g_mayhem_scoringmethod_1_damage_weight) );
+                       float playerdamagescore = (((((scorer.total_damage_dealt/(start_health + start_armorvalue)) * 100)/autocvar_g_mayhem_fraglimit) * autocvar_g_mayhem_scoringmethod_1_damage_weight) );
                                                                                                                                                                                        // * 100 to avoid float inaccuracy at that decimal level
 
                        //playerdamagescore rounded
                        float roundedplayerdamagescore = ((rint(playerdamagescore*10))/10);
 
                        //kills minus suicides, total out of fraglimit, calculate weight
-                       float playerkillscore = ((((PlayerScore_Get(frag_attacker, SP_KILLS) - (PlayerScore_Get(frag_attacker, SP_SUICIDES) * suicide_weight)) * 100) / autocvar_g_mayhem_fraglimit) * autocvar_g_mayhem_scoringmethod_1_frag_weight);
+                       float playerkillscore = ((((PlayerScore_Get(scorer, SP_KILLS) - (PlayerScore_Get(scorer, SP_SUICIDES) * suicide_weight)) * 100) / autocvar_g_mayhem_fraglimit) * autocvar_g_mayhem_scoringmethod_1_frag_weight);
                                                                                                                                                                                                                                                                                                // * 100 to avoid float inaccuracy at that decimal level
 
                        //only used for debug print, add killscore and damagescore together
-                       float playerscore = (roundedplayerdamagescore + playerkillscore) / 100;
+                       float playerscore = (roundedplayerdamagescore + playerkillscore);
 
                        //add killscore and damagescore together to get total score and then adjust it to be total out of the visual score limit
-                       float playerscorevisual = (((roundedplayerdamagescore + playerkillscore) * autocvar_g_mayhem_visual_score_limit) / 100);
-                                                                                                                                                                                                                                               //   / 100 to move back to the decimal level
+                       float playerscorevisual = ((roundedplayerdamagescore + playerkillscore) * autocvar_g_mayhem_visual_score_limit);
+                                                                                                                                                                                                                                               
 
                        //calculated how much score the player has and now calculate total of how much they are supposed to have
-                       float scoretoadd = (playerscorevisual - PlayerScore_Get(frag_attacker, SP_SCORE));
+                       float scoretoadd = (playerscorevisual - (PlayerScore_Get(scorer, SP_SCORE) * 100));
+                                                                                                                                                                                  // * 100 to avoid float inaccuracy at that decimal level
 
                        //adjust total score to be what the player is supposed to have
-                       GameRules_scoring_add_team(frag_attacker, SCORE, scoretoadd);
-
-                       //debug printing
-                       if(!IS_BOT_CLIENT(frag_attacker) && frag_target != frag_attacker){
-                               print(sprintf("%f", totaldamagedealt),                                                  " totaldamagedealt \n");
-                               print(sprintf("%f", playerdamagescore),                                                 " playerdamagescore \n");
-                               print(sprintf("%f", roundedplayerdamagescore),                                  " rounded playerdamagescore \n");
-                               print(sprintf("%f", playerkillscore),                                                   " playerkillscore \n");
-                               print(sprintf("%f", PlayerScore_Get(frag_attacker, SP_KILLS)),  " PlayerScore_Get(frag_attacker, SP_KILLS) \n");
-                               print(sprintf("%f", playerscore),                                                               " playerscore \n");
-                               print(sprintf("%f", playerscorevisual),                                                 " visual playerscore \n");
-                               print(sprintf("%f", scoretoadd),                                                                " scoretoadd \n");
-                               print(sprintf("%f", PlayerScore_Get(frag_attacker, SP_SCORE)),  " PlayerScore_Get(frag_attacker, SP_SCORE) \n \n");
+                       GameRules_scoring_add_team(scorer, SCORE, (scoretoadd / 100));
+                                                                                                                                       //   / 100 to move back to the decimal level
+
+                       if(1){
+                               //debug printing
+                               if(!IS_BOT_CLIENT(scorer)){
+                                       print(sprintf("%f", scorer.total_damage_dealt),                 " scorer.total_damage_dealt \n");
+                                       print(sprintf("%f", playerdamagescore),                                 " playerdamagescore \n");
+                                       print(sprintf("%f", roundedplayerdamagescore),                  " rounded playerdamagescore \n");
+                                       print(sprintf("%f", playerkillscore),                                   " playerkillscore \n");
+                                       print(sprintf("%f", PlayerScore_Get(scorer, SP_KILLS)), " PlayerScore_Get(scorer, SP_KILLS) \n");
+                                       print(sprintf("%f", playerscore),                                               " playerscore \n");
+                                       print(sprintf("%f", playerscorevisual),                                 " visual playerscore \n");
+                                       print(sprintf("%f", scoretoadd),                                                " scoretoadd \n");
+                                       print(sprintf("%f", PlayerScore_Get(scorer, SP_SCORE)), " PlayerScore_Get(scorer, SP_SCORE) \n \n");
+                               }
                        }
                return;
                }
@@ -187,18 +187,20 @@ void CalculatePlayerScore(entity frag_attacker, entity frag_target){
                case 2:
                {
                        //calculate how much score the player should have based on their frags gotten and then add the missing score
-                       float playerkillscore = (((PlayerScore_Get(frag_attacker, SP_KILLS) - PlayerScore_Get(frag_attacker, SP_SUICIDES)) * 100)/ autocvar_g_mayhem_fraglimit);
+                       float playerkillscore = (((PlayerScore_Get(scorer, SP_KILLS) - PlayerScore_Get(scorer, SP_SUICIDES)) * 100)/ autocvar_g_mayhem_fraglimit);
                        float playerscorevisual = (playerkillscore * autocvar_g_mayhem_visual_score_limit) / 100;
-                       float scoretoadd = (playerscorevisual - PlayerScore_Get(frag_attacker, SP_SCORE));
-                       GameRules_scoring_add_team(frag_attacker, SCORE, scoretoadd);
-
-                       //debug printing
-                       if(!IS_BOT_CLIENT(frag_attacker) && frag_target != frag_attacker){
-                               print(sprintf("%f", playerkillscore),                                                   " playerkillscore \n");
-                               print(sprintf("%f", PlayerScore_Get(frag_attacker, SP_KILLS)),  " PlayerScore_Get(frag_attacker, SP_KILLS) \n");
-                               print(sprintf("%f", playerscorevisual),                                                 " visual playerscore \n");
-                               print(sprintf("%f", scoretoadd),                                                                " scoretoadd \n");
-                               print(sprintf("%f", PlayerScore_Get(frag_attacker, SP_SCORE)),  " PlayerScore_Get(frag_attacker, SP_SCORE) \n \n");
+                       float scoretoadd = (playerscorevisual - PlayerScore_Get(scorer, SP_SCORE));
+                       GameRules_scoring_add_team(scorer, SCORE, scoretoadd);
+
+                       if(1){
+                               //debug printing
+                               if(!IS_BOT_CLIENT(scorer)){
+                                       print(sprintf("%f", playerkillscore),                                   " playerkillscore \n");
+                                       print(sprintf("%f", PlayerScore_Get(scorer, SP_KILLS)), " PlayerScore_Get(scorer, SP_KILLS) \n");
+                                       print(sprintf("%f", playerscorevisual),                                 " visual playerscore \n");
+                                       print(sprintf("%f", scoretoadd),                                                " scoretoadd \n");
+                                       print(sprintf("%f", PlayerScore_Get(scorer, SP_SCORE)), " PlayerScore_Get(scorer, SP_SCORE) \n \n");
+                               }
                        }
                return;
                }
@@ -206,21 +208,22 @@ void CalculatePlayerScore(entity frag_attacker, entity frag_target){
                case 3:
                {
                        //calculate how much score the player should have based on their damage dealt and then add the missing score
-                       float totaldamagedealt = (frag_attacker.total_damage_dealt - frag_attacker.total_friendly_damage_dealt);
-                       float playerdamagescore = (((totaldamagedealt/(start_health + start_armorvalue)) * 100)/autocvar_g_mayhem_fraglimit);
+                       float playerdamagescore = (((scorer.total_damage_dealt/(start_health + start_armorvalue)) * 100)/autocvar_g_mayhem_fraglimit);
                        float roundedplayerdamagescore = ((rint(playerdamagescore*10))/10);
-                       float playerscorevisual = ((roundedplayerdamagescore * autocvar_g_mayhem_visual_score_limit) / 100);
-                       float scoretoadd = (playerscorevisual - PlayerScore_Get(frag_attacker, SP_SCORE));
-                       GameRules_scoring_add_team(frag_attacker, SCORE, scoretoadd);
-
-                       //debug printing
-                       if(!IS_BOT_CLIENT(frag_attacker) && frag_target != frag_attacker){
-                               print(sprintf("%f", totaldamagedealt),                                                  " totaldamagedealt \n");
-                               print(sprintf("%f", playerdamagescore),                                                 " playerdamagescore \n");
-                               print(sprintf("%f", roundedplayerdamagescore),                                  " rounded playerdamagescore \n");
-                               print(sprintf("%f", playerscorevisual),                                                 " visual playerscore \n");
-                               print(sprintf("%f", scoretoadd),                                                                " scoretoadd \n");
-                               print(sprintf("%f", PlayerScore_Get(frag_attacker, SP_SCORE)),  " PlayerScore_Get(frag_attacker, SP_SCORE) \n \n");
+                       float playerscorevisual = (roundedplayerdamagescore * autocvar_g_mayhem_visual_score_limit);
+                       float scoretoadd = (playerscorevisual - (PlayerScore_Get(scorer, SP_SCORE) * 100));
+                       GameRules_scoring_add_team(scorer, SCORE, (scoretoadd / 100));
+
+                       if(1){
+                               //debug printing
+                               if(!IS_BOT_CLIENT(scorer)){
+                                       print(sprintf("%f", scorer.total_damage_dealt),                 " scorer.total_damage_dealt \n");
+                                       print(sprintf("%f", playerdamagescore),                                 " playerdamagescore \n");
+                                       print(sprintf("%f", roundedplayerdamagescore),                  " rounded playerdamagescore \n");
+                                       print(sprintf("%f", playerscorevisual),                                 " visual playerscore \n");
+                                       print(sprintf("%f", scoretoadd),                                                " scoretoadd \n");
+                                       print(sprintf("%f", PlayerScore_Get(scorer, SP_SCORE)), " PlayerScore_Get(scorer, SP_SCORE) \n \n");
+                               }
                        }
                return;
                }
@@ -231,36 +234,45 @@ MUTATOR_HOOKFUNCTION(mayhem, PlayerDamage_SplitHealthArmor)
 {
        if(autocvar_g_mayhem_scoringmethod==2)return;
        
-       entity frag_attacker = M_ARGV(1, entity);
        entity frag_target = M_ARGV(2, entity);
 
-       if (!StatusEffects_active(STATUSEFFECT_SpawnShield, frag_target) || autocvar_g_spawnshield_blockdamage < 1)
-       {
-               float frag_deathtype = M_ARGV(6, float);
-               float frag_damage = M_ARGV(7, float);
-               float damage_take = bound(0, M_ARGV(4, float), GetResource(frag_target, RES_HEALTH));
-               float damage_save = bound(0, M_ARGV(5, float), GetResource(frag_target, RES_ARMOR));
+       if (StatusEffects_active(STATUSEFFECT_SpawnShield, frag_target) && autocvar_g_spawnshield_blockdamage >= 1)return;
+       
+       entity frag_attacker = M_ARGV(1, entity);
+       float frag_deathtype = M_ARGV(6, float);
+       float frag_damage = M_ARGV(7, float);
+       float damage_take = bound(0, M_ARGV(4, float), GetResource(frag_target, RES_HEALTH));
+       float damage_save = bound(0, M_ARGV(5, float), GetResource(frag_target, RES_ARMOR));
+       float excess = max(0, frag_damage - damage_take - damage_save);
+       float total = frag_damage - excess;
 
-               float excess = max(0, frag_damage - damage_take - damage_save);
-               float total = frag_damage - excess;
+       if (total == 0) return;
 
-               if (StatusEffects_active(STATUSEFFECT_SpawnShield, frag_target) && autocvar_g_spawnshield_blockdamage < 1)
-                       total *= 1 - bound(0, autocvar_g_spawnshield_blockdamage, 1);
+       if (StatusEffects_active(STATUSEFFECT_SpawnShield, frag_target) && autocvar_g_spawnshield_blockdamage < 1)
+               total *= 1 - bound(0, autocvar_g_spawnshield_blockdamage, 1);
 
+       entity scorer = NULL; //entity which needs their score to be updated
+
+       if (IS_PLAYER(frag_attacker))
+       {
                //non-friendly fire
-               if (frag_target != frag_attacker && IS_PLAYER(frag_attacker))
+               if (frag_target != frag_attacker)
                        frag_attacker.total_damage_dealt += total;
 
                //friendly fire aka self damage
-               if (frag_target == frag_attacker && IS_PLAYER(frag_attacker) && !autocvar_g_mayhem_scoringmethod_1_disable_selfdamage2score)
-                       frag_attacker.total_friendly_damage_dealt += total;
+               if (frag_target == frag_attacker && !autocvar_g_mayhem_scoringmethod_1_disable_selfdamage2score)
+                       frag_attacker.total_damage_dealt -= total;
 
+               scorer = frag_attacker;
+       }
+       else
+       {
                //handle (environmental hazard) suiciding, check first if player has a registered attacker who most likely pushed them there to avoid punishing pushed players as pushers are already rewarded
                //deathtypes:
                //kill = suicide, drown = drown in water/liquid, hurttrigger = out of the map void or hurt triggers inside maps like electric sparks
                //camp = campcheck, lava = lava, slime = slime
                //team change / rebalance suicides are currently not included
-               if (!autocvar_g_mayhem_scoringmethod_1_disable_selfdamage2score && !IS_PLAYER(frag_attacker) && (
+               if (!autocvar_g_mayhem_scoringmethod_1_disable_selfdamage2score && (
                        frag_deathtype == DEATH_KILL.m_id ||
                        frag_deathtype == DEATH_DROWN.m_id ||
                        frag_deathtype == DEATH_HURTTRIGGER.m_id ||
@@ -268,19 +280,20 @@ MUTATOR_HOOKFUNCTION(mayhem, PlayerDamage_SplitHealthArmor)
                        frag_deathtype == DEATH_LAVA.m_id ||
                        frag_deathtype == DEATH_SLIME.m_id ||
                        frag_deathtype == DEATH_SWAMP.m_id))
-                               frag_attacker.total_friendly_damage_dealt += total;
+                               frag_target.total_damage_dealt -= total;
 
-               CalculatePlayerScore(frag_attacker, frag_target);
+               scorer = frag_target;
        }
+
+       CalculatePlayerScore(scorer);
 }
 
 MUTATOR_HOOKFUNCTION(mayhem, GiveFragsForKill, CBC_ORDER_FIRST)
 {
        entity frag_attacker = M_ARGV(0, entity);
-       entity frag_target = M_ARGV(1, entity);
-       M_ARGV(2, float) = 0;
+       M_ARGV(2, float) = 0; //score to give for the frag directly
        
-       CalculatePlayerScore(frag_attacker, frag_target);
+       if(IS_PLAYER(frag_attacker))CalculatePlayerScore(frag_attacker);
        
        return true;
 }