]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/gamemodes/gamemode/mmm/sv_mmm.qc
Fix visualization if server admin uses 'sv_ready_restart_after_countdown 1'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / gamemodes / gamemode / mmm / sv_mmm.qc
index c970f6335f581add250a8f32b0fdc90300d768a4..c2931f967f86c5f745f5fae200213ce8f1249b15 100644 (file)
@@ -18,13 +18,6 @@ float autocvar_g_mmm_karma_severity = 0.25;
 float autocvar_g_mmm_karma_damagepunishmentdeal = 20; //LegendGuard sets Karma punishment damage setting if player kills an ally 28-03-2021
 // Sleuth is a created team, this team is added inside Civilians team
 
-/*scoreboard.qc method
-void KarmaScore_GetField(entity pl, PlayerScoreField field)
-{
-       if (field == SP_MMM_KARMA)
-       float karmap = pl.(scores(SP_MMM_KARMA));
-}*/
-
 void mmm_FakeTimeLimit(entity e, float t)
 {
        if(!IS_REAL_CLIENT(e))
@@ -229,6 +222,17 @@ float mmm_CheckWinner()
        return 1;
 }
 
+void Karma_WarningCheck(entity it)
+{
+       float totalmeankarma = ((autocvar_g_mmm_max_karma_points + autocvar_g_mmm_min_karma_points + it.karmapoints) / 3);
+       if (it.karmapoints <= totalmeankarma)
+       {
+               Send_Notification(NOTIF_ONE_ONLY, it, MSG_INFO, INFO_MMM_KARMAWARNING);
+               //centerprint(it, strcat(BOLD_OPERATOR, "^1KARMA WARNING!\n^3Here, have the Rifle!"));
+               GiveWeapon(it, WEP_RIFLE.m_id, OP_PLUS, 1);
+       }
+}
+
 void mmm_RoundStart()
 {
        allowed_to_spawn = boolean(warmup_stage);
@@ -337,17 +341,12 @@ void mmm_RoundStart()
 
        FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
        {
-               float totalmeankarma = ((autocvar_g_mmm_max_karma_points + autocvar_g_mmm_min_karma_points + it.karmapoints) / 3);
                karma_Control(it);
                it.activekillerrole = false;
 
                if(it.mmm_status == MMM_STATUS_CIVILIAN)
                {
-                       if (it.karmapoints <= totalmeankarma)
-                       {
-                               centerprint(it, strcat(BOLD_OPERATOR, "^1KARMA WARNING!\n^3Here, have the Rifle!"));
-                               GiveWeapon(it, WEP_RIFLE.m_id, OP_PLUS, 1);
-                       }
+                       Karma_WarningCheck(it);
                        //Gives Mine Layer weapon to the player
                        GiveWeapon(it, WEP_MINE_LAYER.m_id, OP_PLUS, 1);
                        Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_MMM_CIVILIAN);
@@ -356,11 +355,7 @@ void mmm_RoundStart()
                }
                else if(it.mmm_status == MMM_STATUS_MURDERER)
                {
-                       if (it.karmapoints <= totalmeankarma)
-                       {
-                               centerprint(it, strcat(BOLD_OPERATOR, "^1KARMA WARNING!\n^3Here, have the Rifle!"));
-                               GiveWeapon(it, WEP_RIFLE.m_id, OP_PLUS, 1);
-                       }
+                       Karma_WarningCheck(it);
                        //Gives Mine Layer weapon to the player
                        GiveWeapon(it, WEP_MINE_LAYER.m_id, OP_PLUS, 1);
                        Send_Notification(NOTIF_ONE_ONLY, it, MSG_CENTER, CENTER_MMM_MURDERER);
@@ -369,11 +364,7 @@ void mmm_RoundStart()
                }
                else if(it.mmm_status == MMM_STATUS_SLEUTH)
                {
-                       if (it.karmapoints <= totalmeankarma)
-                       {
-                               centerprint(it, strcat(BOLD_OPERATOR, "^1KARMA WARNING!\n^3Here, have the Rifle!"));
-                               GiveWeapon(it, WEP_RIFLE.m_id, OP_PLUS, 1);
-                       }
+                       Karma_WarningCheck(it);
                        //Gives Shockwave and Mine Layer weapon to the player
                        GiveWeapon(it, WEP_SHOCKWAVE.m_id, OP_PLUS, 1);
                        GiveWeapon(it, WEP_MINE_LAYER.m_id, OP_PLUS, 1);
@@ -681,7 +672,31 @@ MUTATOR_HOOKFUNCTION(mmm, Damage_Calculate)
 MUTATOR_HOOKFUNCTION(mmm, PlayerPreThink)
 {
        entity player = M_ARGV(0, entity);
-       
+       int playercount = 0;
+       bool playercheck = false;
+
+       if (playercheck != true)
+       {
+               FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
+               {
+                       ++playercount;
+               });
+               playercheck = true;
+       }
+
+       //if the murderer is still here around, then avoid illogical winning
+       if (playercheck == true)
+       {
+               FOREACH_CLIENT(IS_PLAYER(it) && !IS_DEAD(it),
+               {
+                       if (playercount == 3)
+                       {
+                               if (it.mmm_status == MMM_STATUS_SLEUTH)
+                                       it.mmm_status = MMM_STATUS_CIVILIAN;
+                       }
+               });
+       }
+
        if(IS_PLAYER(player) || player.caplayer)
        {
                if (player.karmaspectated != true)
@@ -722,6 +737,7 @@ MUTATOR_HOOKFUNCTION(mmm, PlayerSpawn)
        //Karma points start
        if (player.karmastarted != true)
        {
+               CS(player).scorekeeper.(scores(SP_MMM_KARMA)) = 0; //full karma reset lol
                player.karmapoints = autocvar_g_mmm_max_karma_points;
                GameRules_scoring_add(player, MMM_KARMA, player.karmapoints);
                player.karmastarted = true;
@@ -925,6 +941,12 @@ MUTATOR_HOOKFUNCTION(mmm, CalculateRespawnTime)
        return true;
 }
 
+//if server admin sets "sv_ready_restart_after_countdown 1", will avoid possible visual failure for karma in the scoreboard
+MUTATOR_HOOKFUNCTION(mmm, ReadLevelCvars)
+{
+       sv_ready_restart_after_countdown = 0;
+}
+
 MUTATOR_HOOKFUNCTION(mmm, Bot_FixCount, CBC_ORDER_EXCLUSIVE)
 {
        FOREACH_CLIENT(IS_REAL_CLIENT(it), {