X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fgamemodes%2Fgamemode%2Flms%2Fsv_lms.qc;h=dc18b7c9072413a51d0d93d2aff0993682cb0750;hb=bee54f50a9b23fa73a00c4cf4945bff53ce9176c;hp=d590895a4775bea5a84fe7db05e6082b48ac3ff7;hpb=729f7cf812441720792d8a0e3444f3c3828368b6;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc index d590895a4..dc18b7c90 100644 --- a/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc +++ b/qcsrc/common/gamemodes/gamemode/lms/sv_lms.qc @@ -3,6 +3,8 @@ #include #include #include +#include +#include int autocvar_g_lms_extra_lives; bool autocvar_g_lms_join_anytime; @@ -10,11 +12,10 @@ int autocvar_g_lms_last_join; bool autocvar_g_lms_regenerate; // main functions -float LMS_NewPlayerLives() +int LMS_NewPlayerLives() { - float fl; - fl = autocvar_fraglimit; - if(fl == 0) + int fl = floor(autocvar_fraglimit); + if(fl == 0 || fl > 999) fl = 999; // first player has left the game for dying too much? Nobody else can get in. @@ -22,7 +23,7 @@ float LMS_NewPlayerLives() return 0; if(!autocvar_g_lms_join_anytime) - if(lms_lowest_lives < fl - autocvar_g_lms_last_join) + if(lms_lowest_lives < fl - max(0, floor(autocvar_g_lms_last_join))) return 0; return bound(1, lms_lowest_lives, fl); @@ -161,9 +162,7 @@ MUTATOR_HOOKFUNCTION(lms, ForbidSpawn) if(warmup_stage) return false; - if(player.frags == FRAGS_SPECTATOR) - return true; - if(GameRules_scoring_add(player, LMS_LIVES, 0) <= 0) + if(player.frags == FRAGS_SPECTATOR || GameRules_scoring_add(player, LMS_LIVES, 0) <= 0) { Send_Notification(NOTIF_ONE, player, MSG_CENTER, CENTER_LMS_NOLIVES); return true; @@ -175,6 +174,13 @@ MUTATOR_HOOKFUNCTION(lms, PlayerDies) { entity frag_target = M_ARGV(2, entity); + float tl = GameRules_scoring_add(frag_target, LMS_LIVES, 0); + if (tl <= 0) + { + frag_target.respawn_flags = RESPAWN_SILENT; + // prevent unwanted sudden rejoin as spectator and movement of spectator camera + frag_target.respawn_time = time + 2; + } frag_target.respawn_flags |= RESPAWN_FORCE; } @@ -184,27 +190,23 @@ void lms_RemovePlayer(entity player) float player_rank = GameRules_scoring_add(player, LMS_RANK, 0); if (!player_rank) { - int pl_cnt = 0; - FOREACH_CLIENT(IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME, { - pl_cnt++; - }); if (player.lms_spectate_warning < 2) { - if(IS_BOT_CLIENT(player)) - bot_clear(player); player.frags = FRAGS_PLAYER_OUT_OF_GAME; + int pl_cnt = 0; + FOREACH_CLIENT(IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME, { + pl_cnt++; + }); GameRules_scoring_add(player, LMS_RANK, pl_cnt + 1); } else { - lms_lowest_lives = 999; FOREACH_CLIENT(true, { if (it.frags == FRAGS_PLAYER_OUT_OF_GAME) { float it_rank = GameRules_scoring_add(it, LMS_RANK, 0); if (it_rank > player_rank && it_rank <= 256) GameRules_scoring_add(it, LMS_RANK, -1); - lms_lowest_lives = 0; } else if (it.frags != FRAGS_SPECTATOR) { @@ -310,8 +312,6 @@ MUTATOR_HOOKFUNCTION(lms, GiveFragsForKill) FOREACH_CLIENT(IS_PLAYER(it) && it.frags != FRAGS_PLAYER_OUT_OF_GAME, { pl_cnt++; }); - if(IS_BOT_CLIENT(frag_target)) - bot_clear(frag_target); frag_target.frags = FRAGS_PLAYER_OUT_OF_GAME; GameRules_scoring_add(frag_target, LMS_RANK, pl_cnt); } @@ -358,6 +358,7 @@ void lms_extralife(entity this) MUTATOR_HOOKFUNCTION(lms, OnEntityPreSpawn) { + if (MUTATOR_RETURNVALUE) return false; if (!autocvar_g_powerups) return false; if (!autocvar_g_lms_extra_lives) return false; @@ -379,6 +380,8 @@ MUTATOR_HOOKFUNCTION(lms, OnEntityPreSpawn) MUTATOR_HOOKFUNCTION(lms, ItemTouch) { + if(MUTATOR_RETURNVALUE) return false; + entity item = M_ARGV(0, entity); entity toucher = M_ARGV(1, entity); @@ -449,5 +452,5 @@ MUTATOR_HOOKFUNCTION(lms, AddPlayerScore) void lms_Initialize() { - lms_lowest_lives = 9999; + lms_lowest_lives = 999; }