From: drjaska Date: Mon, 17 Jan 2022 22:09:58 +0000 (+0200) Subject: a little bit of refactoring X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=307942075041c925f1d607e1c8079bb90a28e583;p=xonotic%2Fxonotic-data.pk3dir.git a little bit of refactoring --- diff --git a/qcsrc/common/gamemodes/gamemode/mayhem/sv_mayhem.qc b/qcsrc/common/gamemodes/gamemode/mayhem/sv_mayhem.qc index 573e53352..aeca56e40 100644 --- a/qcsrc/common/gamemodes/gamemode/mayhem/sv_mayhem.qc +++ b/qcsrc/common/gamemodes/gamemode/mayhem/sv_mayhem.qc @@ -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; }