From dbcc077426ac9cd6d20c039cb2ec27769f9e8a4a Mon Sep 17 00:00:00 2001 From: Lechuga Date: Tue, 13 Aug 2024 16:46:40 -0400 Subject: [PATCH 1/2] Readyup - New feature and translation of the panel l4d_ready_unready_limit: If different from 0, it will indicate how many times a player can cancel the countdown, this affects only when intentionally cancelled. Panel: The panel's translations will be based on the client's language. --- addons/sourcemod/plugins/optional/readyup.smx | Bin 32088 -> 32561 bytes addons/sourcemod/scripting/readyup.sp | 13 +- addons/sourcemod/scripting/readyup/action.inc | 57 ++++- addons/sourcemod/scripting/readyup/panel.inc | 224 ++++++++++-------- addons/sourcemod/scripting/readyup/setup.inc | 1 + .../translations/chi/readyup.phrases.txt | 59 ++++- .../translations/es/readyup.phrases.txt | 63 ++++- .../translations/jp/readyup.phrases.txt | 59 ++++- .../translations/ko/readyup.phrases.txt | 59 ++++- .../translations/readyup.phrases.txt | 59 ++++- 10 files changed, 484 insertions(+), 110 deletions(-) diff --git a/addons/sourcemod/plugins/optional/readyup.smx b/addons/sourcemod/plugins/optional/readyup.smx index e500ab90f4270e434c8b14a2cc8aba09b11b8ae8..6bacb6d282baac717527b306006748634971aaa6 100644 GIT binary patch literal 32561 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
q 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 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..cbf68ee46 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 From e04d5e4ca5427c978dbbef64ca90d283fd21e6c3 Mon Sep 17 00:00:00 2001 From: Lechuga Date: Tue, 13 Aug 2024 22:39:59 -0400 Subject: [PATCH 2/2] corrections in chi translations --- addons/sourcemod/translations/chi/readyup.phrases.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/sourcemod/translations/chi/readyup.phrases.txt b/addons/sourcemod/translations/chi/readyup.phrases.txt index cbf68ee46..4146efb7d 100644 --- a/addons/sourcemod/translations/chi/readyup.phrases.txt +++ b/addons/sourcemod/translations/chi/readyup.phrases.txt @@ -88,7 +88,7 @@ "UnReadyLimit" { - "chi" "{default}[{green}!{default}] 你已经达到了 {red}取消准备{default}的限制 [{green}%d{default}]" + "chi" "{default}[{green}!{default}] 你已经达到了 {red}取消准备{default} 的上限次数: [{green}%d{default}] 次" } "RoundIsLive" @@ -125,12 +125,12 @@ "PanelCommands" { - "chi" "▸ 命令:" + "chi" "▸ 指令:" } "PanelSurvivors" { - "chi" "->%d. 幸存者%s" + "chi" "->%d. 生还者%s" } "PanelInfected" @@ -150,12 +150,12 @@ "PanelSpectator" { - "chi" "->%d. 观众" + "chi" "->%d. 旁观者" } "PanelSpectators" { - "chi" "->%d. 观众" + "chi" "->%d. 旁观者" } "PanelMany"