diff --git a/addons/sourcemod/plugins/optional/readyup.smx b/addons/sourcemod/plugins/optional/readyup.smx index e500ab90f..6bacb6d28 100644 Binary files a/addons/sourcemod/plugins/optional/readyup.smx and b/addons/sourcemod/plugins/optional/readyup.smx differ diff --git a/addons/sourcemod/scripting/readyup.sp b/addons/sourcemod/scripting/readyup.sp index df9be699c..3a0ab93c3 100644 --- a/addons/sourcemod/scripting/readyup.sp +++ b/addons/sourcemod/scripting/readyup.sp @@ -9,7 +9,7 @@ #undef REQUIRE_PLUGIN #include -#define PLUGIN_VERSION "10.2.5" +#define PLUGIN_VERSION "10.2.6" public Plugin myinfo = { @@ -80,7 +80,7 @@ ConVar // sound l4d_ready_enable_sound, l4d_ready_notify_sound, l4d_ready_countdown_sound, l4d_ready_live_sound, l4d_ready_autostart_sound, l4d_ready_chuckle, l4d_ready_secret, // action - l4d_ready_delay, l4d_ready_force_extra, l4d_ready_autostart_delay, l4d_ready_autostart_wait, l4d_ready_autostart_min, l4d_ready_unbalanced_start, l4d_ready_unbalanced_min; + l4d_ready_delay, l4d_ready_force_extra, l4d_ready_autostart_delay, l4d_ready_autostart_wait, l4d_ready_autostart_min, l4d_ready_unbalanced_start, l4d_ready_unbalanced_min, l4d_ready_unready_limit; // Server Name ConVar @@ -129,6 +129,10 @@ char g_sDisruptReason[disruptType_SIZE][] = "Admin aborted" }; + +// Limit Cancel Ready +StringMap g_smUnreadyCount; + // Sub modules are included here #include "readyup/action.inc" #include "readyup/command.inc" @@ -158,6 +162,7 @@ public void OnPluginStart() SetupConVars(); SetupCommands(); + g_smUnreadyCount = new StringMap(); nativeFooter = new Footer(); readySurvFreeze = l4d_ready_survivor_freeze.BoolValue; @@ -383,6 +388,10 @@ public Action L4D_OnFirstSurvivorLeftSafeArea(int client) ReturnPlayerToSaferoom(client, false); return Plugin_Handled; } + + if(l4d_ready_unready_limit.BoolValue) + g_smUnreadyCount.Clear(); + return Plugin_Continue; } diff --git a/addons/sourcemod/scripting/readyup/action.inc b/addons/sourcemod/scripting/readyup/action.inc index e91715f71..b9a911400 100644 --- a/addons/sourcemod/scripting/readyup/action.inc +++ b/addons/sourcemod/scripting/readyup/action.inc @@ -230,19 +230,26 @@ void CancelFullReady(int client, disruptType type) { if (readyUpMode == ReadyMode_AutoStart) return; - + if (s_readyCountdownTimer != null) { + if (l4d_ready_unready_limit.BoolValue && type == readyStatus && !AddUnReadyCount(client)) + return; + delete s_readyCountdownTimer; InitiateReadyUp(false); SetTeamFrozen(L4D2Team_Survivor, l4d_ready_survivor_freeze.BoolValue); if (type == teamShuffle) // fix spectating SetClientFrozen(client, false); - + PrintHintTextToAll("%t", "LiveCountdownCancelled"); - CPrintToChatAllEx(client, "%t", g_sDisruptReason[type], client); - + + if (l4d_ready_unready_limit.BoolValue && type == readyStatus) + CPrintToChatAllEx(client, "%t %t", g_sDisruptReason[type], client, "CountUnReady", GetUnReadyCount(client), l4d_ready_unready_limit.IntValue); + else + CPrintToChatAllEx(client, "%t", g_sDisruptReason[type], client); + if (g_hCountdownCancelledForward.FunctionCount) { Call_StartForward(g_hCountdownCancelledForward); @@ -253,6 +260,7 @@ void CancelFullReady(int client, disruptType type) } } + void RespectateSpectators() { for (int client = 1; client <= MaxClients; ++client) @@ -262,4 +270,45 @@ void RespectateSpectators() FakeClientCommand(client, "sm_spectate"); } } +} + +/** + * Adds an unready count for a client. + * + * @param client The client index. + * @return True if the unready count was successfully added, false otherwise. + */ +bool AddUnReadyCount(int client) +{ + char authId[18]; + GetClientAuthId(client, AuthId_SteamID64, authId, sizeof(authId)); + int unReadyCount = 0; + g_smUnreadyCount.GetValue(authId, unReadyCount); + + if (unReadyCount >= l4d_ready_unready_limit.IntValue) + { + CPrintToChat(client, "%t", "UnReadyLimit", l4d_ready_unready_limit.IntValue); + return false; + } + + unReadyCount++; + g_smUnreadyCount.SetValue(authId, unReadyCount); + + return true; +} + +/** + * Returns the number of unready(s) for a given client. + * + * @param client The client index. + * @return The number of unready players. + */ +int GetUnReadyCount(int client) +{ + char authId[18]; + GetClientAuthId(client, AuthId_SteamID64, authId, sizeof(authId)); + int unReadyCount = 0; + g_smUnreadyCount.GetValue(authId, unReadyCount); + + return unReadyCount; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/readyup/panel.inc b/addons/sourcemod/scripting/readyup/panel.inc index 9f5a8b1c1..3e870f8b0 100644 --- a/addons/sourcemod/scripting/readyup/panel.inc +++ b/addons/sourcemod/scripting/readyup/panel.inc @@ -1,18 +1,18 @@ #if defined _readyup_panel_included - #endinput + #endinput #endif #define _readyup_panel_included static Footer cmdFooter; - + static int curCmd; -static const char - hintPhrase[2][] = {"HintUnready", "HintReady"}, - readySymbol[2][] = {"☐", "☑"}, - teamReadySymbol[2][] = {" [X]", " [√]"}; +static const char + hintPhrase[2][] = { "HintUnready", "HintReady" }, + readySymbol[2][] = { "☐", "☑" }, + teamReadySymbol[2][] = { " [X]", " [√]" }; void InitPanel() { @@ -29,13 +29,13 @@ void InitPanel() cmdFooter.Add("->8. !secondary"); cmdFooter.Add("->9. !forcestart / !fs"); } - + curCmd = 0; - CreateTimer(1.0, MenuRefresh_Timer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); - CreateTimer(4.0, MenuCmd_Timer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(1.0, MenuRefresh_Timer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); + CreateTimer(4.0, MenuCmd_Timer, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE); } -int DummyHandler(Handle menu, MenuAction action, int param1, int param2) { return 1; } +int DummyHandler(Handle menu, MenuAction action, int param1, int param2) { return 1; } Action MenuRefresh_Timer(Handle timer) { @@ -64,58 +64,62 @@ void UpdatePanel() { char survivorBuffer[400] = ""; char infectedBuffer[400] = ""; - char casterBuffer[300] = ""; - char specBuffer[200] = ""; - int playerCount = 0; - int casterCount = 0; - int specCount = 0; - - Panel menuPanel = new Panel(); + char casterBuffer[300] = ""; + char specBuffer[200] = ""; + int playerCount = 0; + int casterCount = 0; + int specCount = 0; char ServerBuffer[128]; char ServerName[32]; char cfgName[32]; - int iPassTime = RoundToFloor(GetGameTime() - fStartTimestamp); - + int iPassTime = RoundToFloor(GetGameTime() - fStartTimestamp); + bool isTeamReadyMode = readyUpMode == ReadyMode_TeamReady; - int survivorReady = IsTeamReady(L4D2Team_Survivor); - int infectedReady = IsTeamReady(L4D2Team_Infected); + int survivorReady = IsTeamReady(L4D2Team_Survivor); + int infectedReady = IsTeamReady(L4D2Team_Infected); + // Panel Slots g_cvServerNamer.GetString(ServerName, sizeof(ServerName)); - l4d_ready_cfg_name.GetString(cfgName, sizeof(cfgName)); - Format(ServerBuffer, sizeof(ServerBuffer), "▸ Server: %s \n▸ Slots: %d/%d\n▸ Config: %s", ServerName, GetSeriousClientCount(), FindConVar("sv_maxplayers").IntValue, cfgName); - menuPanel.DrawText(ServerBuffer); - - FormatTime(ServerBuffer, sizeof(ServerBuffer), "▸ %m/%d/%Y - %I:%M%p"); - Format(ServerBuffer, sizeof(ServerBuffer), "%s (%02d:%02d)", ServerBuffer, iPassTime / 60, iPassTime % 60); - menuPanel.DrawText(ServerBuffer); - - menuPanel.DrawText(" "); - menuPanel.DrawText("▸ Commands:"); - menuPanel.DrawText(FooterGet(cmdFooter, curCmd)); - menuPanel.DrawText(" "); - + int Maxplayers; + ConVar sv_maxplayers = FindConVar("sv_maxplayers"); + if (sv_maxplayers == null) + Maxplayers = 8; + else + Maxplayers = sv_maxplayers.IntValue; + + // Panel DateTime - Format will be defined by sm_datetime_format + char DateTimeBuffer[128]; + FormatTime(DateTimeBuffer, sizeof(DateTimeBuffer), NULL_STRING); + Format(DateTimeBuffer, sizeof(DateTimeBuffer), "▸ %s", DateTimeBuffer); + Format(DateTimeBuffer, sizeof(DateTimeBuffer), "%s (%02d:%02d)", DateTimeBuffer, iPassTime / 60, iPassTime % 60); + + // Panel Commands + char FooterBuffer[128]; + Format(FooterBuffer, sizeof(FooterBuffer), "%s", FooterGet(cmdFooter, curCmd)); + + // Panel Players char nameBuf[64]; - for (int client = 1; client <= MaxClients; client++) { if (IsClientInGame(client) && !IsFakeClient(client)) { ++playerCount; GetClientFixedName(client, nameBuf, sizeof(nameBuf)); - + if (IsPlayer(client)) { - bool type = (GetClientTeam(client) == L4D2Team_Survivor); - int isReady = view_as(IsPlayerReady(client)); - + bool type = (GetClientTeam(client) == L4D2Team_Survivor); + int isReady = view_as(IsPlayerReady(client)); + switch (readyUpMode) { case ReadyMode_PlayerReady: { - if (!inLiveCountdown) PrintHintText(client, "%t", hintPhrase[isReady]); + if (!inLiveCountdown) + PrintHintText(client, "%t", hintPhrase[isReady]); Format(nameBuf, sizeof(nameBuf), "%s %s%s\n", readySymbol[isReady], nameBuf, IsPlayerAfk(client) ? " [AFK]" : ""); } case ReadyMode_AutoStart: @@ -124,7 +128,8 @@ void UpdatePanel() } case ReadyMode_TeamReady: { - if (!inLiveCountdown) PrintHintText(client, "%t", hintPhrase[type ? survivorReady : infectedReady]); + if (!inLiveCountdown) + PrintHintText(client, "%t", hintPhrase[type ? survivorReady : infectedReady]); Format(nameBuf, sizeof(nameBuf), "%s%s\n", nameBuf, IsPlayerAfk(client) ? " [AFK]" : ""); } } @@ -150,16 +155,13 @@ void UpdatePanel() } } } - + int textCount = 0; - int bufLen = strlen(survivorBuffer); + int bufLen = strlen(survivorBuffer); if (bufLen != 0) { survivorBuffer[bufLen] = '\0'; ReplaceString(survivorBuffer, sizeof(survivorBuffer), "#", "_"); - Format(nameBuf, sizeof(nameBuf), "->%d. Survivors%s", ++textCount, isTeamReadyMode ? teamReadySymbol[survivorReady] : ""); - menuPanel.DrawText(nameBuf); - menuPanel.DrawText(survivorBuffer); } bufLen = strlen(infectedBuffer); @@ -167,73 +169,101 @@ void UpdatePanel() { infectedBuffer[bufLen] = '\0'; ReplaceString(infectedBuffer, sizeof(infectedBuffer), "#", "_"); - Format(nameBuf, sizeof(nameBuf), "->%d. Infected%s", ++textCount, isTeamReadyMode ? teamReadySymbol[infectedReady] : ""); - menuPanel.DrawText(nameBuf); - menuPanel.DrawText(infectedBuffer); } - - if (specCount && textCount) menuPanel.DrawText(" "); - if (casterSystemAvailable) + for (int client = 1; client <= MaxClients; client++) { - bufLen = strlen(casterBuffer); + if (!IsClientInGame(client) || IsFakeClient(client) || IsPlayerHiddenPanel(client)) + continue; + + if (BuiltinVote_IsVoteInProgress() && IsClientInBuiltinVotePool(client)) + continue; + + if (Game_IsVoteInProgress()) + { + int voteteam = Game_GetVoteTeam(); + if (voteteam == -1 || voteteam == GetClientTeam(client)) + continue; + } + + switch (GetClientMenu(client)) + { + case MenuSource_External, MenuSource_Normal: continue; + } + + Panel menuPanel = new Panel(); + + Format(ServerBuffer, sizeof(ServerBuffer), "%T", "PanelSlots", client, ServerName, GetSeriousClientCount(), Maxplayers, cfgName); + menuPanel.DrawText(ServerBuffer); + menuPanel.DrawText(DateTimeBuffer); + + menuPanel.DrawText(" "); + Format(ServerBuffer, sizeof(ServerBuffer), "%T", "PanelCommands", client); + menuPanel.DrawText(ServerBuffer); + menuPanel.DrawText(FooterBuffer); + menuPanel.DrawText(" "); + + bufLen = strlen(survivorBuffer); if (bufLen != 0) { - casterBuffer[bufLen] = '\0'; - Format(nameBuf, sizeof(nameBuf), "->%d. Caster%s", ++textCount, casterCount > 1 ? "s" : ""); + Format(nameBuf, sizeof(nameBuf), "%T", "PanelSurvivors", client, ++textCount, isTeamReadyMode ? teamReadySymbol[survivorReady] : ""); menuPanel.DrawText(nameBuf); - ReplaceString(casterBuffer, sizeof(casterBuffer), "#", "_", true); - menuPanel.DrawText(casterBuffer); + menuPanel.DrawText(survivorBuffer); } - } - - bufLen = strlen(specBuffer); - if (bufLen != 0) - { - specBuffer[bufLen] = '\0'; - Format(nameBuf, sizeof(nameBuf), "->%d. Spectator%s", ++textCount, specCount > 1 ? "s" : ""); - menuPanel.DrawText(nameBuf); - ReplaceString(specBuffer, sizeof(specBuffer), "#", "_"); - if (playerCount > l4d_ready_max_players.IntValue && specCount - casterCount > 1) - FormatEx(specBuffer, sizeof(specBuffer), "**Many** (%d)", specCount - casterCount); - menuPanel.DrawText(specBuffer); - } - if (nativeFooter.Length) - { - menuPanel.DrawText(" "); - for (int i = 0; i < nativeFooter.Length; i++) + bufLen = strlen(infectedBuffer); + if (bufLen != 0) { - menuPanel.DrawText(FooterGet(nativeFooter, i)); + Format(nameBuf, sizeof(nameBuf), "%T", "PanelInfected", client, ++textCount, isTeamReadyMode ? teamReadySymbol[infectedReady] : ""); + menuPanel.DrawText(nameBuf); + menuPanel.DrawText(infectedBuffer); } - } - for (int client = 1; client <= MaxClients; client++) - { - if (IsClientInGame(client) && !IsFakeClient(client) && !IsPlayerHiddenPanel(client)) + if (specCount && textCount) + menuPanel.DrawText(" "); + + if (casterSystemAvailable) { - if (BuiltinVote_IsVoteInProgress() && IsClientInBuiltinVotePool(client)) + bufLen = strlen(casterBuffer); + if (bufLen != 0) { - continue; - } - - if (Game_IsVoteInProgress()) - { - int voteteam = Game_GetVoteTeam(); - if (voteteam == -1 || voteteam == GetClientTeam(client)) - { - continue; - } + casterBuffer[bufLen] = '\0'; + if (casterCount < 2) + Format(nameBuf, sizeof(nameBuf), "%T", "PanelCaster", client, ++textCount); + else + Format(nameBuf, sizeof(nameBuf), "%T", "PanelCasters", client, ++textCount); + menuPanel.DrawText(nameBuf); + ReplaceString(casterBuffer, sizeof(casterBuffer), "#", "_", true); + menuPanel.DrawText(casterBuffer); } - - switch (GetClientMenu(client)) + } + + bufLen = strlen(specBuffer); + if (bufLen != 0) + { + specBuffer[bufLen] = '\0'; + if (specCount < 2) + Format(nameBuf, sizeof(nameBuf), "%T", "PanelSpectator", client, ++textCount); + else + Format(nameBuf, sizeof(nameBuf), "%T", "PanelSpectators", client, ++textCount); + + menuPanel.DrawText(nameBuf); + ReplaceString(specBuffer, sizeof(specBuffer), "#", "_"); + if (playerCount > l4d_ready_max_players.IntValue && specCount - casterCount > 1) + FormatEx(specBuffer, sizeof(specBuffer), "%T", "PanelMany", client, specCount - casterCount); + menuPanel.DrawText(specBuffer); + } + + if (nativeFooter.Length) + { + menuPanel.DrawText(" "); + for (int i = 0; i < nativeFooter.Length; i++) { - case MenuSource_External, MenuSource_Normal: continue; + menuPanel.DrawText(FooterGet(nativeFooter, i)); } - - menuPanel.Send(client, DummyHandler, 1); } + + menuPanel.Send(client, DummyHandler, 1); + delete menuPanel; } - - delete menuPanel; } \ No newline at end of file diff --git a/addons/sourcemod/scripting/readyup/setup.inc b/addons/sourcemod/scripting/readyup/setup.inc index fe8649c14..b551171e3 100644 --- a/addons/sourcemod/scripting/readyup/setup.inc +++ b/addons/sourcemod/scripting/readyup/setup.inc @@ -72,6 +72,7 @@ void SetupConVars() l4d_ready_autostart_min = CreateConVar("l4d_ready_autostart_min", "0.25", "Percent of max players (Versus = 8) in game to allow auto-start to proceed.", FCVAR_NOTIFY, true, 0.0, true, 1.0); l4d_ready_unbalanced_start = CreateConVar("l4d_ready_unbalanced_start", "0", "Allow game to go live when teams are not full.", FCVAR_NOTIFY, true, 0.0, true, 1.0); l4d_ready_unbalanced_min = CreateConVar("l4d_ready_unbalanced_min", "2", "Minimum of players in each team to allow a unbalanced start.", FCVAR_NOTIFY, true, 0.0); + l4d_ready_unready_limit = CreateConVar("l4d_ready_unready_limit", "0", "Limit of unready that a player can do. Set to 0 to disable.", FCVAR_NOTIFY, true, 0.0, true, 1.0); // game convars director_no_specials = FindConVar("director_no_specials"); diff --git a/addons/sourcemod/translations/chi/readyup.phrases.txt b/addons/sourcemod/translations/chi/readyup.phrases.txt index 1a7c27823..4146efb7d 100644 --- a/addons/sourcemod/translations/chi/readyup.phrases.txt +++ b/addons/sourcemod/translations/chi/readyup.phrases.txt @@ -79,7 +79,18 @@ { "chi" "倒数中止!" } - + + "CountUnReady" + { + "#format" "{1:d}{2:d}" + "chi" "[{olive}{1}{default}/{olive}{2}{default}]" + } + + "UnReadyLimit" + { + "chi" "{default}[{green}!{default}] 你已经达到了 {red}取消准备{default} 的上限次数: [{green}%d{default}] 次" + } + "RoundIsLive" { "chi" "比赛开始!" @@ -105,4 +116,50 @@ { "chi" "玩家数量不足..." } + + // readyup/panel.inc + "PanelSlots" + { + "chi" "▸ 服务器: %s \n▸ 玩家: %d/%d\n▸ 配置: %s" + } + + "PanelCommands" + { + "chi" "▸ 指令:" + } + + "PanelSurvivors" + { + "chi" "->%d. 生还者%s" + } + + "PanelInfected" + { + "chi" "->%d. 感染者%s" + } + + "PanelCaster" + { + "chi" "->%d. 解说员" + } + + "PanelCasters" + { + "chi" "->%d. 解说员" + } + + "PanelSpectator" + { + "chi" "->%d. 旁观者" + } + + "PanelSpectators" + { + "chi" "->%d. 旁观者" + } + + "PanelMany" + { + "chi" "**许多** (%d)" + } } \ No newline at end of file diff --git a/addons/sourcemod/translations/es/readyup.phrases.txt b/addons/sourcemod/translations/es/readyup.phrases.txt index 47ed34a2f..81d2d0a95 100644 --- a/addons/sourcemod/translations/es/readyup.phrases.txt +++ b/addons/sourcemod/translations/es/readyup.phrases.txt @@ -31,13 +31,13 @@ "Player marked unready" { "#format" "{1:N}" - "es" "{default}[{green}!{default}] {green}¡Cuenta regresiva cancelada! {default}({teamcolor}{1} {green}marcado como no listo{default})" + "es" "{default}[{green}!{default}] {green}¡Cuenta regresiva cancelada! {default}({teamcolor}{1}{default} no esta {green}listo{default})" } "Player switched team" { "#format" "{1:N}" - "es" "{default}[{green}!{default}] {green}¡Cuenta regresiva cancelada! {default}({teamcolor}{1} {olive}cambio de equipo{default})" + "es" "{default}[{green}!{default}] {green}¡Cuenta regresiva cancelada! {default}({teamcolor}{1}{default} se {olive}cambio de equipo{default})" } "Player disconnected" @@ -79,7 +79,18 @@ { "es" "¡Cuenta regresiva cancelada!" } - + + "CountUnReady" + { + "#format" "{1:d}{2:d}" + "es" "[{olive}{1}{default}/{olive}{2}{default}]" + } + + "UnReadyLimit" + { + "es" "{default}[{green}!{default}] Has alcanzado tu {red}limite de cancelaciones{default} [{green}%d{default}]" + } + "RoundIsLive" { "es" "¡La ronda esta en vivo!" @@ -105,4 +116,50 @@ { "es" "Se requieren mas jugadores..." } + + // readyup/panel.inc + "PanelSlots" + { + "es" "▸ Servidor: %s \n▸ Espacios: %d/%d\n▸ Config: %s" + } + + "PanelCommands" + { + "es" "▸ Comandos:" + } + + "PanelSurvivors" + { + "es" "->%d. Superviviente%s" + } + + "PanelInfected" + { + "es" "->%d. Infectado%s" + } + + "PanelCaster" + { + "es" "->%d. Comentador" + } + + "PanelCasters" + { + "es" "->%d. Comentadores" + } + + "PanelSpectator" + { + "es" "->%d. Espectador" + } + + "PanelSpectators" + { + "es" "->%d. Espectadores" + } + + "PanelMany" + { + "es" "**Muchos** (%d)" + } } \ No newline at end of file diff --git a/addons/sourcemod/translations/jp/readyup.phrases.txt b/addons/sourcemod/translations/jp/readyup.phrases.txt index 155f6a8b1..40165c7a3 100644 --- a/addons/sourcemod/translations/jp/readyup.phrases.txt +++ b/addons/sourcemod/translations/jp/readyup.phrases.txt @@ -79,7 +79,18 @@ { "jp" "カウントダウンがキャンセルされました!" } - + + "CountUnReady" + { + "#format" "{1:d}{2:d}" + "jp" "[{olive}{1}{default}/{olive}{2}{default}]" + } + + "UnReadyLimit" + { + "jp" "{default}[{green}!{default}] キャンセル回数が{red}制限{default}に達しました [{green}%d{default}]" + } + "RoundIsLive" { "jp" "ラウンド開始!" @@ -100,4 +111,50 @@ { "jp" "プレイヤーのローディング完了を待っています..." } + + // readyup/panel.inc + "PanelSlots" + { + "jp" "▸ サーバー: %s \n▸ スロット: %d/%d\n▸ 設定: %s" + } + + "PanelCommands" + { + "jp" "▸ コマンド:" + } + + "PanelSurvivors" + { + "jp" "->%d. 生存者%s" + } + + "PanelInfected" + { + "jp" "->%d. インフェクテッド%s" + } + + "PanelCaster" + { + "jp" "->%d. キャスター" + } + + "PanelCasters" + { + "jp" "->%d. キャスター" + } + + "PanelSpectator" + { + "jp" "->%d. 観戦者" + } + + "PanelSpectators" + { + "jp" "->%d. 観戦者" + } + + "PanelMany" + { + "jp" "**多数** (%d)" + } } \ No newline at end of file diff --git a/addons/sourcemod/translations/ko/readyup.phrases.txt b/addons/sourcemod/translations/ko/readyup.phrases.txt index 3bd61e576..bc760df13 100644 --- a/addons/sourcemod/translations/ko/readyup.phrases.txt +++ b/addons/sourcemod/translations/ko/readyup.phrases.txt @@ -79,7 +79,18 @@ { "ko" "카운트다운 취소됨!" } - + + "CountUnReady" + { + "#format" "{1:d}{2:d}" + "ko" "[{olive}{1}{default}/{olive}{2}{default}]" + } + + "UnReadyLimit" + { + "ko" "{default}[{green}!{default}] 취소한 횟수가 {red}제한{default}에 도달했습니다 [{green}%d{default}]" + } + "RoundIsLive" { "ko" "라운드 시작!" @@ -100,4 +111,50 @@ { "ko" "로드 중인 플레이어를 기다립니다." } + + // readyup/panel.inc + "PanelSlots" + { + "ko" "▸ 서버: %s \n▸ 슬롯: %d/%d\n▸ 설정: %s" + } + + "PanelCommands" + { + "ko" "▸ 명령어:" + } + + "PanelSurvivors" + { + "ko" "->%d. 생존자%s" + } + + "PanelInfected" + { + "ko" "->%d. 감염자%s" + } + + "PanelCaster" + { + "ko" "->%d. 캐스터" + } + + "PanelCasters" + { + "ko" "->%d. 캐스터" + } + + "PanelSpectator" + { + "ko" "->%d. 관전자" + } + + "PanelSpectators" + { + "ko" "->%d. 관전자" + } + + "PanelMany" + { + "ko" "**많음** (%d)" + } } \ No newline at end of file diff --git a/addons/sourcemod/translations/readyup.phrases.txt b/addons/sourcemod/translations/readyup.phrases.txt index 62efbbeb4..dd0f2afd8 100644 --- a/addons/sourcemod/translations/readyup.phrases.txt +++ b/addons/sourcemod/translations/readyup.phrases.txt @@ -79,7 +79,18 @@ { "en" "Countdown Cancelled!" } - + + "CountUnReady" + { + "#format" "{1:d}{2:d}" + "en" "[{olive}{1}{default}/{olive}{2}{default}]" + } + + "UnReadyLimit" + { + "en" "{default}[{green}!{default}] You have reached your {red}unready limit{default} [{green}%d{default}]" + } + "RoundIsLive" { "en" "Round is live!" @@ -105,4 +116,50 @@ { "en" "More players are required..." } + + // readyup/panel.inc + "PanelSlots" + { + "en" "▸ Server: %s \n▸ Slots: %d/%d\n▸ Config: %s" + } + + "PanelCommands" + { + "en" "▸ Commands:" + } + + "PanelSurvivors" + { + "en" "->%d. Survivors%s" + } + + "PanelInfected" + { + "en" "->%d. Infected%s" + } + + "PanelCaster" + { + "en" "->%d. Caster" + } + + "PanelCasters" + { + "en" "->%d. Casters" + } + + "PanelSpectator" + { + "en" "->%d. Spectator" + } + + "PanelSpectators" + { + "en" "->%d. Spectators" + } + + "PanelMany" + { + "en" "**Many** (%d)" + } } \ No newline at end of file