diff --git a/.asset/game/sharp/locales/Ptr.Modules.MapManager.json b/.asset/game/sharp/locales/Ptr.Modules.MapManager.json new file mode 100644 index 0000000..c3a070f --- /dev/null +++ b/.asset/game/sharp/locales/Ptr.Modules.MapManager.json @@ -0,0 +1,498 @@ +{ + "ptr.mapmanager.extend_map_after_x": { + "en-us": "A vote to extend the map time can only be initiated after {{green}}{0}{{muted}} seconds.", + "zh-cn": "{{green}}{0}{{muted}} 秒后才能发起延长地图时间投票.", + "zh-tw": "{{green}}{0}{{muted}} 秒後才能發起延長地圖時間投票。", + "pt-br": "Uma votacao para estender o tempo do mapa so pode ser iniciada apos {{green}}{0}{{muted}} segundos.", + "bg-bg": "Гласуване за удължаване на времето на картата може да бъде започнато след {{green}}{0}{{muted}} секунди.", + "cs-cz": "Hlasovani o prodlouzeni casu mapy lze zahajit az po {{green}}{0}{{muted}} sekundach.", + "da-dk": "En afstemning om at forlaenge kortets tid kan forst startes efter {{green}}{0}{{muted}} sekunder.", + "nl-nl": "Een stemming om de maptijd te verlengen kan pas worden gestart na {{green}}{0}{{muted}} seconden.", + "fi-fi": "Aanestys kartan ajan jatkamisesta voidaan aloittaa vasta {{green}}{0}{{muted}} sekunnin kuluttua.", + "fr-fr": "Un vote pour prolonger le temps de la carte ne peut etre lance qu'apres {{green}}{0}{{muted}} secondes.", + "de-de": "Eine Abstimmung zur Verlangerung der Kartenzeit kann erst nach {{green}}{0}{{muted}} Sekunden gestartet werden.", + "el-gr": "Μια ψηφοφορια για παραταση του χρονου του χαρτη μπορει να ξεκινησει μετα απο {{green}}{0}{{muted}} δευτερολεπτα.", + "hu-hu": "A palya idejének meghosszabbitasara vonatkozo szavazas csak {{green}}{0}{{muted}} masodperc utan inditható.", + "id-id": "Pemungutan suara untuk memperpanjang waktu peta hanya dapat dimulai setelah {{green}}{0}{{muted}} detik.", + "it-it": "Una votazione per estendere il tempo della mappa puo essere avviata solo dopo {{green}}{0}{{muted}} secondi.", + "ja-jp": "マップ時間延長の投票は {{green}}{0}{{muted}} 秒後にのみ開始できます。", + "ko-kr": "맵 시간 연장 투표는 {{green}}{0}{{muted}}초 후에만 시작할 수 있습니다.", + "es-419": "Una votacion para extender el tiempo del mapa solo puede iniciarse despues de {{green}}{0}{{muted}} segundos.", + "nb-no": "En avstemning for a forlenge karttiden kan bare startes etter {{green}}{0}{{muted}} sekunder.", + "pl-pl": "Glosowanie nad przedluzeniem czasu mapy mozna rozpoczac dopiero po {{green}}{0}{{muted}} sekundach.", + "pt-pt": "Uma votacao para prolongar o tempo do mapa so pode ser iniciada apos {{green}}{0}{{muted}} segundos.", + "ro-ro": "Un vot pentru prelungirea timpului hartii poate fi initiat doar dupa {{green}}{0}{{muted}} secunde.", + "ru-ru": "Голосование за продление времени карты можно начать только через {{green}}{0}{{muted}} секунд.", + "es-es": "Una votacion para extender el tiempo del mapa solo puede iniciarse despues de {{green}}{0}{{muted}} segundos.", + "sv-se": "En omrostning for att forlanga karttiden kan bara startas efter {{green}}{0}{{muted}} sekunder.", + "th-th": "การโหวตขยายเวลาแผนที่สามารถเริ่มได้หลังจาก {{green}}{0}{{muted}} วินาที", + "tr-tr": "Harita suresini uzatmak icin oylama ancak {{green}}{0}{{muted}} saniye sonra baslatilabilir.", + "uk-ua": "Голосування за продовження часу карти можна розпочати лише через {{green}}{0}{{muted}} секунд.", + "vi-vn": "Cuoc bo phieu gia han thoi gian ban do chi co the bat dau sau {{green}}{0}{{muted}} giay." + }, + "ptr.mapmanager.max_extends_reached": { + "en-us": "The maximum number of times the time can be extended has been reached.", + "zh-cn": "已到达最大可延长时间次数。", + "zh-tw": "已達到最大可延長時間次數。", + "pt-br": "O numero maximo de vezes que o tempo pode ser estendido foi atingido.", + "bg-bg": "Достигнат е максималният брой пъти, в които времето може да бъде удължено.", + "cs-cz": "Bylo dosazeno maximalniho poctu prodlouzeni casu.", + "da-dk": "Det maksimale antal gange tiden kan forlaenges er naet.", + "nl-nl": "Het maximale aantal keren dat de tijd kan worden verlengd is bereikt.", + "fi-fi": "Ajan jatkamisen enimmaismaara on saavutettu.", + "fr-fr": "Le nombre maximum de prolongations du temps a ete atteint.", + "de-de": "Die maximale Anzahl an Zeitverlangerungen wurde erreicht.", + "el-gr": "Εχει επιτευχθει ο μεγιστος αριθμος παρατασεων χρονου.", + "hu-hu": "Elerte a maximalis idomeghosszabbitasok szamat.", + "id-id": "Jumlah maksimum perpanjangan waktu telah tercapai.", + "it-it": "E stato raggiunto il numero massimo di estensioni del tempo.", + "ja-jp": "時間延長の最大回数に達しました。", + "ko-kr": "시간 연장 최대 횟수에 도달했습니다.", + "es-419": "Se ha alcanzado el numero maximo de extensiones de tiempo.", + "nb-no": "Maksimalt antall tidsforlengelser er nadd.", + "pl-pl": "Osiagnieto maksymalna liczbe przedluzen czasu.", + "pt-pt": "O numero maximo de prolongamentos de tempo foi atingido.", + "ro-ro": "A fost atins numarul maxim de prelungiri ale timpului.", + "ru-ru": "Достигнуто максимальное количество продлений времени.", + "es-es": "Se ha alcanzado el numero maximo de extensiones de tiempo.", + "sv-se": "Det maximala antalet tidsforlangningar har uppnatts.", + "th-th": "ถึงจำนวนครั้งสูงสุดที่สามารถขยายเวลาได้แล้ว", + "tr-tr": "Maksimum sure uzatma sayisina ulasildi.", + "uk-ua": "Досягнуто максимальну кількість продовжень часу.", + "vi-vn": "Da dat so lan gia han thoi gian toi da." + }, + "ptr.mapmanager.you_already_voted_to_extend": { + "en-us": "You have already voted to extend the map time.", + "zh-cn": "你已经投票过延长地图时间了。", + "zh-tw": "你已經投票過延長地圖時間了。", + "pt-br": "Voce ja votou para estender o tempo do mapa.", + "bg-bg": "Вече сте гласували за удължаване на времето на картата.", + "cs-cz": "Jiz jste hlasovali pro prodlouzeni casu mapy.", + "da-dk": "Du har allerede stemt for at forlaenge kortets tid.", + "nl-nl": "Je hebt al gestemd om de maptijd te verlengen.", + "fi-fi": "Olet jo aanestanyt kartan ajan jatkamisesta.", + "fr-fr": "Vous avez deja vote pour prolonger le temps de la carte.", + "de-de": "Du hast bereits fur die Verlangerung der Kartenzeit gestimmt.", + "el-gr": "Εχετε ηδη ψηφισει για παραταση του χρονου του χαρτη.", + "hu-hu": "Mar szavaztal a palya idejének meghosszabbitasara.", + "id-id": "Anda sudah memberikan suara untuk memperpanjang waktu peta.", + "it-it": "Hai gia votato per estendere il tempo della mappa.", + "ja-jp": "マップ時間延長に既に投票済みです。", + "ko-kr": "이미 맵 시간 연장에 투표하셨습니다.", + "es-419": "Ya has votado para extender el tiempo del mapa.", + "nb-no": "Du har allerede stemt for a forlenge karttiden.", + "pl-pl": "Juz glosowaes za przedluzeniem czasu mapy.", + "pt-pt": "Ja votou para prolongar o tempo do mapa.", + "ro-ro": "Ai votat deja pentru prelungirea timpului hartii.", + "ru-ru": "Вы уже голосовали за продление времени карты.", + "es-es": "Ya has votado para extender el tiempo del mapa.", + "sv-se": "Du har redan rostat for att forlanga karttiden.", + "th-th": "คุณได้โหวตขยายเวลาแผนที่ไปแล้ว", + "tr-tr": "Harita suresini uzatmak icin zaten oy kullandiniz.", + "uk-ua": "Ви вже голосували за продовження часу карти.", + "vi-vn": "Ban da bo phieu gia han thoi gian ban do roi." + }, + "ptr.mapmanager.extend_vote_progress": { + "en-us": "{{green}}{0}{{muted}} players have voted to extend the map time, {{green}}{1}{{muted}} more votes needed.", + "zh-cn": "已有 {{green}}{0}{{muted}} 人投票延长地图时间,还需 {{green}}{1}{{muted}} 票。", + "zh-tw": "已有 {{green}}{0}{{muted}} 人投票延長地圖時間,還需 {{green}}{1}{{muted}} 票。", + "pt-br": "{{green}}{0}{{muted}} jogadores votaram para estender o tempo do mapa, {{green}}{1}{{muted}} votos a mais necessarios.", + "bg-bg": "{{green}}{0}{{muted}} играчи гласуваха за удължаване на времето, необходими са още {{green}}{1}{{muted}} гласа.", + "cs-cz": "{{green}}{0}{{muted}} hracu hlasovalo pro prodlouzeni casu mapy, potreba jeste {{green}}{1}{{muted}} hlasu.", + "da-dk": "{{green}}{0}{{muted}} spillere har stemt for at forlaenge kortets tid, {{green}}{1}{{muted}} flere stemmer nodvendige.", + "nl-nl": "{{green}}{0}{{muted}} spelers hebben gestemd om de maptijd te verlengen, nog {{green}}{1}{{muted}} stemmen nodig.", + "fi-fi": "{{green}}{0}{{muted}} pelaajaa on aanestanyt ajan jatkamisesta, {{green}}{1}{{muted}} aanta viela tarvitaan.", + "fr-fr": "{{green}}{0}{{muted}} joueurs ont vote pour prolonger le temps, {{green}}{1}{{muted}} votes supplementaires requis.", + "de-de": "{{green}}{0}{{muted}} Spieler haben fur die Zeitverlangerung gestimmt, {{green}}{1}{{muted}} weitere Stimmen benotigt.", + "el-gr": "{{green}}{0}{{muted}} παικτες ψηφισαν για παραταση χρονου, χρειαζονται ακομη {{green}}{1}{{muted}} ψηφοι.", + "hu-hu": "{{green}}{0}{{muted}} jatekos szavazott az idomeghosszabbitasra, meg {{green}}{1}{{muted}} szavazat szukseges.", + "id-id": "{{green}}{0}{{muted}} pemain telah memilih untuk memperpanjang waktu, {{green}}{1}{{muted}} suara lagi diperlukan.", + "it-it": "{{green}}{0}{{muted}} giocatori hanno votato per estendere il tempo, servono altri {{green}}{1}{{muted}} voti.", + "ja-jp": "{{green}}{0}{{muted}} 人が時間延長に投票しました。あと {{green}}{1}{{muted}} 票必要です。", + "ko-kr": "{{green}}{0}{{muted}}명이 시간 연장에 투표했습니다. {{green}}{1}{{muted}}표 더 필요합니다.", + "es-419": "{{green}}{0}{{muted}} jugadores han votado para extender el tiempo, se necesitan {{green}}{1}{{muted}} votos mas.", + "nb-no": "{{green}}{0}{{muted}} spillere har stemt for a forlenge tiden, {{green}}{1}{{muted}} flere stemmer trengs.", + "pl-pl": "{{green}}{0}{{muted}} graczy zaglosowalo za przedluzeniem czasu, potrzeba jeszcze {{green}}{1}{{muted}} glosow.", + "pt-pt": "{{green}}{0}{{muted}} jogadores votaram para prolongar o tempo, necessarios mais {{green}}{1}{{muted}} votos.", + "ro-ro": "{{green}}{0}{{muted}} jucatori au votat pentru prelungirea timpului, mai sunt necesare {{green}}{1}{{muted}} voturi.", + "ru-ru": "{{green}}{0}{{muted}} игроков проголосовало за продление времени, нужно ещё {{green}}{1}{{muted}} голосов.", + "es-es": "{{green}}{0}{{muted}} jugadores han votado para extender el tiempo, se necesitan {{green}}{1}{{muted}} votos mas.", + "sv-se": "{{green}}{0}{{muted}} spelare har rostat for att forlanga tiden, {{green}}{1}{{muted}} fler roster behovs.", + "th-th": "{{green}}{0}{{muted}} ผู้เล่นโหวตขยายเวลาแล้ว ต้องการอีก {{green}}{1}{{muted}} โหวต", + "tr-tr": "{{green}}{0}{{muted}} oyuncu sure uzatmak icin oy kullandi, {{green}}{1}{{muted}} oy daha gerekli.", + "uk-ua": "{{green}}{0}{{muted}} гравців проголосували за продовження часу, потрібно ще {{green}}{1}{{muted}} голосів.", + "vi-vn": "{{green}}{0}{{muted}} nguoi choi da bo phieu gia han thoi gian, can them {{green}}{1}{{muted}} phieu nua." + }, + "ptr.mapmanager.extend_vote_passed": { + "en-us": "Vote passed, the map time will be extended.", + "zh-cn": "投票通过,即将延长地图持续时间。", + "zh-tw": "投票通過,即將延長地圖持續時間。", + "pt-br": "Votacao aprovada, o tempo do mapa sera estendido.", + "bg-bg": "Гласуването премина, времето на картата ще бъде удължено.", + "cs-cz": "Hlasovani proslo, cas mapy bude prodlouzen.", + "da-dk": "Afstemningen er godkendt, kortets tid vil blive forlaenget.", + "nl-nl": "Stemming geslaagd, de maptijd wordt verlengd.", + "fi-fi": "Aanestys hyvaksytty, kartan aikaa jatketaan.", + "fr-fr": "Vote approuve, le temps de la carte sera prolonge.", + "de-de": "Abstimmung erfolgreich, die Kartenzeit wird verlangert.", + "el-gr": "Η ψηφοφορια περασε, ο χρονος του χαρτη θα παραταθει.", + "hu-hu": "Szavazas elfogadva, a palya ideje meghosszabbitasra kerul.", + "id-id": "Pemungutan suara berhasil, waktu peta akan diperpanjang.", + "it-it": "Votazione approvata, il tempo della mappa sara esteso.", + "ja-jp": "投票が可決されました。マップ時間が延長されます。", + "ko-kr": "투표가 통과되었습니다. 맵 시간이 연장됩니다.", + "es-419": "Votacion aprobada, el tiempo del mapa sera extendido.", + "nb-no": "Avstemningen ble godkjent, karttiden vil bli forlenget.", + "pl-pl": "Glosowanie przeszlo, czas mapy zostanie przedluzony.", + "pt-pt": "Votacao aprovada, o tempo do mapa sera prolongado.", + "ro-ro": "Votul a trecut, timpul hartii va fi prelungit.", + "ru-ru": "Голосование прошло, время карты будет продлено.", + "es-es": "Votacion aprobada, el tiempo del mapa sera extendido.", + "sv-se": "Omrostningen godkandes, karttiden kommer att forlangas.", + "th-th": "โหวตผ่าน เวลาแผนที่จะถูกขยาย", + "tr-tr": "Oylama gecti, harita suresi uzatilacak.", + "uk-ua": "Голосування пройшло, час карти буде продовжено.", + "vi-vn": "Bo phieu thanh cong, thoi gian ban do se duoc gia han." + }, + "ptr.mapmanager.nominate_not_enough_players": { + "en-us": "At least {{green}}{0}{{muted}} players are required to nominate maps.", + "zh-cn": "当前在线人数不足 {{green}}{0}{{muted}} 人,无法提名地图。", + "zh-tw": "當前在線人數不足 {{green}}{0}{{muted}} 人,無法提名地圖。", + "pt-br": "Sao necessarios pelo menos {{green}}{0}{{muted}} jogadores para nomear mapas.", + "bg-bg": "Необходими са поне {{green}}{0}{{muted}} играчи за номиниране на карти.", + "cs-cz": "Pro nominaci map je potreba alespon {{green}}{0}{{muted}} hracu.", + "da-dk": "Der kraeves mindst {{green}}{0}{{muted}} spillere for at nominere kort.", + "nl-nl": "Er zijn minimaal {{green}}{0}{{muted}} spelers nodig om maps te nomineren.", + "fi-fi": "Karttojen ehdottamiseen tarvitaan vahintaan {{green}}{0}{{muted}} pelaajaa.", + "fr-fr": "Au moins {{green}}{0}{{muted}} joueurs sont requis pour nominer des cartes.", + "de-de": "Mindestens {{green}}{0}{{muted}} Spieler werden benotigt, um Karten zu nominieren.", + "el-gr": "Απαιτουνται τουλαχιστον {{green}}{0}{{muted}} παικτες για να προτεινετε χαρτες.", + "hu-hu": "Legalabb {{green}}{0}{{muted}} jatekos szukseges a palyak jelolesehez.", + "id-id": "Diperlukan setidaknya {{green}}{0}{{muted}} pemain untuk menominasikan peta.", + "it-it": "Sono necessari almeno {{green}}{0}{{muted}} giocatori per nominare mappe.", + "ja-jp": "マップをノミネートするには少なくとも {{green}}{0}{{muted}} 人のプレイヤーが必要です。", + "ko-kr": "맵 추천에는 최소 {{green}}{0}{{muted}}명의 플레이어가 필요합니다.", + "es-419": "Se requieren al menos {{green}}{0}{{muted}} jugadores para nominar mapas.", + "nb-no": "Minst {{green}}{0}{{muted}} spillere kreves for a nominere kart.", + "pl-pl": "Do nominowania map wymaganych jest co najmniej {{green}}{0}{{muted}} graczy.", + "pt-pt": "Sao necessarios pelo menos {{green}}{0}{{muted}} jogadores para nomear mapas.", + "ro-ro": "Sunt necesari cel putin {{green}}{0}{{muted}} jucatori pentru a nominaliza harti.", + "ru-ru": "Для номинации карт требуется минимум {{green}}{0}{{muted}} игроков.", + "es-es": "Se requieren al menos {{green}}{0}{{muted}} jugadores para nominar mapas.", + "sv-se": "Minst {{green}}{0}{{muted}} spelare kravs for att nominera kartor.", + "th-th": "ต้องมีผู้เล่นอย่างน้อย {{green}}{0}{{muted}} คนเพื่อเสนอชื่อแผนที่", + "tr-tr": "Harita aday gostermek icin en az {{green}}{0}{{muted}} oyuncu gereklidir.", + "uk-ua": "Для номінації карт потрібно мінімум {{green}}{0}{{muted}} гравців.", + "vi-vn": "Can it nhat {{green}}{0}{{muted}} nguoi choi de de cu ban do." + }, + "ptr.mapmanager.nominate_usage": { + "en-us": "Usage: .nominate ", + "zh-cn": "用法:.nominate <地图名>", + "zh-tw": "用法:.nominate <地圖名>", + "pt-br": "Uso: .nominate ", + "bg-bg": "Употреба: .nominate <име на картата>", + "cs-cz": "Pouziti: .nominate ", + "da-dk": "Brug: .nominate ", + "nl-nl": "Gebruik: .nominate ", + "fi-fi": "Kaytto: .nominate ", + "fr-fr": "Utilisation: .nominate ", + "de-de": "Verwendung: .nominate ", + "el-gr": "Χρηση: .nominate <ονομα χαρτη>", + "hu-hu": "Hasznalat: .nominate ", + "id-id": "Penggunaan: .nominate ", + "it-it": "Uso: .nominate ", + "ja-jp": "使用法: .nominate <マップ名>", + "ko-kr": "사용법: .nominate <맵 이름>", + "es-419": "Uso: .nominate ", + "nb-no": "Bruk: .nominate ", + "pl-pl": "Uzycie: .nominate ", + "pt-pt": "Utilizacao: .nominate ", + "ro-ro": "Utilizare: .nominate ", + "ru-ru": "Использование: .nominate <название карты>", + "es-es": "Uso: .nominate ", + "sv-se": "Anvandning: .nominate ", + "th-th": "วิธีใช้: .nominate <ชื่อแผนที่>", + "tr-tr": "Kullanim: .nominate ", + "uk-ua": "Використання: .nominate <назва карти>", + "vi-vn": "Cach dung: .nominate " + }, + "ptr.mapmanager.map_already_nominated": { + "en-us": "This map has already been nominated.", + "zh-cn": "该地图已经被提名过了。", + "zh-tw": "該地圖已經被提名過了。", + "pt-br": "Este mapa ja foi nomeado.", + "bg-bg": "Тази карта вече е номинирана.", + "cs-cz": "Tato mapa jiz byla nominovana.", + "da-dk": "Dette kort er allerede nomineret.", + "nl-nl": "Deze map is al genomineerd.", + "fi-fi": "Tama kartta on jo ehdotettu.", + "fr-fr": "Cette carte a deja ete nominee.", + "de-de": "Diese Karte wurde bereits nominiert.", + "el-gr": "Αυτος ο χαρτης εχει ηδη προταθει.", + "hu-hu": "Ez a palya mar jelolve lett.", + "id-id": "Peta ini sudah dinominasikan.", + "it-it": "Questa mappa e gia stata nominata.", + "ja-jp": "このマップは既にノミネートされています。", + "ko-kr": "이 맵은 이미 추천되었습니다.", + "es-419": "Este mapa ya ha sido nominado.", + "nb-no": "Dette kartet er allerede nominert.", + "pl-pl": "Ta mapa zostala juz nominowana.", + "pt-pt": "Este mapa ja foi nomeado.", + "ro-ro": "Aceasta harta a fost deja nominalizata.", + "ru-ru": "Эта карта уже номинирована.", + "es-es": "Este mapa ya ha sido nominado.", + "sv-se": "Denna karta har redan nominerats.", + "th-th": "แผนที่นี้ถูกเสนอชื่อไปแล้ว", + "tr-tr": "Bu harita zaten aday gosterildi.", + "uk-ua": "Ця карта вже номінована.", + "vi-vn": "Ban do nay da duoc de cu." + }, + "ptr.mapmanager.map_recently_played": { + "en-us": "This map was played recently and cannot be nominated.", + "zh-cn": "该地图最近已经玩过了,目前无法提名。", + "zh-tw": "該地圖最近已經玩過了,目前無法提名。", + "pt-br": "Este mapa foi jogado recentemente e nao pode ser nomeado.", + "bg-bg": "Тази карта беше играна наскоро и не може да бъде номинирана.", + "cs-cz": "Tato mapa byla nedavno hrana a nelze ji nominovat.", + "da-dk": "Dette kort blev spillet for nylig og kan ikke nomineres.", + "nl-nl": "Deze map is recent gespeeld en kan niet worden genomineerd.", + "fi-fi": "Tata karttaa pelattiin aiemmin eika sita voi ehdottaa.", + "fr-fr": "Cette carte a ete jouee recemment et ne peut pas etre nominee.", + "de-de": "Diese Karte wurde kurzlich gespielt und kann nicht nominiert werden.", + "el-gr": "Αυτος ο χαρτης παιχτηκε προσφατα και δεν μπορει να προταθει.", + "hu-hu": "Ezt a palyat nemreg jatszottak es nem jelolheto.", + "id-id": "Peta ini baru saja dimainkan dan tidak dapat dinominasikan.", + "it-it": "Questa mappa e stata giocata di recente e non puo essere nominata.", + "ja-jp": "このマップは最近プレイされたためノミネートできません。", + "ko-kr": "이 맵은 최근에 플레이되어 추천할 수 없습니다.", + "es-419": "Este mapa se jugo recientemente y no puede ser nominado.", + "nb-no": "Dette kartet ble spilt nylig og kan ikke nomineres.", + "pl-pl": "Ta mapa byla niedawno grana i nie moze byc nominowana.", + "pt-pt": "Este mapa foi jogado recentemente e nao pode ser nomeado.", + "ro-ro": "Aceasta harta a fost jucata recent si nu poate fi nominalizata.", + "ru-ru": "Эта карта недавно игралась и не может быть номинирована.", + "es-es": "Este mapa se jugo recientemente y no puede ser nominado.", + "sv-se": "Denna karta spelades nyligen och kan inte nomineras.", + "th-th": "แผนที่นี้เพิ่งถูกเล่นไปและไม่สามารถเสนอชื่อได้", + "tr-tr": "Bu harita yakin zamanda oynandi ve aday gosterilemez.", + "uk-ua": "Ця карта нещодавно грали і не може бути номінована.", + "vi-vn": "Ban do nay vua duoc choi gan day va khong the de cu." + }, + "ptr.mapmanager.map_not_found": { + "en-us": "Cannot find this map in the map pool.", + "zh-cn": "无法从图池中找到该地图。", + "zh-tw": "無法從圖池中找到該地圖。", + "pt-br": "Nao foi possivel encontrar este mapa no pool de mapas.", + "bg-bg": "Не може да се намери тази карта в списъка с карти.", + "cs-cz": "Tuto mapu nelze najit v poolu map.", + "da-dk": "Kan ikke finde dette kort i kortpuljen.", + "nl-nl": "Kan deze map niet vinden in de mappool.", + "fi-fi": "Karttaa ei loydy karttavalikoimasta.", + "fr-fr": "Impossible de trouver cette carte dans la liste des cartes.", + "de-de": "Diese Karte kann im Kartenpool nicht gefunden werden.", + "el-gr": "Δεν μπορει να βρεθει αυτος ο χαρτης στο pool χαρτων.", + "hu-hu": "Nem talalhato ez a palya a palyakeszletben.", + "id-id": "Tidak dapat menemukan peta ini di pool peta.", + "it-it": "Impossibile trovare questa mappa nel pool delle mappe.", + "ja-jp": "このマップはマッププールに見つかりません。", + "ko-kr": "맵 풀에서 이 맵을 찾을 수 없습니다.", + "es-419": "No se puede encontrar este mapa en el pool de mapas.", + "nb-no": "Kan ikke finne dette kartet i kartpoolen.", + "pl-pl": "Nie mozna znalezc tej mapy w puli map.", + "pt-pt": "Nao foi possivel encontrar este mapa no conjunto de mapas.", + "ro-ro": "Nu se poate gasi aceasta harta in pool-ul de harti.", + "ru-ru": "Не удается найти эту карту в пуле карт.", + "es-es": "No se puede encontrar este mapa en el grupo de mapas.", + "sv-se": "Kan inte hitta denna karta i kartpoolen.", + "th-th": "ไม่พบแผนที่นี้ในกลุ่มแผนที่", + "tr-tr": "Bu harita harita havuzunda bulunamiyor.", + "uk-ua": "Не вдається знайти цю карту в пулі карт.", + "vi-vn": "Khong the tim thay ban do nay trong danh sach ban do." + }, + "ptr.mapmanager.cannot_nominate_current_map": { + "en-us": "Cannot nominate the current map.", + "zh-cn": "不能投票正在游玩的地图。", + "zh-tw": "不能投票正在遊玩的地圖。", + "pt-br": "Nao e possivel nomear o mapa atual.", + "bg-bg": "Не може да се номинира текущата карта.", + "cs-cz": "Nelze nominovat aktualni mapu.", + "da-dk": "Kan ikke nominere det aktuelle kort.", + "nl-nl": "Kan de huidige map niet nomineren.", + "fi-fi": "Nykyista karttaa ei voi ehdottaa.", + "fr-fr": "Impossible de nominer la carte actuelle.", + "de-de": "Die aktuelle Karte kann nicht nominiert werden.", + "el-gr": "Δεν μπορειτε να προτεινετε τον τρεχοντα χαρτη.", + "hu-hu": "A jelenlegi palya nem jelolheto.", + "id-id": "Tidak dapat menominasikan peta saat ini.", + "it-it": "Non e possibile nominare la mappa attuale.", + "ja-jp": "現在のマップはノミネートできません。", + "ko-kr": "현재 맵은 추천할 수 없습니다.", + "es-419": "No se puede nominar el mapa actual.", + "nb-no": "Kan ikke nominere det gjeldende kartet.", + "pl-pl": "Nie mozna nominowac obecnej mapy.", + "pt-pt": "Nao e possivel nomear o mapa atual.", + "ro-ro": "Nu se poate nominaliza harta curenta.", + "ru-ru": "Нельзя номинировать текущую карту.", + "es-es": "No se puede nominar el mapa actual.", + "sv-se": "Kan inte nominera den aktuella kartan.", + "th-th": "ไม่สามารถเสนอชื่อแผนที่ปัจจุบันได้", + "tr-tr": "Mevcut harita aday gosterilemez.", + "uk-ua": "Не можна номінувати поточну карту.", + "vi-vn": "Khong the de cu ban do hien tai." + }, + "ptr.mapmanager.player_nominated_map": { + "en-us": "{{green}}{0}{{muted}} nominated map {{green}}{1}{{muted}}.", + "zh-cn": "{{green}}{0}{{muted}} 提名了地图 {{green}}{1}{{muted}}。", + "zh-tw": "{{green}}{0}{{muted}} 提名了地圖 {{green}}{1}{{muted}}。", + "pt-br": "{{green}}{0}{{muted}} nomeou o mapa {{green}}{1}{{muted}}.", + "bg-bg": "{{green}}{0}{{muted}} номинира карта {{green}}{1}{{muted}}.", + "cs-cz": "{{green}}{0}{{muted}} nominoval mapu {{green}}{1}{{muted}}.", + "da-dk": "{{green}}{0}{{muted}} nominerede kortet {{green}}{1}{{muted}}.", + "nl-nl": "{{green}}{0}{{muted}} nomineerde map {{green}}{1}{{muted}}.", + "fi-fi": "{{green}}{0}{{muted}} ehdotti karttaa {{green}}{1}{{muted}}.", + "fr-fr": "{{green}}{0}{{muted}} a nomine la carte {{green}}{1}{{muted}}.", + "de-de": "{{green}}{0}{{muted}} hat die Karte {{green}}{1}{{muted}} nominiert.", + "el-gr": "Ο {{green}}{0}{{muted}} προτεινε τον χαρτη {{green}}{1}{{muted}}.", + "hu-hu": "{{green}}{0}{{muted}} jelolte a {{green}}{1}{{muted}} palyat.", + "id-id": "{{green}}{0}{{muted}} menominasikan peta {{green}}{1}{{muted}}.", + "it-it": "{{green}}{0}{{muted}} ha nominato la mappa {{green}}{1}{{muted}}.", + "ja-jp": "{{green}}{0}{{muted}} がマップ {{green}}{1}{{muted}} をノミネートしました。", + "ko-kr": "{{green}}{0}{{muted}}님이 맵 {{green}}{1}{{muted}}을(를) 추천했습니다.", + "es-419": "{{green}}{0}{{muted}} nomino el mapa {{green}}{1}{{muted}}.", + "nb-no": "{{green}}{0}{{muted}} nominerte kartet {{green}}{1}{{muted}}.", + "pl-pl": "{{green}}{0}{{muted}} nominowal mape {{green}}{1}{{muted}}.", + "pt-pt": "{{green}}{0}{{muted}} nomeou o mapa {{green}}{1}{{muted}}.", + "ro-ro": "{{green}}{0}{{muted}} a nominalizat harta {{green}}{1}{{muted}}.", + "ru-ru": "{{green}}{0}{{muted}} номинировал карту {{green}}{1}{{muted}}.", + "es-es": "{{green}}{0}{{muted}} nomino el mapa {{green}}{1}{{muted}}.", + "sv-se": "{{green}}{0}{{muted}} nominerade kartan {{green}}{1}{{muted}}.", + "th-th": "{{green}}{0}{{muted}} เสนอชื่อแผนที่ {{green}}{1}{{muted}}", + "tr-tr": "{{green}}{0}{{muted}} haritayi aday gosterdi: {{green}}{1}{{muted}}.", + "uk-ua": "{{green}}{0}{{muted}} номінував карту {{green}}{1}{{muted}}.", + "vi-vn": "{{green}}{0}{{muted}} da de cu ban do {{green}}{1}{{muted}}." + }, + "ptr.mapmanager.rtv_after_x": { + "en-us": "A vote to change the map can only be initiated after {{green}}{0}{{muted}} seconds.", + "zh-cn": "{{green}}{0}{{muted}} 秒后才能发起换图投票。", + "zh-tw": "{{green}}{0}{{muted}} 秒後才能發起換圖投票。", + "pt-br": "Uma votacao para mudar o mapa so pode ser iniciada apos {{green}}{0}{{muted}} segundos.", + "bg-bg": "Гласуване за смяна на картата може да бъде започнато след {{green}}{0}{{muted}} секунди.", + "cs-cz": "Hlasovani o zmene mapy lze zahajit az po {{green}}{0}{{muted}} sekundach.", + "da-dk": "En afstemning om at skifte kort kan forst startes efter {{green}}{0}{{muted}} sekunder.", + "nl-nl": "Een stemming om de map te wijzigen kan pas worden gestart na {{green}}{0}{{muted}} seconden.", + "fi-fi": "Aanestys kartan vaihtamisesta voidaan aloittaa vasta {{green}}{0}{{muted}} sekunnin kuluttua.", + "fr-fr": "Un vote pour changer de carte ne peut etre lance qu'apres {{green}}{0}{{muted}} secondes.", + "de-de": "Eine Abstimmung zum Kartenwechsel kann erst nach {{green}}{0}{{muted}} Sekunden gestartet werden.", + "el-gr": "Μια ψηφοφορια για αλλαγη χαρτη μπορει να ξεκινησει μετα απο {{green}}{0}{{muted}} δευτερολεπτα.", + "hu-hu": "A palyavaltas szavazas csak {{green}}{0}{{muted}} masodperc utan inditható.", + "id-id": "Pemungutan suara untuk mengubah peta hanya dapat dimulai setelah {{green}}{0}{{muted}} detik.", + "it-it": "Una votazione per cambiare mappa puo essere avviata solo dopo {{green}}{0}{{muted}} secondi.", + "ja-jp": "マップ変更の投票は {{green}}{0}{{muted}} 秒後にのみ開始できます。", + "ko-kr": "맵 변경 투표는 {{green}}{0}{{muted}}초 후에만 시작할 수 있습니다.", + "es-419": "Una votacion para cambiar el mapa solo puede iniciarse despues de {{green}}{0}{{muted}} segundos.", + "nb-no": "En avstemning for a bytte kart kan bare startes etter {{green}}{0}{{muted}} sekunder.", + "pl-pl": "Glosowanie nad zmiana mapy mozna rozpoczac dopiero po {{green}}{0}{{muted}} sekundach.", + "pt-pt": "Uma votacao para mudar o mapa so pode ser iniciada apos {{green}}{0}{{muted}} segundos.", + "ro-ro": "Un vot pentru schimbarea hartii poate fi initiat doar dupa {{green}}{0}{{muted}} secunde.", + "ru-ru": "Голосование за смену карты можно начать только через {{green}}{0}{{muted}} секунд.", + "es-es": "Una votacion para cambiar el mapa solo puede iniciarse despues de {{green}}{0}{{muted}} segundos.", + "sv-se": "En omrostning for att byta karta kan bara startas efter {{green}}{0}{{muted}} sekunder.", + "th-th": "การโหวตเปลี่ยนแผนที่สามารถเริ่มได้หลังจาก {{green}}{0}{{muted}} วินาที", + "tr-tr": "Harita degistirmek icin oylama ancak {{green}}{0}{{muted}} saniye sonra baslatilabilir.", + "uk-ua": "Голосування за зміну карти можна розпочати лише через {{green}}{0}{{muted}} секунд.", + "vi-vn": "Cuoc bo phieu thay doi ban do chi co the bat dau sau {{green}}{0}{{muted}} giay." + }, + "ptr.mapmanager.already_voted_rtv": { + "en-us": "You have already voted to change the map!", + "zh-cn": "你已经投票过换图了!", + "zh-tw": "你已經投票過換圖了!", + "pt-br": "Voce ja votou para mudar o mapa!", + "bg-bg": "Вече сте гласували за смяна на картата!", + "cs-cz": "Jiz jste hlasovali pro zmenu mapy!", + "da-dk": "Du har allerede stemt for at skifte kort!", + "nl-nl": "Je hebt al gestemd om de map te wijzigen!", + "fi-fi": "Olet jo aanestanyt kartan vaihtamisesta!", + "fr-fr": "Vous avez deja vote pour changer de carte!", + "de-de": "Du hast bereits fur einen Kartenwechsel gestimmt!", + "el-gr": "Εχετε ηδη ψηφισει για αλλαγη χαρτη!", + "hu-hu": "Mar szavaztal a palyavaltasra!", + "id-id": "Anda sudah memberikan suara untuk mengubah peta!", + "it-it": "Hai gia votato per cambiare mappa!", + "ja-jp": "マップ変更に既に投票済みです!", + "ko-kr": "이미 맵 변경에 투표하셨습니다!", + "es-419": "Ya has votado para cambiar el mapa!", + "nb-no": "Du har allerede stemt for a bytte kart!", + "pl-pl": "Juz glosowaes za zmiana mapy!", + "pt-pt": "Ja votou para mudar o mapa!", + "ro-ro": "Ai votat deja pentru schimbarea hartii!", + "ru-ru": "Вы уже голосовали за смену карты!", + "es-es": "Ya has votado para cambiar el mapa!", + "sv-se": "Du har redan rostat for att byta karta!", + "th-th": "คุณได้โหวตเปลี่ยนแผนที่ไปแล้ว!", + "tr-tr": "Harita degistirmek icin zaten oy kullandiniz!", + "uk-ua": "Ви вже голосували за зміну карти!", + "vi-vn": "Ban da bo phieu thay doi ban do roi!" + }, + "ptr.mapmanager.rtv_vote_progress": { + "en-us": "{{green}}{0}{{muted}} players have voted to change the map, {{green}}{1}{{muted}} more votes needed.", + "zh-cn": "已有 {{green}}{0}{{muted}} 人投票换图,还需 {{green}}{1}{{muted}} 票。", + "zh-tw": "已有 {{green}}{0}{{muted}} 人投票換圖,還需 {{green}}{1}{{muted}} 票。", + "pt-br": "{{green}}{0}{{muted}} jogadores votaram para mudar o mapa, {{green}}{1}{{muted}} votos a mais necessarios.", + "bg-bg": "{{green}}{0}{{muted}} играчи гласуваха за смяна на картата, необходими са още {{green}}{1}{{muted}} гласа.", + "cs-cz": "{{green}}{0}{{muted}} hracu hlasovalo pro zmenu mapy, potreba jeste {{green}}{1}{{muted}} hlasu.", + "da-dk": "{{green}}{0}{{muted}} spillere har stemt for at skifte kort, {{green}}{1}{{muted}} flere stemmer nodvendige.", + "nl-nl": "{{green}}{0}{{muted}} spelers hebben gestemd om de map te wijzigen, nog {{green}}{1}{{muted}} stemmen nodig.", + "fi-fi": "{{green}}{0}{{muted}} pelaajaa on aanestanyt kartan vaihtamisesta, {{green}}{1}{{muted}} aanta viela tarvitaan.", + "fr-fr": "{{green}}{0}{{muted}} joueurs ont vote pour changer de carte, {{green}}{1}{{muted}} votes supplementaires requis.", + "de-de": "{{green}}{0}{{muted}} Spieler haben fur einen Kartenwechsel gestimmt, {{green}}{1}{{muted}} weitere Stimmen benotigt.", + "el-gr": "{{green}}{0}{{muted}} παικτες ψηφισαν για αλλαγη χαρτη, χρειαζονται ακομη {{green}}{1}{{muted}} ψηφοι.", + "hu-hu": "{{green}}{0}{{muted}} jatekos szavazott a palyavaltasra, meg {{green}}{1}{{muted}} szavazat szukseges.", + "id-id": "{{green}}{0}{{muted}} pemain telah memilih untuk mengubah peta, {{green}}{1}{{muted}} suara lagi diperlukan.", + "it-it": "{{green}}{0}{{muted}} giocatori hanno votato per cambiare mappa, servono altri {{green}}{1}{{muted}} voti.", + "ja-jp": "{{green}}{0}{{muted}} 人がマップ変更に投票しました。あと {{green}}{1}{{muted}} 票必要です。", + "ko-kr": "{{green}}{0}{{muted}}명이 맵 변경에 투표했습니다. {{green}}{1}{{muted}}표 더 필요합니다.", + "es-419": "{{green}}{0}{{muted}} jugadores han votado para cambiar el mapa, se necesitan {{green}}{1}{{muted}} votos mas.", + "nb-no": "{{green}}{0}{{muted}} spillere har stemt for a bytte kart, {{green}}{1}{{muted}} flere stemmer trengs.", + "pl-pl": "{{green}}{0}{{muted}} graczy zaglosowalo za zmiana mapy, potrzeba jeszcze {{green}}{1}{{muted}} glosow.", + "pt-pt": "{{green}}{0}{{muted}} jogadores votaram para mudar o mapa, necessarios mais {{green}}{1}{{muted}} votos.", + "ro-ro": "{{green}}{0}{{muted}} jucatori au votat pentru schimbarea hartii, mai sunt necesare {{green}}{1}{{muted}} voturi.", + "ru-ru": "{{green}}{0}{{muted}} игроков проголосовало за смену карты, нужно ещё {{green}}{1}{{muted}} голосов.", + "es-es": "{{green}}{0}{{muted}} jugadores han votado para cambiar el mapa, se necesitan {{green}}{1}{{muted}} votos mas.", + "sv-se": "{{green}}{0}{{muted}} spelare har rostat for att byta karta, {{green}}{1}{{muted}} fler roster behovs.", + "th-th": "{{green}}{0}{{muted}} ผู้เล่นโหวตเปลี่ยนแผนที่แล้ว ต้องการอีก {{green}}{1}{{muted}} โหวต", + "tr-tr": "{{green}}{0}{{muted}} oyuncu harita degistirmek icin oy kullandi, {{green}}{1}{{muted}} oy daha gerekli.", + "uk-ua": "{{green}}{0}{{muted}} гравців проголосували за зміну карти, потрібно ще {{green}}{1}{{muted}} голосів.", + "vi-vn": "{{green}}{0}{{muted}} nguoi choi da bo phieu thay doi ban do, can them {{green}}{1}{{muted}} phieu nua." + }, + "ptr.mapmanager.rtv_vote_passed": { + "en-us": "RTV vote passed! Map voting will start after this round ends.", + "zh-cn": "投票换图通过!将在回合结束后开始投票。", + "zh-tw": "投票換圖通過!將在回合結束後開始投票。", + "pt-br": "Votacao RTV aprovada! A votacao de mapas comecara apos o fim desta rodada.", + "bg-bg": "RTV гласуването премина! Гласуването за карта ще започне след края на рунда.", + "cs-cz": "RTV hlasovani proslo! Hlasovani o mape zacne po skonceni tohoto kola.", + "da-dk": "RTV-afstemningen er godkendt! Kortafstemning starter efter denne runde.", + "nl-nl": "RTV-stemming geslaagd! Map stemming begint na deze ronde.", + "fi-fi": "RTV-aanestys hyvaksytty! Kartta-aanestys alkaa kierroksen jalkeen.", + "fr-fr": "Vote RTV approuve! Le vote de carte commencera apres cette manche.", + "de-de": "RTV-Abstimmung erfolgreich! Kartenabstimmung beginnt nach dieser Runde.", + "el-gr": "Η ψηφοφορια RTV περασε! Η ψηφοφορια χαρτη θα ξεκινησει μετα το τελος του γυρου.", + "hu-hu": "RTV szavazas elfogadva! A palyaszavazas a kor vegen kezdodik.", + "id-id": "Pemungutan suara RTV berhasil! Pemungutan suara peta akan dimulai setelah ronde ini berakhir.", + "it-it": "Votazione RTV approvata! La votazione della mappa iniziera dopo questo round.", + "ja-jp": "RTV投票が可決されました!ラウンド終了後にマップ投票が始まります。", + "ko-kr": "RTV 투표가 통과되었습니다! 이 라운드가 끝나면 맵 투표가 시작됩니다.", + "es-419": "Votacion RTV aprobada! La votacion de mapas comenzara al final de esta ronda.", + "nb-no": "RTV-avstemningen ble godkjent! Kartavstemning starter etter denne runden.", + "pl-pl": "Glosowanie RTV przeszlo! Glosowanie na mape rozpocznie sie po tej rundzie.", + "pt-pt": "Votacao RTV aprovada! A votacao de mapas comecara apos esta ronda.", + "ro-ro": "Votul RTV a trecut! Votarea hartii va incepe dupa aceasta runda.", + "ru-ru": "Голосование RTV прошло! Голосование за карту начнётся после этого раунда.", + "es-es": "Votacion RTV aprobada! La votacion de mapas comenzara al final de esta ronda.", + "sv-se": "RTV-omrostningen godkandes! Kartomrostning borjar efter denna runda.", + "th-th": "โหวต RTV ผ่าน! การโหวตแผนที่จะเริ่มหลังจบรอบนี้", + "tr-tr": "RTV oylamasi gecti! Harita oylamasi bu tur bittikten sonra baslayacak.", + "uk-ua": "Голосування RTV пройшло! Голосування за карту почнеться після цього раунду.", + "vi-vn": "Bo phieu RTV thanh cong! Bo phieu ban do se bat dau sau khi ket thuc vong nay." + } +} diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 37087df..d00a34a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -9,4 +9,4 @@ - \ No newline at end of file + diff --git a/src/Ptr.Modules.MapManager/InterfaceBridge.cs b/src/Ptr.Modules.MapManager/InterfaceBridge.cs index 2c63d95..c8ba523 100644 --- a/src/Ptr.Modules.MapManager/InterfaceBridge.cs +++ b/src/Ptr.Modules.MapManager/InterfaceBridge.cs @@ -77,7 +77,7 @@ public InterfaceBridge(ISharedSystem sharedSystem, public string ModuleIdentity { get; init; } /// - /// 开洞,一般情况下别用! + /// Don't use it under normal circumstances! /// internal static InterfaceBridge Instance { get; private set; } = null!; @@ -99,14 +99,16 @@ public InterfaceBridge(ISharedSystem sharedSystem, public IModSharp ModSharp => _sharedSystem.GetModSharp(); /// - /// CGlobalVars* gpGlobals,没什么好说的。
- /// 注意,一定要在地图加载之后调用!不然服务器第一次加载的时候是拿不到的! + /// CGlobalVars* gpGlobals,There's not much to say。
+ /// Note that this must be called after the map is loaded!
+ /// Otherwise, it won't be available when the server loads it for the first time! ///
public IGlobalVars GlobalVars => ModSharp.GetGlobals(); /// - /// CGameRules* g_pGameRules
- /// 注意,一定要在地图加载之后调用!不然服务器第一次加载的时候是拿不到的! + /// CGameRules* g_pGameRules
+ /// Note that this must be called after the map is loaded!
+ /// Otherwise, it won't be available when the server loads it for the first time! ///
public IGameRules GameRules => ModSharp.GetGameRules(); @@ -137,9 +139,9 @@ public InterfaceBridge(ISharedSystem sharedSystem, public DateTime AllowVoteTime { get; set; } /// - /// 开洞,一般情况下别用! + /// Don't use it under normal circumstances! /// public string CurrentMapGroup { get; set; } = string.Empty; //public ICommandRegistry CommandRegistry { get; set; } = null!; -} \ No newline at end of file +} diff --git a/src/Ptr.Modules.MapManager/MapManager.cs b/src/Ptr.Modules.MapManager/MapManager.cs index 5fada73..3aa810f 100644 --- a/src/Ptr.Modules.MapManager/MapManager.cs +++ b/src/Ptr.Modules.MapManager/MapManager.cs @@ -5,11 +5,11 @@ using Ptr.Modules.MapManager.Hooks; using Ptr.Modules.MapManager.Services; using Ptr.Modules.MapManager.Shared; -using Ptr.Shared.Extensions; using Ptr.Shared.Hooks.Hosting; using Ptr.Shared.Hooks.Managers; using Ptr.Shared.Hosting; using Ptr.Shared.Misc; +using Sharp.Modules.LocalizerManager.Shared; using Sharp.Shared; using Sharp.Shared.Abstractions; using Sharp.Shared.Listeners; @@ -20,10 +20,11 @@ namespace Ptr.Modules.MapManager; internal class MapManager : IModSharpModule, IMapManager, IGameListener { private readonly InterfaceBridge _bridge; - private readonly IConVar? _countdownAfterChangeLevel; private readonly ILogger _logger; private readonly IServiceProvider _provider; - private readonly IConVar? _voteSuccessRatio; + private IConVar? _chatFormatPrefix; + private IConVar? _voteSuccessRatio; + private IConVar? _countdownAfterChangeLevel; public MapManager( ISharedSystem sharedSystem, @@ -34,7 +35,6 @@ public MapManager( bool hotReload) { var formatter = new ChatMessageFormatter(); - formatter.SetPrefix("{green}[地图]{white}"); var bridge = new InterfaceBridge(sharedSystem, dllPath, sharpPath, version, configuration, hotReload, formatter, this); var services = new ServiceCollection(); @@ -50,17 +50,10 @@ public MapManager( services.AddLogging(x => x.ClearProviders()); var provider = services.BuildServiceProvider(); - provider.UseHook(); _bridge = provider.GetRequiredService(); _logger = sharedSystem.GetLoggerFactory().CreateLogger(); _provider = provider; - - _countdownAfterChangeLevel = _bridge.ConVarManager.CreateConVar("mapmanager_countdown_after_changelevel", 180, - "Countdown after map change (unit is sec.)"); - - _voteSuccessRatio = _bridge.ConVarManager.CreateConVar("mapmanager_vote_success_ratio", 0.6f, - "Ratio request for a success vote."); } internal int GetVoteSuccessNumberRequested() @@ -132,9 +125,6 @@ private void CallMapConfigLoaded() public bool Init() { InitConfig(); - - _provider.LoadAllSharpExtensions(); - _provider.InitNativeHooks(); _provider.CallInit(e => { _logger.LogError(e, "An error occurred when initializing modules"); }); return true; @@ -142,9 +132,31 @@ public bool Init() public void PostInit() { + // Safest place to init convars is PostInit + _chatFormatPrefix = _bridge.ConVarManager.CreateConVar("mapmanager_format_prefix", "{whitespace}{red}MapVote{whitespace}{muted}", + "Chat prefix format for map manager module."); + + // Real time prefix changes + if (_chatFormatPrefix is not null) + { + _bridge.ChatFormatter.SetPrefix(_chatFormatPrefix.GetString()); + _bridge.ConVarManager.InstallChangeHook(_chatFormatPrefix, OnChatFormatPrefixChange); + } + + _countdownAfterChangeLevel = _bridge.ConVarManager.CreateConVar("mapmanager_countdown_after_changelevel", 180, + "Countdown after map change (unit is sec.)"); + + _voteSuccessRatio = _bridge.ConVarManager.CreateConVar("mapmanager_vote_success_ratio", 0.6f, + "Ratio request for a success vote."); + _provider.CallPostInit(e => { _logger.LogError(e, "An error occurred when initializing modules"); }); _bridge.SharpModuleManager.RegisterSharpModuleInterface(this, IMapManager.Identity, this); } + private void OnChatFormatPrefixChange(IConVar conVar) + { + _bridge.ChatFormatter.SetPrefix(conVar.GetString()); + } + public void OnLibraryConnected(string name) { _provider.CallLibraryConnected(name, e => @@ -155,7 +167,17 @@ public void OnLibraryConnected(string name) public void OnAllModulesLoaded() { + _provider.LoadAllSharpExtensions(); + _provider.UseHook(); + _provider.InitNativeHooks(); + _provider.CallAllModulesLoaded(e => { _logger.LogError(e, "An error occurred when initializing modules"); }); + CallMapConfigLoaded(); + + var _localizerManager = _bridge.SharpModuleManager + .GetRequiredSharpModuleInterface(ILocalizerManager.Identity).Instance!; + _localizerManager.LoadLocaleFile("Ptr.Modules.MapManager"); + } public void Shutdown() @@ -165,6 +187,10 @@ public void Shutdown() _provider.ShutdownAllSharpExtensions(); _bridge.Maps.Clear(); MapConfigLoaded = null; + if (_chatFormatPrefix is not null) + { + _bridge.ConVarManager.RemoveChangeHook(_chatFormatPrefix, OnChatFormatPrefixChange); + } } string IModSharpModule.DisplayName => "Ptr.Modules.MapManager"; @@ -226,6 +252,11 @@ public void ChangeLevel(IGameMap map) public void OnServerActivate() { _bridge.AllowVoteTime = DateTime.Now.AddSeconds(_countdownAfterChangeLevel?.GetInt32() ?? 180); + // On this step we already executed .cfg files + if (_chatFormatPrefix is not null) + { + _bridge.ChatFormatter.SetPrefix(_chatFormatPrefix.GetString()); + } } int IGameListener.ListenerPriority => 0; diff --git a/src/Ptr.Modules.MapManager/Ptr.Modules.MapManager.csproj b/src/Ptr.Modules.MapManager/Ptr.Modules.MapManager.csproj index 23526c3..ce1e6dc 100644 --- a/src/Ptr.Modules.MapManager/Ptr.Modules.MapManager.csproj +++ b/src/Ptr.Modules.MapManager/Ptr.Modules.MapManager.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Ptr.Modules.MapManager/Services/ExtendService.cs b/src/Ptr.Modules.MapManager/Services/ExtendService.cs index b3a58d2..8a1a366 100644 --- a/src/Ptr.Modules.MapManager/Services/ExtendService.cs +++ b/src/Ptr.Modules.MapManager/Services/ExtendService.cs @@ -2,6 +2,7 @@ using Ptr.Shared.Extensions; using Ptr.Shared.Hosting; using Sharp.Modules.CommandManager.Shared; +using Sharp.Modules.LocalizerManager.Shared; using Sharp.Shared.Definition; using Sharp.Shared.Enums; using Sharp.Shared.Listeners; @@ -15,46 +16,60 @@ internal interface IExtendService : IModule; internal class ExtendService : IExtendService, IClientListener, IGameListener { private readonly InterfaceBridge _bridge; - private readonly IConVar? _enableExtend; - + private readonly IConVar _enableExtend; + private readonly IConVar _extendTime; + private readonly IConVar _maxExtCount; private readonly bool[] _extClients = new bool[64]; - private readonly IConVar? _extendTime; private readonly ILogger _logger; - private readonly IConVar? _maxExtCount; private int _extCount; private ICommandRegistry _commandRegistry = null!; + private ILocalizerManager _localizerManager = null!; public ExtendService(InterfaceBridge bridge, ILogger logger) { _bridge = bridge; _logger = logger; - _enableExtend = _bridge.ConVarManager.CreateConVar("mapmanager_enable_extend", true, "Enable ext"); + _enableExtend = _bridge.ConVarManager.CreateConVar("mapmanager_enable_extend", true, "Enable map extensions command", ConVarFlags.Release)!; _maxExtCount = _bridge.ConVarManager.CreateConVar("mapmanager_max_extend_count", 3, - "Maximum allowed extend map time limit count."); - _extendTime = - _bridge.ConVarManager.CreateConVar("mapmanager_ext_time", 15, "The extend applies for time limit."); + "Maximum allowed extend map time limit count.", ConVarFlags.Release)!; + _extendTime = _bridge.ConVarManager.CreateConVar("mapmanager_ext_time", 15, "The extend applies for time limit.", ConVarFlags.Release)!; } private void OnCommandExt(IGameClient client, StringCommand command) { + if (_enableExtend.GetBool() is not true) + { + return; + } + if (_localizerManager is null) + { + throw new InvalidOperationException("LocalizerManager is not initialized."); + } + _localizerManager.TryGetLocalizer(client, out var _localizer); + if (_localizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when executing ext command.", + client.Slot); + return; + } var remaining = (int)(_bridge.AllowVoteTime - DateTime.Now).TotalSeconds; if (remaining > 0) { client.PrintToChat( - _bridge.ChatFormatter.Format($"{ChatColor.Green}{remaining}{ChatColor.White} 秒后才能发起延长地图时间投票。")); + _bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.extend_map_after_x", remaining))); return; } - var maxAllowed = _maxExtCount!.GetInt32(); + var maxAllowed = _maxExtCount.GetInt32(); if (_extCount >= maxAllowed) { - client.PrintToChat(_bridge.ChatFormatter.Format("已到达最大可延长时间次数。")); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.max_extends_reached"))); return; } if (_extClients[client.Slot]) { - client.PrintToChat("你已经投票过延长地图时间了。"); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.you_already_voted_to_extend"))); return; } @@ -63,16 +78,31 @@ private void OnCommandExt(IGameClient client, StringCommand command) var request = _bridge.MapManager.GetVoteSuccessNumberRequested(); var clientGaps = request - current; client.PrintToChat( - $"已有 {ChatColor.Green}{current}{ChatColor.White} 人投票延长地图时间,还需 {ChatColor.Green}{clientGaps}{ChatColor.White} 票。"); + _bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.extend_vote_progress", current, clientGaps))); if (clientGaps > 0) { return; } - - _bridge.ModSharp.PrintToChatAll("投票通过,即将延长地图持续时间。"); + var allClients = _bridge.ClientManager.GetGameClients(true); + foreach (var c in allClients) + { + if (c.IsFakeClient) + { + continue; + } + _localizerManager.TryGetLocalizer(client, out var _tempLocalizer); + if (_tempLocalizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when executing ext command.", + c.Slot); + continue; + } + c.PrintToChat( + _bridge.ChatFormatter.Format(_tempLocalizer.Format("ptr.mapmanager.extend_vote_passed"))); + } var timeLimit = _bridge.ConVarManager.FindConVar("mp_timelimit")!; var currentTimeLeft = timeLimit.GetFloat(); - var pendingExtendTime = _extendTime?.GetFloat() ?? 15.0f; + var pendingExtendTime = _extendTime.GetFloat(); var nextTimeLeft = currentTimeLeft + pendingExtendTime; timeLimit.Set($"{nextTimeLeft}"); _extCount++; @@ -95,38 +125,29 @@ private void ResetExtCount() } #region IModule - public void OnInit() { - if (_enableExtend?.GetBool() is true) - { - return; - } + _bridge.ModSharp.InstallGameListener(this); + _bridge.ClientManager.InstallClientListener(this); _logger.LogInformation("Ext is disabled."); } public void OnAllModulesLoaded() { - if (_enableExtend?.GetBool() is not true) - { - return; - } - _commandRegistry = _bridge.SharpModuleManager .GetRequiredSharpModuleInterface(ICommandManager.Identity).Instance! .GetRegistry(_bridge.ModuleIdentity); _commandRegistry.RegisterClientCommand("ext", OnCommandExt); + + _localizerManager = _bridge.SharpModuleManager + .GetRequiredSharpModuleInterface(ILocalizerManager.Identity) + .Instance!; } public void OnShutdown() { - if (_enableExtend?.GetBool() is not true) - { - return; - } - ResetExtCount(); ResetClientsExt(); } @@ -162,4 +183,4 @@ public void OnGameDeactivate() int IGameListener.ListenerVersion => IGameListener.ApiVersion; #endregion -} \ No newline at end of file +} diff --git a/src/Ptr.Modules.MapManager/Services/MapVoteService.cs b/src/Ptr.Modules.MapManager/Services/MapVoteService.cs index 0cacee5..be58879 100644 --- a/src/Ptr.Modules.MapManager/Services/MapVoteService.cs +++ b/src/Ptr.Modules.MapManager/Services/MapVoteService.cs @@ -50,7 +50,7 @@ private ECommandAction OnEndMatchVoteNextMap(IGameClient client, StringCommand c private void OnMapVoteCreated(IMapVoteCreatedForwardParams @params) { - // GetMapGroupMapList的索引是可以直接和EndMatchMapGroupVoteOptions对应的 + // The index of GetMapGroupMapList directly corresponds to EndMatchMapGroupVoteOptions if (_bridge.ModSharp.GetMapGroupMapList(_bridge.CurrentMapGroup) is not { } mapGroupElements) { _logger.LogInformation("Current map group {CurrentMapGroup} cannot retrive map list, check your map group configuration!", _bridge.CurrentMapGroup); @@ -174,7 +174,7 @@ private List SelectMapsForVote(int maxMaps = 10) private void SummaryVote() { - // GetMapGroupMapList的索引是可以直接和EndMatchMapGroupVoteOptions对应的 + // The index of GetMapGroupMapList directly corresponds to EndMatchMapGroupVoteOptions if (_bridge.ModSharp.GetMapGroupMapList(_bridge.CurrentMapGroup) is not { } mapGroupElements) { return; diff --git a/src/Ptr.Modules.MapManager/Services/NominateService.cs b/src/Ptr.Modules.MapManager/Services/NominateService.cs index 6ab8dba..bedf341 100644 --- a/src/Ptr.Modules.MapManager/Services/NominateService.cs +++ b/src/Ptr.Modules.MapManager/Services/NominateService.cs @@ -2,7 +2,9 @@ using Ptr.Shared.Extensions; using Ptr.Shared.Hosting; using Sharp.Modules.CommandManager.Shared; +using Sharp.Modules.LocalizerManager.Shared; using Sharp.Shared.Definition; +using Sharp.Shared.Enums; using Sharp.Shared.Objects; using Sharp.Shared.Types; @@ -12,105 +14,124 @@ internal interface INominateService : IModule; internal class NominateService : INominateService { - private readonly IConVar? _activateNominateMinPlayers; private readonly InterfaceBridge _bridge; - - private readonly IConVar? _enableNominate; + private readonly IConVar _enableNominate; + private readonly IConVar _activateNominateMinPlayers; private readonly ILogger _logger; + private ILocalizerManager _localizerManager = null!; public NominateService(InterfaceBridge bridge, ILogger logger) { _bridge = bridge; _logger = logger; - - _enableNominate = _bridge.ConVarManager.CreateConVar("mapmanager_enable_nominate", true, "Enable nominate"); + _enableNominate = _bridge.ConVarManager.CreateConVar("mapmanager_enable_nominate", true, "Enable nominate command", ConVarFlags.Release)!; _activateNominateMinPlayers = _bridge.ConVarManager.CreateConVar("mapmanager_activate_nominate_min_players", 5, - "minimal players count to activate nominate."); + "minimal players count to activate nominate.", ConVarFlags.Release)!; } public void OnInit() { - if (_enableNominate?.GetBool() is true) - { - return; - } - - _logger.LogInformation("Nomination is disabled."); + _logger.LogInformation("Nomination is enabled."); } public void OnAllModulesLoaded() { - if (_enableNominate?.GetBool() is not true) - { - return; - } - _bridge .SharpModuleManager .GetRequiredSharpModuleInterface(ICommandManager.Identity) .Instance! .GetRegistry(_bridge.ModuleIdentity) .RegisterClientCommand("nominate", OnCommandNominate); + + _localizerManager = _bridge.SharpModuleManager + .GetRequiredSharpModuleInterface(ILocalizerManager.Identity) + .Instance!; } public void OnShutdown() { - if (_enableNominate?.GetBool() is not true) - { - return; - } - _bridge.NominatedMaps.Clear(); } private void OnCommandNominate(IGameClient client, StringCommand command) { + if (_enableNominate.GetBool() is not true) + { + return; + } + if (_localizerManager is null) + { + throw new InvalidOperationException("LocalizerManager is not initialized."); + } + _localizerManager.TryGetLocalizer(client, out var _localizer); + if (_localizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when executing nominate command.", + client.Slot); + return; + } + var clientsCount = _bridge.Server.GetGameClients(true, true).Count; - var leastActivateNominateCount = _activateNominateMinPlayers?.GetInt32() ?? 5; + var leastActivateNominateCount = _activateNominateMinPlayers.GetInt32(); if (clientsCount < leastActivateNominateCount) { client.PrintToChat(_bridge.ChatFormatter.Format( - $"当前在线人数不足 {ChatColor.Green}{leastActivateNominateCount}{ChatColor.White} 人,无法提名地图。")); + _localizer.Format("ptr.mapmanager.nominate_not_enough_players", leastActivateNominateCount))); return; } if (command.ArgCount < 1) { - client.PrintToChat(_bridge.ChatFormatter.Format("用法:.nominate <地图名>")); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.nominate_usage"))); return; } var map = command[1]; if (_bridge.NominatedMaps.Contains(map, StringComparer.OrdinalIgnoreCase)) { - client.PrintToChat("该地图已经被提名过了。"); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.map_already_nominated"))); return; } if (_bridge.PreviousGameMaps.Exists(x => x.MapName.Equals(map, StringComparison.OrdinalIgnoreCase))) { - client.PrintToChat("该地图最近已经玩过了,目前无法提名。"); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.map_recently_played"))); return; } if (_bridge.Maps.Exists(x => x.MapName.Equals(map, StringComparison.OrdinalIgnoreCase))) { - client.PrintToChat("无法从图池中找到该地图。"); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.map_not_found"))); return; } var currentMap = _bridge.GlobalVars.MapName; if (currentMap.Equals(map, StringComparison.OrdinalIgnoreCase)) { - client.PrintToChat("不能投票正在游玩的地图。"); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.cannot_nominate_current_map"))); return; } _bridge.NominatedMaps.Add(map); - _bridge.ModSharp.PrintToChatAll(_bridge.ChatFormatter.Format( - $"{ChatColor.Green}{client.Name}{ChatColor.White} 提名了地图 {ChatColor.Green}{map}{ChatColor.White}。")); + var allClients = _bridge.ClientManager.GetGameClients(true); + foreach (var c in allClients) + { + if (c.IsFakeClient) + { + continue; + } + _localizerManager.TryGetLocalizer(c, out var _tempLocalizer); + if (_tempLocalizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when broadcasting nomination.", + c.Slot); + continue; + } + c.PrintToChat( + _bridge.ChatFormatter.Format(_tempLocalizer.Format("ptr.mapmanager.player_nominated_map", client.Name, map))); + } _logger.LogInformation("{ClientName} nominated {Map}", client.Name, map); } -} \ No newline at end of file +} diff --git a/src/Ptr.Modules.MapManager/Services/RtvService.cs b/src/Ptr.Modules.MapManager/Services/RtvService.cs index 294345a..b3948db 100644 --- a/src/Ptr.Modules.MapManager/Services/RtvService.cs +++ b/src/Ptr.Modules.MapManager/Services/RtvService.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using Ptr.Shared.Extensions; using Ptr.Shared.Hosting; +using Sharp.Modules.LocalizerManager.Shared; using Sharp.Shared.Definition; using Sharp.Shared.Enums; using Sharp.Shared.Listeners; @@ -13,33 +14,48 @@ internal interface IRtvService : IModule; internal class RtvService : IRtvService, IGameListener, IClientListener { private readonly InterfaceBridge _bridge; - - private readonly IConVar? _enableRtv; + private readonly IConVar _enableRtv; private readonly ILogger _logger; private readonly bool[] _rtvPlayers = new bool[64]; + private ILocalizerManager _localizerManager = null!; public RtvService(InterfaceBridge bridge, ILogger logger) { _bridge = bridge; _logger = logger; - - - _enableRtv = _bridge.ConVarManager.CreateConVar("mapmanager_enable_rtv", true, "Enable RTV"); + _enableRtv = _bridge.ConVarManager.CreateConVar("mapmanager_enable_rtv", true, "Enable RTV", ConVarFlags.Release)!; } private void AttemptRtv(IGameClient client) { + if (_enableRtv.GetBool() is not true) + { + _logger.LogInformation("RTV is disabled, skip RTV attempt."); + return; + } + if (_localizerManager is null) + { + throw new InvalidOperationException("LocalizerManager is not initialized."); + } + _localizerManager.TryGetLocalizer(client, out var _localizer); + if (_localizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when executing rtv command.", + client.Slot); + return; + } + var remaining = (int)(_bridge.AllowVoteTime - DateTime.Now).TotalSeconds; if (remaining > 0) { client.PrintToChat( - _bridge.ChatFormatter.Format($"{ChatColor.Green} {remaining} {ChatColor.White}秒后才能发起换图投票。")); + _bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.rtv_after_x", remaining))); return; } if (_rtvPlayers[client.Slot]) { - client.PrintToChat(_bridge.ChatFormatter.Format("你已经投票过换图了!")); + client.PrintToChat(_bridge.ChatFormatter.Format(_localizer.Format("ptr.mapmanager.already_voted_rtv"))); return; } @@ -47,15 +63,42 @@ private void AttemptRtv(IGameClient client) var current = _rtvPlayers.Count(rtvPlayer => rtvPlayer); var requested = _bridge.MapManager.GetVoteSuccessNumberRequested(); var clientGaps = requested - current; - _bridge.ModSharp.PrintToChatAll(_bridge.ChatFormatter.Format( - $"已有 {ChatColor.Green}{current}{ChatColor.White} 人投票换图,还需 {ChatColor.Green}{clientGaps}{ChatColor.White} 票。")); + + var allClients = _bridge.ClientManager.GetGameClients(true); + foreach (var c in allClients) + { + _localizerManager.TryGetLocalizer(c, out var _tempLocalizer); + if (_tempLocalizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when broadcasting rtv progress.", + c.Slot); + continue; + } + c.PrintToChat( + _bridge.ChatFormatter.Format(_tempLocalizer.Format("ptr.mapmanager.rtv_vote_progress", current, clientGaps))); + } if (clientGaps > 0) { return; } - _bridge.ModSharp.PrintToChatAll(_bridge.ChatFormatter.Format("投票换图通过!将在回合结束后开始投票。")); + foreach (var c in allClients) + { + if (c.IsFakeClient) + { + continue; + } + _localizerManager.TryGetLocalizer(c, out var _tempLocalizer); + if (_tempLocalizer is null) + { + _logger.LogWarning("Localizer not found for client {ClientSlot} when broadcasting rtv passed.", + c.Slot); + continue; + } + c.PrintToChat( + _bridge.ChatFormatter.Format(_tempLocalizer.Format("ptr.mapmanager.rtv_vote_passed"))); + } _bridge.ModSharp.ServerCommand("mp_timelimit 0.00000001"); } @@ -70,27 +113,20 @@ private void ResetClientRtvState(IGameClient client) } #region IModule - public void OnInit() { - if (_enableRtv?.GetBool() is not true) - { - _logger.LogInformation("RTV is disabled, skip initialization."); - return; - } - - _bridge.ClientManager.InstallClientListener(this); _bridge.ModSharp.InstallGameListener(this); + _bridge.ClientManager.InstallClientListener(this); + } + public void OnAllModulesLoaded() + { + _localizerManager = _bridge.SharpModuleManager + .GetRequiredSharpModuleInterface(ILocalizerManager.Identity) + .Instance!; } public void OnShutdown() { - if (_enableRtv?.GetBool() is not true) - { - _logger.LogInformation("RTV is disabled, skip shutdown."); - return; - } - _bridge.ModSharp.RemoveGameListener(this); _bridge.ClientManager.RemoveClientListener(this); ResetRtvState(); @@ -138,4 +174,4 @@ public ECommandAction OnClientSayCommand(IGameClient client, bool teamOnly, bool int IClientListener.ListenerVersion => IClientListener.ApiVersion; #endregion -} \ No newline at end of file +} diff --git a/src/Ptr.Shared/Bridge/InterfaceBridge.cs b/src/Ptr.Shared/Bridge/InterfaceBridge.cs index 99e3aa4..0ca34b7 100644 --- a/src/Ptr.Shared/Bridge/InterfaceBridge.cs +++ b/src/Ptr.Shared/Bridge/InterfaceBridge.cs @@ -49,14 +49,14 @@ public InterfaceBridge(ISharedSystem sharedSystem, public IModSharp ModSharp => _sharedSystem.GetModSharp(); /// - /// CGlobalVars* gpGlobals,没什么好说的。
- /// 注意,一定要在地图加载之后调用!不然服务器第一次加载的时候是拿不到的! + /// CGlobalVars* gpGlobals.
+ /// Note: Must be called after the map is loaded! Otherwise it won't be available on the server's first load! ///
public IGlobalVars GlobalVars => ModSharp.GetGlobals(); /// /// CGameRules* g_pGameRules
- /// 注意,一定要在地图加载之后调用!不然服务器第一次加载的时候是拿不到的! + /// Note: Must be called after the map is loaded! Otherwise it won't be available on the server's first load! ///
public IGameRules GameRules => ModSharp.GetGameRules(); diff --git a/src/Ptr.Shared/Extensions/EntityManagerExtensions.cs b/src/Ptr.Shared/Extensions/EntityManagerExtensions.cs index 7dde914..6583acd 100644 --- a/src/Ptr.Shared/Extensions/EntityManagerExtensions.cs +++ b/src/Ptr.Shared/Extensions/EntityManagerExtensions.cs @@ -11,7 +11,7 @@ public static class EntityManagerExtensions extension(IEntityManager self) { /// - /// 通过PlayerSlot查找PlayerController + /// Find PlayerController by PlayerSlot /// public IPlayerController? GetPlayerController(PlayerSlot slot) { @@ -19,7 +19,7 @@ public static class EntityManagerExtensions } /// - /// 通过IGameClient查找PlayerController + /// Find PlayerController by IGameClient /// public IPlayerController? GetPlayerController(IGameClient client) { diff --git a/src/Ptr.Shared/Extensions/TransmitManagerExtensions.cs b/src/Ptr.Shared/Extensions/TransmitManagerExtensions.cs index 38d8374..796b685 100644 --- a/src/Ptr.Shared/Extensions/TransmitManagerExtensions.cs +++ b/src/Ptr.Shared/Extensions/TransmitManagerExtensions.cs @@ -11,11 +11,11 @@ public static class TransmitManagerExtensions extension(ITransmitManager self) { /// - /// 获取实体的Controller可见状态 + /// Get the entity's visibility state for a Controller /// /// Entity /// Player Controller - /// Channel, -1为读取全局状态 + /// Channel, -1 to read global state public bool GetEntityState(IBaseEntity entity, IPlayerController controller, int channel = -1) { @@ -23,11 +23,11 @@ public bool GetEntityState(IBaseEntity entity, IPlayerController controller, } /// - /// 设置实体的Controller可见状态 + /// Set the entity's visibility state for a Controller /// /// Entity /// Player Controller - /// 是否可见 + /// Whether visible /// Channel public bool SetEntityState(IBaseEntity entity, IPlayerController controller, bool transmit, int channel) @@ -36,7 +36,7 @@ public bool SetEntityState(IBaseEntity entity, IPlayerController controller, } /// - /// 获取实体是否被Block + /// Get whether the entity is blocked /// public bool GetEntityBlock(IBaseEntity entity) { @@ -44,7 +44,7 @@ public bool GetEntityBlock(IBaseEntity entity) } /// - /// 设置实体Block State + /// Set entity block state /// public bool SetEntityBlock(IBaseEntity entity, bool state) { @@ -52,7 +52,7 @@ public bool SetEntityBlock(IBaseEntity entity, bool state) } /// - /// 获取Hook中的实体Owner + /// Get the entity's owner in the hook /// /// -2 = NoHook | -1 = Null | other = Entity Index public int GetEntityOwner(IBaseEntity entity) @@ -61,19 +61,19 @@ public int GetEntityOwner(IBaseEntity entity) } /// - /// 设置Hook中的实体Owner + /// Set the entity's owner in the hook /// - /// 实体 - /// Owner实体的 + /// Entity + /// Owner entity public bool SetEntityOwner(IBaseEntity entity, IBaseEntity owner) { return self.SetEntityOwner(entity.Index, owner.Index); } /// - /// TempEnt的状态 + /// Get TempEnt state /// - /// TE类型 + /// TE type /// IGameClient public bool GetTempEntState(BlockTempEntType type, IGameClient client) { @@ -81,11 +81,11 @@ public bool GetTempEntState(BlockTempEntType type, IGameClient client) } /// - /// 设置TempEnt的状态 + /// Set TempEnt state /// - /// TE类型 + /// TE type /// IGameClient - /// 可见状态 + /// Visibility state public void SetTempEntState(BlockTempEntType type, IGameClient client, bool state) { @@ -93,7 +93,7 @@ public void SetTempEntState(BlockTempEntType type, IGameClient client, } /// - /// 重置接受者的所有实体状态 + /// Reset all entity states for the receiver /// /// receiver controller public void ClearReceiverState(IPlayerController receiver) diff --git a/src/Ptr.Shared/Hooks/Abstractions/AbstractHookService.cs b/src/Ptr.Shared/Hooks/Abstractions/AbstractHookService.cs index 1cdb1b4..4bbf647 100644 --- a/src/Ptr.Shared/Hooks/Abstractions/AbstractHookService.cs +++ b/src/Ptr.Shared/Hooks/Abstractions/AbstractHookService.cs @@ -15,12 +15,12 @@ namespace Ptr.Shared.Hooks.Abstractions; internal interface IHookService where TParams : class, IFunctionParams { /// - /// 泛播给其他的订户 + /// Broadcast to other subscribers /// - /// Hook参数 - /// Hook的返回值 (如果是void, 直接写int就好) + /// Hook parameters + /// Hook return value (if void, just use int) /// - /// 封装了Hook操作和Hook的返回值 + /// Encapsulates the hook action and hook return value HookReturnValue InvokeHookPre(TParams @params); void InvokeHookPost(TParams @params, HookReturnValue @return); diff --git a/src/Ptr.Shared/Misc/ChatMessageFormatter.cs b/src/Ptr.Shared/Misc/ChatMessageFormatter.cs index c21956a..5d75365 100644 --- a/src/Ptr.Shared/Misc/ChatMessageFormatter.cs +++ b/src/Ptr.Shared/Misc/ChatMessageFormatter.cs @@ -49,7 +49,10 @@ internal static class ChatMessageFormatterExtensions { "{blue}", ChatColor.Blue }, { "{darkblue}", ChatColor.DarkBlue }, { "{purple}", ChatColor.Purple }, - { "{lightred}", ChatColor.LightRed } + { "{lightred}", ChatColor.LightRed }, + { "{muted}", ChatColor.Muted }, + { "{head}", ChatColor.Head }, + { "{whitespace}", "\u00A0" } }; extension(string self) diff --git a/src/Ptr.Shared/Types/QAngle.cs b/src/Ptr.Shared/Types/QAngle.cs index 7d1a383..3754198 100644 --- a/src/Ptr.Shared/Types/QAngle.cs +++ b/src/Ptr.Shared/Types/QAngle.cs @@ -154,7 +154,7 @@ public float LengthSqr() } /// - /// 常规化 + /// Normalize /// public void Normalize() {