diff --git a/crowdin/lang/ar-SA/messages.json b/crowdin/lang/ar-SA/messages.json index 5d655cd52f..1c2dea3e2d 100644 --- a/crowdin/lang/ar-SA/messages.json +++ b/crowdin/lang/ar-SA/messages.json @@ -1,18 +1,18 @@ { "_comment": "أهلاً أيها المترجم! إذا كنت تترجم بإستخدام GitHub أو عن طريق الكود الأساسي من الأفضل أن تذهب إلى https://crowdin.com/project/quickshop-reremake", - "file-test": "This is a test textfile. We use it to test if the messages.json is broken. You can fill it with any easter eggs you like here :)", + "file-test": "إن هذا المِلَفّ لتجربه, يمكننا استخدامه إذا كان messages.json غير صالح, يمكنك تعبته بأي شيئا تريده :)", "translation-author": "المترجم: Ghost_chu, Andre_601, MoroccanTea", "translation-version": "إصدار الدعم: إعادة التشكيل", "translation-contributors": "المساهمون: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken و Andre_601", "translation-country": "منطقة اللغة: العربية (ar_AR)", "language-version": "66", - "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", + "not-looking-at-valid-shop-block": "&c لم يتم العثور على البلوك لصنع المتجر, يجب عليك أن تنظر باتجاه واحد.", "not-looking-at-shop": "&cلا يمكن العثور على QuickShop. تحتاج إلى النظر إلى واحد.", "no-anythings-in-your-hand": "&cلا يوجد شيء في يديك.", "no-permission": "لا تملك الصلاحيّات للقيام بذلك.", "integrations-check-failed-create": "&cالتكامل {0} رفض إنشاء المحل", "integrations-check-failed-trade": "&cالتكامل {0} رفض تداول المتجر", - "3rd-plugin-build-check-failed": "&c3rd party plugin &l{0}&r&c denied the protection checks (build protection), did you have build permission of this 3rd plugin? If is not expected, please contact admin.", + "3rd-plugin-build-check-failed": "إضافة خارجية &l{0}&r&c قد رفضت التحقق من الحماية (build protection), هل لديك إذن البناء من هذه الإضافة الخارجية؟, إن كان لديك الإذن, فعليك التواصل مع المسؤول.", "3rd-plugin-build-check-failed-admin": "&7(AdminOnly) &d{0} &8denied the protection checks (build protection), If this not excepted, try add &d{1} &7to listener blacklist. &7Configure Guide: https://github.com/PotatoCraft-Studio/QuickShop-Reremake/wiki/Use-protection-listener-filter", "no-creative-break": "&cلا يمكنك كسر متاجر اللاعبين الآخرين في الوضع الإبداعي، قم بالتبديل إلى وضع البقاء أو حاول استخدام الأداة الخارقة {0} بدلاً من ذلك.", "trading-in-creative-mode-is-disabled": "&cلا يمكنك التداول مع هذا المتجر بينما تكون في وضع إبداعي.", diff --git a/crowdin/lang/cs-CZ/messages.json b/crowdin/lang/cs-CZ/messages.json index e06373764c..7c19edb927 100644 --- a/crowdin/lang/cs-CZ/messages.json +++ b/crowdin/lang/cs-CZ/messages.json @@ -35,10 +35,10 @@ "shop-stock-too-low": "&cV obchodě zbývá pouze {0} {1}!", "you-cant-afford-to-buy": "&cToto stojí {0}, ale ty máš jen {1}", "select-shop-type-or-cancel": "&aJaký typ obchodu chcete použít? \n {0} {1} {2}", - "select-shop-type-or-cancel-selling-button": "&d[Selling]", - "select-shop-type-or-cancel-buying-button": "&b[Buying]", - "select-shop-type-or-cancel-cancel-button": "&c[Cancel]", - "not-a-valid-shop-type": "&cYou can only input Buy/Sell/Cancel, your input was {0}.", + "select-shop-type-or-cancel-selling-button": "&d[Prodej]", + "select-shop-type-or-cancel-buying-button": "&b[Nákup]", + "select-shop-type-or-cancel-cancel-button": "&c[Zrušit]", + "not-a-valid-shop-type": "&cMůžete zadat pouze nákup/prodej/zrušit, váš vstup byl {0}.", "negative-amount": "&cDerp, nemůžeš obchodovat se zápornými částkami", "not-a-number": "&cMůžete zadat pouze číslo, váš vstup byl {0}.", "exceeded-maximum": "&cHodnota překročila maximální hodnotu v Javě.", @@ -70,7 +70,7 @@ "unknown-owner": "Nezname", "owner-bypass-check": "&b▪&8▏ &bSystem &8› &7Prošel všechny kontroly. Obchod byl úspěšný! (Nyní jste vlastníkem obchodu!)", "reached-maximum-can-create": "&b▪&8▏ &bSystem &8› &cJiž jste vytvořili maximum {0}/{1} obchodů!", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&cCílový hráč dosáhl maxima {0}/{1} obchodů!", "restricted-prices": "&b▪&8▏ &bSystem &8› &cOmezená cena za {0}: Min {1}, max {2}", "no-enough-money-to-keep-shops": "&b▪&8▏ &bSystem &8› &cNemáte dostatek peněz na udržení svých obchodů! Všechny obchody byly odstraněny...", "nothing-to-flush": "&b▪&8▏ &bSystem &8› &7Nemáte žádné nové zprávy o obchodu.", @@ -248,7 +248,7 @@ "freeze-hover": "&bPřepnout stav zmrazení obchodu.", "toggledisplay": "&fPředmět: &b{0} &7[&d&3Přepni&7]", "toggledisplay-hover": "&fPřepne obchodu status ukazovaného předmětu", - "staff": "&aStaff amount: &b{0} &e[&d&lModify&e]" + "staff": "&aPočet Zaměstnanců: &b{0} &e[&d&lUpravit&e]" }, "tableformat": { "full_line": "&r", diff --git a/crowdin/lang/de-DE/messages.json b/crowdin/lang/de-DE/messages.json index d39b03e5af..937481d0b8 100644 --- a/crowdin/lang/de-DE/messages.json +++ b/crowdin/lang/de-DE/messages.json @@ -25,7 +25,7 @@ "price-too-cheap": "&cPreis muss höher als &e${0}&c sein", "no-price-change": "&cDies würde in keinen Preisunterschied enden!", "you-cant-afford-a-new-shop": "&cEs kostet {0} um einen neuen Shop zu erstellen.", - "player-bought-from-your-store-tax": "&c{0} hat {1} {2} &r&cvon deine Shop gekauft und du hast {3} daran verdient ({4} an Steuern).", + "player-bought-from-your-store-tax": "&c{0} hat {1} {2} &r&cvon deinem Shop gekauft und du hast {3} daran verdient ({4} an Steuern).", "you-cant-afford-to-change-price": "Es kostet {0} um den Preis deines Shops zu ändern.", "success-created-shop": "&aShop erstellt.", "success-removed-shop": "&aShop entfernt.", @@ -43,7 +43,7 @@ "not-a-number": "&cDu kannst nur eine Zahl eingeben, Deine Eingabe war {0}.", "exceeded-maximum": "&cDer Wert hat den Maximalwert in Java überschritten.", "not-a-integer": "&cDu kannst nur eine Zahl eingeben, Deine Eingabe war {0}.", - "player-bought-from-your-store": "&c{0} hat {1} {2} &r&cvon deine Shop gekauft und du hast {3} daran verdient.", + "player-bought-from-your-store": "&c{0} hat {1} {2} &r&cvon deinem Shop gekauft und du hast {3} daran verdient.", "shop-out-of-stock": "&5Dein Shop bei den Koordinaten {0}, {1}, {2}, verfügt über keine {3} mehr!", "shop-has-no-space": "&cDer Shop hat nur noch Platz für {0} weitere {1}.", "you-dont-have-that-many-items": "&cDu hast nur {0} {1}.", diff --git a/crowdin/lang/es-ES/messages.json b/crowdin/lang/es-ES/messages.json index 5db0cea1f8..2dab07a443 100644 --- a/crowdin/lang/es-ES/messages.json +++ b/crowdin/lang/es-ES/messages.json @@ -70,7 +70,7 @@ "unknown-owner": "Desconocido", "owner-bypass-check": "&ePasado todos los controles. ¡Comercio exitoso! (¡Ahora eres el propietario de la tienda!)", "reached-maximum-can-create": "&c¡Ya has creado un máximo de {0}/{1} tiendas!", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&cEl jugador objetivo ha alcanzado el máximo de {0}/{1} tiendas!", "restricted-prices": "&cPrecio restringido de {0}: Mín. {1}, Máx. {2}", "no-enough-money-to-keep-shops": "&c¡No dispones del suficiente dinero para mantener tus tiendas! Todas tus tiendas han sido eliminadas...", "nothing-to-flush": "&aNo tienes mensajes de tienda nuevos.", diff --git a/crowdin/lang/fr-FR/messages.json b/crowdin/lang/fr-FR/messages.json index d36687b797..2c73f3399b 100644 --- a/crowdin/lang/fr-FR/messages.json +++ b/crowdin/lang/fr-FR/messages.json @@ -70,7 +70,7 @@ "unknown-owner": "Inconnu", "owner-bypass-check": "&eVérifications passées. Echange réussi ! (Tu es propriétaire de la boutique!)", "reached-maximum-can-create": "&cTu as atteint ton nombre de coffre de boutiques maximal : {0}/{1}!", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&cLe joueur ciblé a atteint le maximum de {0}/{1} boutiques !", "restricted-prices": "&cPrix restreints {0}: min {1}, max {2}", "no-enough-money-to-keep-shops": "&cTu n'as plus assez d'argent pour garder tes boutiques! Tous tes coffres ont été supprimés...", "nothing-to-flush": "&aAucun nouveau message.", diff --git a/crowdin/lang/no-NO/messages.json b/crowdin/lang/no-NO/messages.json index bf91c88a33..e495c70cf0 100644 --- a/crowdin/lang/no-NO/messages.json +++ b/crowdin/lang/no-NO/messages.json @@ -12,8 +12,8 @@ "no-permission": "&cDu har ikke tillatelse til å gjøre det.", "integrations-check-failed-create": "&cIntegrasjon {0} nektet opprettelse av butikken", "integrations-check-failed-trade": "&cIntegrasjon {0} avviste handelen", - "3rd-plugin-build-check-failed": "&c3rd party plugin &l{0}&r&c denied the protection checks (build protection), did you have build permission of this 3rd plugin? If is not expected, please contact admin.", - "3rd-plugin-build-check-failed-admin": "&7(AdminOnly) &d{0} &8denied the protection checks (build protection), If this not excepted, try add &d{1} &7to listener blacklist. &7Configure Guide: https://github.com/PotatoCraft-Studio/QuickShop-Reremake/wiki/Use-protection-listener-filter", + "3rd-plugin-build-check-failed": "&c3. partsplugin &l{0}&r&c nektet beskyttelsessjekk (byggebeskyttelse), hadde du byggetillatelse med denne 3. parts pluginen? Hvis dette ikke var forventet, vennligst kontakt admin.", + "3rd-plugin-build-check-failed-admin": "&7(AdminOnly) &d{0} &8nektet beskyttelsessjekkene (byggebeskyttelse), hvis dette ikke var forventet, prøv å svarteliste &d{1}. &7Konfigurasjonsguide: https://github.com/PotatoCraft-Studio/QuickShop-Reremake/wiki/Use-protection-listener-filter", "no-creative-break": "&cDu kan ikke ødelegge andre spillere sine butikker i kreativ modus. Bytt til overlevelsesmodus eller prøv å bruke superverktøyet {0} i stedet.", "trading-in-creative-mode-is-disabled": "&cDu kan ikke handle med denne butikken mens du er i kreativ modus.", "supertool-is-disabled": "&cSuperverktøyet er deaktivert. Kan ikke ødelegge butikker.", @@ -34,11 +34,11 @@ "shop-purchase-cancelled": "&cKjøpet ble avbrutt.", "shop-stock-too-low": "&cButikken har kun {0} {1} igjen!", "you-cant-afford-to-buy": "&cDet koster {0}, men du har bare {1}", - "select-shop-type-or-cancel": "&aWhich shop type you want to use? \n {0} {1} {2}", - "select-shop-type-or-cancel-selling-button": "&d[Selling]", - "select-shop-type-or-cancel-buying-button": "&b[Buying]", - "select-shop-type-or-cancel-cancel-button": "&c[Cancel]", - "not-a-valid-shop-type": "&cYou can only input Buy/Sell/Cancel, your input was {0}.", + "select-shop-type-or-cancel": "&aHvilken butikktype du ønsker å bruke? \n {0} {1} {2}", + "select-shop-type-or-cancel-selling-button": "&d[Selger]", + "select-shop-type-or-cancel-buying-button": "&b[Kjøper]", + "select-shop-type-or-cancel-cancel-button": "&c[Avbryt]", + "not-a-valid-shop-type": "&cDu kan bare velge kjøp/selg/avbryt, du valgte {0}.", "negative-amount": "&cDu kan ikke handle med negativt beløp", "not-a-number": "&cDu kan bare angi et nummer, du skrev {0}.", "exceeded-maximum": "&cVerdien overskrider maksimumsverdien i Java.", @@ -70,7 +70,7 @@ "unknown-owner": "Ukjent", "owner-bypass-check": "&aAlle sjekker ble ignorert. Overføringen ble gjennomført! (Du er nå eieren av butikken!)", "reached-maximum-can-create": "&cDu har allerede opprettet maksimum {0}/{1} butikker!", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&cSpilleren har nådd sin maksimale grense på {0}/{1} butikker!", "restricted-prices": "&cBegrenset pris for {0}: Min {1}, maks {2}", "no-enough-money-to-keep-shops": "&cDu har ikke nok penger til å beholde butikkene! Alle butikker ble fjernet...", "nothing-to-flush": "&aDu har ingen nye butikkmeldinger.", @@ -80,7 +80,7 @@ "warn-to-paste": "&eSamler inn data for å laste den opp til Pastebin, dette kan ta en stund. &c&lAdvarsel:&c Dataene oppbevares offentlig i en uke! Det kan lekke serverkonfigurasjonen og annen sensitiv informasjon. Sørg for at du bare sender den til &lstab/utviklere du stoler på.", "price-too-high": "&cButikkprisen er for høy! Du kan ikke sette en pris høyere enn {0}.", "you-cant-create-shop-in-there": "&cDu har ikke tillatelse til å opprette en butikk på denne plasseringen.", - "unknown-player": "&cTarget player doesn't existed or not online, please check the username you typed.", + "unknown-player": "&cSpilleren eksisterer ikke eller er avlogget, vennligst sjekk om du har skrevet riktig brukernavn.", "shop-staff-cleared": "&aAlle ansatte ble fjernet fra din butikk.", "shop-staff-added": "&cDu ansatte {0} som medarbeider i din butikk.", "shop-staff-deleted": "&aSpiller {0} ble fjernet som medarbeider i din butikk.", @@ -135,7 +135,7 @@ "counting": "&aButikken teller nå alltid beholderen, selv om den er ubegrenset", "not-counting": "&aButikken respekterer nå ubegrenset istedet for antall" }, - "transfer-success": "&aTransferred &e{0} &a selling shop(s) to &e{1}", + "transfer-success": "&aOverførte &e{0} &abutikk(er) (Selger) til &e{1}", "transfer-success-other": "&aOverførte &e{0} &abutikker tilhørende &e{1}&a til &e{2}", "some-shops-removed": "&e{0} &abutikk(er) ble fjernet", "no-owner-given": "&cIngen eier er oppgitt", @@ -185,7 +185,7 @@ "supercreate": "&eOpprett en butikk mens alle beskyttelse sjekker blir ignorert", "language": "&eBytt språk", "removeall": "&eFjern ALLE butikker for en spesifisert spiller", - "transfer": "&eTransfer someone's ALL selling shops to other", + "transfer": "&eOverfør ALLE butikker (salg) fra en spiller til en annen", "removeworld": "&eFjern ALLE butikker i en spesifikk verden", "currency": "&eSett eller fjern valuta oppsettet til butikken", "ban": "&eUtesteng en spiller fra butikken", @@ -248,7 +248,7 @@ "freeze-hover": "&eVeksle butikkens frysestatus.", "toggledisplay": "&eUtstillingsvare: &b{0} &e[&d&lVeksle&e]", "toggledisplay-hover": "&eSlå av/på butikkens utstillingsvare", - "staff": "&aStaff amount: &b{0} &e[&d&lModify&e]" + "staff": "&aAntall ansatte: &b{0} &e[&d&lEndre&e]" }, "tableformat": { "full_line": "+---------------------------------------------------+", diff --git a/crowdin/lang/pl-PL/messages.json b/crowdin/lang/pl-PL/messages.json index 646731ea1b..047d02c2a2 100644 --- a/crowdin/lang/pl-PL/messages.json +++ b/crowdin/lang/pl-PL/messages.json @@ -70,7 +70,7 @@ "unknown-owner": "Nieznany", "owner-bypass-check": "&ePominięto wszystkie sprawdzania. Handel zakończony sukcesem! (Jesteś teraz właścicielem sklepu!)", "reached-maximum-can-create": "&cJuż utworzyłeś maksimum {0}/{1} sklepów!", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&cDocelowy gracz osiągnął maksymalną liczbę sklepów {0}/{1}!", "restricted-prices": "&cOgraniczona cena dla {0}: min. {1}, maks. {2}", "no-enough-money-to-keep-shops": "&cNie masz wystarczająco pieniędzy, aby przechowywać sklepy! Wszystkie sklepy zostały usunięte...", "nothing-to-flush": "&aNie masz nowych wiadomości ze sklepu.", diff --git a/crowdin/lang/ru-RU/messages.json b/crowdin/lang/ru-RU/messages.json index 8572eb5b32..d637e5ddee 100644 --- a/crowdin/lang/ru-RU/messages.json +++ b/crowdin/lang/ru-RU/messages.json @@ -9,66 +9,66 @@ "not-looking-at-valid-shop-block": "&cНе удалось найти блок для создания магазина. Вы должны смотреть на него.", "not-looking-at-shop": "&cНе удалось найти магазин. Вы должны смотреть на него.", "no-anythings-in-your-hand": "&cУ вас нет ничего в руках.", - "no-permission": "&cУ вас нет прав.", - "integrations-check-failed-create": "&cИнтеграция {0} отказала в создании магазина", + "no-permission": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cУ вас нет прав.", + "integrations-check-failed-create": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cИнтеграция {0} отказала в создании магазина", "integrations-check-failed-trade": "&cИнтеграция {0} отказала в продаже магазина", - "3rd-plugin-build-check-failed": "&cСторонний плагин &l{0}&r&c запретил проверку защиты (защита от строительства), у вас есть разрешение на строительство от этого третьего плагина? Если так быть не должно, пожалуйста, свяжитесь с администратором.", - "3rd-plugin-build-check-failed-admin": "&7(Админ) &d{0} &8отказал в проверке доступа. Если это не ожидаемое поведение плагина, попробуйте добавить &d{1} &7в черный список. &7Руководство по настройке: https://github.com/PotatoCraft-Studio/QuickShop-Reremake/wiki/Use-protection-listener-filter", + "3rd-plugin-build-check-failed": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cСторонний плагин &l{0}&r&c запретил проверку защиты (защита от строительства), у вас есть разрешение на строительство от этого третьего плагина? Если так быть не должно, пожалуйста, свяжитесь с администратором.", + "3rd-plugin-build-check-failed-admin": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &7(Админ) &d{0} &8отказал в проверке доступа. Если это не ожидаемое поведение плагина, попробуйте добавить &d{1} &7в черный список. &7Руководство по настройке: https://github.com/PotatoCraft-Studio/QuickShop-Reremake/wiki/Use-protection-listener-filter", "no-creative-break": "&cВы не можете сломать чужой магазин в творческом режиме, переключитесь на режим выживания или попробуйте использовать супер-инструмент {0}.", - "trading-in-creative-mode-is-disabled": "&cВы не можете торговать в творческом режиме.", - "supertool-is-disabled": "&cСупер-инструмент отключен, вы не можете сломать чужой магазин.", - "disabled-in-this-world": "&cQuickShop отключен в этом мире", + "trading-in-creative-mode-is-disabled": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cВы не можете торговать в творческом режиме.", + "supertool-is-disabled": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cСупер-инструмент отключен, вы не можете сломать чужой магазин.", + "disabled-in-this-world": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cQuickShop отключен в этом мире", "no-double-chests": "&cВы не можете создать магазин на двойных сундуках.", - "not-managed-shop": "&cВы не владелец или сотрудник этого магазина", - "shop-already-owned": "&cВы уже создали магазин.", - "chest-was-removed": "&cСундук удален.", - "price-too-cheap": "&cЦена должна быть больше &e${0}", + "not-managed-shop": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cВы не владелец или сотрудник этого магазина", + "shop-already-owned": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cВы уже создали магазин.", + "chest-was-removed": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cСундук удален.", + "price-too-cheap": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cЦена должна быть больше &e${0}", "no-price-change": "&cЦена не может быть равна предыдущей!", - "you-cant-afford-a-new-shop": "&cСоздание магазина стоит {0}.", - "player-bought-from-your-store-tax": "&c{0} купил {1} {2} &r&c из вашего магазина, и вы заработали {3} ({4} - налог).", - "you-cant-afford-to-change-price": "&cИзменение цены в магазине стоит {0}.", - "success-created-shop": "&cМагазин создан.", - "success-removed-shop": "&aМагазин удален.", + "you-cant-afford-a-new-shop": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cСоздание магазина стоит {0}.", + "player-bought-from-your-store-tax": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &c{0} купил {1} {2} &r&c из вашего магазина, и вы заработали {3} ({4} - налог).", + "you-cant-afford-to-change-price": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cИзменение цены в магазине стоит {0}.", + "success-created-shop": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cМагазин создан.", + "success-removed-shop": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aМагазин удален.", "shops-arent-locked": "&cПомните, магазины НЕ защищены от кражи! Если вы хотите остановить воров, заблокируйте его с помощью LWC, Lockette и т.д.!", - "shop-creation-cancelled": "&cСоздание магазина отменено.", - "shop-purchase-cancelled": "&cПокупка в магазине отменена.", - "shop-stock-too-low": "&cВ магазине осталось {0} {1}!", - "you-cant-afford-to-buy": "&cЭто стоит {0}, но у вас на балансе {1}", - "select-shop-type-or-cancel": "&aКакой тип магазина вы хотите использовать? \n {0} {1} {2}", - "select-shop-type-or-cancel-selling-button": "&d[Продажа]", - "select-shop-type-or-cancel-buying-button": "&b[Покупка]", - "select-shop-type-or-cancel-cancel-button": "&c[Отмена]", - "not-a-valid-shop-type": "&cМожно ввести только Покупка/Продажа/Отмена. Вы ввели {0}.", + "shop-creation-cancelled": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cСоздание магазина отменено.", + "shop-purchase-cancelled": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cПокупка в магазине отменена.", + "shop-stock-too-low": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cВ магазине осталось {0} {1}!", + "you-cant-afford-to-buy": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cЭто стоит {0}, но у вас на балансе {1}", + "select-shop-type-or-cancel": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aКакой тип магазина вы хотите использовать? \n {0} {1} {2}", + "select-shop-type-or-cancel-selling-button": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &d[Продажа]", + "select-shop-type-or-cancel-buying-button": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &b[Покупка]", + "select-shop-type-or-cancel-cancel-button": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &c[Отмена]", + "not-a-valid-shop-type": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cМожно ввести только Покупка/Продажа/Отмена. Вы ввели {0}.", "negative-amount": "&cВы не можете использовать отрицательные значения", "not-a-number": "&cМожно ввести только число. Вы ввели {0}.", - "exceeded-maximum": "&cЗначение превысило максимальное значение в Java.", + "exceeded-maximum": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cЗначение превысило максимальное значение в Java.", "not-a-integer": "&cВы должны ввести целое число. Вы ввели {0}.", - "player-bought-from-your-store": "&c{0} купил {1} {2} &r&cиз вашего магазина, и вы заработали {3}.", + "player-bought-from-your-store": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &c{0} купил {1} {2} &r&cиз вашего магазина, и вы заработали {3}.", "shop-out-of-stock": "&5В вашем магазине на координатах {0}, {1}, {2} закончился товар {3}!", "shop-has-no-space": "&cМагазин можно пополнить ещё {0} {1}.", - "you-dont-have-that-many-items": "&cУ вас только {0} {1}.", - "the-owner-cant-afford-to-buy-from-you": "&cЭто стоит {0}, но у владелец только {1}", - "player-sold-to-your-store": "&a{0} продал {1}x {2} в ваш магазин.", - "shop-out-of-space": "&5Магазин переполнен {0}, {1}, {2}.", - "fee-charged-for-price-change": "&aВы заплатили &c{0}&a за изменение цены.", - "price-is-now": "&aНовая цена магазина &e{0}", - "thats-not-a-number": "&cНеверное число", - "forbidden-vanilla-behavior": "&cОперация отклонена, она не соответствует ванильному поведению", - "no-price-given": "&cПожалуйста укажите верную цену.", - "average-price-nearby": "&aСредняя цена: &e{0}", - "shop-has-changed": "&cМагазин, который вы пытались использовать, был изменен!", - "shop-not-exist": "&cТакого нет магазина.", - "nearby-shop-this-way": "&aМагазин находится в {0} блоках от вас.", - "nearby-shop-header": "&aБлижайший магазин, соответствующий &b{0}&a:", - "nearby-shop-entry": "&a- Информация:{0} &aЦена:&b{1} &ax:&b{2} &ay:&b{3} &az:&b{4} &aрасстояние: &b{5} &aблок(ов)", - "no-nearby-shop": "&cНет близлежащего магазина, соответствующего {0}.", - "buying-more-than-selling": "&cВНИМАНИЕ: Вы покупаете товары дороже, чем продаёте!", - "not-enough-space": "&cВ вашем инвентаре не хватило больше {0} мест!", - "refill-success": "&aПополнение успешно", - "empty-success": "&aМагазин успешно очищен", - "admin-shop": "Администратор", - "unknown-owner": "Неизвестно", - "owner-bypass-check": "&eВсе проверки прошли, вы можете торговать! (Теперь вы владелец магазина!)", + "you-dont-have-that-many-items": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cУ вас только {0} {1}.", + "the-owner-cant-afford-to-buy-from-you": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cЭто стоит {0}, но у владелец только {1}", + "player-sold-to-your-store": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &a{0} продал {1}x {2} в ваш магазин.", + "shop-out-of-space": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &5Магазин переполнен {0}, {1}, {2}.", + "fee-charged-for-price-change": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aВы заплатили &c{0}&a за изменение цены.", + "price-is-now": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aНовая цена магазина &e{0}", + "thats-not-a-number": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cНеверное число", + "forbidden-vanilla-behavior": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cОперация отклонена, она не соответствует ванильному поведению", + "no-price-given": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cПожалуйста укажите верную цену.", + "average-price-nearby": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aСредняя цена: &e{0}", + "shop-has-changed": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cМагазин, который вы пытались использовать, был изменен!", + "shop-not-exist": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cТакого нет магазина.", + "nearby-shop-this-way": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aМагазин находится в {0} блоках от вас.", + "nearby-shop-header": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aБлижайший магазин, соответствующий &b{0}&a:", + "nearby-shop-entry": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &a- Информация:{0} &aЦена:&b{1} &ax:&b{2} &ay:&b{3} &az:&b{4} &aрасстояние: &b{5} &aблок(ов)", + "no-nearby-shop": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cНет близлежащего магазина, соответствующего {0}.", + "buying-more-than-selling": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cВНИМАНИЕ: Вы покупаете товары дороже, чем продаёте!", + "not-enough-space": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &cВ вашем инвентаре не хватило больше {0} мест!", + "refill-success": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aПополнение успешно", + "empty-success": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &aМагазин успешно очищен", + "admin-shop": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| Администратор", + "unknown-owner": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| Неизвестно", + "owner-bypass-check": "&x&8&4&8&8&f&bᴏ&x&f&b&9&a&f&7ᴍ &6| &eВсе проверки прошли, вы можете торговать! (Теперь вы владелец магазина!)", "reached-maximum-can-create": "&cВы уже создали максимум {0}/{1} магазинов!", "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", "restricted-prices": "&cЦена ограничена {0}: от {1} до {2}", diff --git a/crowdin/lang/tr-TR/messages.json b/crowdin/lang/tr-TR/messages.json index e50015097b..94a4770104 100644 --- a/crowdin/lang/tr-TR/messages.json +++ b/crowdin/lang/tr-TR/messages.json @@ -70,7 +70,7 @@ "unknown-owner": "Bilinmiyor", "owner-bypass-check": "&eBütün kontroller atlandı. Ticaret başarılı! (Market sahibisin!)", "reached-maximum-can-create": "&cZaten maksimum {0}/{1} market oluşturdun!", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&cHedef oyuncu {0}/{1} market sayısına ulaştı!", "restricted-prices": "&c{0} için sınırlandırılmış fiyat: Min {1}, Maks {2}", "no-enough-money-to-keep-shops": "&cMarketlerini açık tutacak kadar paran yoktu! Bütün marketlerin kaldırıldı...", "nothing-to-flush": "&aYeni market mesajınız yok.", diff --git a/crowdin/lang/uk-UA/messages.json b/crowdin/lang/uk-UA/messages.json index f931f84404..9b481f9213 100644 --- a/crowdin/lang/uk-UA/messages.json +++ b/crowdin/lang/uk-UA/messages.json @@ -35,7 +35,7 @@ "shop-stock-too-low": "&cThe shop only has {0} {1} left!", "you-cant-afford-to-buy": "&cIt costs {0}, but you only have {1}", "select-shop-type-or-cancel": "&aWhich shop type you want to use? \n {0} {1} {2}", - "select-shop-type-or-cancel-selling-button": "&d[Selling]", + "select-shop-type-or-cancel-selling-button": "&d[Продаж]", "select-shop-type-or-cancel-buying-button": "&b[Buying]", "select-shop-type-or-cancel-cancel-button": "&c[Cancel]", "not-a-valid-shop-type": "&cYou can only input Buy/Sell/Cancel, your input was {0}.", @@ -143,7 +143,7 @@ "now-buying": "&aNow &dBUYING &e{0}", "now-selling": "&aNow &bSELLING &e{0}", "cleaning": "&aRemoving shops without any stock...", - "reloading": "&aConfiguration reloaded. &eSome changes may require reboot to affect. \n&7(Notice: Reloading behavior has been changed after 4.0.9.10, we now only reload configuration but not whole plugin to ensure the server won't crashed.)", + "reloading": "&aКонфігурація перезавантажена. &eДля впливу деяких змін може знадобитися перезавантаження сервера. \n&7(Примітка: Поведінка перезавантаження була змінена після 4.0.9.10, тепер ми перезавантажуємо лише конфігурацію, але не весь плагін, щоб гарантувати, що сервер не вийде з ладу.)", "cleaned": "&aRemoved &e{0}&a shops.", "no-type-given": "&cUsage: /qs find ", "no-world-given": "&cPlease specify a world name", diff --git a/crowdin/lang/zh-CN/messages.json b/crowdin/lang/zh-CN/messages.json index 737df11d5a..055e75721a 100644 --- a/crowdin/lang/zh-CN/messages.json +++ b/crowdin/lang/zh-CN/messages.json @@ -70,7 +70,7 @@ "unknown-owner": "未知所有者", "owner-bypass-check": "&e已绕过所有检查并完成交易(因为你是商店所有者)!", "reached-maximum-can-create": "&c你创建的商店数量达到上限:{0}/{1}", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&c目标玩家已达到最大商店数量 {0}/{1} 个商店!", "restricted-prices": "&c物品 {0} 的价格限制为 {1}(包含)到{2}(包含)", "no-enough-money-to-keep-shops": "&c你没有足够的金钱去维持你商店的运营!所有商店已被移除...", "nothing-to-flush": "&a你没有新的商店消息", diff --git a/crowdin/lang/zh-TW/messages.json b/crowdin/lang/zh-TW/messages.json index 8402d2266a..c1c2edfa6c 100644 --- a/crowdin/lang/zh-TW/messages.json +++ b/crowdin/lang/zh-TW/messages.json @@ -4,7 +4,7 @@ "translation-author": "翻譯人員:Ghost_chu、Andre_601、flandretw", "translation-version": "支援版本:Reremake(重製版)", "translation-contributors": "貢獻人員:Timtower、Netherfoam、KaiNoMood、Mgazul、JackTheChicken 和 Andre_601", - "translation-country": "語言:&b&l繁體中文 Chinese Traditional(zh_TW)", + "translation-country": "語言:繁體中文 Chinese Traditional made by flandretw(zh_TW)", "language-version": "66", "not-looking-at-valid-shop-block": "&c無法找到建立商店的方塊,你需要先注視著商店方塊。", "not-looking-at-shop": "&c無法找到儲物箱商店,你需要先注視著儲物箱。", @@ -25,8 +25,8 @@ "price-too-cheap": "&c價格必須大於 &e${0}", "no-price-change": "&c這不會導致價格變動!", "you-cant-afford-a-new-shop": "&c需要花費 {0} 才能建立商店。", - "player-bought-from-your-store-tax": "&c{0} &r&c從你的商店購買了 {1} 個 {2},你總共賺了 {3} ({4} 的稅) 。", - "you-cant-afford-to-change-price": "&c你需要花費 {0} 來修改商品價格。", + "player-bought-from-your-store-tax": "&c{0} &r&c從你的商店購買了 {1} 個 {2},總共讓你進賺了 {3} ({4} 的稅)。", + "you-cant-afford-to-change-price": "&c你需要花費 {0} 來變更商品價格。", "success-created-shop": "&c已建立商店。", "success-removed-shop": "&a已移除商店。", "shops-arent-locked": "&c請注意,商店無法防盜!如果你想要防盜功能,請使用 LWC、Lockette 等插件鎖住商店。", @@ -43,14 +43,14 @@ "not-a-number": "&c輸入內容只能是數字,但你輸入了 {0}。", "exceeded-maximum": "&c該值超出了 Java 中的最大值。 ", "not-a-integer": "&c輸入一定是數字,但你輸入了 {0}。", - "player-bought-from-your-store": "&c{0} &r&c從你的商店購買了 {1} {2},你總共賺了 {3}。", + "player-bought-from-your-store": "&8[&6系統&8] &e» &7{0} &r&f從您的商店購買了 &a{1}個{2} 總共讓您賺了 {3}", "shop-out-of-stock": "&5你在 {0}, {1}, {2} 出售 {3} 的商店已售罄一空!", "shop-has-no-space": "&c該商店只能再裝下 {0} 個 {1} 了。", "you-dont-have-that-many-items": "&c你的身上只有 {0} 個 {1}!", "the-owner-cant-afford-to-buy-from-you": "&c該商品價格 {0},但店主只剩 {1} 了。", "player-sold-to-your-store": "&a{0} 在你的商店賣出了 {1} 個 {2}。", - "shop-out-of-space": "&5你在 XYZ:{0} / {1} / {2} 的商店已滿了。", - "fee-charged-for-price-change": "&a你花費了 &c{0}&a 修改商店定價。", + "shop-out-of-space": "&5你在 XYZ:{0}/{1}/{2} 的商店已滿了。", + "fee-charged-for-price-change": "&a你花費了 &c{0}&a 變更商品價格。", "price-is-now": "&a現在你的商店定價是 &e{0}。", "thats-not-a-number": "&c無效的數字", "forbidden-vanilla-behavior": "&c該操作不符合原版行為,因此被禁止。", @@ -60,7 +60,7 @@ "shop-not-exist": "&c商店不存在。", "nearby-shop-this-way": "&a商店距離你 {0} 個方塊。", "nearby-shop-header": "&a附近匹配商店 &b{0}&a:", - "nearby-shop-entry": "&a-資訊:{0} &a價格:&b{1} &aXYZ:&b{2} / {3} / {4} &a距離:&b{5} &a個方塊", + "nearby-shop-entry": "&a-資訊:{0} &a價格:&b{1} &aXYZ:&b{2}/{3}/{4} &a距離:&b{5} &a個方塊", "no-nearby-shop": "&c找不到符合 {0} 的商店。", "buying-more-than-selling": "&c警告:你收購的物品價格比出售的物品價格高!", "not-enough-space": "&c你只剩下 {0} 格空間可以裝東西!", @@ -70,7 +70,7 @@ "unknown-owner": "未知", "owner-bypass-check": "&e繞過所有檢查並交易成功!(因為你是商店擁有者!)", "reached-maximum-can-create": "&c你建立的商店數量已達到上限(你已建立 {0} 個,最多 {1} 個!)", - "reached-maximum-other-can-hold": "&cTarget player has reached the maximum of {0}/{1} shops!", + "reached-maximum-other-can-hold": "&c目標玩家已達到最大商店數量 {0}/{1} 個商店!", "restricted-prices": "&c{0} 是無效的價格:最高 {1},最低 {2}。", "no-enough-money-to-keep-shops": "&c你沒有足夠的金錢維持你的商店經營!所以你所有的商店已被移除……", "nothing-to-flush": "&a沒有關於商店的新訊息。", @@ -123,7 +123,7 @@ "how-many-sell": "&a在聊天室中輸入你想要「&d出售&a」的數量,你最多可以出售 &e{0} &a個。輸入「&b{1}&a」出售全部。", "not-allowed-to-create": "&c你無法在此建立商店。", "blacklisted-item": "&c由於這是黑名單的物品,所以你不能賣", - "how-much-to-trade-for": "&a請在聊天室中輸入你想買賣 &e{1} 個 {0} &a的價格。", + "how-much-to-trade-for": "&8[&6系統&8] &e» &f請在聊天室中輸入您想買賣 &a{1}個{0} &f的價格。", "command": { "format": "&a/{0} {1} &e- {2}", "format-disabled": "&c/{0} {1} &7- {2}", @@ -135,7 +135,7 @@ "counting": "&a現在商店會持續計數容器物品(即使是無限商店)", "not-counting": "&a現在商店會視情況計數容器物品(無限商店無視容器物品)" }, - "transfer-success": "&a轉讓 &e{0} &a 正在出售中的商店給 &e{1}", + "transfer-success": "&a將 &e{0} &a正在出售中的商店轉移到 &e{1}", "transfer-success-other": "&a將&e {0} {1}&a的商店轉移到&e {2}", "some-shops-removed": "&e{0} &a的商店已移除", "no-owner-given": "&c未指定新的擁有者", @@ -150,7 +150,7 @@ "bulk-size-not-set": "&c用法:/qs size <數量>", "bulk-size-now": "&a現在開始交易 &e{0} 個 {1}", "invalid-bulk-amount": "&c指定的值 {0} 大於最大堆疊或小於 1", - "no-trade-item": "&a請在主手持有要修改的交易商品", + "no-trade-item": "&a請在主手持有要變更的交易商品", "trade-item-now": "&a現在開始交易 &e{0} 個 {1}", "no-amount-given": "&c沒有指定數量,請使用:&a/qs refill <數量>&c", "now-debuging": "&a成功地啟用開發者模式,正在重新載入 QuickShop……", @@ -160,11 +160,11 @@ "alwayscounting": "&e設定商店是否會持續計數容器物品(即使是無限商店)", "title": "&aQuickShop 說明", "unlimited": "&e設定商店為無限庫存", - "setowner": "&e修改新的商店擁有者。", - "owner": "&e修改新的商店擁有者。", - "buy": "&e修改成 &d收購 &e模式", - "sell": "&e修改成 &d出售 &e模式", - "price": "&e修改 收購/出售 的價格", + "setowner": "&e變更新的商店擁有者。", + "owner": "&e變更新的商店擁有者。", + "buy": "&e變更為 &d收購 &e模式", + "sell": "&e變更為 &d出售 &e模式", + "price": "&e變更 收購/出售 的商品價格", "clean": "&e移除所有(已載入)沒有商品的商店", "find": "&e搜尋附近指定物品類型的商店。", "reload": "&e重新載入 QuickShop", @@ -180,10 +180,10 @@ "amount": "&e設定物品數量(聊天室發生問題時很實用)", "about": "&e顯示關於 QuickShop 資訊", "help": "&e顯示 QuickShop 說明", - "item": "&e修改商店物品", - "size": "&e修改每份物品的數量", + "item": "&e變更商店物品", + "size": "&e變更商店每份物品的數量", "supercreate": "&e繞過所有保護檢查並建立商店", - "language": "&e修改正在使用的語言", + "language": "&e變更正在使用的語言", "removeall": "&e移除指定玩家的所有商店", "transfer": "&e將某人所有出售中的商店轉讓給其他人", "removeworld": "&e移除指定世界的商店", @@ -217,29 +217,29 @@ "freeze": "已停用交易" }, "controlpanel": { - "alwayscounting": "&a持續計數:{0} &e[&d&l修改&e]", - "alwayscounting-hover": "&e點擊修改是否使商店持續計數容器物品。", - "setowner": "&a擁有者:&b{0} &e[&d&l修改&e]", + "alwayscounting": "&a持續計數:{0} &e[&d&l變更&e]", + "alwayscounting-hover": "&e點擊變更是否使商店持續計數容器物品。", + "setowner": "&a擁有者:&b{0} &e[&d&l變更&e]", "infomation": "&a商店控制面板:", - "setowner-hover": "&e點擊修改擁有者。", - "unlimited": "&a無限:{0} &e[&d&l修改&e]", - "unlimited-hover": "&e點擊修改商店模式為無限。", - "mode-selling": "&a商店模式:&b出售 &e[&d&l修改&e]", - "mode-selling-hover": "&e點擊修改商店為收購模式。", - "mode-buying": "&a商店模式:&b收購 &e[&d&l修改&e]", - "mode-buying-hover": "&e點擊修改商店為出售模式。", - "price": "&a價格:&b{0} &e[&d&l修改&e]", - "price-hover": "&e點擊修改商品價格。", + "setowner-hover": "&e點擊變更擁有者。", + "unlimited": "&a無限:{0} &e[&d&l變更&e]", + "unlimited-hover": "&e點擊變更商店模式為無限。", + "mode-selling": "&a商店模式:&b出售 &e[&d&l變更&e]", + "mode-selling-hover": "&e點擊變更商店為收購模式。", + "mode-buying": "&a商店模式:&b收購 &e[&d&l變更&e]", + "mode-buying-hover": "&e點擊變更商店為出售模式。", + "price": "&a價格:&b{0} &e[&d&l變更&e]", + "price-hover": "&e點擊變更商品價格。", "refill": "&a補貨:重新填充商品 &e[&d&l確定&e]", "refill-hover": "&e點擊重新填充商品。", "empty": "&a清空:移除所有商品 &e[&d&l確定&e]", "empty-hover": "&e點擊清除商店內庫存。", "remove": "&c&l[移除商店]", "remove-hover": "&e點擊移除該商店。", - "stack": "&a每份數量:&b{0} &e[&d&l修改&e]", + "stack": "&a每份數量:&b{0} &e[&d&l變更&e]", "stack-hover": "&e點擊設定每份的物品數量。設定為 1 以恢復為普通單物品商店。", - "item": "&a商店物品:{0} &e[&d&l修改&e]", - "item-hover": "&e點擊修改商店物品", + "item": "&a商店物品:{0} &e[&d&l變更&e]", + "item-hover": "&e點擊變更商店物品", "currency": "&a目前:&b{0} &e[&d&l設定&e]", "currency-hover": "&e點擊設定或移除目前正在使用的商店貨幣", "lock": "&e商店鎖:&b{0} &e[&d&l切換&e]", @@ -248,7 +248,7 @@ "freeze-hover": "&e切換商店凍結狀態。", "toggledisplay": "&e懸浮物顯示:&b{0} &e[&d&l切換&e]", "toggledisplay-hover": "&e切換商店是否顯示懸浮物", - "staff": "&a員工數量:&b{0}&e [&d&l修改&e]" + "staff": "&a員工數量:&b{0}&e [&d&l變更&e]" }, "tableformat": { "full_line": "+---------------------------------------------------+", @@ -277,7 +277,7 @@ "看來你需要更新,QuickShop {0} 已正式發布了!", "噢!QuickShop {0} 已正式發布了,但你還在使用 QuickShop {1}!", "我保證,QS 已更新到了 {0},但你怎麼還沒有更新?", - "修復並重…… 抱歉,QuickShop {0} 已正式發布了!", + "修復並重……抱歉,QuickShop {0} 已正式發布了!", "錯誤!不,其實並沒有錯誤,QuickShop {0} 已正式發布!", "我的天啊!QuickShop {0} 已出來了!你怎麼還在使用 QuickShop {1}?", "今日新聞:QuickShop 已正式發布 {0} 的更新!", diff --git a/pom.xml b/pom.xml index cae431e574..83ba369272 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ QuickShop - 5.1.2.2 + 5.1.2.3 org.maxgamer.quickshop Ghost-chu UTF-8 @@ -484,7 +484,7 @@ com.comphenix.protocol ProtocolLib - 5.0.0 + 5.1.0 provided @@ -577,7 +577,7 @@ com.github.angeschossen LandsAPI - 6.29.12 + 6.35.0 provided @@ -590,7 +590,7 @@ org.junit.jupiter junit-jupiter-api - 5.9.2 + 5.10.0 test @@ -652,7 +652,7 @@ com.sk89q.worldguard worldguard-bukkit - 7.0.8 + 7.0.9 provided @@ -854,7 +854,7 @@ com.github.alex9849 advanced-region-market - 3.5.0 + 3.5.4 provided diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 1b325c3cd6..8751d078d2 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -214,8 +214,11 @@ public class QuickShop extends JavaPlugin implements QuickShopAPI { private DatabaseManager databaseManager; /** * Default database prefix, can overwrite by config + *

+ * Deprecated: use manager#getDatabase#getTableprefix instead */ @Getter + @Deprecated private String dbPrefix = ""; /** * Whether we should use display items or not @@ -1190,10 +1193,12 @@ private boolean setupDatabase() { AbstractDatabaseCore dbCore; if (Objects.requireNonNull(dbCfg).getBoolean("mysql")) { // MySQL database - Required database be created first. - dbPrefix = dbCfg.getString("prefix"); - if (dbPrefix == null || "none".equals(dbPrefix)) { - dbPrefix = ""; + String prefix = dbCfg.getString("prefix"); + if (prefix == null || "none".equals(prefix)) { + prefix = ""; } + //just keep backward compatible + dbPrefix = prefix; String user = dbCfg.getString("user"); String pass = dbCfg.getString("password"); String host = dbCfg.getString("host"); @@ -1207,7 +1212,7 @@ private boolean setupDatabase() { optionsMap.put(strings[0], strings[1]); } } - dbCore = new MySQLCore(this, Objects.requireNonNull(host, "MySQL host can't be null"), Objects.requireNonNull(user, "MySQL username can't be null"), Objects.requireNonNull(pass, "MySQL password can't be null"), Objects.requireNonNull(database, "MySQL database name can't be null"), Objects.requireNonNull(port, "MySQL port can't be null"), useSSL, optionsMap); + dbCore = new MySQLCore(this, Objects.requireNonNull(host, "MySQL host can't be null"), Objects.requireNonNull(user, "MySQL username can't be null"), Objects.requireNonNull(pass, "MySQL password can't be null"), Objects.requireNonNull(database, "MySQL database name can't be null"), Objects.requireNonNull(port, "MySQL port can't be null"), prefix, useSSL, optionsMap); } else { // SQLite database - Doing this handles file creation dbCore = new SQLiteCore(this, new File(this.getDataFolder(), "shops.db")); diff --git a/src/main/java/org/maxgamer/quickshop/chat/platform/minedown/BungeeQuickChat.java b/src/main/java/org/maxgamer/quickshop/chat/platform/minedown/BungeeQuickChat.java index 5912c98fcd..683af7bdca 100644 --- a/src/main/java/org/maxgamer/quickshop/chat/platform/minedown/BungeeQuickChat.java +++ b/src/main/java/org/maxgamer/quickshop/chat/platform/minedown/BungeeQuickChat.java @@ -61,28 +61,12 @@ @AllArgsConstructor public class BungeeQuickChat implements QuickChat { private final QuickShop plugin; + private final String[] indexStrCache = {"{0}", "{1}", "{2}", "{3}", "{4}", "{5}", "{6}", "{7}", "{8}", "{9}"}; public static BaseComponent[] fromLegacyText(String text) { return TextComponent.fromLegacyText(text, net.md_5.bungee.api.ChatColor.RESET); } - @Override - public void send(@NotNull CommandSender receiver, @Nullable QuickComponent component) { - if (component == null) { - return; - } - if (component.get() instanceof BaseComponent[]) { - receiver.spigot().sendMessage((BaseComponent[]) component.get()); - return; - } - if (component.get() instanceof BaseComponent) { - receiver.spigot().sendMessage((BaseComponent) component.get()); - return; - } - Util.debugLog("Illegal component " + component.get().getClass().getName() + " sending to " + this.getClass().getName() + " processor, trying force sending."); - - } - public static String toLegacyText(BaseComponent[] components) { StringBuilder builder = new StringBuilder(); BaseComponent lastComponent = null; @@ -108,6 +92,23 @@ public static String toLegacyText(BaseComponent[] components) { return builder.toString(); } + @Override + public void send(@NotNull CommandSender receiver, @Nullable QuickComponent component) { + if (component == null) { + return; + } + if (component.get() instanceof BaseComponent[]) { + receiver.spigot().sendMessage((BaseComponent[]) component.get()); + return; + } + if (component.get() instanceof BaseComponent) { + receiver.spigot().sendMessage((BaseComponent) component.get()); + return; + } + Util.debugLog("Illegal component " + component.get().getClass().getName() + " sending to " + this.getClass().getName() + " processor, trying force sending."); + + } + @Override public void send(@NotNull CommandSender receiver, @Nullable String message) { if (StringUtils.isEmpty(message)) { @@ -121,7 +122,6 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ sendItemHologramChat(player, text, itemStack, false); } - private BungeeComponentBuilder appendItemHoloChat(@Nullable String itemJson, @NotNull String message) { BungeeComponentBuilder builder = new BungeeComponentBuilder(); TextSplitter.SpilledString spilledString = TextSplitter.deBakeItem(message); @@ -177,7 +177,8 @@ private void sendItemHologramChat(@NotNull Player player, @NotNull String text, } else { player.spigot().sendMessage(result); } - } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException | InstantiationException e) { + } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException | + InstantiationException e) { plugin.getLogger().log(Level.WARNING, "Failed to process chat component", e); player.spigot().sendMessage(errorComponent); } @@ -226,8 +227,103 @@ private void sendItemHologramChat(@NotNull Player player, @NotNull String text, } } + @Override + public @NotNull QuickComponent getItemTextComponent(@NotNull Player player, @NotNull ItemStack itemStack, @NotNull String normalText) { + TextComponent errorComponent = new TextComponent(plugin.text().of(player, "menu.item-holochat-error").forLocale()); + + String json; + try { + json = ReflectFactory.convertBukkitItemStackToJson(itemStack); + } catch (Exception throwable) { + plugin.getLogger().log(Level.SEVERE, "Failed to saving item to json for holochat", throwable); + return new QuickComponentImpl(errorComponent); + } + if (json == null) { + return new QuickComponentImpl(errorComponent); + } + + TextComponent component = new TextComponent(normalText + " " + plugin.text().of(player, "menu.preview").forLocale()); + ComponentBuilder cBuilder = new ComponentBuilder(json); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, cBuilder.create())); + return new QuickComponentImpl(component); + + } + + public String getIndexStr(int index) { + return index <= 9 ? indexStrCache[index] : "{" + index + "}"; + } + + @Override + public void sendExecutableChat(@NotNull CommandSender receiver, @NotNull String message, Map.Entry... textToCommandMapping) { + List components = new ArrayList<>(Arrays.asList(fromLegacyText(message))); + Iterator> iterator = Arrays.asList(textToCommandMapping).iterator(); + + int index = 0; + replace: + while (iterator.hasNext()) { + Map.Entry replacement = iterator.next(); + for (int i = 0; i < components.size(); i++) { + BaseComponent component = components.get(i); + if (component instanceof TextComponent) { + String text = ((TextComponent) component).getText(); + if (text.contains(getIndexStr(index))) { + String[] strings = text.split(getIndexStr(index).replace("{", "\\{").replace("}", "\\}"), 2); + TextComponent component1 = new TextComponent(strings[0]); + TextComponent component2 = new TextComponent(strings[1]); + component1.copyFormatting(component); + component2.copyFormatting(component); + BaseComponent[] replacementComponents = fromLegacyText(replacement.getKey()); + ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, replacement.getValue()); + HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, fromLegacyText(replacement.getKey())); + for (BaseComponent baseComponent : replacementComponents) { + baseComponent.setClickEvent(clickEvent); + baseComponent.setHoverEvent(hoverEvent); + component1.addExtra(baseComponent); + } + components.remove(i); + components.add(i, component2); + components.add(i, component1); + index++; + continue replace; + } + } + } + } + receiver.spigot().sendMessage(components.toArray(new BaseComponent[0])); + } + + @Override + public void sendExecutableChat(@NotNull CommandSender receiver, @NotNull String message, @NotNull String hoverText, @NotNull String command) { + BaseComponent[] components = + fromLegacyText(ChatColor.DARK_PURPLE + plugin.text().of(receiver, "tableformat.left_begin").forLocale() + message); + ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, command); + //FIXME: Update this when drop 1.15 supports + HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, fromLegacyText(hoverText)); + for (BaseComponent component : components) { + component.setClickEvent(clickEvent); + component.setHoverEvent( + hoverEvent); //FIXME: Update this when drop 1.15 supports + } + receiver.spigot().sendMessage(components); + } + + @Override + public void sendSuggestedChat(@NotNull CommandSender receiver, @NotNull String message, @NotNull String hoverText, @NotNull String command) { + BaseComponent[] components = + fromLegacyText(ChatColor.DARK_PURPLE + plugin.text().of(receiver, "tableformat.left_begin").forLocale() + message); + ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command); + //FIXME: Update this when drop 1.15 supports + HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, fromLegacyText(hoverText)); + for (BaseComponent component : components) { + component.setClickEvent(clickEvent); + component.setHoverEvent(hoverEvent); + } + receiver.spigot().sendMessage(components); + } public static class BungeeComponentBuilder { + private static final boolean isUsingResetCommitVersion = Util + .isMethodAvailable(BaseComponent.class, "isReset"); private final ComponentBuilder builder; public BungeeComponentBuilder() { @@ -237,9 +333,9 @@ public BungeeComponentBuilder() { public BungeeComponentBuilder append(BaseComponent component) { if (builder.getCursor() == -1) { - builder.append(component, ComponentBuilder.FormatRetention.EVENTS); + append(component, ComponentBuilder.FormatRetention.EVENTS); } else { - builder.append(component); + append(component); } return this; } @@ -254,9 +350,9 @@ public BungeeComponentBuilder append(BaseComponent[] components) { public BungeeComponentBuilder append(String text) { if (builder.getCursor() == -1) { - builder.append(text, ComponentBuilder.FormatRetention.EVENTS); + append(text, ComponentBuilder.FormatRetention.EVENTS); } else { - builder.append(text); + append(text, ComponentBuilder.FormatRetention.ALL); } return this; } @@ -269,7 +365,7 @@ public BungeeComponentBuilder appendLegacy(String... text) { for (int i = 1; i < text.length; i++) { stringBuilder.append(text[i]); } - builder.append(fromLegacyText(stringBuilder.toString()), ComponentBuilder.FormatRetention.EVENTS); + append(fromLegacyText(stringBuilder.toString()), ComponentBuilder.FormatRetention.EVENTS); return this; } @@ -289,17 +385,18 @@ public BungeeComponentBuilder appendLegacyAndItem(String left, BaseComponent[] i for (BaseComponent baseComponent : itemsComponent) { leftComponent.addExtra(baseComponent); } - builder.append(leftComponent, ComponentBuilder.FormatRetention.EVENTS); - builder.append(rightComponent, ComponentBuilder.FormatRetention.EVENTS); + append(leftComponent, ComponentBuilder.FormatRetention.EVENTS); + append(rightComponent, ComponentBuilder.FormatRetention.EVENTS); } else { - builder.append(component, ComponentBuilder.FormatRetention.EVENTS); + append(component, ComponentBuilder.FormatRetention.EVENTS); } } return this; } + public BungeeComponentBuilder appendLegacy(String text) { - builder.append(fromLegacyText(text), ComponentBuilder.FormatRetention.EVENTS); + append(fromLegacyText(text), ComponentBuilder.FormatRetention.EVENTS); return this; } @@ -325,101 +422,44 @@ public BaseComponent[] create() { public ComponentBuilder color(net.md_5.bungee.api.ChatColor color) { return builder.color(color); } - } - - @Override - public @NotNull QuickComponent getItemTextComponent(@NotNull Player player, @NotNull ItemStack itemStack, @NotNull String normalText) { - TextComponent errorComponent = new TextComponent(plugin.text().of(player, "menu.item-holochat-error").forLocale()); - - String json; - try { - json = ReflectFactory.convertBukkitItemStackToJson(itemStack); - } catch (Exception throwable) { - plugin.getLogger().log(Level.SEVERE, "Failed to saving item to json for holochat", throwable); - return new QuickComponentImpl(errorComponent); - } - if (json == null) { - return new QuickComponentImpl(errorComponent); - } - - TextComponent component = new TextComponent(normalText + " " + plugin.text().of(player, "menu.preview").forLocale()); - ComponentBuilder cBuilder = new ComponentBuilder(json); - component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, cBuilder.create())); - return new QuickComponentImpl(component); - - } - private final String[] indexStrCache = {"{0}", "{1}", "{2}", "{3}", "{4}", "{5}", "{6}", "{7}", "{8}", "{9}"}; - - public String getIndexStr(int index) { - return index <= 9 ? indexStrCache[index] : "{" + index + "}"; - } + /** + * The dump method for fixing append always care about reset + */ + //dump start + private ComponentBuilder append(BaseComponent component, ComponentBuilder.FormatRetention retention) { + if (!isUsingResetCommitVersion) { + builder.append(component, retention); + return builder; + } - @Override - public void sendExecutableChat(@NotNull CommandSender receiver, @NotNull String message, Map.Entry... textToCommandMapping) { - List components = new ArrayList<>(Arrays.asList(fromLegacyText(message))); - Iterator> iterator = Arrays.asList(textToCommandMapping).iterator(); + List parts = builder.getParts(); + BaseComponent previous = (parts.isEmpty()) ? null : parts.get(parts.size() - 1); - int index = 0; - replace: - while (iterator.hasNext()) { - Map.Entry replacement = iterator.next(); - for (int i = 0; i < components.size(); i++) { - BaseComponent component = components.get(i); - if (component instanceof TextComponent) { - String text = ((TextComponent) component).getText(); - if (text.contains(getIndexStr(index))) { - String[] strings = text.split(getIndexStr(index).replace("{", "\\{").replace("}", "\\}"), 2); - TextComponent component1 = new TextComponent(strings[0]); - TextComponent component2 = new TextComponent(strings[1]); - component1.copyFormatting(component); - component2.copyFormatting(component); - BaseComponent[] replacementComponents = fromLegacyText(replacement.getKey()); - ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, replacement.getValue()); - HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, fromLegacyText(replacement.getKey())); - for (BaseComponent baseComponent : replacementComponents) { - baseComponent.setClickEvent(clickEvent); - baseComponent.setHoverEvent(hoverEvent); - component1.addExtra(baseComponent); - } - components.remove(i); - components.add(i, component2); - components.add(i, component1); - index++; - continue replace; - } - } + if (component.isReset() && retention == ComponentBuilder.FormatRetention.ALL) { + retention = ComponentBuilder.FormatRetention.EVENTS; } + if (previous != null && (!component.isReset() || retention == ComponentBuilder.FormatRetention.EVENTS)) { + component.copyFormatting(previous, retention, false); + parts.add(component); + builder.resetCursor(); + } else { + //follow the original logic + builder.append(component, retention); + } + return builder; } - receiver.spigot().sendMessage(components.toArray(new BaseComponent[0])); - } - @Override - public void sendExecutableChat(@NotNull CommandSender receiver, @NotNull String message, @NotNull String hoverText, @NotNull String command) { - BaseComponent[] components = - fromLegacyText(ChatColor.DARK_PURPLE + plugin.text().of(receiver, "tableformat.left_begin").forLocale() + message); - ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, command); - //FIXME: Update this when drop 1.15 supports - HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, fromLegacyText(hoverText)); - for (BaseComponent component : components) { - component.setClickEvent(clickEvent); - component.setHoverEvent( - hoverEvent); //FIXME: Update this when drop 1.15 supports + private ComponentBuilder append(String text, ComponentBuilder.FormatRetention retention) { + return append(new TextComponent(text), retention); } - receiver.spigot().sendMessage(components); - } - @Override - public void sendSuggestedChat(@NotNull CommandSender receiver, @NotNull String message, @NotNull String hoverText, @NotNull String command) { - BaseComponent[] components = - fromLegacyText(ChatColor.DARK_PURPLE + plugin.text().of(receiver, "tableformat.left_begin").forLocale() + message); - ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, command); - //FIXME: Update this when drop 1.15 supports - HoverEvent hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, fromLegacyText(hoverText)); - for (BaseComponent component : components) { - component.setClickEvent(clickEvent); - component.setHoverEvent(hoverEvent); + private ComponentBuilder append(BaseComponent[] components, ComponentBuilder.FormatRetention retention) { + for (BaseComponent component : components) { + append(component, retention); + } + return builder; } - receiver.spigot().sendMessage(components); + //dump end } } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Convert.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Convert.java index d72210be98..a723256dc1 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Convert.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Convert.java @@ -86,6 +86,10 @@ public void onCommand(@NotNull ConsoleCommandSender sender, @NotNull String comm String port = dbCfg.getString("port"); String databaseStr = dbCfg.getString("database"); boolean useSSL = dbCfg.getBoolean("usessl"); + String prefix = dbCfg.getString("prefix"); + if (prefix == null || "none".equals(prefix)) { + prefix = ""; + } Map optionsMap = new HashMap<>(); for (String options : dbCfg.getStringList("mysql-connect-options")) { String[] strings = options.split("=", 2); @@ -94,9 +98,10 @@ public void onCommand(@NotNull ConsoleCommandSender sender, @NotNull String comm } } running = true; + final String finalPrefix = prefix; plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> { try { - AbstractDatabaseCore dbCore = new MySQLCore(plugin, Objects.requireNonNull(host, "MySQL host can't be null"), Objects.requireNonNull(user, "MySQL username can't be null"), Objects.requireNonNull(pass, "MySQL password can't be null"), Objects.requireNonNull(databaseStr, "MySQL database name can't be null"), Objects.requireNonNull(port, "MySQL port can't be null"), useSSL, optionsMap); + AbstractDatabaseCore dbCore = new MySQLCore(plugin, Objects.requireNonNull(host, "MySQL host can't be null"), Objects.requireNonNull(user, "MySQL username can't be null"), Objects.requireNonNull(pass, "MySQL password can't be null"), Objects.requireNonNull(databaseStr, "MySQL database name can't be null"), Objects.requireNonNull(port, "MySQL port can't be null"), finalPrefix, useSSL, optionsMap); DatabaseManager databaseManager = new DatabaseManager(QuickShop.getInstance(), dbCore); sender.sendMessage(ChatColor.GREEN + "Converting..."); transferShops(new SimpleDatabaseHelper(plugin, databaseManager), sender); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Transfer.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Transfer.java index 00fdc73c07..1b4663b420 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Transfer.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Transfer.java @@ -133,7 +133,7 @@ private boolean checkAndSendLimitMessage(Player checkingPlayer, CommandSender co } int max = plugin.getShopLimit(checkingPlayer); if (owned + increment <= max) { - plugin.text().of(commandSender, "reached-maximum-other-can-hold", String.valueOf(owned), String.valueOf(max)).send(); + plugin.text().of(commandSender, "reached-maximum-other-can-hold", String.valueOf(owned + increment), String.valueOf(max)).send(); return false; } } diff --git a/src/main/java/org/maxgamer/quickshop/database/AbstractDatabaseCore.java b/src/main/java/org/maxgamer/quickshop/database/AbstractDatabaseCore.java index 4d6230b460..c0e2bdec82 100644 --- a/src/main/java/org/maxgamer/quickshop/database/AbstractDatabaseCore.java +++ b/src/main/java/org/maxgamer/quickshop/database/AbstractDatabaseCore.java @@ -57,6 +57,10 @@ void signalForNewConnection() { } + public String getTablePrefix() { + return ""; + } + /** * Close all not in-use connections created by DatabaseCore. */ diff --git a/src/main/java/org/maxgamer/quickshop/database/MySQLCore.java b/src/main/java/org/maxgamer/quickshop/database/MySQLCore.java index 84bd7b3b2e..f732c4de14 100644 --- a/src/main/java/org/maxgamer/quickshop/database/MySQLCore.java +++ b/src/main/java/org/maxgamer/quickshop/database/MySQLCore.java @@ -46,6 +46,9 @@ public class MySQLCore extends AbstractDatabaseCore { @NotNull private final QuickShop plugin; + + private final String tablePrefix; + public MySQLCore( @NotNull QuickShop plugin, @NotNull String host, @@ -53,8 +56,10 @@ public MySQLCore( @NotNull String pass, @NotNull String database, @NotNull String port, + @NotNull String tablePrefix, boolean useSSL, Map options) { this.plugin = plugin; + this.tablePrefix = tablePrefix; info = new Properties(); info.setProperty("autoReconnect", "true"); info.setProperty("user", user); @@ -76,6 +81,10 @@ public MySQLCore( } } + @Override + public String getTablePrefix() { + return tablePrefix; + } @Override synchronized void close() { diff --git a/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java b/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java index 647d77e7d5..fe97a06b4e 100644 --- a/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java +++ b/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java @@ -61,16 +61,16 @@ public SimpleDatabaseHelper(@NotNull QuickShop plugin, @NotNull DatabaseManager } private void init() throws SQLException { - if (!manager.hasTable(plugin.getDbPrefix() + "shops")) { + if (!manager.hasTable(manager.getDatabase().getTablePrefix() + "shops")) { createShopsTable(); } - if (!manager.hasTable(plugin.getDbPrefix() + "messages")) { + if (!manager.hasTable(manager.getDatabase().getTablePrefix() + "messages")) { createMessagesTable(); } - if (!manager.hasTable(plugin.getDbPrefix() + "logs")) { + if (!manager.hasTable(manager.getDatabase().getTablePrefix() + "logs")) { createLogsTable(); } - if (!manager.hasTable(plugin.getDbPrefix() + "external_cache")) { + if (!manager.hasTable(manager.getDatabase().getTablePrefix() + "external_cache")) { createExternalCacheTable(); } checkColumns(); @@ -81,9 +81,9 @@ private void init() throws SQLException { */ private void createShopsTable() { - String sqlString = "CREATE TABLE " + plugin.getDbPrefix() + "shops (owner VARCHAR(255) NOT NULL, price double(32, 2) NOT NULL, itemConfig TEXT CHARSET utf8 NOT NULL, x INTEGER(32) NOT NULL, y INTEGER(32) NOT NULL, z INTEGER(32) NOT NULL, world VARCHAR(32) NOT NULL, unlimited boolean, type boolean, PRIMARY KEY (x, y, z, world) );"; + String sqlString = "CREATE TABLE " + manager.getDatabase().getTablePrefix() + "shops (owner VARCHAR(255) NOT NULL, price double(32, 2) NOT NULL, itemConfig TEXT CHARSET utf8 NOT NULL, x INTEGER(32) NOT NULL, y INTEGER(32) NOT NULL, z INTEGER(32) NOT NULL, world VARCHAR(32) NOT NULL, unlimited boolean, type boolean, PRIMARY KEY (x, y, z, world) );"; if (manager.getDatabase() instanceof MySQLCore) { - sqlString = "CREATE TABLE " + plugin.getDbPrefix() + "shops (owner VARCHAR(255) NOT NULL, price double(32, 2) NOT NULL, itemConfig TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, x INTEGER(32) NOT NULL, y INTEGER(32) NOT NULL, z INTEGER(32) NOT NULL, world VARCHAR(32) NOT NULL, unlimited boolean, type boolean, PRIMARY KEY (x, y, z, world) );"; + sqlString = "CREATE TABLE " + manager.getDatabase().getTablePrefix() + "shops (owner VARCHAR(255) NOT NULL, price double(32, 2) NOT NULL, itemConfig TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, x INTEGER(32) NOT NULL, y INTEGER(32) NOT NULL, z INTEGER(32) NOT NULL, world VARCHAR(32) NOT NULL, unlimited boolean, type boolean, PRIMARY KEY (x, y, z, world) );"; } manager.runInstantTask(new DatabaseTask(sqlString)); } @@ -92,17 +92,17 @@ private void createShopsTable() { * Creates the database table 'messages' */ private void createMessagesTable() { - String createTable = "CREATE TABLE " + plugin.getDbPrefix() + String createTable = "CREATE TABLE " + manager.getDatabase().getTablePrefix() + "messages (owner VARCHAR(255) NOT NULL, message TEXT(25) NOT NULL, time BIGINT(32) NOT NULL );"; if (manager.getDatabase() instanceof MySQLCore) { - createTable = "CREATE TABLE " + plugin.getDbPrefix() + createTable = "CREATE TABLE " + manager.getDatabase().getTablePrefix() + "messages (owner VARCHAR(255) NOT NULL, message TEXT(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL , time BIGINT(32) NOT NULL );"; } manager.runInstantTask(new DatabaseTask(createTable)); } private void createLogsTable() { - String createTable = "CREATE TABLE " + plugin.getDbPrefix() + String createTable = "CREATE TABLE " + manager.getDatabase().getTablePrefix() + "logs (time BIGINT(32) NOT NULL);"; manager.runInstantTask(new DatabaseTask(createTable)); createColumn("logs", "classname", new DataType(DataTypeMapping.TEXT, null, "")); @@ -110,7 +110,7 @@ private void createLogsTable() { } private void createExternalCacheTable() { - String createTable = "CREATE TABLE " + plugin.getDbPrefix() + String createTable = "CREATE TABLE " + manager.getDatabase().getTablePrefix() + "external_cache (x INTEGER(32) NOT NULL, y INTEGER(32) NOT NULL, z INTEGER(32) NOT NULL, world VARCHAR(32) NOT NULL, PRIMARY KEY (x, y, z, world));"; manager.runInstantTask(new DatabaseTask(createTable)); createColumn("external_cache", "space", new DataType(DataTypeMapping.INT, null)); @@ -135,11 +135,9 @@ public void onFailed(SQLException e) { } }; // V3.4.2 - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "shops MODIFY COLUMN price double(32,2) NOT NULL AFTER owner", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "shops MODIFY COLUMN price double(32,2) NOT NULL AFTER owner", checkTask)); // V3.4.3 - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "messages MODIFY COLUMN time BIGINT(32) NOT NULL AFTER message", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "messages MODIFY COLUMN time BIGINT(32) NOT NULL AFTER message", checkTask)); //Extra column createColumn("shops", "extra", new DataType(DataTypeMapping.LONGTEXT, null, "")); createColumn("shops", "currency", new DataType(DataTypeMapping.TEXT)); @@ -148,16 +146,11 @@ public void onFailed(SQLException e) { if (manager.getDatabase() instanceof MySQLCore) { - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "messages MODIFY COLUMN message text CHARACTER SET utf8mb4 NOT NULL AFTER owner", checkTask)); - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "shops MODIFY COLUMN itemConfig text CHARACTER SET utf8mb4 NOT NULL AFTER price", checkTask)); - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "shops TO CHARACTER SET uft8mb4 COLLATE utf8mb4_general_ci", checkTask)); - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "messages TO CHARACTER SET uft8mb4 COLLATE utf8mb4_general_ci", checkTask)); - manager.runInstantTask(new DatabaseTask("ALTER TABLE " + plugin - .getDbPrefix() + "history TO CHARACTER SET uft8mb4 COLLATE utf8mb4_general_ci", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "messages MODIFY COLUMN message text CHARACTER SET utf8mb4 NOT NULL AFTER owner", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "shops MODIFY COLUMN itemConfig text CHARACTER SET utf8mb4 NOT NULL AFTER price", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "shops TO CHARACTER SET uft8mb4 COLLATE utf8mb4_general_ci", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "messages TO CHARACTER SET uft8mb4 COLLATE utf8mb4_general_ci", checkTask)); + manager.runInstantTask(new DatabaseTask("ALTER TABLE " + manager.getDatabase().getTablePrefix() + "history TO CHARACTER SET uft8mb4 COLLATE utf8mb4_general_ci", checkTask)); } plugin.getLogger().info("Finished!"); } @@ -166,7 +159,7 @@ public void onFailed(SQLException e) { public boolean createColumn(@NotNull String tableName, @NotNull String columnName, @NotNull DataType type) { try { - String table = plugin.getDbPrefix() + tableName; + String table = manager.getDatabase().getTablePrefix() + tableName; if (manager.hasColumn(table, columnName)) { return false; } @@ -177,7 +170,7 @@ public boolean createColumn(@NotNull String tableName, @NotNull String columnNam sqlString = "alter table " + table + " add column " + columnName + " " + type.getDatatype().getSqlite(); } if (type.getLength() != null) { - sqlString += "(" + type.getLength().toString() + ") "; + sqlString += "(" + type.getLength() + ") "; } Util.debugLog("Append sql for creating column is " + sqlString); manager.runInstantTask(new DatabaseTask(sqlString, new DatabaseTask.Task() { @@ -201,21 +194,20 @@ public void onFailed(SQLException e) { @Override public void cleanMessage(long weekAgo) { - String sqlString = "DELETE FROM " + plugin - .getDbPrefix() + "messages WHERE time < ?"; + String sqlString = "DELETE FROM " + manager.getDatabase().getTablePrefix() + "messages WHERE time < ?"; manager.addDelayTask(new DatabaseTask(sqlString, ps -> ps.setLong(1, weekAgo))); } @Override public void cleanMessageForPlayer(@NotNull UUID player) { - String sqlString = "DELETE FROM " + plugin.getDbPrefix() + "messages WHERE owner = ?"; + String sqlString = "DELETE FROM " + manager.getDatabase().getTablePrefix() + "messages WHERE owner = ?"; manager.addDelayTask(new DatabaseTask(sqlString, (ps) -> ps.setString(1, player.toString()))); } @Override public void createShop(@NotNull Shop shop, @Nullable Runnable onSuccess, @Nullable Consumer onFailed) { removeShop(shop); //First purge old exist shop before create new shop. - String sqlString = "INSERT INTO " + plugin.getDbPrefix() + "shops (owner, price, itemConfig, x, y, z, world, unlimited, type, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + String sqlString = "INSERT INTO " + manager.getDatabase().getTablePrefix() + "shops (owner, price, itemConfig, x, y, z, world, unlimited, type, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; manager.addDelayTask(new DatabaseTask(sqlString, new DatabaseTask.Task() { @Override public void edit(PreparedStatement ps) throws SQLException { @@ -260,7 +252,7 @@ public void onFailed(SQLException e) { @Override public void removeShop(Shop shop) { String sqlString = "DELETE FROM " - + plugin.getDbPrefix() + + manager.getDatabase().getTablePrefix() + "shops WHERE x = ? AND y = ? AND z = ? AND world = ?" + (manager.getDatabase() instanceof MySQLCore ? " LIMIT 1" : ""); manager.addDelayTask(new DatabaseTask(sqlString, (ps) -> { @@ -276,7 +268,7 @@ public void removeShop(Shop shop) { @Override public void removeShop(String world, int x, int y, int z) { String sqlString = "DELETE FROM " - + plugin.getDbPrefix() + + manager.getDatabase().getTablePrefix() + "shops WHERE x = ? AND y = ? AND z = ? AND world = ?" + (manager.getDatabase() instanceof MySQLCore ? " LIMIT 1" : ""); manager.addDelayTask(new DatabaseTask(sqlString, (ps) -> { @@ -297,7 +289,7 @@ public SimpleWarpedResultSet selectAllMessages() throws SQLException { public SimpleWarpedResultSet selectTable(String table) throws SQLException { DatabaseConnection databaseConnection = manager.getDatabase().getConnection(); Statement st = databaseConnection.get().createStatement(); - String sql = "SELECT * FROM " + plugin.getDbPrefix() + table; + String sql = "SELECT * FROM " + manager.getDatabase().getTablePrefix() + table; ResultSet resultSet = st.executeQuery(sql); //Resource closes will complete in this class return new SimpleWarpedResultSet(st, resultSet, databaseConnection); @@ -311,7 +303,7 @@ public SimpleWarpedResultSet selectAllShops() throws SQLException { @Override public void saveOfflineTransactionMessage(@NotNull UUID player, @NotNull String message, long time) { - String sqlString = "INSERT INTO " + plugin.getDbPrefix() + "messages (owner, message, time) VALUES (?, ?, ?)"; + String sqlString = "INSERT INTO " + manager.getDatabase().getTablePrefix() + "messages (owner, message, time) VALUES (?, ?, ?)"; manager.addDelayTask( new DatabaseTask( sqlString, @@ -324,8 +316,7 @@ public void saveOfflineTransactionMessage(@NotNull UUID player, @NotNull String @Override public void updateOwner2UUID(@NotNull String ownerUUID, int x, int y, int z, @NotNull String worldName) { - String sqlString = "UPDATE " + plugin - .getDbPrefix() + "shops SET owner = ? WHERE x = ? AND y = ? AND z = ? AND world = ?" + ( + String sqlString = "UPDATE " + manager.getDatabase().getTablePrefix() + "shops SET owner = ? WHERE x = ? AND y = ? AND z = ? AND world = ?" + ( manager.getDatabase() instanceof MySQLCore ? " LIMIT 1" : ""); manager.addDelayTask( new DatabaseTask(sqlString, ps -> { @@ -341,7 +332,7 @@ public void updateOwner2UUID(@NotNull String ownerUUID, int x, int y, int z, @No public void updateExternalInventoryProfileCache(@NotNull Shop shop, int space, int stock) { if (manager.getDatabase() instanceof MySQLCore) { - String sqlString = "INSERT INTO " + plugin.getDbPrefix() + "external_cache (x,y,z,world,space,stock) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE space = ?, stock = ?"; + String sqlString = "INSERT INTO " + manager.getDatabase().getTablePrefix() + "external_cache (x,y,z,world,space,stock) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE space = ?, stock = ?"; manager.addDelayTask( new DatabaseTask(sqlString, ps -> { ps.setInt(1, shop.getLocation().getBlockX()); @@ -354,7 +345,7 @@ public void updateExternalInventoryProfileCache(@NotNull Shop shop, int space, i ps.setInt(8, stock); })); } else { - String createString = "INSERT OR IGNORE INTO " + plugin.getDbPrefix() + "external_cache (x,y,z,world,space,stock) VALUES (?,?,?,?,?,?)"; + String createString = "INSERT OR IGNORE INTO " + manager.getDatabase().getTablePrefix() + "external_cache (x,y,z,world,space,stock) VALUES (?,?,?,?,?,?)"; manager.addDelayTask( new DatabaseTask(createString, ps -> { ps.setInt(1, shop.getLocation().getBlockX()); @@ -364,7 +355,7 @@ public void updateExternalInventoryProfileCache(@NotNull Shop shop, int space, i ps.setInt(5, space); ps.setInt(6, stock); })); - String updateString = "UPDATE " + plugin.getDbPrefix() + "external_cache SET space = ?, stock = ? WHERE x = ? AND y = ? AND z = ? AND world =?"; + String updateString = "UPDATE " + manager.getDatabase().getTablePrefix() + "external_cache SET space = ?, stock = ? WHERE x = ? AND y = ? AND z = ? AND world =?"; manager.addDelayTask( new DatabaseTask(updateString, ps -> { ps.setInt(1, space); @@ -382,8 +373,7 @@ public void updateExternalInventoryProfileCache(@NotNull Shop shop, int space, i public void updateShop(@NotNull String owner, @NotNull ItemStack item, int unlimited, int shopType, double price, int x, int y, int z, @NotNull String world, @NotNull String extra, @Nullable String currency, boolean disableDisplay, @Nullable String taxAccount) { - String sqlString = "UPDATE " + plugin - .getDbPrefix() + "shops SET owner = ?, itemConfig = ?, unlimited = ?, type = ?, price = ?," + + String sqlString = "UPDATE " + manager.getDatabase().getTablePrefix() + "shops SET owner = ?, itemConfig = ?, unlimited = ?, type = ?, price = ?," + " extra = ?, currency = ?, disableDisplay = ?, taxAccount = ?" + " WHERE x = ? AND y = ? and z = ? and world = ?"; manager.addDelayTask(new DatabaseTask(sqlString, ps -> { @@ -407,7 +397,7 @@ public void updateShop(@NotNull String owner, @NotNull ItemStack item, int unlim @Override public void insertHistoryRecord(Object rec) { - String sqlString = "INSERT INTO " + plugin.getDbPrefix() + "logs (time, classname, data) VALUES (?, ?, ?)"; + String sqlString = "INSERT INTO " + manager.getDatabase().getTablePrefix() + "logs (time, classname, data) VALUES (?, ?, ?)"; manager.addDelayTask( new DatabaseTask( sqlString, diff --git a/src/main/java/org/maxgamer/quickshop/economy/Trader.java b/src/main/java/org/maxgamer/quickshop/economy/Trader.java index afe5c2f109..ceb328bbd8 100644 --- a/src/main/java/org/maxgamer/quickshop/economy/Trader.java +++ b/src/main/java/org/maxgamer/quickshop/economy/Trader.java @@ -20,6 +20,7 @@ package org.maxgamer.quickshop.economy; import lombok.AllArgsConstructor; +import org.bukkit.BanEntry; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -32,6 +33,9 @@ import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.util.PlayerFinder; +import java.time.Duration; +import java.time.Instant; +import java.util.Date; import java.util.Map; import java.util.UUID; @@ -78,6 +82,24 @@ public boolean isBanned() { return offlinePlayer.isBanned(); } + @Nullable + @Override + public BanEntry ban(@Nullable String s, @Nullable Date date, @Nullable String s1) { + return offlinePlayer.ban(s, date, s1); + } + + @Nullable + @Override + public BanEntry ban(@Nullable String s, @Nullable Instant instant, @Nullable String s1) { + return offlinePlayer.ban(s, instant, s1); + } + + @Nullable + @Override + public BanEntry ban(@Nullable String s, @Nullable Duration duration, @Nullable String s1) { + return offlinePlayer.ban(s, duration, s1); + } + @Override public boolean isWhitelisted() { return offlinePlayer.isWhitelisted(); diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index 2c35e1f309..4cb20dea01 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -162,13 +162,19 @@ private void postControlPanel(PlayerInteractEvent e) { block = e.getClickedBlock(); } Shop controlPanelShop = plugin.getShopManager().getShop(Objects.requireNonNull(block).getLocation()); - if (controlPanelShop != null && (controlPanelShop.getOwner().equals(p.getUniqueId()) || QuickShop.getPermissionManager().hasPermission(p, "quickshop.other.control"))) { - MsgUtil.sendControlPanelInfo(p, Objects.requireNonNull(plugin.getShopManager().getShop(block.getLocation()))); - this.playClickSound(e.getPlayer()); - Objects.requireNonNull(plugin.getShopManager().getShop(block.getLocation())).setSignText(); - //Prevent use item by ancient - if (e.getAction() == Action.RIGHT_CLICK_BLOCK) { - e.setUseItemInHand(Event.Result.DENY); + if (controlPanelShop != null) { + if ((controlPanelShop.getOwner().equals(p.getUniqueId()) || QuickShop.getPermissionManager().hasPermission(p, "quickshop.other.control"))) { + MsgUtil.sendControlPanelInfo(p, Objects.requireNonNull(plugin.getShopManager().getShop(block.getLocation()))); + this.playClickSound(e.getPlayer()); + Objects.requireNonNull(plugin.getShopManager().getShop(block.getLocation())).setSignText(); + //Prevent use item by ancient + if (e.getAction() == Action.RIGHT_CLICK_BLOCK) { + e.setUseItemInHand(Event.Result.DENY); + } + } + //Cancel for interacting with sign (editing) + if (plugin.getGameVersion().ordinal() >= GameVersion.v1_20_R1.ordinal()) { + e.setCancelled(true); } //Cancel for interacting with sign (editing) if (plugin.getGameVersion().ordinal() >= GameVersion.v1_20_R1.ordinal()) {