From 30b2ec265f1f5a1e3568b4b3e75c9debc069b804 Mon Sep 17 00:00:00 2001 From: Ghost_chu <2908803755@qq.com> Date: Thu, 18 Nov 2021 19:54:13 +0800 Subject: [PATCH 001/725] Allow addon to hook the Inventory getting --- .../api/event/ShopInventoryEvent.java | 75 +++++++++++++++++++ .../quickshop/shop/ContainerShop.java | 9 ++- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/maxgamer/quickshop/api/event/ShopInventoryEvent.java diff --git a/src/main/java/org/maxgamer/quickshop/api/event/ShopInventoryEvent.java b/src/main/java/org/maxgamer/quickshop/api/event/ShopInventoryEvent.java new file mode 100644 index 0000000000..708ae972c5 --- /dev/null +++ b/src/main/java/org/maxgamer/quickshop/api/event/ShopInventoryEvent.java @@ -0,0 +1,75 @@ +/* + * This file is a part of project QuickShop, the name is ShopInventoryEvent.java + * Copyright (C) PotatoCraft Studio and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.maxgamer.quickshop.api.event; + +import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.NotNull; +import org.maxgamer.quickshop.api.shop.Shop; + +/** + * Calling when shop inventory be got and for using + */ +public class ShopInventoryEvent extends AbstractQSEvent { + + @NotNull + private final Shop shop; + @NotNull + private Inventory inventory; + + /** + * Call when shop was clicked. + * + * @param shop The shop bought from + */ + public ShopInventoryEvent(@NotNull Shop shop, @NotNull Inventory inventory) { + this.shop = shop; + this.inventory = inventory; + + } + + /** + * Getting the Inventory that shop be used + * + * @return The inventory + */ + @NotNull + public Inventory getInventory() { + return inventory; + } + + /** + * Sets the Inventory + * + * @param inventory new inventory for shop for this time. + * It is not persis. + */ + public void setInventory(@NotNull Inventory inventory) { + this.inventory = inventory; + } + + /** + * Getting the shops that clicked + * + * @return Clicked shop + */ + public @NotNull Shop getShop() { + return this.shop; + } +} diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 1c66527c5a..c919dcc2fb 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -1295,11 +1295,12 @@ public AbstractDisplayItem getDisplayItem() { public @Nullable Inventory getInventory() { Util.ensureThread(false); BlockState state = PaperLib.getBlockState(location.getBlock(), false).getState(); + Inventory inv = null; try { if (state.getType() == Material.ENDER_CHEST && plugin.getOpenInvPlugin() != null) { //FIXME: Need better impl OpenInv openInv = ((OpenInv) plugin.getOpenInvPlugin()); - return openInv.getSpecialEnderChest( + inv = openInv.getSpecialEnderChest( Objects.requireNonNull( openInv.loadPlayer( plugin.getServer().getOfflinePlayer(this.moderator.getOwner()))), @@ -1313,7 +1314,7 @@ public AbstractDisplayItem getDisplayItem() { InventoryHolder container; try { container = (InventoryHolder) state; - return container.getInventory(); + inv = container.getInventory(); } catch (Exception e) { if (!createBackup) { createBackup = Util.backupDatabase(); @@ -1328,6 +1329,10 @@ public AbstractDisplayItem getDisplayItem() { "Inventory doesn't exist anymore: " + this + " shop was removed."); return null; } + + ShopInventoryEvent event = new ShopInventoryEvent(this, inv); + event.callEvent(); + return event.getInventory(); } /** From d65e576c9153079f2df88aeadb13681b79c6a2b7 Mon Sep 17 00:00:00 2001 From: Ghost_chu <2908803755@qq.com> Date: Thu, 18 Nov 2021 21:41:15 +0800 Subject: [PATCH 002/725] bump ver --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24d2d33079..0d3549c1b4 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ QuickShop - 5.0.0.16 + 5.0.0.17 org.maxgamer.quickshop Ghost-chu UTF-8 From 492864c71674b768d17e591e2e734c94a8ed653b Mon Sep 17 00:00:00 2001 From: Ghost_chu <30802565+Ghost-chu@users.noreply.github.com> Date: Fri, 19 Nov 2021 02:58:53 +0800 Subject: [PATCH 003/725] New translations messages.json (Dutch) --- crowdin/lang/nl-NL/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crowdin/lang/nl-NL/messages.json b/crowdin/lang/nl-NL/messages.json index 05b61b7b7f..0b0ab273e5 100644 --- a/crowdin/lang/nl-NL/messages.json +++ b/crowdin/lang/nl-NL/messages.json @@ -97,7 +97,7 @@ "item-holochat-error": "&c[Error]", "preview": "&b[Item voorbeeld]", "space": "&aSpatie: &e{0}", - "stock": "&aVoorraad &{0}", + "stock": "&aVoorraad &e{0}", "price-per": "&aPrice per &e{0} &a- &e{1}", "price-per-stack": "&aPrice per &e{2}x {0} - {1}", "total-value-of-chest": "&aTotale waarde van kist: &e{0}", From 900efca956f86d11bce39e0c106d03e35b0fcb6c Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Tue, 23 Nov 2021 11:14:25 +0800 Subject: [PATCH 004/725] Update config.yml --- .github/ISSUE_TEMPLATE/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b63dfe5495..74a56f8d0a 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,4 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - name: 'Development Builds' about: |- @@ -7,10 +7,10 @@ contact_links: url: 'https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake-SNAPSHOT/' - name: 'Feature Requests' about: 'Use our discussions page to request changes towards QuickShop.' - url: 'https://github.com/Ghost-chu/QuickShop-Reremake/discussions/categories/ideas' + url: 'https://github.com/PotatoCraft-Studio/QuickShop-Reremake/discussions/categories/ideas' - name: 'Wiki' about: 'Find info about QuickShop in our dedicated wiki.' - url: 'https://github.com/Ghost-chu/QuickShop-Reremake/wiki' + url: 'https://github.com/PotatoCraft-Studio/QuickShop-Reremake/wiki' - name: 'Discord' about: 'Join our Discord to ask questions and get fast support.' url: 'https://discord.gg/bfefw2E' From 4c28220509541623c332fbcb4174cc5e774ec135 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Nov 2021 03:26:59 +0000 Subject: [PATCH 005/725] Bump sqlite-jdbc from 3.34.0 to 3.36.0.3 Bumps [sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.34.0 to 3.36.0.3. - [Release notes](https://github.com/xerial/sqlite-jdbc/releases) - [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG) - [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.34.0...3.36.0.3) --- updated-dependencies: - dependency-name: org.xerial:sqlite-jdbc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0d3549c1b4..8dd3435f54 100644 --- a/pom.xml +++ b/pom.xml @@ -555,7 +555,7 @@ org.xerial sqlite-jdbc - 3.34.0 + 3.36.0.3 test From 9d60f1b8803c43d0598c03ba2c341cc5ceebe3b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Nov 2021 03:33:29 +0000 Subject: [PATCH 006/725] Bump okhttp from 4.9.2 to 4.9.3 Bumps [okhttp](https://github.com/square/okhttp) from 4.9.2 to 4.9.3. - [Release notes](https://github.com/square/okhttp/releases) - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-4.9.2...parent-4.9.3) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0d3549c1b4..3d548f0691 100644 --- a/pom.xml +++ b/pom.xml @@ -826,7 +826,7 @@ com.squareup.okhttp3 okhttp - 4.9.2 + 4.9.3 compile From 2d0c2fcf1f25ece2bc3c8b4480f0426e84942b69 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 23 Nov 2021 12:22:47 +0800 Subject: [PATCH 007/725] Fix broken readme --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 02bebaa545..3ae1f49c72 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,10 @@ from [KaiKikuchi's QuickShop upstream repository](https://github.com/KaiKikuchi/ ## Support -| -| -| | :-: | :-: | | **Discord** | **Github Issues** | +| | | +| :---: | :---: | +| [**Discord**](https://discord.gg/bfefw2E) | [**Github +Issues**](https://github.com/PotatoCraft-Studio/QuickShop-Reremake/issues) | ## Features @@ -49,7 +50,7 @@ from [KaiKikuchi's QuickShop upstream repository](https://github.com/KaiKikuchi/ ## Downloads | | | | - | --- | --- | --- | --- | + | :---: | :---: | :---: | :---: | | **Spigot** | **BukkitDev** | **MCBBS** | **Jenkins** | ## Contribute @@ -61,10 +62,9 @@ number. Thank you very much! To compile the QuickShop and debug it by yourself, please follow these steps: -0. Make sure you're using Java16 JDK in your PATH. -1. Compile sub-project: `cd ./src/integration/plotsquared/5 && mvn install && cd ../../../../` -2. Compile main-project without signature by using debug proile: `mvn install -Pdebug` -3. Start your server with extra flag to skip the QuickShop signature +0. Make sure you're using Java16 JDK in your PATH. 1.Compile main-project without signature by using debug + proile: `mvn install -Pdebug` + 2.Start your server with extra flag to skip the QuickShop signature checks: `-Dorg.maxgamer.quickshop.util.envcheck.skip.SIGNATURE_VERIFY` ## Maven From 5b6287ecadeb244366e800ee55b02272ac9fe7b2 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 23 Nov 2021 12:25:33 +0800 Subject: [PATCH 008/725] Fix broken readme again --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3ae1f49c72..eaa27db1b5 100644 --- a/README.md +++ b/README.md @@ -25,8 +25,7 @@ from [KaiKikuchi's QuickShop upstream repository](https://github.com/KaiKikuchi/ | | | | :---: | :---: | -| [**Discord**](https://discord.gg/bfefw2E) | [**Github -Issues**](https://github.com/PotatoCraft-Studio/QuickShop-Reremake/issues) | +| [**Discord**](https://discord.gg/bfefw2E) | [**Github Issues**](https://github.com/PotatoCraft-Studio/QuickShop-Reremake/issues) | ## Features @@ -55,16 +54,16 @@ Issues**](https://github.com/PotatoCraft-Studio/QuickShop-Reremake/issues) | ## Contribute -[]()If you're a developer, you can contribute to the QuickShop code! Just make a fork and install the Lombok plugin, +If you're a developer, you can contribute to the QuickShop code! Just make a fork and install the Lombok plugin, then make a pull request when you're done! Please try to follow [Google Java Style](https://google.github.io/styleguide/javaguide.html). Also do not increase the plugin version number. Thank you very much! To compile the QuickShop and debug it by yourself, please follow these steps: -0. Make sure you're using Java16 JDK in your PATH. 1.Compile main-project without signature by using debug - proile: `mvn install -Pdebug` - 2.Start your server with extra flag to skip the QuickShop signature +0. Make sure you're using Java16 JDK in your PATH. +1. Compile main-project without signature by using debug profile: `mvn install -Pdebug` +2. Start your server with extra flag to skip the QuickShop signature checks: `-Dorg.maxgamer.quickshop.util.envcheck.skip.SIGNATURE_VERIFY` ## Maven From 0b47d617971cb927cc8dfbf18a53114700fba698 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 23 Nov 2021 18:10:23 +0800 Subject: [PATCH 009/725] [FactionUUID] Drop support for 0.5.x and support 0.6.x --- pom.xml | 30 ++----------------- .../factionsuuid/FactionsUUIDIntegration.java | 11 ++++--- 2 files changed, 10 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 0d3549c1b4..c652935d1b 100644 --- a/pom.xml +++ b/pom.xml @@ -667,36 +667,12 @@ com.massivecraft Factions - 1.6.9.5-U0.5.21 + 1.6.9.5-U0.6.0 provided - gson - com.google.code.gson - - - fluent-hc - org.apache.httpcomponents - - - configurate-core - org.spongepowered - - - guava - com.google.guava - - - paste-gg-api - org.kitteh - - - paperlib - io.papermc - - - particleeffect - com.darkblade12 + * + * diff --git a/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java index 99ffdb7f30..68ae2dfdca 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java @@ -24,6 +24,7 @@ import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.Faction; import com.massivecraft.factions.perms.PermissibleAction; +import com.massivecraft.factions.perms.PermissibleActionRegistry; import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -122,7 +123,8 @@ private void init() { } private boolean check(@NotNull Player player, @NotNull Location location, boolean createRequireOpen, boolean createRequireSafeZone, boolean createRequirePermanent, boolean createRequirePeaceful, boolean createRequireWilderness, boolean createRequireWarZone, boolean createRequireNormal, boolean createRequireOwn, List createFlags, boolean whiteList) { - Faction faction = Board.getInstance().getFactionAt(new FLocation(location)); + FLocation fLocation = new FLocation(location); + Faction faction = Board.getInstance().getFactionAt(fLocation); if (faction == null) { return !whiteList; } @@ -151,12 +153,13 @@ private boolean check(@NotNull Player player, @NotNull Location location, boolea return false; } if (createRequireOwn - && !faction.getOwnerList(new FLocation(location)).contains(player.getName())) { + && !faction.getOwnerList(fLocation).contains(player.getName())) { return false; } + for (String flag : createFlags) { - if (!faction.hasAccess( - FPlayers.getInstance().getByPlayer(player), PermissibleAction.fromString(flag))) { + PermissibleAction permissibleAction = PermissibleActionRegistry.get(flag); + if (permissibleAction != null && !faction.hasAccess(FPlayers.getInstance().getByPlayer(player), permissibleAction, fLocation)) { return false; } } From 790afda0c2a447571ba01b65fd808d439499f952 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Tue, 23 Nov 2021 23:55:22 +0800 Subject: [PATCH 010/725] New translations messages.json (English) --- crowdin/lang/en-US/messages.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crowdin/lang/en-US/messages.json b/crowdin/lang/en-US/messages.json index 7c7e819350..50de1bf7fb 100644 --- a/crowdin/lang/en-US/messages.json +++ b/crowdin/lang/en-US/messages.json @@ -12,8 +12,8 @@ "integrations-check-failed-create": "&cIntegration {0} denied the shop-creation", "integrations-check-failed-trade": "&cIntegration {0} denied the Shop trading", "3rd-plugin-build-check-failed": "&c3rd-party plugin &l{0}&r&c denied the permission checks, did you have permission set up in there?", - "no-creative-break": "&cYou cannot break other players shops in creative mode, switch to survival mode or try to use the supertool {0} instead.", - "trading-in-creative-mode-is-disabled": "&cYou cannot trade with this shop while being in creative mode.", + "no-creative-break": "&cYou cannot break the shops of other players while in creative mode. Switch to survival mode or try to use the supertool {0} instead.", + "trading-in-creative-mode-is-disabled": "&cYou cannot trade with this shop while in creative mode.", "supertool-is-disabled": "&cSupertool is disabled. Cannot break any shops.", "no-double-chests": "&cYou cannot create a double chest shop.", "not-managed-shop": "&cYou are not the owner nor moderator of this Shop", @@ -22,7 +22,7 @@ "price-too-cheap": "&cPrice must be greater than &e${0}", "no-price-change": "&cThis wouldn't result in a price change!", "you-cant-afford-a-new-shop": "&cIt costs {0} to create a new shop.", - "player-bought-from-your-store-tax": "&c{0} purchased {1} {2} from your shop, and you earned {3} ({4} in taxes).", + "player-bought-from-your-store-tax": "&a{0} purchased{1} {2} from your shop and you earned {3} ({4} in taxes).", "you-cant-afford-to-change-price": "&cIt costs {0} to change the price in your shop.", "success-created-shop": "&aShop created.", "success-removed-shop": "&aShop removed.", @@ -35,13 +35,13 @@ "not-a-number": "&cYou can only input a number, your input was {0}.", "exceeded-maximum": "&cThe value exceeded the maximum value in Java.", "not-a-integer": "&cYou must input an integer, your input was {0}.", - "player-bought-from-your-store": "&c{0} purchased {1} {2} from your shop, and you earned {3}.", + "player-bought-from-your-store": "&a{0} purchased {1} {2} from your shop, and you earned {3}.", "shop-out-of-stock": "&5Your shop at {0}, {1}, {2} has run out of {3}!", "shop-has-no-space": "&cThe shop only has room for {0} more {1}.", "you-dont-have-that-many-items": "&cYou only have {0} {1}.", - "the-owner-cant-afford-to-buy-from-you": "&cThis costs {0}, but the shop-owner only has {1}", + "the-owner-cant-afford-to-buy-from-you": "&cThis item is worth {0}, but the shop-owner only has {1}", "player-sold-to-your-store": "&a{0} sold {1} {2} to your shop.", - "shop-out-of-space": "&5Your shop at {0}, {1}, {2} is now full.", + "shop-out-of-space": "&5Your shop at {0}, {1}, {2} is full!", "fee-charged-for-price-change": "&aYou paid &c{0}&a to change the price.", "price-is-now": "&aThe new price of the shop is &e{0}", "thats-not-a-number": "&cInvalid number", From 79cf51b2aa6b8878be31d5626027f96cb8153a2d Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Wed, 24 Nov 2021 10:50:11 +0800 Subject: [PATCH 011/725] New translations messages.json (Korean) --- crowdin/lang/ko-KR/messages.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crowdin/lang/ko-KR/messages.json b/crowdin/lang/ko-KR/messages.json index 60df8f2c7d..0f07393804 100644 --- a/crowdin/lang/ko-KR/messages.json +++ b/crowdin/lang/ko-KR/messages.json @@ -179,7 +179,7 @@ "lock": "상점 잠금 상태 전환", "taxaccount": "&e쇼핑에서 사용하는 세금 계정 설정", "toggledisplay": "&e상점 표시 항목 상태 전환", - "purge": "&eStart the shop purge task in background" + "purge": "&a백그라운드에서 상점 정리 작업을 시작합니다" }, "disabled": "&c이 명령어는 비활성화 되어있습니다: &e{0}", "feature-not-enabled": "이옵션은 컨피그에서 비활성 상태입니다" @@ -229,8 +229,8 @@ "lock-hover": "&e상점 잠금 보호를 활성화/비활성화 합니다. ", "freeze": "&e동결 상태: &b{0} &e[&d&l전환&e]", "freeze-hover": "&e상점 동결 상태 전환.", - "toggledisplay": "&eDisplayItem: &b{0} &e[&d&lToggle&e]", - "toggledisplay-hover": "&eToggle the shop's displayitem status" + "toggledisplay": "&e아이템 표시: &b{0} &e[&d&l전환&e]", + "toggledisplay-hover": "&e상점 표시 항목 상태 전환" }, "tableformat": { "full_line": "+---------------------------------------------------+", From 327f0ce988cf5e7f31d2bca469e9ce910f18125d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Nov 2021 14:24:39 +0000 Subject: [PATCH 012/725] Bump paperlib from 1.0.6 to 1.0.7 Bumps [paperlib](https://github.com/PaperMC/PaperLib) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/PaperMC/PaperLib/releases) - [Changelog](https://github.com/PaperMC/PaperLib/blob/master/CHANGELOG.md) - [Commits](https://github.com/PaperMC/PaperLib/compare/1.0.6...v1.0.7) --- updated-dependencies: - dependency-name: io.papermc:paperlib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c652935d1b..434d608ceb 100644 --- a/pom.xml +++ b/pom.xml @@ -749,7 +749,7 @@ io.papermc paperlib - 1.0.6 + 1.0.7 compile From 9a94668792b812566a5289394916ed7d307cd217 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Fri, 26 Nov 2021 01:34:10 +0800 Subject: [PATCH 013/725] [WorldGuardIntegration] Fix global region issue --- .../org/maxgamer/quickshop/QuickShop.java | 4 ++ .../worldguard/WorldGuardIntegration.java | 52 ++++++++++++++----- src/main/resources/config.yml | 4 +- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 27f7c3db9a..a97074ea45 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -1962,6 +1962,10 @@ private void updateConfig(int selectedVersion) throws IOException { getConfiguration().remove("plugin.BKCommonLib"); getConfiguration().set("config-version", ++selectedVersion); } + if (selectedVersion == 148) { + getConfiguration().set("integration.worldguard.respect-global-region",false); + getConfiguration().set("config-version", ++selectedVersion); + } if (getConfiguration().getInt("matcher.work-type") != 0 && GameVersion.get(ReflectFactory.getServerVersion()).name().contains("1_16")) { getLogger().warning("You are not using QS Matcher, it may meeting item comparing issue mentioned there: https://hub.spigotmc.org/jira/browse/SPIGOT-5063"); } diff --git a/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java index 1db8fb573d..dbe0497178 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java @@ -23,11 +23,13 @@ import com.sk89q.worldguard.LocalPlayer; import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.bukkit.WorldGuardPlugin; +import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.Flags; import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.flags.registry.FlagConflictException; import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; +import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.protection.regions.RegionQuery; import org.bukkit.ChatColor; @@ -54,6 +56,7 @@ public class WorldGuardIntegration extends AbstractQSIntegratedPlugin { private List tradeFlags; private boolean anyOwner; private boolean whiteList; + private boolean respectGlobalRegion; private boolean load = false; public WorldGuardIntegration(QuickShop plugin) { @@ -89,6 +92,7 @@ public void load() { private void init() { this.whiteList = plugin.getConfiguration().getBoolean("integration.worldguard.whitelist-mode"); this.anyOwner = plugin.getConfiguration().getBoolean("integration.worldguard.any-owner"); + respectGlobalRegion = plugin.getConfiguration().getBoolean("integration.worldguard.respect-global-region"); createFlags = WorldGuardFlags.deserialize( plugin.getConfiguration().getStringList("integration.worldguard.create")); @@ -133,38 +137,48 @@ public boolean canCreateShopHere(@NotNull Player player, @NotNull Location locat } RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery query = container.createQuery(); - if (query.getApplicableRegions(wgLoc).getRegions().isEmpty()) { + ApplicableRegionSet applicableRegionSet=query.getApplicableRegions(wgLoc); + //Regions not included global one + if (applicableRegionSet.getRegions().isEmpty()&&!respectGlobalRegion) { return !whiteList; + }else { + //So check it manually + RegionManager worldManger = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(location.getWorld())); + if (worldManger != null&&!worldManger.hasRegion("__global__")) { + //If not have, just check whitelist + return !whiteList; + } } + //Passed, but flag calculation will include the global region for (WorldGuardFlags flag : createFlags) { switch (flag) { case BUILD: - if (query.queryState(wgLoc, localPlayer, Flags.BUILD) == StateFlag.State.DENY) { + if (!applicableRegionSet.testState(localPlayer,Flags.BUILD)) { return false; } break; case FLAG: - if (query.queryState(wgLoc, localPlayer, this.createFlag) == StateFlag.State.DENY) { + if (!applicableRegionSet.testState(localPlayer, this.createFlag)) { return false; } break; case CHEST_ACCESS: - if (query.queryState(wgLoc, localPlayer, Flags.CHEST_ACCESS) == StateFlag.State.DENY) { + if (!applicableRegionSet.testState(localPlayer, Flags.CHEST_ACCESS)) { return false; } break; case INTERACT: - if (query.queryState(wgLoc, localPlayer, Flags.INTERACT) == StateFlag.State.DENY) { + if (!applicableRegionSet.testState(localPlayer, Flags.INTERACT)) { return false; } break; case OWN: if (anyOwner) { - if (query.getApplicableRegions(wgLoc).getRegions().stream().noneMatch(region -> region.isOwner(localPlayer))) { + if (applicableRegionSet.getRegions().stream().noneMatch(region -> region.isOwner(localPlayer))) { return false; } } else { - if (!query.getApplicableRegions(wgLoc).isOwnerOfAll(localPlayer)) { + if (!applicableRegionSet.isOwnerOfAll(localPlayer)) { return false; } } @@ -194,36 +208,46 @@ public boolean canTradeShopHere(@NotNull Player player, @NotNull Location locati } RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery query = container.createQuery(); - if (query.getApplicableRegions(wgLoc).getRegions().isEmpty()) { + ApplicableRegionSet applicableRegionSet=query.getApplicableRegions(wgLoc); + //Regions not included global one + if (applicableRegionSet.getRegions().isEmpty()&&!respectGlobalRegion) { return !whiteList; + }else { + //So check it manually + RegionManager worldManger = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(location.getWorld())); + if (worldManger != null&&!worldManger.hasRegion("__global__")) { + //If not have, just check whitelist + return !whiteList; + } } + //Passed, but flag calculation will include the global region for (WorldGuardFlags flag : tradeFlags) { switch (flag) { case BUILD: - if (!query.testState(wgLoc, localPlayer, Flags.BUILD)) { + if (!applicableRegionSet.testState(localPlayer, Flags.BUILD)) { return false; } break; case FLAG: - if (!query.testState(wgLoc, localPlayer, this.tradeFlag)) { + if (!applicableRegionSet.testState(localPlayer, this.tradeFlag)) { return false; } break; case CHEST_ACCESS: - if (!query.testState(wgLoc, localPlayer, Flags.CHEST_ACCESS)) { + if (!applicableRegionSet.testState(localPlayer, Flags.CHEST_ACCESS)) { return false; } break; case INTERACT: - if (!query.testState(wgLoc, localPlayer, Flags.INTERACT)) { + if (!applicableRegionSet.testState(localPlayer, Flags.INTERACT)) { return false; } break; case OWN: if (anyOwner) { - return query.getApplicableRegions(wgLoc).getRegions().stream().anyMatch(region -> region.isOwner(localPlayer)); + return applicableRegionSet.getRegions().stream().anyMatch(region -> region.isOwner(localPlayer)); } else { - return query.getApplicableRegions(wgLoc).isOwnerOfAll(localPlayer); + return applicableRegionSet.isOwnerOfAll(localPlayer); } default: // do nothing diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b18f99b4f0..c5ade0dff7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,7 @@ # QuickShop-Reremake Plugin Configuration #Do not touch this if you don't know what you're doing! -config-version: 148 +config-version: 149 #This language will used by Item Name, Enchantment Name, #and Potion Effect Name or the text on the shop info sign (nbtapi not installed) and other them related position. @@ -557,6 +557,8 @@ integration: whitelist-mode: false #Allow players to create a shop if the player is the owner of in this location or ANY region. any-owner: true + #Should we respect the global region flag? + respect-global-region: true #Which checks does a player need to pass to create a shop? #You can use multiple checks at the same time. #Priority: UP > DOWN From ad43c83ffc96edddab523972b7439d56953b6e37 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Fri, 26 Nov 2021 13:29:31 +0800 Subject: [PATCH 014/725] New translations messages.json (Korean) --- crowdin/lang/ko-KR/messages.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crowdin/lang/ko-KR/messages.json b/crowdin/lang/ko-KR/messages.json index 0f07393804..7b6899e0c9 100644 --- a/crowdin/lang/ko-KR/messages.json +++ b/crowdin/lang/ko-KR/messages.json @@ -190,8 +190,8 @@ "header": "{1}{0}", "buying": "&b구매 {0} 개", "stack-buying": "&b구매중 {0} 개", - "item-left": "", - "item-right": "", + "item-left": "&f", + "item-right": "&f", "price": "개당 {0}", "stack-price": "아이템 {2}, {1} 개당 {0}원", "unlimited": "무제한", @@ -346,6 +346,6 @@ "display-turn-on": "&a상점 디스플레이를 성공적으로 켰습니다.", "display-turn-off": "&a상점 디스플레이를 성공적으로 껏습니다.", "shop-purged-start": "&a상점 정리가 시작되었습니다. 자세한 내용은 콘솔을 확인하십시오.", - "purchase-out-of-stock": "&cThis shop run out of the stock, Contact shop owner or staffs to refill the stock.", - "purchase-out-of-space": "&cThis shop run out of the space, Contact shop owner or staffs to empty the shop." + "purchase-out-of-stock": "&c이 상점은 재고가 다 떨어졌으니 주인에게 문의하여 재고보충을 요구해주세요.", + "purchase-out-of-space": "&c이 상점은 공간이 부족하니 주인에게 문의하여 상자를 비우라고 요청해주세요." } From ec0c8a0e07cb78206f2ef763c86c182d4a2484ee Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Fri, 26 Nov 2021 22:41:15 +0800 Subject: [PATCH 015/725] Try to fix sync issue --- crowdin.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/crowdin.yml b/crowdin.yml index 15ad6b03b9..eaa02e6b24 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,4 @@ +base_path: "/master" files: - source: /src/main/resources/lang/*.json translation: /crowdin/lang/%locale%/%original_file_name% From 632a22945416670c5e4410b2fd0cd0909e8441a1 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 10:53:02 +0800 Subject: [PATCH 016/725] Fix shade issue --- pom.xml | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/pom.xml b/pom.xml index 304196a3ea..90062ac6cd 100644 --- a/pom.xml +++ b/pom.xml @@ -129,6 +129,14 @@ org.checkerframework. org.maxgamer.quickshop.shade.org.checkerframework. + + org.apache.commons.lang3. + org.maxgamer.quickshop.shade.org.apache.commons.lang3. + + + org.objectweb.asm. + org.maxgamer.quickshop.shade.org.objectweb.asm. + org.slf4j. org.maxgamer.quickshop.shade.org.slf4j.slf4j. @@ -191,6 +199,38 @@ org.enginehub.squirrelid. org.maxgamer.quickshop.shade.org.enginehub.squirrelid. + + kotlin. + org.maxgamer.quickshop.shade.org.kotlin. + + + javax.annotation. + org.maxgamer.quickshop.shade.org.javax.annotation. + + + com.google.common. + org.maxgamer.quickshop.shade.com.google.common. + + + com.flowpowered.math. + org.maxgamer.quickshop.shade.com.flowpowered.math. + + + okio. + org.maxgamer.quickshop.shade.okio. + + + okhttp3. + org.maxgamer.quickshop.shade.okhttp3. + + + net.kyori.minecraft. + org.maxgamer.quickshop.shade.net.kyori.minecraft. + + + net.minidev.asm. + org.maxgamer.quickshop.shade.net.minidev.asm. + com.squareup. org.maxgamer.quickshop.shade.org.com.squareup. @@ -206,6 +246,23 @@ org.maxgamer.quickshop.javaw.bootstrap.Bootstrap + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + META-INF/*.kotlin_module + META-INF/*.txt + META-INF/proguard/* + META-INF/services/* + META-INF/versions/9/* + *License* + *LICENSE* + + + @@ -570,6 +627,12 @@ spigot-api 1.17.1-R0.1-SNAPSHOT provided + + + commons-lang + commons-lang + + me.vagdedes.spartan From 8132706d6b0af90b94de238b686b525f5a4c9f11 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 10:53:42 +0800 Subject: [PATCH 017/725] Change to common-lang3, adapt to spigot 1.18 lib changes --- pom.xml | 5 +++++ .../org/maxgamer/quickshop/QuickShop.java | 2 +- .../api/command/CommandContainer.java | 2 +- .../platform/minedown/BungeeQuickChat.java | 2 +- .../command/subcommand/SubCommand_Refill.java | 2 +- .../maxgamer/quickshop/database/DataType.java | 2 +- .../eventmanager/QSEventManager.java | 2 +- .../distributions/MojangDistribution.java | 2 +- .../quickshop/shop/InventoryPreview.java | 2 +- .../maxgamer/quickshop/shop/ShopLoader.java | 2 +- .../quickshop/shop/SimpleShopManager.java | 2 +- .../org/maxgamer/quickshop/util/MsgUtil.java | 2 +- .../maxgamer/quickshop/util/TextSplitter.java | 2 +- .../org/maxgamer/quickshop/util/Util.java | 2 +- .../BuiltInEconomyFormatter.java | 2 +- .../economyformatter/EconomyFormatter.java | 2 +- .../util/envcheck/ResultContainer.java | 2 +- .../util/hack/packet/SignPacketHack.java | 2 +- .../matcher/item/BukkitItemMatcherImpl.java | 2 +- .../item/QuickShopItemMatcherImpl.java | 2 +- .../watcher/DisplayAutoDespawnWatcher.java | 19 +++++++------------ 21 files changed, 31 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 90062ac6cd..0f561801f9 100644 --- a/pom.xml +++ b/pom.xml @@ -634,6 +634,11 @@ + + org.apache.commons + commons-lang3 + 3.12.0 + me.vagdedes.spartan SpartanAPI diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index a97074ea45..14b65354d1 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -29,7 +29,7 @@ import lombok.Setter; import me.minebuilders.clearlag.Clearlag; import me.minebuilders.clearlag.listeners.ItemMergeListener; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.PluginCommand; diff --git a/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java b/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java index 1f2ac20f54..6a654170e0 100644 --- a/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java +++ b/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java @@ -22,7 +22,7 @@ import lombok.Builder; import lombok.Data; import lombok.Singular; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; 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 3ac2515113..9b125c8750 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 @@ -22,7 +22,7 @@ import lombok.AllArgsConstructor; import net.md_5.bungee.api.chat.*; import net.md_5.bungee.chat.ComponentSerializer; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java index c4c8e24b8d..a23f13f6ba 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java @@ -20,7 +20,7 @@ package org.maxgamer.quickshop.command.subcommand; import lombok.AllArgsConstructor; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.util.BlockIterator; diff --git a/src/main/java/org/maxgamer/quickshop/database/DataType.java b/src/main/java/org/maxgamer/quickshop/database/DataType.java index 0970b84f7e..3dc571a939 100644 --- a/src/main/java/org/maxgamer/quickshop/database/DataType.java +++ b/src/main/java/org/maxgamer/quickshop/database/DataType.java @@ -1,7 +1,7 @@ package org.maxgamer.quickshop.database; import lombok.Getter; -import org.apache.commons.lang.Validate; +import org.apache.commons.lang3.Validate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java b/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java index f150109138..24b140bda9 100644 --- a/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java +++ b/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java @@ -20,7 +20,7 @@ package org.maxgamer.quickshop.eventmanager; import lombok.AllArgsConstructor; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.event.*; import org.bukkit.event.server.PluginDisableEvent; diff --git a/src/main/java/org/maxgamer/quickshop/localization/game/game/distributions/MojangDistribution.java b/src/main/java/org/maxgamer/quickshop/localization/game/game/distributions/MojangDistribution.java index d1a4f8e2b3..c9658802b6 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/game/game/distributions/MojangDistribution.java +++ b/src/main/java/org/maxgamer/quickshop/localization/game/game/distributions/MojangDistribution.java @@ -26,7 +26,7 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; diff --git a/src/main/java/org/maxgamer/quickshop/shop/InventoryPreview.java b/src/main/java/org/maxgamer/quickshop/shop/InventoryPreview.java index d877ab0446..a897aa3098 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/InventoryPreview.java +++ b/src/main/java/org/maxgamer/quickshop/shop/InventoryPreview.java @@ -21,7 +21,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.ChatColor; import org.bukkit.NamespacedKey; import org.bukkit.entity.HumanEntity; diff --git a/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java b/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java index 0b485a14df..cf21fe4740 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java @@ -24,7 +24,7 @@ import com.google.gson.JsonSyntaxException; import lombok.Getter; import lombok.Setter; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; diff --git a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java index ea2a16bb60..45b539eb18 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java +++ b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java @@ -26,7 +26,7 @@ import com.google.common.collect.Sets; import io.papermc.lib.PaperLib; import lombok.Getter; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index 3ad2267f5e..ed62eee957 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -28,7 +28,7 @@ import lombok.Getter; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.TranslatableComponent; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; diff --git a/src/main/java/org/maxgamer/quickshop/util/TextSplitter.java b/src/main/java/org/maxgamer/quickshop/util/TextSplitter.java index 89f70a765b..e1b2e79f73 100644 --- a/src/main/java/org/maxgamer/quickshop/util/TextSplitter.java +++ b/src/main/java/org/maxgamer/quickshop/util/TextSplitter.java @@ -24,7 +24,7 @@ import lombok.SneakyThrows; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import java.nio.charset.StandardCharsets; import java.util.Base64; diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 8dbf806e0b..401f116945 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -30,7 +30,7 @@ import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; diff --git a/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java b/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java index 2102a6b4b7..8b351918c7 100644 --- a/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java +++ b/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java @@ -19,7 +19,7 @@ package org.maxgamer.quickshop.util.economyformatter; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.util.MsgUtil; diff --git a/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java b/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java index 8771172e08..923956bc3e 100644 --- a/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java +++ b/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java @@ -19,7 +19,7 @@ package org.maxgamer.quickshop.util.economyformatter; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.World; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/org/maxgamer/quickshop/util/envcheck/ResultContainer.java b/src/main/java/org/maxgamer/quickshop/util/envcheck/ResultContainer.java index 22bcb8680a..e4c30c5713 100644 --- a/src/main/java/org/maxgamer/quickshop/util/envcheck/ResultContainer.java +++ b/src/main/java/org/maxgamer/quickshop/util/envcheck/ResultContainer.java @@ -19,7 +19,7 @@ package org.maxgamer.quickshop.util.envcheck; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/org/maxgamer/quickshop/util/hack/packet/SignPacketHack.java b/src/main/java/org/maxgamer/quickshop/util/hack/packet/SignPacketHack.java index b04ef43cab..e464d1a93e 100644 --- a/src/main/java/org/maxgamer/quickshop/util/hack/packet/SignPacketHack.java +++ b/src/main/java/org/maxgamer/quickshop/util/hack/packet/SignPacketHack.java @@ -6,7 +6,7 @@ //import com.bergerkiller.bukkit.common.utils.BlockUtil; //import com.bergerkiller.bukkit.common.utils.PacketUtil; //import net.md_5.bungee.chat.ComponentSerializer; -//import org.apache.commons.lang.Validate; +//import org.apache.commons.lang3.Validate; //import org.bukkit.Bukkit; //import org.bukkit.block.Sign; //import org.bukkit.entity.Player; diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java index cc37661749..91e62789c4 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java @@ -21,7 +21,7 @@ import de.tr7zw.nbtapi.NBTItem; import lombok.AllArgsConstructor; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java index 65bbf4e5f3..d068d163d5 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java @@ -22,7 +22,7 @@ import de.leonhard.storage.sections.FlatFileSection; import de.tr7zw.nbtapi.NBTItem; import lombok.AllArgsConstructor; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.attribute.Attribute; import org.bukkit.block.ShulkerBox; import org.bukkit.enchantments.Enchantment; diff --git a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java index 0492de125a..6ca625e7db 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java @@ -26,6 +26,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; +import org.maxgamer.quickshop.api.shop.AbstractDisplayItem; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.util.Util; import org.maxgamer.quickshop.util.reload.ReloadResult; @@ -61,7 +62,8 @@ public void run() { continue; } World world = shop.getLocation().getWorld(); //Cache this, because it will took some time. - if (shop.getDisplay() != null) { + AbstractDisplayItem displayItem=shop.getDisplay(); + if (displayItem != null) { // Check the range has player? boolean anyPlayerInRegion = false; for (Player player : Bukkit.getOnlinePlayers()) { @@ -71,7 +73,7 @@ public void run() { } } if (anyPlayerInRegion) { - if (!shop.getDisplay().isSpawned()) { + if (!displayItem.isSpawned()) { Util.debugLog( "Respawning the shop " + shop @@ -80,26 +82,19 @@ public void run() { } } else if (shop.getDisplay().isSpawned()) { removeDisplayItemDelayed(shop); + } } } } - public boolean removeDisplayItemDelayed(Shop shop) { + public void removeDisplayItemDelayed(Shop shop) { if (shop.getDisplay() != null) { - if (shop.getDisplay().isPendingRemoval()) { - // Actually remove the pending display - //Util.debugLog("Removing the shop " + shop + " the display, cause nobody can see it"); - Util.mainThreadRun(() -> shop.getDisplay().remove()); - return true; - } else { // Delayed to next calling //Util.debugLog("Pending to remove the shop " + shop + " the display, cause nobody can see it"); shop.getDisplay().pendingRemoval(); - return false; } - } - return false; + } } From 75778bab3bf67e9aecff3e28a95be3748689970c Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 10:55:01 +0800 Subject: [PATCH 018/725] Revert wrong changes --- .../watcher/DisplayAutoDespawnWatcher.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java index 6ca625e7db..0492de125a 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java @@ -26,7 +26,6 @@ import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.shop.AbstractDisplayItem; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.util.Util; import org.maxgamer.quickshop.util.reload.ReloadResult; @@ -62,8 +61,7 @@ public void run() { continue; } World world = shop.getLocation().getWorld(); //Cache this, because it will took some time. - AbstractDisplayItem displayItem=shop.getDisplay(); - if (displayItem != null) { + if (shop.getDisplay() != null) { // Check the range has player? boolean anyPlayerInRegion = false; for (Player player : Bukkit.getOnlinePlayers()) { @@ -73,7 +71,7 @@ public void run() { } } if (anyPlayerInRegion) { - if (!displayItem.isSpawned()) { + if (!shop.getDisplay().isSpawned()) { Util.debugLog( "Respawning the shop " + shop @@ -82,19 +80,26 @@ public void run() { } } else if (shop.getDisplay().isSpawned()) { removeDisplayItemDelayed(shop); - } } } } - public void removeDisplayItemDelayed(Shop shop) { + public boolean removeDisplayItemDelayed(Shop shop) { if (shop.getDisplay() != null) { + if (shop.getDisplay().isPendingRemoval()) { + // Actually remove the pending display + //Util.debugLog("Removing the shop " + shop + " the display, cause nobody can see it"); + Util.mainThreadRun(() -> shop.getDisplay().remove()); + return true; + } else { // Delayed to next calling //Util.debugLog("Pending to remove the shop " + shop + " the display, cause nobody can see it"); shop.getDisplay().pendingRemoval(); + return false; } - + } + return false; } } From f1dddd2a468f7f7ab7720bfb9e952220cdf37da7 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 10:56:35 +0800 Subject: [PATCH 019/725] Volatile the dev-mode, prevent some issues --- src/main/java/org/maxgamer/quickshop/util/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 401f116945..1c19f421bf 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -89,7 +89,7 @@ public class Util { private static final ThreadLocal MINEDOWN = ThreadLocal.withInitial(() -> new MineDown("")); private static int BYPASSED_CUSTOM_STACKSIZE = -1; private static Yaml yaml = null; - private static Boolean devMode = null; + private volatile static Boolean devMode = null; @Setter private static QuickShop plugin; @Getter From 3e710974624f23d50692afde715a831f3b4214e7 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 11:01:35 +0800 Subject: [PATCH 020/725] Target to 1.18-rc3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0f561801f9..66776ad702 100644 --- a/pom.xml +++ b/pom.xml @@ -625,7 +625,7 @@ org.spigotmc spigot-api - 1.17.1-R0.1-SNAPSHOT + 1.18-rc3-R0.1-SNAPSHOT provided From 207b385c8c6cd599b69097abe5f0ac305663fada Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 11:08:04 +0800 Subject: [PATCH 021/725] Remove lombok.NonNull and javax.annotation.Nonnull usage --- .../java/org/maxgamer/quickshop/Cache.java | 3 +- .../quickshop/database/DatabaseTask.java | 4 +-- .../org/maxgamer/quickshop/util/JsonUtil.java | 36 +++++++++---------- .../org/maxgamer/quickshop/util/Util.java | 3 +- .../quickshop/watcher/LogWatcher.java | 4 +-- 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/Cache.java b/src/main/java/org/maxgamer/quickshop/Cache.java index 453239551e..ec8c43e21c 100644 --- a/src/main/java/org/maxgamer/quickshop/Cache.java +++ b/src/main/java/org/maxgamer/quickshop/Cache.java @@ -24,7 +24,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import org.bukkit.Location; -import org.checkerframework.checker.nullness.qual.NonNull; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.api.shop.Shop; @@ -50,7 +49,7 @@ public Cache(QuickShop plugin) { this.plugin = plugin; } - public @NonNull CacheStats getStats() { + public @NotNull CacheStats getStats() { return accessCaching.stats(); } diff --git a/src/main/java/org/maxgamer/quickshop/database/DatabaseTask.java b/src/main/java/org/maxgamer/quickshop/database/DatabaseTask.java index d2eeb97ce7..5bbd7739bd 100644 --- a/src/main/java/org/maxgamer/quickshop/database/DatabaseTask.java +++ b/src/main/java/org/maxgamer/quickshop/database/DatabaseTask.java @@ -20,8 +20,8 @@ package org.maxgamer.quickshop.database; -import lombok.NonNull; import lombok.ToString; +import org.jetbrains.annotations.NotNull; import java.sql.Connection; import java.sql.PreparedStatement; @@ -46,7 +46,7 @@ public DatabaseTask(String statement) { } - public void run(@NonNull Connection connection) { + public void run(@NotNull Connection connection) { try (PreparedStatement ps = connection.prepareStatement(statement)) { //TODO Use addBatch to improve performance task.edit(ps); ps.execute(); diff --git a/src/main/java/org/maxgamer/quickshop/util/JsonUtil.java b/src/main/java/org/maxgamer/quickshop/util/JsonUtil.java index 6f2a133b9d..56480bd671 100644 --- a/src/main/java/org/maxgamer/quickshop/util/JsonUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/JsonUtil.java @@ -25,8 +25,8 @@ import me.lucko.helper.gson.typeadapters.GsonSerializableAdapterFactory; import me.lucko.helper.gson.typeadapters.JsonElementTreeSerializer; import me.lucko.helper.text3.serializer.gson.GsonComponentSerializer; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nonnull; import java.io.Reader; import java.util.Objects; @@ -65,7 +65,7 @@ public static Gson regular() { return REGULAR_GSON; } - @Nonnull + @NotNull public static Gson standard() { return STANDARD_GSON; } @@ -74,60 +74,60 @@ public static Gson getGson() { return STANDARD_GSON; } - @Nonnull + @NotNull public static Gson prettyPrinting() { return PRETTY_PRINT_GSON; } - @Nonnull + @NotNull public static JsonParser parser() { return PARSER; } - @Nonnull - public static JsonObject readObject(@Nonnull Reader reader) { + @NotNull + public static JsonObject readObject(@NotNull Reader reader) { return PARSER.parse(reader).getAsJsonObject(); } - @Nonnull - public static JsonObject readObject(@Nonnull String s) { + @NotNull + public static JsonObject readObject(@NotNull String s) { return PARSER.parse(s).getAsJsonObject(); } - public static void writeObject(@Nonnull Appendable writer, @Nonnull JsonObject object) { + public static void writeObject(@NotNull Appendable writer, @NotNull JsonObject object) { standard().toJson(object, writer); } - public static void writeObjectPretty(@Nonnull Appendable writer, @Nonnull JsonObject object) { + public static void writeObjectPretty(@NotNull Appendable writer, @NotNull JsonObject object) { prettyPrinting().toJson(object, writer); } - public static void writeElement(@Nonnull Appendable writer, @Nonnull JsonElement element) { + public static void writeElement(@NotNull Appendable writer, @NotNull JsonElement element) { standard().toJson(element, writer); } - public static void writeElementPretty(@Nonnull Appendable writer, @Nonnull JsonElement element) { + public static void writeElementPretty(@NotNull Appendable writer, @NotNull JsonElement element) { prettyPrinting().toJson(element, writer); } - @Nonnull - public static String toString(@Nonnull JsonElement element) { + @NotNull + public static String toString(@NotNull JsonElement element) { return Objects.requireNonNull(standard().toJson(element)); } - @Nonnull - public static String toStringPretty(@Nonnull JsonElement element) { + @NotNull + public static String toStringPretty(@NotNull JsonElement element) { return Objects.requireNonNull(prettyPrinting().toJson(element)); } - @Nonnull + @NotNull @Deprecated public static Gson get() { return standard(); } - @Nonnull + @NotNull @Deprecated public static Gson getPrettyPrinting() { return prettyPrinting(); diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 1c19f421bf..3495d03978 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -24,7 +24,6 @@ import de.themoep.minedown.MineDownParser; import io.papermc.lib.PaperLib; import lombok.Getter; -import lombok.NonNull; import lombok.Setter; import lombok.SneakyThrows; import net.md_5.bungee.api.ChatColor; @@ -353,7 +352,7 @@ public static void debugLog(@NotNull String... logs) { * @return the right side for given blockFace, UP and DOWN will return itself */ @NotNull - public static BlockFace getRightSide(@NonNull BlockFace blockFace) { + public static BlockFace getRightSide(@NotNull BlockFace blockFace) { switch (blockFace) { case EAST: return BlockFace.SOUTH; diff --git a/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java index d0af43ebae..54abd2c4d5 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java @@ -19,11 +19,11 @@ package org.maxgamer.quickshop.watcher; -import lombok.NonNull; import lombok.SneakyThrows; import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream; import org.apache.commons.compress.compressors.gzip.GzipParameters; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; import java.io.*; @@ -106,7 +106,7 @@ public void close() { } } - public void log(@NonNull String log) { + public void log(@NotNull String log) { logs.add("[" + DATETIME_FORMATTER.format(Instant.now()) + "] " + log); } From 9505a677deb62601e7931f7576ea32e780716472 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 11:38:46 +0800 Subject: [PATCH 022/725] Fix auto despawn watcher --- .../org/maxgamer/quickshop/QuickShop.java | 4 +- .../watcher/DisplayAutoDespawnWatcher.java | 40 ++++++------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 14b65354d1..95991d5e9e 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -226,6 +226,7 @@ public class QuickShop extends JavaPlugin implements QuickShopAPI { private @Deprecated DisplayDupeRemoverWatcher displayDupeRemoverWatcher; @Getter + @Deprecated private boolean enabledAsyncDisplayDespawn; @Getter private Plugin blockHubPlugin; @@ -839,10 +840,9 @@ public final void onEnable() { permissionManager = new PermissionManager(this); // This should be inited before shop manager if (this.display && getConfiguration().getBoolean("shop.display-auto-despawn")) { - this.enabledAsyncDisplayDespawn = true; this.displayAutoDespawnWatcher = new DisplayAutoDespawnWatcher(this); //BUKKIT METHOD SHOULD ALWAYS EXECUTE ON THE SERVER MAIN THEAD - this.displayAutoDespawnWatcher.runTaskTimer(this, 20, getConfiguration().getInt("shop.display-check-time")); // not worth async + timerTaskList.add(this.displayAutoDespawnWatcher.runTaskTimer(this, 20, getConfiguration().getInt("shop.display-check-time"))); // not worth async } getLogger().info("Registering commands..."); diff --git a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java index 0492de125a..9652cbbe16 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java @@ -21,11 +21,13 @@ import lombok.AllArgsConstructor; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; +import org.maxgamer.quickshop.api.shop.AbstractDisplayItem; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.util.Util; import org.maxgamer.quickshop.util.reload.ReloadResult; @@ -56,50 +58,32 @@ public ReloadResult reloadModule() { @Override public void run() { for (Shop shop : plugin.getShopManager().getLoadedShops()) { - //Shop may deleted or unloaded when iterating + //Shop may be deleted or unloaded when iterating if (shop.isDeleted() || !shop.isLoaded()) { continue; } + Location location = shop.getLocation(); World world = shop.getLocation().getWorld(); //Cache this, because it will took some time. - if (shop.getDisplay() != null) { + AbstractDisplayItem displayItem = shop.getDisplay(); + if (displayItem != null) { // Check the range has player? boolean anyPlayerInRegion = false; for (Player player : Bukkit.getOnlinePlayers()) { - if ((player.getWorld() == world) && (player.getLocation().distance(shop.getLocation()) < range)) { + if ((player.getWorld() == world) && (player.getLocation().distance(location) <= range)) { anyPlayerInRegion = true; break; } } if (anyPlayerInRegion) { - if (!shop.getDisplay().isSpawned()) { - Util.debugLog( - "Respawning the shop " - + shop - + " the display, cause it was despawned and a player close to it"); - Util.mainThreadRun(() -> shop.getDisplay().spawn()); + if (!displayItem.isSpawned()) { + Util.debugLog("Respawning the shop " + shop + " the display, cause it was despawned and a player close to it"); + displayItem.spawn(); } - } else if (shop.getDisplay().isSpawned()) { - removeDisplayItemDelayed(shop); + } else if (displayItem.isSpawned()) { + displayItem.remove(); } } } } - public boolean removeDisplayItemDelayed(Shop shop) { - if (shop.getDisplay() != null) { - if (shop.getDisplay().isPendingRemoval()) { - // Actually remove the pending display - //Util.debugLog("Removing the shop " + shop + " the display, cause nobody can see it"); - Util.mainThreadRun(() -> shop.getDisplay().remove()); - return true; - } else { - // Delayed to next calling - //Util.debugLog("Pending to remove the shop " + shop + " the display, cause nobody can see it"); - shop.getDisplay().pendingRemoval(); - return false; - } - } - return false; - } - } From fb2baa02b319c9141caf9c8373e9f87e4ba0f182 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 11:39:04 +0800 Subject: [PATCH 023/725] Deprecated DisplayWatcher --- .../org/maxgamer/quickshop/QuickShop.java | 23 ++++++++++++++++--- .../quickshop/watcher/DisplayWatcher.java | 23 ++----------------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 95991d5e9e..37950c15d7 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -166,6 +166,7 @@ public class QuickShop extends JavaPlugin implements QuickShopAPI { @Getter private int displayItemCheckTicks; @Getter + @Deprecated private DisplayWatcher displayWatcher; /** * The economy we hook into for transactions @@ -904,10 +905,25 @@ public final void onEnable() { new EconomySetupListener(this).register(); InternalListener internalListener = new InternalListener(this); internalListener.register(); - ongoingFeeWatcher = new OngoingFeeWatcher(this); if (this.display && AbstractDisplayItem.getNowUsing() != DisplayType.VIRTUALITEM) { - displayWatcher = new DisplayWatcher(this); + if (getConfiguration().getInt("shop.display-items-check-ticks") < 3000) { + getLogger().severe("Shop.display-items-check-ticks is too low! It may cause HUGE lag! Pick a number > 3000"); + } + if (getDisplayItemCheckTicks() > 0) { + getLogger().info("Registering DisplayCheck task...."); + timerTaskList.add(getServer().getScheduler().runTaskTimer(this, () -> { + for (Shop shop : getShopManager().getLoadedShops()) { + //Shop may be deleted or unloaded when iterating + if (shop.isDeleted() || !shop.isLoaded()) { + continue; + } + shop.checkDisplay(); + } + }, 1L, getDisplayItemCheckTicks())); + } else { + getLogger().severe("Shop.display-items-check-ticks is invalid! Pick a number > 3000"); + } new DisplayProtectionListener(this, this.shopCache).register(); if (Bukkit.getPluginManager().getPlugin("ClearLag") != null) { new ClearLaggListener(this).register(); @@ -945,8 +961,9 @@ public void run() { getLogger().info("Log actions is enabled, actions will log in the qs.log file!"); } if (getConfiguration().getBoolean("shop.ongoing-fee.enable")) { - getLogger().info("Ongoing fee feature is enabled."); + ongoingFeeWatcher = new OngoingFeeWatcher(this); timerTaskList.add(ongoingFeeWatcher.runTaskTimerAsynchronously(this, 0, getConfiguration().getInt("shop.ongoing-fee.ticks"))); + getLogger().info("Ongoing fee feature is enabled."); } integrationHelper.searchAndRegisterPlugins(); this.integrationHelper.callIntegrationsLoad(IntegrateStage.onEnableAfter); diff --git a/src/main/java/org/maxgamer/quickshop/watcher/DisplayWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/DisplayWatcher.java index 77bd7c2131..5903423027 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/DisplayWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/DisplayWatcher.java @@ -21,11 +21,9 @@ import lombok.Data; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.shop.AbstractDisplayItem; -import org.maxgamer.quickshop.api.shop.DisplayType; -import org.maxgamer.quickshop.api.shop.Shop; @Data +@Deprecated public class DisplayWatcher { private QuickShop plugin; @@ -34,24 +32,7 @@ public DisplayWatcher(QuickShop plugin) { registerTask(); } + private void registerTask() { - plugin.getLogger().info("Registering DisplayCheck task...."); - if (AbstractDisplayItem.getNowUsing() == DisplayType.VIRTUALITEM) { - return; - } - if (plugin.isDisplayEnabled() && plugin.getDisplayItemCheckTicks() > 0) { - plugin.getServer().getScheduler().runTaskTimer(plugin, () -> { - if (plugin.getConfiguration().getInt("shop.display-items-check-ticks") < 3000) { - plugin.getLogger().severe("Shop.display-items-check-ticks is too low! It may cause HUGE lag! Pick a number > 3000"); - } - for (Shop shop : plugin.getShopManager().getLoadedShops()) { - //Shop may be deleted or unloaded when iterating - if (shop.isDeleted() || !shop.isLoaded()) { - continue; - } - shop.checkDisplay(); - } - }, 1L, plugin.getDisplayItemCheckTicks()); - } } } From 82d2895470bfbfe9e2bdf6f066cd40fcd8b6710d Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 11:50:33 +0800 Subject: [PATCH 024/725] Re-add "Enchantment name shows on enchanted books" feature --- .../org/maxgamer/quickshop/shop/ContainerShop.java | 4 +++- src/main/java/org/maxgamer/quickshop/util/Util.java | 12 +++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index c919dcc2fb..e5f7859197 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -753,10 +753,12 @@ public List getSignText(@NotNull String locale) { .create())); } else { // NBTAPI installed + String itemName = Util.getItemCustomName(getItem()); + BaseComponent[] itemComponents = itemName == null ? new BaseComponent[]{new TranslatableComponent(ReflectFactory.getMaterialMinecraftNamespacedKey(getItem().getType()))} : TextComponent.fromLegacyText(itemName); lines.add(new ComponentPackage(new ComponentBuilder() .color(ChatColor.RESET) .append(left) - .append(new TranslatableComponent(ReflectFactory.getMaterialMinecraftNamespacedKey(getItem().getType()))) + .append(itemComponents) .append(right) .create())); } diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 3495d03978..fb9faac97b 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -411,8 +411,8 @@ public static boolean useEnchantmentForEnchantedBook() { return plugin.getConfiguration().getBoolean("shop.use-enchantment-for-enchanted-book"); } - @NotNull - public static String getItemStackName(@NotNull ItemStack itemStack) { + @Nullable + public static String getItemCustomName(@NotNull ItemStack itemStack) { if (useEnchantmentForEnchantedBook() && itemStack.getType() == Material.ENCHANTED_BOOK) { ItemMeta meta = itemStack.getItemMeta(); if (meta instanceof EnchantmentStorageMeta && ((EnchantmentStorageMeta) meta).hasStoredEnchants()) { @@ -424,7 +424,13 @@ public static String getItemStackName(@NotNull ItemStack itemStack) { && !QuickShop.getInstance().getConfiguration().getBoolean("shop.force-use-item-original-name")) { return itemStack.getItemMeta().getDisplayName(); } - return MsgUtil.getItemi18n(itemStack.getType().name()); + return null; + } + + @NotNull + public static String getItemStackName(@NotNull ItemStack itemStack) { + String result = getItemCustomName(itemStack); + return result == null ? MsgUtil.getItemi18n(itemStack.getType().name()) : result; } @NotNull From 34ff52a9588ac6e981a73545570fd92e3f9517c6 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 12:34:20 +0800 Subject: [PATCH 025/725] Fix ShopPurger --- .../org/maxgamer/quickshop/QuickShop.java | 4 +- .../command/subcommand/SubCommand_Purge.java | 2 +- .../maxgamer/quickshop/shop/ShopPurger.java | 75 ++++++++++++------- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 37950c15d7..1454111a46 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -982,8 +982,8 @@ public void run() { calendarWatcher = new CalendarWatcher(this); calendarWatcher.start(); tpsWatcher.runTaskTimer(this, 1000, 50); - this.shopPurger = new ShopPurger(this, false); - shopPurger.runTaskAsynchronously(this); + this.shopPurger = new ShopPurger(this); + shopPurger.purge(); Util.debugLog("Now using display-type: " + AbstractDisplayItem.getNowUsing().name()); getLogger().info("QuickShop Loaded! " + enableTimer.stopAndGetTimePassed() + " ms."); } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Purge.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Purge.java index fe2efb7c31..5495351bda 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Purge.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Purge.java @@ -32,7 +32,7 @@ public class SubCommand_Purge implements CommandHandler { @Override public void onCommand(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - plugin.getShopPurger().runTaskAsynchronously(plugin); + plugin.getShopPurger().purge(); plugin.text().of(sender, "shop-purged-start").send(); } diff --git a/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java b/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java index 5ed24ad5f2..263cb0ca47 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java @@ -19,34 +19,45 @@ package org.maxgamer.quickshop.shop; -import lombok.AllArgsConstructor; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.scheduler.BukkitRunnable; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.api.economy.EconomyTransaction; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.util.Util; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; -@AllArgsConstructor -public class ShopPurger extends BukkitRunnable { + +public class ShopPurger implements Runnable { private final QuickShop plugin; private volatile boolean executing; - @Override - public void run() { - Util.ensureThread(true); + public ShopPurger(QuickShop plugin) { + this.plugin = plugin; + } + + public void purge() { + if (!plugin.getConfiguration().getBoolean("purge.enabled")) { + plugin.getLogger().info("[Shop Purger] Purge not enabled!"); + return; + } if (executing) { plugin.getLogger().info("[Shop Purger] Another purge task still running!"); - return; + } else { + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, this); } + } + + @Override + @Deprecated + public void run() { + Util.ensureThread(true); executing = true; - if (!plugin.getConfiguration().getBoolean("purge.enabled")) { - return; - } Util.debugLog("[Shop Purger] Scanning and removing shops"); + List pendingRemovalShops = new ArrayList<>(); int days = plugin.getConfiguration().getOrDefault("purge.days", 360); boolean deleteBanned = plugin.getConfiguration().getBoolean("purge.banned"); boolean skipOp = plugin.getConfiguration().getBoolean("purge.skip-op"); @@ -76,23 +87,33 @@ public void run() { if (!markDeletion) { continue; } - plugin.getLogger().info("[Shop Purger] Shop " + shop + " has been purged."); - shop.delete(false); - if (returnCreationFee) { - EconomyTransaction transaction = - EconomyTransaction.builder() - .amount(plugin.getConfiguration().getDouble("shop.cost")) - .allowLoan(false) - .core(QuickShop.getInstance().getEconomy()) - .currency(shop.getCurrency()) - .world(shop.getLocation().getWorld()) - .to(shop.getOwner()) - .build(); - transaction.failSafeCommit(); - } + pendingRemovalShops.add(shop); + } + if (pendingRemovalShops.size() > 0) { + plugin.getLogger().info("[Shop Purger] Found " + pendingRemovalShops.size() + " need to removed, will remove in the next tick."); + plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + for (Shop shop : pendingRemovalShops) { + shop.delete(false); + if (returnCreationFee) { + EconomyTransaction transaction = + EconomyTransaction.builder() + .amount(plugin.getConfiguration().getDouble("shop.cost")) + .allowLoan(false) + .core(QuickShop.getInstance().getEconomy()) + .currency(shop.getCurrency()) + .world(shop.getLocation().getWorld()) + .to(shop.getOwner()) + .build(); + transaction.failSafeCommit(); + } + plugin.getLogger().info("[Shop Purger] Shop " + shop + " has been purged."); + } + plugin.getLogger().info("[Shop Purger] Task completed, " + pendingRemovalShops.size() + " shops was purged"); + executing = false; + }, 1L); + } else { + plugin.getLogger().info("[Shop Purger] Task completed, No shops need to purge."); executing = false; - plugin.getLogger().info("[Shop Purger] Task completed"); } - } } From a9820e22dbe5b92d070256533478cfaa1435d5cb Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sat, 27 Nov 2021 12:48:28 +0800 Subject: [PATCH 026/725] Update crowdin.yml --- crowdin.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/crowdin.yml b/crowdin.yml index eaa02e6b24..15ad6b03b9 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,4 +1,3 @@ -base_path: "/master" files: - source: /src/main/resources/lang/*.json translation: /crowdin/lang/%locale%/%original_file_name% From 91f6cf681072bc4287029939234f289b5144ed20 Mon Sep 17 00:00:00 2001 From: nikomaru <76208219+nlkomaru@users.noreply.github.com> Date: Sat, 27 Nov 2021 17:12:07 +0900 Subject: [PATCH 027/725] Fixed a bug in which the Find command would display the result multiple times. --- .../maxgamer/quickshop/command/subcommand/SubCommand_Find.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java index f4c9b8b8f4..65707387a2 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java @@ -134,8 +134,8 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not String.valueOf(location.getBlockZ()), String.valueOf(shopDoubleEntry.getValue().intValue()) ).forLocale()).append("\n"); - MsgUtil.sendDirectMessage(sender, stringBuilder.toString()); } + MsgUtil.sendDirectMessage(sender, stringBuilder.toString()); } } } From 06df37a59ba8c5e5ba0c49573c3bfedd2df0c0e9 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 27 Nov 2021 17:50:18 +0800 Subject: [PATCH 028/725] Fix case-sensitive and underscore issue in enabled languages --- .../quickshop/localization/text/SimpleTextManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 6ed634e362..9713540cde 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -124,6 +124,10 @@ public void load() { distribution.getAvailableLanguages(); // Make a request that loading the manifest to create manifest cache for // parallel threads List enabledLanguagesRegex = plugin.getConfiguration().getStringList("enabled-languages"); + //Make sure is a lowercase regex, prevent case-sensitive and underscore issue + for (int i = 0; i < enabledLanguagesRegex.size(); i++) { + enabledLanguagesRegex.set(i, enabledLanguagesRegex.get(i).toLowerCase(Locale.ROOT).replace("-", "_")); + } // Multi File and Multi-Language loader // Offline Initiated mapper.deployBundled("/master/crowdin/lang/%locale%/messages.json", loadBundled("/master/crowdin/lang/%locale%/messages.json")); From 5d40940dada288b207c276ee41177c978cc68570 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 28 Nov 2021 00:33:34 +0800 Subject: [PATCH 029/725] Fix NoClassDefFoundError not handled by catch statement --- src/main/java/org/maxgamer/quickshop/QuickShop.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 1454111a46..503a384c12 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -498,7 +498,7 @@ public boolean loadEcon() { return false; } economy = ServiceInjector.getEconomy(economy); - } catch (Exception e) { + } catch (Throwable e) { this.getSentryErrorReporter().ignoreThrow(); getLogger().log(Level.WARNING, "Something going wrong when loading up economy system", e); getLogger().severe("QuickShop could not hook into a economy/Not found Vault or Reserve!"); From 0246560a307ec88ec5a8397bfcf29f682e8abf88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:33:49 +0000 Subject: [PATCH 030/725] Bump junit-jupiter-api from 5.8.1 to 5.8.2 Bumps [junit-jupiter-api](https://github.com/junit-team/junit5) from 5.8.1 to 5.8.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 66776ad702..32ac7f9984 100644 --- a/pom.xml +++ b/pom.xml @@ -587,7 +587,7 @@ org.junit.jupiter junit-jupiter-api - 5.8.1 + 5.8.2 test From 363241bc64c16cd2630fb8b8e12e8c8c7d3f3c6e Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Wed, 1 Dec 2021 18:07:05 +0800 Subject: [PATCH 031/725] Adapt to 1.18 --- .../org/maxgamer/quickshop/QuickShop.java | 5 +- .../maxgamer/quickshop/util/GameVersion.java | 1 + .../quickshop/util/ReflectFactory.java | 69 +++++++++++++------ 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 503a384c12..babb09595f 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -121,7 +121,7 @@ public class QuickShop extends JavaPlugin implements QuickShopAPI { /* Public QuickShop API */ private final SimpleCompatibilityManager compatibilityTool = new SimpleCompatibilityManager(this); private final Map limits = new HashMap<>(15); - private final GameVersion gameVersion = GameVersion.get(ReflectFactory.getNMSVersion()); + private GameVersion gameVersion; /** * The shop limites. */ @@ -2105,6 +2105,9 @@ public Map getLimits() { @Override public GameVersion getGameVersion() { + if (gameVersion == null) { + gameVersion = GameVersion.get(ReflectFactory.getNMSVersion()); + } return this.gameVersion; } } diff --git a/src/main/java/org/maxgamer/quickshop/util/GameVersion.java b/src/main/java/org/maxgamer/quickshop/util/GameVersion.java index 898f4db161..17d43b5596 100644 --- a/src/main/java/org/maxgamer/quickshop/util/GameVersion.java +++ b/src/main/java/org/maxgamer/quickshop/util/GameVersion.java @@ -61,6 +61,7 @@ public enum GameVersion { v1_16_R3(true, false, true, false, false, false), v1_16_R4(true, false, true, false, false, false), v1_17_R1(true, false, true, true, true, true), + v1_18_R1(true, false, true, true, true, true), UNKNOWN(true, false, true, true, true, true); /** * CoreSupports - Check does QuickShop most features supports this server version diff --git a/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java b/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java index 77043efd10..22377b683d 100644 --- a/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java +++ b/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java @@ -19,6 +19,7 @@ package org.maxgamer.quickshop.util; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.command.CommandMap; @@ -30,7 +31,11 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.Arrays; +import java.util.List; import java.util.logging.Level; +import java.util.stream.Collectors; /** * ReflectFactory is library builtin QuickShop to get/execute stuff that cannot be access with BukkitAPI with reflect way. @@ -45,12 +50,12 @@ public class ReflectFactory { private static Class craftServerClass; private static Class cachedNMSClass; private static String nmsVersion; + private static Method getMinecraftKeyNameMethod; // private static Object serverInstance; // private static Field tpsField; static { - String name = Bukkit.getServer().getClass().getPackage().getName(); - String nmsVersion = name.substring(name.lastIndexOf('.') + 1); + String nmsVersion = getNMSVersion(); try { craftItemStack_asNMSCopyMethod = @@ -61,7 +66,19 @@ public class ReflectFactory { if (gameVersion.isNewNmsName()) { // 1.17+ nbtTagCompoundClass = Class.forName("net.minecraft.nbt.NBTTagCompound"); - itemStack_saveMethod = Class.forName("net.minecraft.world.item.ItemStack").getDeclaredMethod("save", nbtTagCompoundClass); + List methodList = Arrays.stream(Class.forName("net.minecraft.world.item.ItemStack").getDeclaredMethods()).filter(method -> + { + Class returnType = method.getReturnType(); + Parameter[] parameters = method.getParameters(); + //Save method sign is foo(net/minecraft/nbt/NBTTagCompound)L(net/minecraft/nbt/NBTTagCompound) + return !method.isSynthetic() && !method.isBridge() && parameters.length == 1 && returnType.equals(nbtTagCompoundClass) && parameters[0].getType().equals(nbtTagCompoundClass); + } + ).collect(Collectors.toList()); + if (methodList.size() == 1) { + itemStack_saveMethod = methodList.get(0); + } else { + throw new RuntimeException("Unable to find correct itemStack save method, got " + methodList + ", please report!"); + } } else { // Before 1.17 nbtTagCompoundClass = Class.forName("net.minecraft.server." + nmsVersion + ".NBTTagCompound"); @@ -152,7 +169,13 @@ public static String getServerVersion() { console.getClass().getSuperclass().getMethod("getVersion").invoke(console)); return cachedVersion; } catch (Exception e) { - cachedVersion = "Unknown"; + //Fallback to common substring + String[] strings = StringUtils.substringsBetween(Bukkit.getServer().getVersion(), "(MC: ", ")"); + if (strings != null && strings.length == 1) { + cachedVersion = strings[0]; + } else { + cachedVersion = "Unknown"; + } return cachedVersion; } } @@ -169,7 +192,7 @@ public static String getServerVersion() { */ @Nullable public static String convertBukkitItemStackToJson(@NotNull ItemStack bStack) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException, InstantiationException { - if (bStack.getType() == Material.AIR) { + if (bStack.getType() == Material.AIR || craftItemStack_asNMSCopyMethod == null || nbtTagCompoundClass == null) { return null; } Object mcStack = craftItemStack_asNMSCopyMethod.invoke(null, bStack); @@ -216,6 +239,7 @@ public static void syncCommands() throws NoSuchMethodException, InvocationTarget method.invoke(Bukkit.getServer(), (Object[]) null); } + @Nullable public static String getMaterialMinecraftNamespacedKey(Material material) { Object nmsItem; @@ -226,29 +250,30 @@ public static String getMaterialMinecraftNamespacedKey(Material material) { Util.debugLog("nmsItem null"); return null; } - Method getName = null; - try { - getName = nmsItem.getClass().getMethod("getName"); - } catch (NoSuchMethodException exception) { - Util.debugLog("Mapping changed during minecraft update, dynamic searching..."); - for (Method method : nmsItem.getClass().getMethods()) { - if (method.getReturnType() == String.class) { - if (method.getParameterCount() == 0) { - if (!"toString".equals(method.getName())) { - if (((String) method.invoke(nmsItem)).contains("stone") || ((String) method.invoke(nmsItem)).contains("STONE")) { - getName = method; + if (getMinecraftKeyNameMethod == null) { + try { + getMinecraftKeyNameMethod = nmsItem.getClass().getMethod("getName"); + } catch (NoSuchMethodException exception) { + Util.debugLog("Mapping changed during minecraft update, dynamic searching..."); + for (Method method : nmsItem.getClass().getMethods()) { + if (method.getReturnType() == String.class) { + if (method.getParameterCount() == 0) { + if (!"toString".equals(method.getName())) { + if (((String) method.invoke(nmsItem)).contains("stone") || ((String) method.invoke(nmsItem)).contains("STONE")) { + getMinecraftKeyNameMethod = method; + } + break; } - break; } } } } + if (getMinecraftKeyNameMethod == null) { + Util.debugLog("getMinecraftKeyNameMethod is null"); + return null; + } } - if (getName == null) { - Util.debugLog("getName is null"); - return null; - } - return (String) getName.invoke(nmsItem); + return (String) getMinecraftKeyNameMethod.invoke(nmsItem); } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); return null; From 3bdd8ad0359e21e0fd8ac75d6a6f30e4adba48fb Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Wed, 1 Dec 2021 18:51:11 +0800 Subject: [PATCH 032/725] Fix item namespace method finding issue, also fix fallback --- .../org/maxgamer/quickshop/shop/ContainerShop.java | 2 +- .../java/org/maxgamer/quickshop/util/MsgUtil.java | 2 +- .../maxgamer/quickshop/util/ReflectFactory.java | 9 +++++++-- .../java/org/maxgamer/quickshop/util/Util.java | 14 ++++++++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index e5f7859197..8ccc0297bc 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -754,7 +754,7 @@ public List getSignText(@NotNull String locale) { } else { // NBTAPI installed String itemName = Util.getItemCustomName(getItem()); - BaseComponent[] itemComponents = itemName == null ? new BaseComponent[]{new TranslatableComponent(ReflectFactory.getMaterialMinecraftNamespacedKey(getItem().getType()))} : TextComponent.fromLegacyText(itemName); + BaseComponent[] itemComponents = itemName == null ? Util.getTranslateComponentForItem(getItem()) : TextComponent.fromLegacyText(itemName); lines.add(new ComponentPackage(new ComponentBuilder() .color(ChatColor.RESET) .append(left) diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index ed62eee957..bbeff516c6 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -221,7 +221,7 @@ public static String getTranslateText(ItemStack stack) { } public static String convertItemStackToTranslateText(Material mat) { - return TextSplitter.bakeComponent(new ComponentBuilder().append(new TranslatableComponent(ReflectFactory.getMaterialMinecraftNamespacedKey(mat))).create()); + return TextSplitter.bakeComponent(new ComponentBuilder().append(Util.getTranslateComponentForMaterial(mat)).create()); } @Unstable diff --git a/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java b/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java index 22377b683d..e6fa2270b7 100644 --- a/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java +++ b/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java @@ -34,6 +34,7 @@ import java.lang.reflect.Parameter; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.logging.Level; import java.util.stream.Collectors; @@ -51,6 +52,7 @@ public class ReflectFactory { private static Class cachedNMSClass; private static String nmsVersion; private static Method getMinecraftKeyNameMethod; + private static boolean isMinecraftKeyNameMethodUnavailable = false; // private static Object serverInstance; // private static Field tpsField; @@ -239,7 +241,6 @@ public static void syncCommands() throws NoSuchMethodException, InvocationTarget method.invoke(Bukkit.getServer(), (Object[]) null); } - @Nullable public static String getMaterialMinecraftNamespacedKey(Material material) { Object nmsItem; @@ -251,6 +252,9 @@ public static String getMaterialMinecraftNamespacedKey(Material material) { return null; } if (getMinecraftKeyNameMethod == null) { + if (isMinecraftKeyNameMethodUnavailable) { + return null; + } try { getMinecraftKeyNameMethod = nmsItem.getClass().getMethod("getName"); } catch (NoSuchMethodException exception) { @@ -259,7 +263,7 @@ public static String getMaterialMinecraftNamespacedKey(Material material) { if (method.getReturnType() == String.class) { if (method.getParameterCount() == 0) { if (!"toString".equals(method.getName())) { - if (((String) method.invoke(nmsItem)).contains("stone") || ((String) method.invoke(nmsItem)).contains("STONE")) { + if (((String) method.invoke(nmsItem)).toLowerCase().contains(material.name().toLowerCase(Locale.ROOT))) { getMinecraftKeyNameMethod = method; } break; @@ -269,6 +273,7 @@ public static String getMaterialMinecraftNamespacedKey(Material material) { } } if (getMinecraftKeyNameMethod == null) { + isMinecraftKeyNameMethodUnavailable = true; Util.debugLog("getMinecraftKeyNameMethod is null"); return null; } diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index fb9faac97b..f0234255ea 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -28,6 +28,8 @@ import lombok.SneakyThrows; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; import net.md_5.bungee.chat.ComponentSerializer; import org.apache.commons.lang3.StringUtils; import org.bukkit.*; @@ -411,6 +413,18 @@ public static boolean useEnchantmentForEnchantedBook() { return plugin.getConfiguration().getBoolean("shop.use-enchantment-for-enchanted-book"); } + @NotNull + public static BaseComponent[] getTranslateComponentForItem(ItemStack stack) { + String result = ReflectFactory.getMaterialMinecraftNamespacedKey(stack.getType()); + return result == null ? TextComponent.fromLegacyText(getItemStackName(stack)) : new BaseComponent[]{new TranslatableComponent(result)}; + } + + @NotNull + public static BaseComponent[] getTranslateComponentForMaterial(Material material) { + String result = ReflectFactory.getMaterialMinecraftNamespacedKey(material); + return result == null ? TextComponent.fromLegacyText(MsgUtil.getItemi18n(material.name())) : new BaseComponent[]{new TranslatableComponent(result)}; + } + @Nullable public static String getItemCustomName(@NotNull ItemStack itemStack) { if (useEnchantmentForEnchantedBook() && itemStack.getType() == Material.ENCHANTED_BOOK) { From 7f0ed5ddea28c8a0edc96b6f6ff6f9c38e91ba07 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Thu, 2 Dec 2021 12:38:49 +0800 Subject: [PATCH 033/725] Fix caching issue, invalidate cache when getting --- .../java/org/maxgamer/quickshop/Cache.java | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/Cache.java b/src/main/java/org/maxgamer/quickshop/Cache.java index ec8c43e21c..44779f7c49 100644 --- a/src/main/java/org/maxgamer/quickshop/Cache.java +++ b/src/main/java/org/maxgamer/quickshop/Cache.java @@ -21,14 +21,13 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheStats; -import lombok.AllArgsConstructor; -import lombok.Data; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.shop.SimpleShopManager; +import java.lang.ref.WeakReference; import java.util.concurrent.TimeUnit; /** @@ -64,15 +63,20 @@ public Cache(QuickShop plugin) { @Nullable public Shop find(@NotNull Location location, boolean attached) { BoxedShop boxedShop = accessCaching.getIfPresent(location); - if (boxedShop == null) { + //Cache is invalid, generated a new one + if (boxedShop == null || !boxedShop.isValid()) { + Shop shop; if (attached) { - boxedShop = new BoxedShop(((SimpleShopManager) plugin.getShopManager()).findShopIncludeAttached(location, false)); + shop = ((SimpleShopManager) plugin.getShopManager()).findShopIncludeAttached(location, false); } else { - boxedShop = new BoxedShop(plugin.getShopManager().getShop(location)); + shop = plugin.getShopManager().getShop(location); } + setCache(location, shop); + return shop; + } else { + //Cache is valid + return boxedShop.getShop(); } - setCache(location, boxedShop.getShop()); - return boxedShop.getShop(); } /** @@ -89,13 +93,32 @@ public void invalidate(@NotNull Location location) { accessCaching.invalidate(location); } - @AllArgsConstructor - @Data - static class BoxedShop { - private Shop shop; - public boolean isPresent() { - return shop != null; + private static class BoxedShop { + @Nullable + private final WeakReference shopWeakRef; + + public BoxedShop(Shop shop) { + if (shop != null) { + this.shopWeakRef = new WeakReference<>(shop); + } else { + shopWeakRef = null; + } + } + + @Nullable + public Shop getShop() { + return shopWeakRef == null ? null : shopWeakRef.get(); + } + + public boolean isValid() { + if (shopWeakRef != null) { + Shop shop = shopWeakRef.get(); + if (shop != null) { + return shop.isValid(); + } + } + return false; } } } From af92c4fa9556f21ec5f3da3c514b21bd899e2dbb Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Thu, 2 Dec 2021 16:36:52 +0800 Subject: [PATCH 034/725] Fix case-sensitive issue in enabled languages --- .../chat/platform/minedown/BungeeQuickChat.java | 4 ++-- .../org/maxgamer/quickshop/shop/ContainerShop.java | 12 +++++------- .../java/org/maxgamer/quickshop/util/MsgUtil.java | 5 ++--- 3 files changed, 9 insertions(+), 12 deletions(-) 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 9b125c8750..4139a47e14 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 @@ -81,7 +81,7 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ TextComponent errorComponent = new TextComponent(plugin.text().of(player, "menu.item-holochat-error").forLocale()); try { String json = ReflectFactory.convertBukkitItemStackToJson(itemStack); - ComponentBuilder builder = new ComponentBuilder(); + ComponentBuilder builder = new ComponentBuilder(""); builder.event(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(json).create())); TextSplitter.SpilledString spilledString = TextSplitter.deBakeItem(text); if (spilledString == null) { @@ -110,7 +110,7 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ if (json == null) { return new QuickComponentImpl(errorComponent); } - ComponentBuilder builder = new ComponentBuilder(); + ComponentBuilder builder = new ComponentBuilder(""); builder.event(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(json).create())); TextSplitter.SpilledString spilledString = TextSplitter.deBakeItem(message); if (spilledString == null) { diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 8ccc0297bc..4a3f9e9634 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -28,7 +28,6 @@ import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.TextComponent; -import net.md_5.bungee.api.chat.TranslatableComponent; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; @@ -55,7 +54,6 @@ import org.maxgamer.quickshop.api.event.*; import org.maxgamer.quickshop.api.shop.*; import org.maxgamer.quickshop.util.MsgUtil; -import org.maxgamer.quickshop.util.ReflectFactory; import org.maxgamer.quickshop.util.Util; import org.maxgamer.quickshop.util.logging.container.ShopRemoveLog; @@ -737,7 +735,7 @@ public List getSignText(@NotNull String locale) { } // TODO No-longer use SHOP_SIGN_PREFIX since we use modern storage method. Pending for deletion. - lines.add(new ComponentPackage(new ComponentBuilder().appendLegacy(SHOP_SIGN_PREFIX).reset().color(ChatColor.RESET).appendLegacy(line2).create())); + lines.add(new ComponentPackage(new ComponentBuilder("").appendLegacy(SHOP_SIGN_PREFIX).reset().color(ChatColor.RESET).appendLegacy(line2).create())); //line 3 if (plugin.getConfiguration().getBoolean("shop.force-use-item-original-name") || !this.getItem().hasItemMeta() || !this.getItem().getItemMeta().hasDisplayName()) { @@ -745,7 +743,7 @@ public List getSignText(@NotNull String locale) { BaseComponent[] right = TextComponent.fromLegacyText(plugin.text().of("signs.item-right").forLocale()); if (plugin.getNbtapi() == null) { // NBTAPI not installed - lines.add(new ComponentPackage(new ComponentBuilder() + lines.add(new ComponentPackage(new ComponentBuilder("") .color(ChatColor.RESET) .append(left) .append(TextComponent.fromLegacyText(Util.getItemStackName(getItem()))) @@ -755,7 +753,7 @@ public List getSignText(@NotNull String locale) { // NBTAPI installed String itemName = Util.getItemCustomName(getItem()); BaseComponent[] itemComponents = itemName == null ? Util.getTranslateComponentForItem(getItem()) : TextComponent.fromLegacyText(itemName); - lines.add(new ComponentPackage(new ComponentBuilder() + lines.add(new ComponentPackage(new ComponentBuilder("") .color(ChatColor.RESET) .append(left) .append(itemComponents) @@ -763,7 +761,7 @@ public List getSignText(@NotNull String locale) { .create())); } } else { - lines.add(new ComponentPackage(new ComponentBuilder().color(ChatColor.RESET).appendLegacy(plugin.text().of("signs.item-left").forLocale()) + lines.add(new ComponentPackage(new ComponentBuilder("").color(ChatColor.RESET).appendLegacy(plugin.text().of("signs.item-left").forLocale()) .append(TextComponent.fromLegacyText(Util.getItemStackName(getItem()))) .appendLegacy(plugin.text().of("signs.item-right").forLocale()).create())); } @@ -777,7 +775,7 @@ public List getSignText(@NotNull String locale) { } else { line4 = plugin.text().of("signs.price", plugin.getShopManager().format(this.getPrice(), this)).forLocale(); } - lines.add(new ComponentPackage(new ComponentBuilder().color(ChatColor.RESET).appendLegacy(line4).create())); + lines.add(new ComponentPackage(new ComponentBuilder("").color(ChatColor.RESET).appendLegacy(line4).create())); return lines; } diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index bbeff516c6..fabe8abe35 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -27,7 +27,6 @@ import lombok.Data; import lombok.Getter; import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.TranslatableComponent; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -221,7 +220,7 @@ public static String getTranslateText(ItemStack stack) { } public static String convertItemStackToTranslateText(Material mat) { - return TextSplitter.bakeComponent(new ComponentBuilder().append(Util.getTranslateComponentForMaterial(mat)).create()); + return TextSplitter.bakeComponent(new ComponentBuilder("").append(Util.getTranslateComponentForMaterial(mat)).create()); } @Unstable @@ -732,7 +731,7 @@ public static void sendDirectMessage(@Nullable CommandSender sender, @Nullable S if (spilledString == null) { plugin.getQuickChat().send(sender, msg); } else { - ComponentBuilder builder = new ComponentBuilder(); + ComponentBuilder builder = new ComponentBuilder(""); builder.appendLegacy(spilledString.getLeft()); builder.append(spilledString.getComponents()); builder.appendLegacy(spilledString.getRight()); From c6692b419692653e9bf7c4fa32d46ff0054831cd Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Thu, 2 Dec 2021 16:57:12 +0800 Subject: [PATCH 035/725] Switch access token to new one --- .../quickshop/util/reporter/error/RollbarErrorReporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/reporter/error/RollbarErrorReporter.java b/src/main/java/org/maxgamer/quickshop/util/reporter/error/RollbarErrorReporter.java index 7175ad9663..5ed6d5c1c1 100644 --- a/src/main/java/org/maxgamer/quickshop/util/reporter/error/RollbarErrorReporter.java +++ b/src/main/java/org/maxgamer/quickshop/util/reporter/error/RollbarErrorReporter.java @@ -64,7 +64,7 @@ public class RollbarErrorReporter { public RollbarErrorReporter(@NotNull QuickShop plugin) { this.plugin = plugin; - Config config = ConfigBuilder.withAccessToken("1d362290de254b27a9b6f4982587260c") + Config config = ConfigBuilder.withAccessToken("164c5246fa464ae4a6a0867a856d4062") .environment(Util.isDevEdition() ? "development" : "production") .platform(plugin.getServer().getVersion()) .codeVersion(QuickShop.getVersion()) From 98cd648b9b864b03da4df1ba58cf069fc387939e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Dec 2021 14:24:50 +0000 Subject: [PATCH 036/725] Bump IridiumSkyblock from 3.1.2 to 3.2.2 Bumps IridiumSkyblock from 3.1.2 to 3.2.2. --- updated-dependencies: - dependency-name: com.iridium:IridiumSkyblock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 66776ad702..05d69a6e3d 100644 --- a/pom.xml +++ b/pom.xml @@ -863,7 +863,7 @@ com.iridium IridiumSkyblock - 3.1.2 + 3.2.2 provided From 7ca0e410e52ba90d293e02b40a38b5edea4e3dde Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 7 Dec 2021 14:16:29 +0800 Subject: [PATCH 037/725] #16 Try to fix cache method issue --- .../quickshop/util/ReflectFactory.java | 67 ++++++++++++------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java b/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java index e6fa2270b7..586797edc9 100644 --- a/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java +++ b/src/main/java/org/maxgamer/quickshop/util/ReflectFactory.java @@ -35,6 +35,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.function.Predicate; import java.util.logging.Level; import java.util.stream.Collectors; @@ -241,6 +242,29 @@ public static void syncCommands() throws NoSuchMethodException, InvocationTarget method.invoke(Bukkit.getServer(), (Object[]) null); } + private static Method findMethod(Class targetClass, Class returnType, Predicate filter, Class... args) { + FindProcess: + for (Method method : targetClass.getMethods()) { + if (method.isBridge() && method.isSynthetic()) { + continue; + } + if (method.getReturnType() == returnType) { + if (method.getParameterCount() == args.length) { + Parameter[] parameters = method.getParameters(); + for (int i = 0; i < args.length; i++) { + if (parameters[i].getType() != args[i]) { + continue FindProcess; + } + } + if (filter.test(method)) { + return method; + } + } + } + } + return null; + } + @Nullable public static String getMaterialMinecraftNamespacedKey(Material material) { Object nmsItem; @@ -251,34 +275,25 @@ public static String getMaterialMinecraftNamespacedKey(Material material) { Util.debugLog("nmsItem null"); return null; } - if (getMinecraftKeyNameMethod == null) { - if (isMinecraftKeyNameMethodUnavailable) { - return null; - } - try { - getMinecraftKeyNameMethod = nmsItem.getClass().getMethod("getName"); - } catch (NoSuchMethodException exception) { - Util.debugLog("Mapping changed during minecraft update, dynamic searching..."); - for (Method method : nmsItem.getClass().getMethods()) { - if (method.getReturnType() == String.class) { - if (method.getParameterCount() == 0) { - if (!"toString".equals(method.getName())) { - if (((String) method.invoke(nmsItem)).toLowerCase().contains(material.name().toLowerCase(Locale.ROOT))) { - getMinecraftKeyNameMethod = method; - } - break; - } - } - } + try { + getMinecraftKeyNameMethod = nmsItem.getClass().getMethod("getName"); + } catch (NoSuchMethodException exception) { + Util.debugLog("Mapping changed during minecraft update, dynamic searching..."); + getMinecraftKeyNameMethod = findMethod(nmsItem.getClass(), String.class, method -> { + try { + return !"toString".equals(method.getName()) && ((String) method.invoke(nmsItem)).toLowerCase().contains(material.getKey().getKey().toLowerCase(Locale.ROOT)); + } catch (Throwable throwable) { + return false; } - } - if (getMinecraftKeyNameMethod == null) { - isMinecraftKeyNameMethodUnavailable = true; - Util.debugLog("getMinecraftKeyNameMethod is null"); - return null; - } + }); + } + + if (getMinecraftKeyNameMethod == null) { + Util.debugLog("getMinecraftKeyNameMethod is null"); + return null; + } else { + return (String) getMinecraftKeyNameMethod.invoke(nmsItem); } - return (String) getMinecraftKeyNameMethod.invoke(nmsItem); } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); return null; From 9f6cfc3036e460b393f7819139efbf4208847408 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 7 Dec 2021 14:17:08 +0800 Subject: [PATCH 038/725] Delete incorrect reloaction --- pom.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pom.xml b/pom.xml index 66776ad702..ceda44a4d2 100644 --- a/pom.xml +++ b/pom.xml @@ -207,10 +207,6 @@ javax.annotation. org.maxgamer.quickshop.shade.org.javax.annotation. - - com.google.common. - org.maxgamer.quickshop.shade.com.google.common. - com.flowpowered.math. org.maxgamer.quickshop.shade.com.flowpowered.math. From 483d5a6baba0f50dd2369b276384423734e6135d Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 7 Dec 2021 14:46:14 +0800 Subject: [PATCH 039/725] Fix mistaken on update message --- .../util/updater/impl/JenkinsUpdater.java | 4 + .../quickshop/watcher/UpdateWatcher.java | 94 +++++++++++++------ 2 files changed, 68 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/updater/impl/JenkinsUpdater.java b/src/main/java/org/maxgamer/quickshop/util/updater/impl/JenkinsUpdater.java index 5df392021f..466341f69f 100644 --- a/src/main/java/org/maxgamer/quickshop/util/updater/impl/JenkinsUpdater.java +++ b/src/main/java/org/maxgamer/quickshop/util/updater/impl/JenkinsUpdater.java @@ -91,6 +91,10 @@ public boolean isLatest(@NotNull VersionType versionType) { if (QuickShop.getInstance().getGameVersion().isEndOfLife()) { // EOL server won't receive future updates return true; } + //Not checking updates for incorrect type + if (versionType != getCurrentRunning()) { + return true; + } try (InputStream inputStream = HttpRequest.get(new URL(jobUrl + "lastSuccessfulBuild/artifact/target/BUILDINFO")) .header("User-Agent", "Java-QuickShop-" + QuickShop.getFork() + " " + QuickShop.getVersion()) .execute() diff --git a/src/main/java/org/maxgamer/quickshop/watcher/UpdateWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/UpdateWatcher.java index b71742d3d5..13054f8a11 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/UpdateWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/UpdateWatcher.java @@ -52,40 +52,74 @@ public BukkitTask getCronTask() { public void init() { cronTask = QuickShop.getInstance().getServer().getScheduler().runTaskTimerAsynchronously(QuickShop.getInstance(), () -> { - if (updater.isLatest(VersionType.STABLE)) { - return; - } - QuickShop.getInstance() - .getLogger() - .info( - "A new version of QuickShop has been released! [" + updater.getRemoteServerVersion() + "]"); - QuickShop.getInstance() - .getLogger() - .info("Update here: https://www.spigotmc.org/resources/62575/"); - - for (Player player : Bukkit.getOnlinePlayers()) { - if (QuickShop.getPermissionManager() - .hasPermission(player, "quickshop.alerts")) { - List notifys = - QuickShop.getInstance().text().ofList(player, "updatenotify.list").forLocale(); - int notifyNum = -1; - if (notifys.size() > 1) { - notifyNum = random.nextInt(notifys.size()); + if (!updater.isLatest(getUpdater().getCurrentRunning())) { + if (updater.getCurrentRunning() == VersionType.STABLE) { + QuickShop.getInstance() + .getLogger() + .info( + "A new version of QuickShop has been released! [" + updater.getRemoteServerVersion() + "]"); + QuickShop.getInstance() + .getLogger() + .info("Update here: https://www.spigotmc.org/resources/62575/"); + + for (Player player : Bukkit.getOnlinePlayers()) { + if (QuickShop.getPermissionManager() + .hasPermission(player, "quickshop.alerts")) { + List notifys = + QuickShop.getInstance().text().ofList(player, "updatenotify.list").forLocale(); + int notifyNum = -1; + if (notifys.size() > 1) { + notifyNum = random.nextInt(notifys.size()); + } + String notify; + if (notifyNum > 0) { // Translate bug. + notify = notifys.get(notifyNum); + } else { + notify = "New update {0} now avaliable! Please update!"; + } + notify = MsgUtil.fillArgs(notify, updater.getRemoteServerVersion(), QuickShop.getInstance().getBuildInfo().getBuildTag()); + player.sendMessage(ChatColor.GREEN + "---------------------------------------------------"); + player.sendMessage(ChatColor.GREEN + notify); + player.sendMessage(ChatColor.GREEN + "Type command " + ChatColor.YELLOW + "/qs update" + ChatColor.GREEN + " or click the link below to update QuickShop :)"); + player.sendMessage(ChatColor.AQUA + " https://www.spigotmc.org/resources/62575/"); + player.sendMessage(ChatColor.GREEN + "---------------------------------------------------"); + } } - String notify; - if (notifyNum > 0) { // Translate bug. - notify = notifys.get(notifyNum); - } else { - notify = "New update {0} now avaliable! Please update!"; + } else { + QuickShop.getInstance() + .getLogger() + .info( + "A new version of QuickShop snapshot has been released! [" + updater.getRemoteServerVersion() + "]"); + QuickShop.getInstance() + .getLogger() + .info("Update here: https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake-SNAPSHOT"); + + for (Player player : Bukkit.getOnlinePlayers()) { + if (QuickShop.getPermissionManager() + .hasPermission(player, "quickshop.alerts")) { + List notifys = + QuickShop.getInstance().text().ofList(player, "updatenotify.list").forLocale(); + int notifyNum = -1; + if (notifys.size() > 1) { + notifyNum = random.nextInt(notifys.size()); + } + String notify; + if (notifyNum > 0) { // Translate bug. + notify = notifys.get(notifyNum); + } else { + notify = "New update {0} now avaliable! Please update!"; + } + notify = MsgUtil.fillArgs(notify, updater.getRemoteServerVersion(), QuickShop.getInstance().getBuildInfo().getBuildTag()); + player.sendMessage(ChatColor.GREEN + "---------------------------------------------------"); + player.sendMessage(ChatColor.GREEN + notify); + player.sendMessage(ChatColor.GREEN + "Type command " + ChatColor.YELLOW + "/qs update" + ChatColor.GREEN + " or click the link below to update QuickShop :)"); + player.sendMessage(ChatColor.AQUA + " https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake-SNAPSHOT"); + player.sendMessage(ChatColor.GREEN + "---------------------------------------------------"); + } } - notify = MsgUtil.fillArgs(notify, updater.getRemoteServerVersion(), QuickShop.getInstance().getBuildInfo().getBuildTag()); - player.sendMessage(ChatColor.GREEN + "---------------------------------------------------"); - player.sendMessage(ChatColor.GREEN + notify); - player.sendMessage(ChatColor.GREEN + "Type command " + ChatColor.YELLOW + "/qs update" + ChatColor.GREEN + " or click the link below to update QuickShop :)"); - player.sendMessage(ChatColor.AQUA + " https://www.spigotmc.org/resources/62575/"); - player.sendMessage(ChatColor.GREEN + "---------------------------------------------------"); } } + }, 1, 20 * 60 * 60); } From 570c0ad7644d1600bc0ce412169f271d97994c6d Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:53:42 +0100 Subject: [PATCH 040/725] Fix price command bypassing the integer only option. --- .../quickshop/command/subcommand/SubCommand_Price.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java index c89781f78b..fcaa81a361 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java @@ -122,6 +122,11 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not return; } + if (checkResult.getStatus() == PriceLimiterStatus.NOT_A_WHOLE_NUMBER) { + plugin.text().of(sender, "not-a-integer", price).send(); + return; + } + if (fee > 0) { EconomyTransaction transaction = EconomyTransaction.builder() .allowLoan(plugin.getConfiguration().getOrDefault("shop.allow-economy-loan", false)) From 92afe6d69f45787cf6d6b1de300f1a27066c67bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Dec 2021 14:21:18 +0000 Subject: [PATCH 041/725] Bump advanced-region-market from 3.3.5 to 3.3.6 Bumps advanced-region-market from 3.3.5 to 3.3.6. --- updated-dependencies: - dependency-name: com.github.alex9849:advanced-region-market dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ceda44a4d2..5402308237 100644 --- a/pom.xml +++ b/pom.xml @@ -853,7 +853,7 @@ com.github.alex9849 advanced-region-market - 3.3.5 + 3.3.6 provided From 826590a13a561e2af56496f7a5b4d1e8ecc36315 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Dec 2021 14:21:42 +0000 Subject: [PATCH 042/725] Bump SongodaCore from 2.5.14 to 2.6.3 Bumps SongodaCore from 2.5.14 to 2.6.3. --- updated-dependencies: - dependency-name: com.songoda:SongodaCore dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ceda44a4d2..6a863a6ebe 100644 --- a/pom.xml +++ b/pom.xml @@ -787,7 +787,7 @@ com.songoda SongodaCore - 2.5.14 + 2.6.3 provided From 34f96863c312c862285362ebe198613a0f43cd52 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Thu, 9 Dec 2021 22:32:05 +0800 Subject: [PATCH 043/725] Fix #20, correct the event using --- .../integration/towny/TownyIntegration.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java index a21c710206..52fab60bac 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java @@ -22,7 +22,7 @@ import com.palmergames.bukkit.towny.TownyAPI; import com.palmergames.bukkit.towny.event.PlotClearEvent; import com.palmergames.bukkit.towny.event.TownRemoveResidentEvent; -import com.palmergames.bukkit.towny.event.actions.TownyDestroyEvent; +import com.palmergames.bukkit.towny.event.town.TownUnclaimEvent; import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; import com.palmergames.bukkit.towny.object.Town; import com.palmergames.bukkit.towny.object.TownBlock; @@ -137,11 +137,15 @@ public void deleteShops(UUID owner, Town town) { } public void purgeShops(TownBlock townBlock) { - if (townBlock == null) { + purgeShops(townBlock.getWorldCoord()); + } + + public void purgeShops(WorldCoord worldCoord) { + if (worldCoord == null) { return; } String worldName; - worldName = townBlock.getWorld().getName(); + worldName = worldCoord.getBukkitWorld().getName(); //Getting all shop with world-chunk-shop mapping for (Map.Entry>> entry : plugin.getShopManager().getShops().entrySet()) { //Matching world @@ -153,14 +157,9 @@ public void purgeShops(TownBlock townBlock) { Map shopMap = chunkedShopEntry.getValue(); for (Shop shop : shopMap.values()) { //Matching Owner - try { - //It should be equal in address - if (WorldCoord.parseWorldCoord(shop.getLocation()).getTownBlock() == townBlock) { - //delete it - shop.delete(); - } - } catch (NotRegisteredException ignored) { - //Is not in town, continue + if (WorldCoord.parseWorldCoord(shop.getLocation()).equals(worldCoord)) { + //delete it + shop.delete(); } } } @@ -191,14 +190,14 @@ public void onPlotClear(PlotClearEvent event) { } @EventHandler - public void onPlotDestroy(TownyDestroyEvent event) { + public void onPlotDestroy(TownUnclaimEvent event) { if (!deleteShopOnPlotDestroy) { return; } if (Bukkit.isPrimaryThread()) { - purgeShops(event.getTownBlock()); + purgeShops(event.getWorldCoord()); } else { - Util.mainThreadRun(() -> purgeShops(event.getTownBlock())); + Util.mainThreadRun(() -> purgeShops(event.getWorldCoord())); } } From 638de58bcb63fcdc9b7a618da9be2d90c4f82cdf Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 17:26:34 +0800 Subject: [PATCH 044/725] Fix #17 --- .../quickshop/listener/PlayerListener.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index 3856048c77..8610faa590 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -199,15 +199,14 @@ private void postTrade(PlayerInteractEvent e) { final AbstractEconomy eco = plugin.getEconomy(); final double price = shop.getPrice(); - final double money = plugin.getEconomy().getBalance(p.getUniqueId(), shop.getLocation().getWorld(), shop.getCurrency()); final Inventory playerInventory = p.getInventory(); if (shop.isSelling()) { if (shop.getRemainingStock() == 0) { plugin.text().of(p, "purchase-out-of-stock", shop.ownerName()).send(); return; } - - int itemAmount = getPlayerCanBuy(shop, money, price, playerInventory); + final double traderBalance = eco.getBalance(p.getUniqueId(), shop.getLocation().getWorld(), shop.getCurrency()); + int itemAmount = getPlayerCanBuy(shop, traderBalance, price, playerInventory); if (shop.isStackingShop()) { plugin.text().of(p, "how-many-buy-stack", Integer.toString(shop.getItem().getAmount()), Integer.toString(itemAmount)).send(); } else { @@ -218,8 +217,8 @@ private void postTrade(PlayerInteractEvent e) { plugin.text().of(p, "purchase-out-of-space", shop.ownerName()).send(); return; } - - int items = getPlayerCanSell(shop, money, price, playerInventory); + final double ownerBalance = eco.getBalance(shop.getOwner(), shop.getLocation().getWorld(), shop.getCurrency()); + int items = getPlayerCanSell(shop, ownerBalance, price, playerInventory); if (shop.isStackingShop()) { plugin.text().of(p, "how-many-sell-stack", Integer.toString(shop.getItem().getAmount()), Integer.toString(items)).send(); } else { @@ -291,11 +290,11 @@ else if (e.useInteractedBlock() == Event.Result.ALLOW } } - private int getPlayerCanBuy(Shop shop, double money, double price, Inventory playerInventory) { + private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inventory playerInventory) { if (shop.isFreeShop()) { // Free shop return Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); } - int itemAmount = Math.min(shop.getRemainingSpace(), (int) Math.floor(money / price)); + int itemAmount = Math.min(shop.getRemainingStock(), (int) Math.floor(traderBalance / price)); if (!shop.isUnlimited()) { itemAmount = Math.min(itemAmount, shop.getRemainingStock()); } @@ -305,13 +304,13 @@ private int getPlayerCanBuy(Shop shop, double money, double price, Inventory pla return itemAmount; } - private int getPlayerCanSell(Shop shop, double money, double price, Inventory playerInventory) { + private int getPlayerCanSell(Shop shop, double ownerBalance, double price, Inventory playerInventory) { if (shop.isFreeShop()) { return Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); } int items = Util.countItems(playerInventory, shop.getItem()); - final int ownerCanAfford = (int) (money / price); + final int ownerCanAfford = (int) (ownerBalance / price); if (!shop.isUnlimited()) { // Amount check player amount and shop empty slot items = Math.min(items, shop.getRemainingSpace()); From 528eeef582a34111b0e4051177e99b02407326ca Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 17:56:17 +0800 Subject: [PATCH 045/725] Change misleading configuration description --- src/main/resources/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c5ade0dff7..fbda3c51ab 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -361,6 +361,7 @@ shop: #Protection check #This will send a FAKE BlockBreakEvent to check if you can break a block. #This may conflict with some protection plugins! + #Integration checking will be checked after this, so disable it when it's conflicting with integration #If you don't want this, then please disable it and use the integration below instead. protection-checking: true @@ -517,7 +518,6 @@ matcher: #Should the Plugin check the shulkerBox contents? shulkerBox: true #Integration is under BETA stage, please report any bugs to our Issue Tracker. -#You must disable protection-checks before enabling integration. integration: #Towny Integration towny: From a94cd91759449c022c5124f9a757aa4cf70e6ad7 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 18:03:36 +0800 Subject: [PATCH 046/725] Backport for NPE fix --- .../maxgamer/quickshop/localization/text/SimpleTextManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 9713540cde..34eca19605 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -368,7 +368,7 @@ private TextList(SimpleTextManager manager, UUID sender, Map fallbackLocal() { - return this.bundled.getStringList(path); + return this.bundled != null ? this.bundled.getStringList(path) : Collections.emptyList(); } /** From 47880cad5691e2ea63bea2229cf7e382f2496991 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 20:43:42 +0800 Subject: [PATCH 047/725] Don't use SimplixStorage --- .../org/maxgamer/quickshop/QuickShop.java | 1094 +++++++++-------- .../api/economy/AbstractEconomy.java | 2 +- .../api/economy/EconomyTransaction.java | 2 +- .../api/shop/AbstractDisplayItem.java | 8 +- .../org/maxgamer/quickshop/api/shop/Shop.java | 2 +- .../command/SimpleCommandManager.java | 4 +- .../subcommand/SubCommand_Convert.java | 4 +- .../command/subcommand/SubCommand_Debug.java | 6 +- .../command/subcommand/SubCommand_Find.java | 10 +- .../command/subcommand/SubCommand_Item.java | 8 +- .../command/subcommand/SubCommand_Price.java | 14 +- .../command/subcommand/SubCommand_Refill.java | 2 +- .../command/subcommand/SubCommand_Reset.java | 2 +- .../SubCommand_SilentUnlimited.java | 4 +- .../command/subcommand/SubCommand_Size.java | 8 +- .../subcommand/SubCommand_Unlimited.java | 4 +- .../quickshop/database/DatabaseManager.java | 4 +- .../economy/Economy_GemsEconomy.java | 2 +- .../quickshop/economy/Economy_Mixed.java | 8 +- .../quickshop/economy/Economy_TNE.java | 2 +- .../quickshop/economy/Economy_Vault.java | 2 +- .../eventmanager/QSEventManager.java | 2 +- .../integration/SimpleIntegrationManager.java | 2 +- .../fabledskyblock/FabledIntegration.java | 4 +- .../factionsuuid/FactionsUUIDIntegration.java | 38 +- .../GriefPreventionIntegration.java | 8 +- .../IridiumSkyblockIntegration.java | 4 +- .../integration/lands/LandsIntegration.java | 6 +- .../plotsquared/PlotSquaredIntegrationV6.java | 4 +- .../residence/ResidenceIntegration.java | 6 +- .../SuperiorSkyblock2Integration.java | 6 +- .../integration/towny/TownyIntegration.java | 14 +- .../worldguard/WorldGuardIntegration.java | 10 +- .../quickshop/listener/BlockListener.java | 12 +- .../quickshop/listener/ChatListener.java | 2 +- .../listener/DisplayProtectionListener.java | 6 +- .../EnhanceDisplayProtectionListener.java | 2 +- .../quickshop/listener/InternalListener.java | 4 +- .../quickshop/listener/LockListener.java | 10 +- .../quickshop/listener/PlayerListener.java | 10 +- .../quickshop/listener/PluginListener.java | 4 +- .../listener/ShopProtectionListener.java | 14 +- .../quickshop/shop/ContainerShop.java | 8 +- .../quickshop/shop/RealDisplayItem.java | 2 +- .../maxgamer/quickshop/shop/ShopLoader.java | 2 +- .../maxgamer/quickshop/shop/ShopPurger.java | 12 +- .../quickshop/shop/SimpleShopManager.java | 64 +- .../quickshop/shop/VirtualDisplayItem.java | 2 +- .../maxgamer/quickshop/util/InteractUtil.java | 12 +- .../org/maxgamer/quickshop/util/MsgUtil.java | 14 +- .../quickshop/util/PermissionChecker.java | 8 +- .../org/maxgamer/quickshop/util/Util.java | 36 +- .../util/config/ConfigurationFixer.java | 5 +- .../config/ConfigurationFixerLightning.java | 2 +- .../util/config/ConfigurationUpdater.java | 6 +- .../BuiltInEconomyFormatter.java | 8 +- .../economyformatter/EconomyFormatter.java | 10 +- .../item/QuickShopItemMatcherImpl.java | 10 +- .../maxgamer/quickshop/util/paste/Paste.java | 6 +- .../watcher/DisplayAutoDespawnWatcher.java | 2 +- .../quickshop/watcher/LogWatcher.java | 2 +- .../quickshop/watcher/OngoingFeeWatcher.java | 6 +- .../eventmanager/ListenerContainerTest.java | 3 +- .../quickshop/util/InteractUtilTest.java | 54 +- 64 files changed, 824 insertions(+), 810 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index babb09595f..9036621957 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -22,8 +22,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.sk89q.worldedit.bukkit.WorldEditPlugin; +import de.leonhard.storage.LightningBuilder; import de.leonhard.storage.Yaml; -import de.leonhard.storage.sections.FlatFileSection; +import de.leonhard.storage.internal.settings.ConfigSettings; +import de.leonhard.storage.internal.settings.ReloadSettings; import de.tr7zw.nbtapi.plugin.NBTAPI; import lombok.Getter; import lombok.Setter; @@ -79,8 +81,8 @@ import org.maxgamer.quickshop.util.Timer; import org.maxgamer.quickshop.util.*; import org.maxgamer.quickshop.util.compatibility.SimpleCompatibilityManager; -import org.maxgamer.quickshop.util.config.ConfigProviderLightning; -import org.maxgamer.quickshop.util.config.ConfigurationFixerLightning; +import org.maxgamer.quickshop.util.config.ConfigProvider; +import org.maxgamer.quickshop.util.config.ConfigurationFixer; import org.maxgamer.quickshop.util.envcheck.*; import org.maxgamer.quickshop.util.matcher.item.BukkitItemMatcherImpl; import org.maxgamer.quickshop.util.matcher.item.QuickShopItemMatcherImpl; @@ -125,7 +127,7 @@ public class QuickShop extends JavaPlugin implements QuickShopAPI { /** * The shop limites. */ - private final ConfigProviderLightning configProvider = new ConfigProviderLightning(this, new File(getDataFolder(), "config.yml")); + private final ConfigProvider configProvider = new ConfigProvider(this, new File(getDataFolder(), "config.yml")); private final List timerTaskList = new ArrayList<>(3); @Getter private final ReloadManager reloadManager = new ReloadManager(); @@ -313,6 +315,9 @@ public IntegrationManager getIntegrationHelper() { return integrationHelper; } + @Deprecated + private Yaml configurationForCompatibility = null; + /** * Get the Player's Shop limit. * @@ -320,7 +325,7 @@ public IntegrationManager getIntegrationHelper() { * @return int Player's shop limit */ public int getShopLimit(@NotNull Player p) { - int max = getConfiguration().getInt("limits.default"); + int max = getConfig().getInt("limits.default"); for (Entry entry : limits.entrySet()) { if (entry.getValue() > max && getPermissionManager().hasPermission(p, entry.getKey())) { max = entry.getValue(); @@ -335,25 +340,25 @@ public int getShopLimit(@NotNull Player p) { private void load3rdParty() { // added for compatibility reasons with OpenInv - see // https://github.com/KaiKikuchi/QuickShop/issues/139 - if (getConfiguration().getBoolean("plugin.OpenInv")) { + if (getConfig().getBoolean("plugin.OpenInv")) { this.openInvPlugin = Bukkit.getPluginManager().getPlugin("OpenInv"); if (this.openInvPlugin != null) { getLogger().info("Successfully loaded OpenInv support!"); } } - if (getConfiguration().getBoolean("plugin.PlaceHolderAPI")) { + if (getConfig().getBoolean("plugin.PlaceHolderAPI")) { this.placeHolderAPI = Bukkit.getPluginManager().getPlugin("PlaceholderAPI"); if (this.placeHolderAPI != null) { getLogger().info("Successfully loaded PlaceHolderAPI support!"); } } - if (getConfiguration().getBoolean("plugin.BlockHub")) { + if (getConfig().getBoolean("plugin.BlockHub")) { this.blockHubPlugin = Bukkit.getPluginManager().getPlugin("BlockHub"); if (this.blockHubPlugin != null) { getLogger().info("Successfully loaded BlockHub support!"); } } - if (getConfiguration().getBoolean("plugin.WorldEdit")) { + if (getConfig().getBoolean("plugin.WorldEdit")) { // GameVersion gameVersion = GameVersion.get(nmsVersion); this.worldEditPlugin = Bukkit.getPluginManager().getPlugin("WorldEdit"); if (this.worldEditPlugin != null) { @@ -363,7 +368,7 @@ private void load3rdParty() { } } - if (getConfiguration().getBoolean("plugin.LWC")) { + if (getConfig().getBoolean("plugin.LWC")) { this.lwcPlugin = Bukkit.getPluginManager().getPlugin("LWC"); if (this.lwcPlugin != null) { if (Util.isMethodAvailable("com.griefcraft.lwc.LWC", "findProtection", org.bukkit.Location.class)) { @@ -374,7 +379,7 @@ private void load3rdParty() { } } } - if (getConfiguration().getBoolean("plugin.NBTAPI")) { + if (getConfig().getBoolean("plugin.NBTAPI")) { this.nbtapi = (NBTAPI) Bukkit.getPluginManager().getPlugin("NBTAPI"); if (this.nbtapi != null) { if (!this.nbtapi.isCompatible()) { @@ -396,7 +401,7 @@ private void load3rdParty() { getLogger().info("Successfully loaded ProtocolLib support!"); } else { getLogger().warning("Failed to load ProtocolLib support, fallback to real item display"); - getConfiguration().set("shop.display-type", 0); + getConfig().set("shop.display-type", 0); saveConfiguration(); } } @@ -425,6 +430,31 @@ private void load3rdParty() { } } + // /** +// * Logs the given string to qs.log, if QuickShop is configured to do so. +// * +// * @param s The string to log. It will be prefixed with the date and time. +// */ +// public void log(@NotNull String s) { +// Util.debugLog("[SHOP LOG] " + s); +// if (this.getLogWatcher() == null) { +// return; +// } +// this.getLogWatcher().log(s); +// } + + public void logEvent(@NotNull Object eventObject) { + if (this.getLogWatcher() == null) { + return; + } + if (loggingLocation == 0) { + this.getLogWatcher().log(JsonUtil.getGson().toJson(eventObject)); + } else { + getDatabaseHelper().insertHistoryRecord(eventObject); + } + + } + /** * Tries to load the economy and its core. If this fails, it will try to use vault. If that fails, * it will return false. @@ -436,16 +466,16 @@ private void load3rdParty() { public boolean loadEcon() { try { // EconomyCore core = new Economy_Vault(); - switch (EconomyType.fromID(getConfiguration().getInt("economy-type"))) { + switch (EconomyType.fromID(getConfig().getInt("economy-type"))) { case UNKNOWN: setupBootError(new BootError(this.getLogger(), "Can't load the Economy provider, invaild value in config.yml."), true); return false; case VAULT: economy = new Economy_Vault(this); Util.debugLog("Now using the Vault economy system."); - if (getConfiguration().getOrDefault("tax", 0.0d) > 0) { + if (getConfig().getDouble("tax", 0.0d) > 0) { try { - String taxAccount = getConfiguration().getOrDefault("tax-account", "tax"); + String taxAccount = getConfig().getString("tax-account", "tax"); if (!taxAccount.isEmpty()) { OfflinePlayer tax; if (Util.isUUID(taxAccount)) { @@ -510,41 +540,19 @@ public boolean loadEcon() { return true; } - // /** -// * Logs the given string to qs.log, if QuickShop is configured to do so. -// * -// * @param s The string to log. It will be prefixed with the date and time. -// */ -// public void log(@NotNull String s) { -// Util.debugLog("[SHOP LOG] " + s); -// if (this.getLogWatcher() == null) { -// return; -// } -// this.getLogWatcher().log(s); -// } - - public void logEvent(@NotNull Object eventObject) { - if (this.getLogWatcher() == null) { - return; - } - if (loggingLocation == 0) { - this.getLogWatcher().log(JsonUtil.getGson().toJson(eventObject)); - } else { - getDatabaseHelper().insertHistoryRecord(eventObject); - } - - } - @Override - @Unstable - @Deprecated public @NotNull FileConfiguration getConfig() throws UnsupportedOperationException { - throw new UnsupportedOperationException("Use QuickShop#getConfiguration to instead."); - //return configProvider.get(); + return configProvider.get(); } + @Deprecated public @NotNull Yaml getConfiguration() { - return this.configProvider.get(); + return configurationForCompatibility == null ? configurationForCompatibility = LightningBuilder + .fromFile(new File(getDataFolder(), "config.yml")) + .addInputStreamFromResource("config.yml") + .setReloadSettings(ReloadSettings.MANUALLY) + .setConfigSettings(ConfigSettings.PRESERVE_COMMENTS) + .createYaml() : configurationForCompatibility; } @Unstable @@ -572,16 +580,16 @@ public void reloadConfig() { public void reloadConfiguration() { configProvider.reload(); // Load quick variables - this.display = this.getConfiguration().getBoolean("shop.display-items"); - this.priceChangeRequiresFee = this.getConfiguration().getBoolean("shop.price-change-requires-fee"); - this.displayItemCheckTicks = this.getConfiguration().getInt("shop.display-items-check-ticks"); - this.allowStack = this.getConfiguration().getBoolean("shop.allow-stacks"); - this.currency = this.getConfiguration().getString("currency"); - this.loggingLocation = this.getConfiguration().getInt("logging.location"); + this.display = this.getConfig().getBoolean("shop.display-items"); + this.priceChangeRequiresFee = this.getConfig().getBoolean("shop.price-change-requires-fee"); + this.displayItemCheckTicks = this.getConfig().getInt("shop.display-items-check-ticks"); + this.allowStack = this.getConfig().getBoolean("shop.allow-stacks"); + this.currency = this.getConfig().getString("currency"); + this.loggingLocation = this.getConfig().getInt("logging.location"); if (StringUtils.isEmpty(this.currency)) { this.currency = null; } - if (this.getConfiguration().getBoolean("logging.enable")) { + if (this.getConfig().getBoolean("logging.enable")) { logWatcher = new LogWatcher(this, new File(getDataFolder(), "qs.log")); } else { logWatcher = null; @@ -609,7 +617,7 @@ public final void onLoad() { getLogger().info("Loading up integration modules."); this.integrationHelper = new SimpleIntegrationManager(this); this.integrationHelper.callIntegrationsLoad(IntegrateStage.onLoadBegin); - if (getConfiguration().getBoolean("integration.worldguard.enable")) { + if (getConfig().getBoolean("integration.worldguard.enable")) { Plugin wg = Bukkit.getPluginManager().getPlugin("WorldGuard"); // WG require register flags when onLoad called. if (wg != null) { @@ -746,13 +754,13 @@ private void initConfiguration() { getLogger().severe("Failed to save config.yml from jar, The binary file of QuickShop may corrupted. Please re-download from our website."); } reloadConfiguration(); - if (getConfiguration().getOrDefault("config-version", 0) == 0) { - getConfiguration().set("config-version", 1); + if (getConfig().getInt("config-version", 0) == 0) { + getConfig().set("config-version", 1); } /* It will generate a new UUID above updateConfig */ - this.serverUniqueID = UUID.fromString(Objects.requireNonNull(getConfiguration().getOrDefault("server-uuid", String.valueOf(UUID.randomUUID())))); + this.serverUniqueID = UUID.fromString(Objects.requireNonNull(getConfig().getString("server-uuid", String.valueOf(UUID.randomUUID())))); try { - updateConfig(getConfiguration().getInt("config-version")); + updateConfig(getConfig().getInt("config-version")); } catch (IOException exception) { getLogger().log(Level.WARNING, "Failed to update configuration", exception); } @@ -805,7 +813,7 @@ public final void onEnable() { metrics = new Metrics(this, 3320); try { - if (!getConfiguration().getBoolean("auto-report-errors")) { + if (!getConfig().getBoolean("auto-report-errors")) { Util.debugLog("Error reporter was disabled!"); } else { sentryErrorReporter = new RollbarErrorReporter(this); @@ -840,10 +848,10 @@ public final void onEnable() { // Create the shop manager. permissionManager = new PermissionManager(this); // This should be inited before shop manager - if (this.display && getConfiguration().getBoolean("shop.display-auto-despawn")) { + if (this.display && getConfig().getBoolean("shop.display-auto-despawn")) { this.displayAutoDespawnWatcher = new DisplayAutoDespawnWatcher(this); //BUKKIT METHOD SHOULD ALWAYS EXECUTE ON THE SERVER MAIN THEAD - timerTaskList.add(this.displayAutoDespawnWatcher.runTaskTimer(this, 20, getConfiguration().getInt("shop.display-check-time"))); // not worth async + timerTaskList.add(this.displayAutoDespawnWatcher.runTaskTimer(this, 20, getConfig().getInt("shop.display-check-time"))); // not worth async } getLogger().info("Registering commands..."); @@ -870,11 +878,11 @@ public final void onEnable() { } } // Limit end - if (getConfiguration().getInt("shop.finding.distance") > 100 && (getConfiguration().getBoolean("shop.finding.exclude-out-of-stock"))) { + if (getConfig().getInt("shop.finding.distance") > 100 && (getConfig().getBoolean("shop.finding.exclude-out-of-stock"))) { getLogger().severe("Shop find distance is too high with chunk loading feature turned on! It may cause lag! Pick a number under 100!"); } - if (getConfiguration().getBoolean("use-caching")) { + if (getConfig().getBoolean("use-caching")) { this.shopCache = new Cache(this); } else { this.shopCache = null; @@ -907,7 +915,7 @@ public final void onEnable() { internalListener.register(); if (this.display && AbstractDisplayItem.getNowUsing() != DisplayType.VIRTUALITEM) { - if (getConfiguration().getInt("shop.display-items-check-ticks") < 3000) { + if (getConfig().getInt("shop.display-items-check-ticks") < 3000) { getLogger().severe("Shop.display-items-check-ticks is too low! It may cause HUGE lag! Pick a number > 3000"); } if (getDisplayItemCheckTicks() > 0) { @@ -929,13 +937,13 @@ public final void onEnable() { new ClearLaggListener(this).register(); } } - if (getConfiguration().getBoolean("shop.lock")) { + if (getConfig().getBoolean("shop.lock")) { new LockListener(this, this.shopCache).register(); } getLogger().info("Cleaning MsgUtils..."); MsgUtil.loadTransactionMessages(); MsgUtil.clean(); - if (this.getConfiguration().getOrDefault("updater", true)) { + if (this.getConfig().getBoolean("updater", true)) { updateWatcher = new UpdateWatcher(); updateWatcher.init(); } @@ -960,9 +968,9 @@ public void run() { timerTaskList.add(logWatcher.runTaskTimerAsynchronously(this, 10, 10)); getLogger().info("Log actions is enabled, actions will log in the qs.log file!"); } - if (getConfiguration().getBoolean("shop.ongoing-fee.enable")) { + if (getConfig().getBoolean("shop.ongoing-fee.enable")) { ongoingFeeWatcher = new OngoingFeeWatcher(this); - timerTaskList.add(ongoingFeeWatcher.runTaskTimerAsynchronously(this, 0, getConfiguration().getInt("shop.ongoing-fee.ticks"))); + timerTaskList.add(ongoingFeeWatcher.runTaskTimerAsynchronously(this, 0, getConfig().getInt("shop.ongoing-fee.ticks"))); getLogger().info("Ongoing fee feature is enabled."); } integrationHelper.searchAndRegisterPlugins(); @@ -990,7 +998,7 @@ public void run() { private void loadItemMatcher() { ItemMatcher defItemMatcher; - switch (getConfiguration().getInt("matcher.work-type")) { + switch (getConfig().getInt("matcher.work-type")) { case 1: defItemMatcher = new BukkitItemMatcherImpl(this); break; @@ -1010,7 +1018,7 @@ private void loadItemMatcher() { private boolean setupDatabase() { getLogger().info("Setting up database..."); try { - FlatFileSection dbCfg = getConfiguration().getSection("database"); + ConfigurationSection dbCfg = getConfig().getConfigurationSection("database"); AbstractDatabaseCore dbCore; if (Objects.requireNonNull(dbCfg).getBoolean("mysql")) { // MySQL database - Required database be created first. @@ -1050,7 +1058,7 @@ private boolean setupDatabase() { } private void submitMeritcs() { - if (!getConfiguration().getBoolean("disabled-metrics")) { + if (!getConfig().getBoolean("disabled-metrics")) { String vaultVer; Plugin vault = Bukkit.getPluginManager().getPlugin("Vault"); if (vault != null) { @@ -1064,7 +1072,7 @@ private void submitMeritcs() { economyType = this.getEconomy().getName(); } String eventAdapter; - if (getConfiguration().getInt("shop.protection-checking-handler") == 1) { + if (getConfig().getInt("shop.protection-checking-handler") == 1) { eventAdapter = "QUICKSHOP"; } else { eventAdapter = "BUKKIT"; @@ -1073,15 +1081,15 @@ private void submitMeritcs() { metrics.addCustomChart(new Metrics.SimplePie("server_version", Bukkit::getVersion)); metrics.addCustomChart(new Metrics.SimplePie("bukkit_version", Bukkit::getBukkitVersion)); metrics.addCustomChart(new Metrics.SimplePie("vault_version", () -> vaultVer)); - metrics.addCustomChart(new Metrics.SimplePie("use_display_items", () -> Util.boolean2Status(getConfiguration().getBoolean("shop.display-items")))); - metrics.addCustomChart(new Metrics.SimplePie("use_locks", () -> Util.boolean2Status(getConfiguration().getBoolean("shop.lock")))); - metrics.addCustomChart(new Metrics.SimplePie("use_sneak_action", () -> Util.boolean2Status(getConfiguration().getBoolean("shop.interact.sneak-to-create") || getConfiguration().getBoolean("shop.interact.sneak-to-trade") || getConfiguration().getBoolean("shop.interact.sneak-to-control")))); + metrics.addCustomChart(new Metrics.SimplePie("use_display_items", () -> Util.boolean2Status(getConfig().getBoolean("shop.display-items")))); + metrics.addCustomChart(new Metrics.SimplePie("use_locks", () -> Util.boolean2Status(getConfig().getBoolean("shop.lock")))); + metrics.addCustomChart(new Metrics.SimplePie("use_sneak_action", () -> Util.boolean2Status(getConfig().getBoolean("shop.interact.sneak-to-create") || getConfig().getBoolean("shop.interact.sneak-to-trade") || getConfig().getBoolean("shop.interact.sneak-to-control")))); String finalEconomyType = economyType; metrics.addCustomChart(new Metrics.SimplePie("economy_type", () -> finalEconomyType)); - metrics.addCustomChart(new Metrics.SimplePie("use_display_auto_despawn", () -> String.valueOf(getConfiguration().getBoolean("shop.display-auto-despawn")))); - metrics.addCustomChart(new Metrics.SimplePie("use_enhance_display_protect", () -> String.valueOf(getConfiguration().getBoolean("shop.enchance-display-protect")))); - metrics.addCustomChart(new Metrics.SimplePie("use_enhance_shop_protect", () -> String.valueOf(getConfiguration().getBoolean("shop.enchance-shop-protect")))); - metrics.addCustomChart(new Metrics.SimplePie("use_ongoing_fee", () -> String.valueOf(getConfiguration().getBoolean("shop.ongoing-fee.enable")))); + metrics.addCustomChart(new Metrics.SimplePie("use_display_auto_despawn", () -> String.valueOf(getConfig().getBoolean("shop.display-auto-despawn")))); + metrics.addCustomChart(new Metrics.SimplePie("use_enhance_display_protect", () -> String.valueOf(getConfig().getBoolean("shop.enchance-display-protect")))); + metrics.addCustomChart(new Metrics.SimplePie("use_enhance_shop_protect", () -> String.valueOf(getConfig().getBoolean("shop.enchance-shop-protect")))); + metrics.addCustomChart(new Metrics.SimplePie("use_ongoing_fee", () -> String.valueOf(getConfig().getBoolean("shop.ongoing-fee.enable")))); metrics.addCustomChart(new Metrics.SimplePie("database_type", () -> this.getDatabaseManager().getDatabase().getName())); metrics.addCustomChart(new Metrics.SimplePie("display_type", () -> AbstractDisplayItem.getNowUsing().name())); metrics.addCustomChart(new Metrics.SimplePie("itemmatcher_type", () -> this.getItemMatcher().getName())); @@ -1097,898 +1105,898 @@ private void submitMeritcs() { //TODO: Refactor it private void updateConfig(int selectedVersion) throws IOException { - String serverUUID = getConfiguration().getString("server-uuid"); + String serverUUID = getConfig().getString("server-uuid"); if (serverUUID == null || serverUUID.isEmpty()) { UUID uuid = UUID.randomUUID(); serverUUID = uuid.toString(); - getConfiguration().set("server-uuid", serverUUID); + getConfig().set("server-uuid", serverUUID); } if (selectedVersion == 1) { - getConfiguration().set("disabled-metrics", false); - getConfiguration().set("config-version", 2); + getConfig().set("disabled-metrics", false); + getConfig().set("config-version", 2); selectedVersion = 2; } if (selectedVersion == 2) { - getConfiguration().set("protect.minecart", true); - getConfiguration().set("protect.entity", true); - getConfiguration().set("protect.redstone", true); - getConfiguration().set("protect.structuregrow", true); - getConfiguration().set("protect.explode", true); - getConfiguration().set("protect.hopper", true); - getConfiguration().set("config-version", 3); + getConfig().set("protect.minecart", true); + getConfig().set("protect.entity", true); + getConfig().set("protect.redstone", true); + getConfig().set("protect.structuregrow", true); + getConfig().set("protect.explode", true); + getConfig().set("protect.hopper", true); + getConfig().set("config-version", 3); selectedVersion = 3; } if (selectedVersion == 3) { - getConfiguration().set("shop.alternate-currency-symbol", '$'); - getConfiguration().set("config-version", 4); + getConfig().set("shop.alternate-currency-symbol", '$'); + getConfig().set("config-version", 4); selectedVersion = 4; } if (selectedVersion == 4) { - getConfiguration().set("updater", true); - getConfiguration().set("config-version", 5); + getConfig().set("updater", true); + getConfig().set("config-version", 5); selectedVersion = 5; } if (selectedVersion == 5) { - getConfiguration().set("config-version", 6); + getConfig().set("config-version", 6); selectedVersion = 6; } if (selectedVersion == 6) { - getConfiguration().set("shop.sneak-to-control", false); - getConfiguration().set("config-version", 7); + getConfig().set("shop.sneak-to-control", false); + getConfig().set("config-version", 7); selectedVersion = 7; } if (selectedVersion == 7) { - getConfiguration().set("database.prefix", "none"); - getConfiguration().set("config-version", 8); + getConfig().set("database.prefix", "none"); + getConfig().set("config-version", 8); selectedVersion = 8; } if (selectedVersion == 8) { - getConfiguration().set("limits.old-algorithm", false); - getConfiguration().set("plugin.ProtocolLib", false); - getConfiguration().set("shop.ignore-unlimited", false); - getConfiguration().set("config-version", 9); + getConfig().set("limits.old-algorithm", false); + getConfig().set("plugin.ProtocolLib", false); + getConfig().set("shop.ignore-unlimited", false); + getConfig().set("config-version", 9); selectedVersion = 9; } if (selectedVersion == 9) { - getConfiguration().set("shop.enable-enderchest", true); - getConfiguration().set("config-version", 10); + getConfig().set("shop.enable-enderchest", true); + getConfig().set("config-version", 10); selectedVersion = 10; } if (selectedVersion == 10) { - getConfiguration().remove("shop.pay-player-from-unlimited-shop-owner"); // Removed - getConfiguration().set("config-version", 11); + getConfig().set("shop.pay-player-from-unlimited-shop-owner", null); // Removed + getConfig().set("config-version", 11); selectedVersion = 11; } if (selectedVersion == 11) { - getConfiguration().remove("shop.enable-enderchest"); // Removed - getConfiguration().set("plugin.OpenInv", true); - List shoppable = getConfiguration().getStringList("shop-blocks"); + getConfig().set("shop.enable-enderchest", null); // Removed + getConfig().set("plugin.OpenInv", true); + List shoppable = getConfig().getStringList("shop-blocks"); shoppable.add("ENDER_CHEST"); - getConfiguration().set("shop-blocks", shoppable); - getConfiguration().set("config-version", 12); + getConfig().set("shop-blocks", shoppable); + getConfig().set("config-version", 12); selectedVersion = 12; } if (selectedVersion == 12) { - getConfiguration().remove("plugin.ProtocolLib"); // Removed - getConfiguration().remove("plugin.BKCommonLib"); // Removed - getConfiguration().remove("database.use-varchar"); // Removed - getConfiguration().remove("database.reconnect"); // Removed - getConfiguration().set("display-items-check-ticks", 1200); - getConfiguration().remove("shop.bypass-owner-check"); // Removed - getConfiguration().set("config-version", 13); + getConfig().set("plugin.ProtocolLib", null); // Removed + getConfig().set("plugin.BKCommonLib", null); // Removed + getConfig().set("database.use-varchar", null); // Removed + getConfig().set("database.reconnect", null); // Removed + getConfig().set("display-items-check-ticks", 1200); + getConfig().set("shop.bypass-owner-check", null); // Removed + getConfig().set("config-version", 13); selectedVersion = 13; } if (selectedVersion == 13) { - getConfiguration().set("config-version", 14); + getConfig().set("config-version", 14); selectedVersion = 14; } if (selectedVersion == 14) { - getConfiguration().remove("plugin.AreaShop"); - getConfiguration().remove("shop.special-region-only"); - getConfiguration().set("config-version", 15); + getConfig().set("plugin.AreaShop", null); + getConfig().set("shop.special-region-only", null); + getConfig().set("config-version", 15); selectedVersion = 15; } if (selectedVersion == 15) { - getConfiguration().remove("ongoingfee"); - getConfiguration().set("shop.display-item-show-name", false); - getConfiguration().set("shop.auto-fetch-shop-messages", true); - getConfiguration().set("config-version", 16); + getConfig().set("ongoingfee", null); + getConfig().set("shop.display-item-show-name", false); + getConfig().set("shop.auto-fetch-shop-messages", true); + getConfig().set("config-version", 16); selectedVersion = 16; } if (selectedVersion == 16) { - getConfiguration().set("config-version", 17); + getConfig().set("config-version", 17); selectedVersion = 17; } if (selectedVersion == 17) { - getConfiguration().set("ignore-cancel-chat-event", false); - getConfiguration().remove("float"); - getConfiguration().set("config-version", 18); + getConfig().set("ignore-cancel-chat-event", false); + getConfig().set("float", null); + getConfig().set("config-version", 18); selectedVersion = 18; } if (selectedVersion == 18) { - getConfiguration().set("shop.disable-vault-format", false); - getConfiguration().set("config-version", 19); + getConfig().set("shop.disable-vault-format", false); + getConfig().set("config-version", 19); selectedVersion = 19; } if (selectedVersion == 19) { - getConfiguration().set("shop.allow-shop-without-space-for-sign", true); - getConfiguration().set("config-version", 20); + getConfig().set("shop.allow-shop-without-space-for-sign", true); + getConfig().set("config-version", 20); selectedVersion = 20; } if (selectedVersion == 20) { - getConfiguration().set("shop.maximum-price", -1); - getConfiguration().set("config-version", 21); + getConfig().set("shop.maximum-price", -1); + getConfig().set("config-version", 21); selectedVersion = 21; } if (selectedVersion == 21) { - getConfiguration().set("shop.sign-material", "OAK_WALL_SIGN"); - getConfiguration().set("config-version", 22); + getConfig().set("shop.sign-material", "OAK_WALL_SIGN"); + getConfig().set("config-version", 22); selectedVersion = 22; } if (selectedVersion == 22) { - getConfiguration().set("include-offlineplayer-list", "false"); - getConfiguration().set("config-version", 23); + getConfig().set("include-offlineplayer-list", "false"); + getConfig().set("config-version", 23); selectedVersion = 23; } if (selectedVersion == 23) { - getConfiguration().remove("lockette.enable"); - getConfiguration().remove("lockette.item"); - getConfiguration().remove("lockette.lore"); - getConfiguration().remove("lockette.displayname"); - getConfiguration().remove("float"); - getConfiguration().set("lockette.enable", true); - getConfiguration().set("shop.blacklist-world", Lists.newArrayList("disabled_world_name")); - getConfiguration().set("config-version", 24); + getConfig().set("lockette.enable", null); + getConfig().set("lockette.item", null); + getConfig().set("lockette.lore", null); + getConfig().set("lockette.displayname", null); + getConfig().set("float", null); + getConfig().set("lockette.enable", true); + getConfig().set("shop.blacklist-world", Lists.newArrayList("disabled_world_name")); + getConfig().set("config-version", 24); selectedVersion = 24; } if (selectedVersion == 24) { - getConfiguration().set("config-version", 25); + getConfig().set("config-version", 25); selectedVersion = 25; } if (selectedVersion == 25) { - String language = getConfiguration().getString("language"); + String language = getConfig().getString("language"); if (language == null || language.isEmpty() || "default".equals(language)) { - getConfiguration().set("language", "en"); + getConfig().set("language", "en"); } - getConfiguration().set("config-version", 26); + getConfig().set("config-version", 26); selectedVersion = 26; } if (selectedVersion == 26) { - getConfiguration().set("database.usessl", false); - getConfiguration().set("config-version", 27); + getConfig().set("database.usessl", false); + getConfig().set("config-version", 27); selectedVersion = 27; } if (selectedVersion == 27) { - getConfiguration().set("queue.enable", true); - getConfiguration().set("queue.shops-per-tick", 20); - getConfiguration().set("config-version", 28); + getConfig().set("queue.enable", true); + getConfig().set("queue.shops-per-tick", 20); + getConfig().set("config-version", 28); selectedVersion = 28; } if (selectedVersion == 28) { - getConfiguration().set("database.queue", true); - getConfiguration().set("config-version", 29); + getConfig().set("database.queue", true); + getConfig().set("config-version", 29); selectedVersion = 29; } if (selectedVersion == 29) { - getConfiguration().remove("plugin.Multiverse-Core"); - getConfiguration().set("shop.protection-checking", true); - getConfiguration().set("config-version", 30); + getConfig().set("plugin.Multiverse-Core", null); + getConfig().set("shop.protection-checking", true); + getConfig().set("config-version", 30); selectedVersion = 30; } if (selectedVersion == 30) { - getConfiguration().set("auto-report-errors", true); - getConfiguration().set("config-version", 31); + getConfig().set("auto-report-errors", true); + getConfig().set("config-version", 31); selectedVersion = 31; } if (selectedVersion == 31) { - getConfiguration().set("shop.display-type", 0); - getConfiguration().set("config-version", 32); + getConfig().set("shop.display-type", 0); + getConfig().set("config-version", 32); selectedVersion = 32; } if (selectedVersion == 32) { - getConfiguration().set("effect.sound.ontabcomplete", true); - getConfiguration().set("effect.sound.oncommand", true); - getConfiguration().set("effect.sound.ononclick", true); - getConfiguration().set("config-version", 33); + getConfig().set("effect.sound.ontabcomplete", true); + getConfig().set("effect.sound.oncommand", true); + getConfig().set("effect.sound.ononclick", true); + getConfig().set("config-version", 33); selectedVersion = 33; } if (selectedVersion == 33) { - getConfiguration().set("matcher.item.damage", true); - getConfiguration().set("matcher.item.displayname", true); - getConfiguration().set("matcher.item.lores", true); - getConfiguration().set("matcher.item.enchs", true); - getConfiguration().set("matcher.item.potions", true); - getConfiguration().set("matcher.item.attributes", true); - getConfiguration().set("matcher.item.itemflags", true); - getConfiguration().set("matcher.item.custommodeldata", true); - getConfiguration().set("config-version", 34); + getConfig().set("matcher.item.damage", true); + getConfig().set("matcher.item.displayname", true); + getConfig().set("matcher.item.lores", true); + getConfig().set("matcher.item.enchs", true); + getConfig().set("matcher.item.potions", true); + getConfig().set("matcher.item.attributes", true); + getConfig().set("matcher.item.itemflags", true); + getConfig().set("matcher.item.custommodeldata", true); + getConfig().set("config-version", 34); selectedVersion = 34; } if (selectedVersion == 34) { - if (getConfiguration().getInt("shop.display-items-check-ticks") == 1200) { - getConfiguration().set("shop.display-items-check-ticks", 6000); + if (getConfig().getInt("shop.display-items-check-ticks") == 1200) { + getConfig().set("shop.display-items-check-ticks", 6000); } - getConfiguration().set("config-version", 35); + getConfig().set("config-version", 35); selectedVersion = 35; } if (selectedVersion == 35) { - getConfiguration().remove("queue"); // Close it for everyone - getConfiguration().set("config-version", 36); + getConfig().set("queue", null); // Close it for everyone + getConfig().set("config-version", 36); selectedVersion = 36; } if (selectedVersion == 36) { - getConfiguration().set("economy-type", 0); // Close it for everyone - getConfiguration().set("config-version", 37); + getConfig().set("economy-type", 0); // Close it for everyone + getConfig().set("config-version", 37); selectedVersion = 37; } if (selectedVersion == 37) { - getConfiguration().set("shop.ignore-cancel-chat-event", true); - getConfiguration().set("config-version", 38); + getConfig().set("shop.ignore-cancel-chat-event", true); + getConfig().set("config-version", 38); selectedVersion = 38; } if (selectedVersion == 38) { - getConfiguration().set("protect.inventorymove", true); - getConfiguration().set("protect.spread", true); - getConfiguration().set("protect.fromto", true); - getConfiguration().remove("protect.minecart"); - getConfiguration().remove("protect.hopper"); - getConfiguration().set("config-version", 39); + getConfig().set("protect.inventorymove", true); + getConfig().set("protect.spread", true); + getConfig().set("protect.fromto", true); + getConfig().set("protect.minecart", null); + getConfig().set("protect.hopper", null); + getConfig().set("config-version", 39); selectedVersion = 39; } if (selectedVersion == 39) { - getConfiguration().set("update-sign-when-inventory-moving", true); - getConfiguration().set("config-version", 40); + getConfig().set("update-sign-when-inventory-moving", true); + getConfig().set("config-version", 40); selectedVersion = 40; } if (selectedVersion == 40) { - getConfiguration().set("allow-economy-loan", false); - getConfiguration().set("config-version", 41); + getConfig().set("allow-economy-loan", false); + getConfig().set("config-version", 41); selectedVersion = 41; } if (selectedVersion == 41) { - getConfiguration().set("send-display-item-protection-alert", true); - getConfiguration().set("config-version", 42); + getConfig().set("send-display-item-protection-alert", true); + getConfig().set("config-version", 42); selectedVersion = 42; } if (selectedVersion == 42) { - getConfiguration().set("config-version", 43); + getConfig().set("config-version", 43); selectedVersion = 43; } if (selectedVersion == 43) { - getConfiguration().set("config-version", 44); + getConfig().set("config-version", 44); selectedVersion = 44; } if (selectedVersion == 44) { - getConfiguration().set("matcher.item.repaircost", false); - getConfiguration().set("config-version", 45); + getConfig().set("matcher.item.repaircost", false); + getConfig().set("config-version", 45); selectedVersion = 45; } if (selectedVersion == 45) { - getConfiguration().set("shop.display-item-use-name", true); - getConfiguration().set("config-version", 46); + getConfig().set("shop.display-item-use-name", true); + getConfig().set("config-version", 46); selectedVersion = 46; } if (selectedVersion == 46) { - getConfiguration().set("shop.max-shops-checks-in-once", 100); - getConfiguration().set("config-version", 47); + getConfig().set("shop.max-shops-checks-in-once", 100); + getConfig().set("config-version", 47); selectedVersion = 47; } if (selectedVersion == 47) { - getConfiguration().set("config-version", 48); + getConfig().set("config-version", 48); selectedVersion = 48; } if (selectedVersion == 48) { - getConfiguration().remove("permission-type"); - getConfiguration().remove("shop.use-protection-checking-filter"); - getConfiguration().remove("shop.protection-checking-filter"); - getConfiguration().set("config-version", 49); + getConfig().set("permission-type", null); + getConfig().set("shop.use-protection-checking-filter", null); + getConfig().set("shop.protection-checking-filter", null); + getConfig().set("config-version", 49); selectedVersion = 49; } if (selectedVersion == 49 || selectedVersion == 50) { - getConfiguration().set("shop.enchance-display-protect", false); - getConfiguration().set("shop.enchance-shop-protect", false); - getConfiguration().remove("protect"); - getConfiguration().set("config-version", 51); + getConfig().set("shop.enchance-display-protect", false); + getConfig().set("shop.enchance-shop-protect", false); + getConfig().set("protect", null); + getConfig().set("config-version", 51); selectedVersion = 51; } if (selectedVersion < 60) { // Ahhh fuck versions - getConfiguration().set("config-version", 60); + getConfig().set("config-version", 60); selectedVersion = 60; } if (selectedVersion == 60) { // Ahhh fuck versions - getConfiguration().remove("shop.strict-matches-check"); - getConfiguration().set("shop.display-auto-despawn", true); - getConfiguration().set("shop.display-despawn-range", 10); - getConfiguration().set("shop.display-check-time", 10); - getConfiguration().set("config-version", 61); + getConfig().set("shop.strict-matches-check", null); + getConfig().set("shop.display-auto-despawn", true); + getConfig().set("shop.display-despawn-range", 10); + getConfig().set("shop.display-check-time", 10); + getConfig().set("config-version", 61); selectedVersion = 61; } if (selectedVersion == 61) { // Ahhh fuck versions - getConfiguration().set("shop.word-for-sell-all-items", "all"); - getConfiguration().set("plugin.PlaceHolderAPI", true); - getConfiguration().set("config-version", 62); + getConfig().set("shop.word-for-sell-all-items", "all"); + getConfig().set("plugin.PlaceHolderAPI", true); + getConfig().set("config-version", 62); selectedVersion = 62; } if (selectedVersion == 62) { // Ahhh fuck versions - getConfiguration().set("shop.display-auto-despawn", false); - getConfiguration().set("shop.word-for-trade-all-items", getConfiguration().getString("shop.word-for-sell-all-items")); + getConfig().set("shop.display-auto-despawn", false); + getConfig().set("shop.word-for-trade-all-items", getConfig().getString("shop.word-for-sell-all-items")); - getConfiguration().set("config-version", 63); + getConfig().set("config-version", 63); selectedVersion = 63; } if (selectedVersion == 63) { // Ahhh fuck versions - getConfiguration().set("shop.ongoing-fee.enable", false); - getConfiguration().set("shop.ongoing-fee.ticks", 42000); - getConfiguration().set("shop.ongoing-fee.cost-per-shop", 2); - getConfiguration().set("shop.ongoing-fee.ignore-unlimited", true); - getConfiguration().set("config-version", 64); + getConfig().set("shop.ongoing-fee.enable", false); + getConfig().set("shop.ongoing-fee.ticks", 42000); + getConfig().set("shop.ongoing-fee.cost-per-shop", 2); + getConfig().set("shop.ongoing-fee.ignore-unlimited", true); + getConfig().set("config-version", 64); selectedVersion = 64; } if (selectedVersion == 64) { - getConfiguration().set("shop.allow-free-shop", false); - getConfiguration().set("config-version", 65); + getConfig().set("shop.allow-free-shop", false); + getConfig().set("config-version", 65); selectedVersion = 65; } if (selectedVersion == 65) { - getConfiguration().set("shop.minimum-price", 0.01); - getConfiguration().set("config-version", 66); + getConfig().set("shop.minimum-price", 0.01); + getConfig().set("config-version", 66); selectedVersion = 66; } if (selectedVersion == 66) { - getConfiguration().set("use-decimal-format", false); - getConfiguration().set("decimal-format", "#,###.##"); - getConfiguration().set("shop.show-owner-uuid-in-controlpanel-if-op", false); - getConfiguration().set("config-version", 67); + getConfig().set("use-decimal-format", false); + getConfig().set("decimal-format", "#,###.##"); + getConfig().set("shop.show-owner-uuid-in-controlpanel-if-op", false); + getConfig().set("config-version", 67); selectedVersion = 67; } if (selectedVersion == 67) { - getConfiguration().set("disable-debuglogger", false); - getConfiguration().remove("matcher.use-bukkit-matcher"); - getConfiguration().set("config-version", 68); + getConfig().set("disable-debuglogger", false); + getConfig().set("matcher.use-bukkit-matcher", null); + getConfig().set("config-version", 68); selectedVersion = 68; } if (selectedVersion == 68) { - getConfiguration().set("shop.blacklist-lores", Lists.newArrayList("SoulBound")); - getConfiguration().set("config-version", 69); + getConfig().set("shop.blacklist-lores", Lists.newArrayList("SoulBound")); + getConfig().set("config-version", 69); selectedVersion = 69; } if (selectedVersion == 69) { - getConfiguration().set("shop.display-item-use-name", false); - getConfiguration().set("config-version", 70); + getConfig().set("shop.display-item-use-name", false); + getConfig().set("config-version", 70); selectedVersion = 70; } if (selectedVersion == 70) { - getConfiguration().set("cachingpool.enable", false); - getConfiguration().set("cachingpool.maxsize", 100000000); - getConfiguration().set("config-version", 71); + getConfig().set("cachingpool.enable", false); + getConfig().set("cachingpool.maxsize", 100000000); + getConfig().set("config-version", 71); selectedVersion = 71; } if (selectedVersion == 71) { - if (Objects.equals(getConfiguration().getString("language"), "en")) { - getConfiguration().set("language", "en-US"); + if (Objects.equals(getConfig().getString("language"), "en")) { + getConfig().set("language", "en-US"); } - getConfiguration().set("server-platform", 0); - getConfiguration().set("config-version", 72); + getConfig().set("server-platform", 0); + getConfig().set("config-version", 72); selectedVersion = 72; } if (selectedVersion == 72) { - if (getConfiguration().getBoolean("use-deciaml-format")) { - getConfiguration().set("use-decimal-format", getConfiguration().getBoolean("use-deciaml-format")); + if (getConfig().getBoolean("use-deciaml-format")) { + getConfig().set("use-decimal-format", getConfig().getBoolean("use-deciaml-format")); } else { - getConfiguration().set("use-decimal-format", false); + getConfig().set("use-decimal-format", false); } - getConfiguration().remove("use-deciaml-format"); + getConfig().set("use-deciaml-format", null); - getConfiguration().set("shop.force-load-downgrade-items.enable", false); - getConfiguration().set("shop.force-load-downgrade-items.method", 0); - getConfiguration().set("config-version", 73); + getConfig().set("shop.force-load-downgrade-items.enable", false); + getConfig().set("shop.force-load-downgrade-items.method", 0); + getConfig().set("config-version", 73); selectedVersion = 73; } if (selectedVersion == 73) { - getConfiguration().set("mixedeconomy.deposit", "eco give {0} {1}"); - getConfiguration().set("mixedeconomy.withdraw", "eco take {0} {1}"); - getConfiguration().set("config-version", 74); + getConfig().set("mixedeconomy.deposit", "eco give {0} {1}"); + getConfig().set("mixedeconomy.withdraw", "eco take {0} {1}"); + getConfig().set("config-version", 74); selectedVersion = 74; } if (selectedVersion == 74) { - String langUtilsLanguage = getConfiguration().getOrDefault("langutils-language", "en_us"); - getConfiguration().remove("langutils-language"); + String langUtilsLanguage = getConfig().getString("langutils-language", "en_us"); + getConfig().set("langutils-language", null); if ("en_us".equals(langUtilsLanguage)) { langUtilsLanguage = "default"; } - getConfiguration().set("game-language", langUtilsLanguage); - getConfiguration().set("maximum-digits-in-price", -1); - getConfiguration().set("config-version", 75); + getConfig().set("game-language", langUtilsLanguage); + getConfig().set("maximum-digits-in-price", -1); + getConfig().set("config-version", 75); selectedVersion = 75; } if (selectedVersion == 75) { - getConfiguration().remove("langutils-language"); - if (getConfiguration().get("game-language") == null) { - getConfiguration().set("game-language", "default"); + getConfig().set("langutils-language", null); + if (getConfig().get("game-language") == null) { + getConfig().set("game-language", "default"); } - getConfiguration().set("config-version", 76); + getConfig().set("config-version", 76); selectedVersion = 76; } if (selectedVersion == 76) { - getConfiguration().set("database.auto-fix-encoding-issue-in-database", false); - getConfiguration().set("send-shop-protection-alert", false); - getConfiguration().set("send-display-item-protection-alert", false); - getConfiguration().set("shop.use-fast-shop-search-algorithm", false); - getConfiguration().set("config-version", 77); + getConfig().set("database.auto-fix-encoding-issue-in-database", false); + getConfig().set("send-shop-protection-alert", false); + getConfig().set("send-display-item-protection-alert", false); + getConfig().set("shop.use-fast-shop-search-algorithm", false); + getConfig().set("config-version", 77); selectedVersion = 77; } if (selectedVersion == 77) { - getConfiguration().set("integration.towny.enable", false); - getConfiguration().set("integration.towny.create", new String[]{"SHOPTYPE", "MODIFY"}); - getConfiguration().set("integration.towny.trade", new String[]{}); - getConfiguration().set("integration.worldguard.enable", false); - getConfiguration().set("integration.worldguard.create", new String[]{"FLAG", "CHEST_ACCESS"}); - getConfiguration().set("integration.worldguard.trade", new String[]{}); - getConfiguration().set("integration.plotsquared.enable", false); - getConfiguration().set("integration.plotsquared.enable", false); - getConfiguration().set("integration.plotsquared.enable", false); - getConfiguration().set("integration.residence.enable", false); - getConfiguration().set("integration.residence.create", new String[]{"FLAG", "interact", "use"}); - getConfiguration().set("integration.residence.trade", new String[]{}); - - getConfiguration().set("integration.factions.enable", false); - getConfiguration().set("integration.factions.create.flag", new String[]{}); - getConfiguration().set("integration.factions.trade.flag", new String[]{}); - getConfiguration().set("integration.factions.create.require.open", false); - getConfiguration().set("integration.factions.create.require.normal", true); - getConfiguration().set("integration.factions.create.require.wilderness", false); - getConfiguration().set("integration.factions.create.require.peaceful", true); - getConfiguration().set("integration.factions.create.require.permanent", false); - getConfiguration().set("integration.factions.create.require.safezone", false); - getConfiguration().set("integration.factions.create.require.own", false); - getConfiguration().set("integration.factions.create.require.warzone", false); - getConfiguration().set("integration.factions.trade.require.open", false); - getConfiguration().set("integration.factions.trade.require.normal", true); - getConfiguration().set("integration.factions.trade.require.wilderness", false); - getConfiguration().set("integration.factions.trade.require.peaceful", false); - getConfiguration().set("integration.factions.trade.require.permanent", false); - getConfiguration().set("integration.factions.trade.require.safezone", false); - getConfiguration().set("integration.factions.trade.require.own", false); - getConfiguration().set("integration.factions.trade.require.warzone", false); - getConfiguration().remove("anonymous-metrics"); - getConfiguration().set("shop.ongoing-fee.async", true); - getConfiguration().set("config-version", 78); + getConfig().set("integration.towny.enable", false); + getConfig().set("integration.towny.create", new String[]{"SHOPTYPE", "MODIFY"}); + getConfig().set("integration.towny.trade", new String[]{}); + getConfig().set("integration.worldguard.enable", false); + getConfig().set("integration.worldguard.create", new String[]{"FLAG", "CHEST_ACCESS"}); + getConfig().set("integration.worldguard.trade", new String[]{}); + getConfig().set("integration.plotsquared.enable", false); + getConfig().set("integration.plotsquared.enable", false); + getConfig().set("integration.plotsquared.enable", false); + getConfig().set("integration.residence.enable", false); + getConfig().set("integration.residence.create", new String[]{"FLAG", "interact", "use"}); + getConfig().set("integration.residence.trade", new String[]{}); + + getConfig().set("integration.factions.enable", false); + getConfig().set("integration.factions.create.flag", new String[]{}); + getConfig().set("integration.factions.trade.flag", new String[]{}); + getConfig().set("integration.factions.create.require.open", false); + getConfig().set("integration.factions.create.require.normal", true); + getConfig().set("integration.factions.create.require.wilderness", false); + getConfig().set("integration.factions.create.require.peaceful", true); + getConfig().set("integration.factions.create.require.permanent", false); + getConfig().set("integration.factions.create.require.safezone", false); + getConfig().set("integration.factions.create.require.own", false); + getConfig().set("integration.factions.create.require.warzone", false); + getConfig().set("integration.factions.trade.require.open", false); + getConfig().set("integration.factions.trade.require.normal", true); + getConfig().set("integration.factions.trade.require.wilderness", false); + getConfig().set("integration.factions.trade.require.peaceful", false); + getConfig().set("integration.factions.trade.require.permanent", false); + getConfig().set("integration.factions.trade.require.safezone", false); + getConfig().set("integration.factions.trade.require.own", false); + getConfig().set("integration.factions.trade.require.warzone", false); + getConfig().set("anonymous-metrics", null); + getConfig().set("shop.ongoing-fee.async", true); + getConfig().set("config-version", 78); selectedVersion = 78; } if (selectedVersion == 78) { - getConfiguration().remove("shop.display-type-specifics"); - getConfiguration().set("config-version", 79); + getConfig().set("shop.display-type-specifics", null); + getConfig().set("config-version", 79); selectedVersion = 79; } if (selectedVersion == 79) { - getConfiguration().set("matcher.item.books", true); - getConfiguration().set("config-version", 80); + getConfig().set("matcher.item.books", true); + getConfig().set("config-version", 80); selectedVersion = 80; } if (selectedVersion == 80) { - getConfiguration().set("shop.use-fast-shop-search-algorithm", true); - getConfiguration().set("config-version", 81); + getConfig().set("shop.use-fast-shop-search-algorithm", true); + getConfig().set("config-version", 81); selectedVersion = 81; } if (selectedVersion == 81) { - getConfiguration().set("config-version", 82); + getConfig().set("config-version", 82); selectedVersion = 82; } if (selectedVersion == 82) { - getConfiguration().set("matcher.item.banner", true); - getConfiguration().set("config-version", 83); + getConfig().set("matcher.item.banner", true); + getConfig().set("config-version", 83); selectedVersion = 83; } if (selectedVersion == 83) { - getConfiguration().set("matcher.item.banner", true); - getConfiguration().set("protect.explode", true); - getConfiguration().set("config-version", 84); + getConfig().set("matcher.item.banner", true); + getConfig().set("protect.explode", true); + getConfig().set("config-version", 84); selectedVersion = 84; } if (selectedVersion == 84) { - getConfiguration().remove("disable-debuglogger"); - getConfiguration().set("config-version", 85); + getConfig().set("disable-debuglogger", null); + getConfig().set("config-version", 85); selectedVersion = 85; } if (selectedVersion == 85) { - getConfiguration().set("config-version", 86); + getConfig().set("config-version", 86); selectedVersion = 86; } if (selectedVersion == 86) { - getConfiguration().set("shop.use-fast-shop-search-algorithm", true); - getConfiguration().set("config-version", 87); + getConfig().set("shop.use-fast-shop-search-algorithm", true); + getConfig().set("config-version", 87); selectedVersion = 87; } if (selectedVersion == 87) { - getConfiguration().set("plugin.BlockHub.enable", true); - getConfiguration().set("plugin.BlockHub.only", false); + getConfig().set("plugin.BlockHub.enable", true); + getConfig().set("plugin.BlockHub.only", false); if (Bukkit.getPluginManager().getPlugin("ProtocolLib") != null) { - getConfiguration().set("shop.display-type", 2); + getConfig().set("shop.display-type", 2); } - getConfiguration().set("config-version", 88); + getConfig().set("config-version", 88); selectedVersion = 88; } if (selectedVersion == 88) { - getConfiguration().set("respect-item-flag", true); - getConfiguration().set("config-version", 89); + getConfig().set("respect-item-flag", true); + getConfig().set("config-version", 89); selectedVersion = 89; } if (selectedVersion == 89) { - getConfiguration().set("use-caching", true); - getConfiguration().set("config-version", 90); + getConfig().set("use-caching", true); + getConfig().set("config-version", 90); selectedVersion = 90; } if (selectedVersion == 90) { - getConfiguration().set("protect.hopper", true); - getConfiguration().set("config-version", 91); + getConfig().set("protect.hopper", true); + getConfig().set("config-version", 91); selectedVersion = 91; } if (selectedVersion == 91) { - getConfiguration().set("database.queue-commit-interval", 2); - getConfiguration().set("config-version", 92); + getConfig().set("database.queue-commit-interval", 2); + getConfig().set("config-version", 92); selectedVersion = 92; } if (selectedVersion == 92) { - getConfiguration().set("send-display-item-protection-alert", false); - getConfiguration().set("send-shop-protection-alert", false); - getConfiguration().set("disable-creative-mode-trading", false); - getConfiguration().set("disable-super-tool", false); - getConfiguration().set("allow-owner-break-shop-sign", false); - getConfiguration().set("matcher.item.skull", true); - getConfiguration().set("matcher.item.firework", true); - getConfiguration().set("matcher.item.map", true); - getConfiguration().set("matcher.item.leatherArmor", true); - getConfiguration().set("matcher.item.fishBucket", true); - getConfiguration().set("matcher.item.suspiciousStew", true); - getConfiguration().set("matcher.item.shulkerBox", true); - getConfiguration().set("config-version", 93); + getConfig().set("send-display-item-protection-alert", false); + getConfig().set("send-shop-protection-alert", false); + getConfig().set("disable-creative-mode-trading", false); + getConfig().set("disable-super-tool", false); + getConfig().set("allow-owner-break-shop-sign", false); + getConfig().set("matcher.item.skull", true); + getConfig().set("matcher.item.firework", true); + getConfig().set("matcher.item.map", true); + getConfig().set("matcher.item.leatherArmor", true); + getConfig().set("matcher.item.fishBucket", true); + getConfig().set("matcher.item.suspiciousStew", true); + getConfig().set("matcher.item.shulkerBox", true); + getConfig().set("config-version", 93); selectedVersion = 93; } if (selectedVersion == 93) { - getConfiguration().remove("disable-creative-mode-trading"); - getConfiguration().remove("disable-super-tool"); - getConfiguration().remove("allow-owner-break-shop-sign"); - getConfiguration().set("shop.disable-creative-mode-trading", true); - getConfiguration().set("shop.disable-super-tool", true); - getConfiguration().set("shop.allow-owner-break-shop-sign", false); - getConfiguration().set("config-version", 94); + getConfig().set("disable-creative-mode-trading", null); + getConfig().set("disable-super-tool", null); + getConfig().set("allow-owner-break-shop-sign", null); + getConfig().set("shop.disable-creative-mode-trading", true); + getConfig().set("shop.disable-super-tool", true); + getConfig().set("shop.allow-owner-break-shop-sign", false); + getConfig().set("config-version", 94); selectedVersion = 94; } if (selectedVersion == 94) { - if (getConfiguration().get("price-restriction") != null) { - getConfiguration().set("shop.price-restriction", getConfiguration().getStringList("price-restriction")); - getConfiguration().remove("price-restriction"); + if (getConfig().get("price-restriction") != null) { + getConfig().set("shop.price-restriction", getConfig().getStringList("price-restriction")); + getConfig().set("price-restriction", null); } else { - getConfiguration().set("shop.price-restriction", new ArrayList<>(0)); + getConfig().set("shop.price-restriction", new ArrayList<>(0)); } - getConfiguration().remove("enable-log4j"); - getConfiguration().set("config-version", 95); + getConfig().set("enable-log4j", null); + getConfig().set("config-version", 95); selectedVersion = 95; } if (selectedVersion == 95) { - getConfiguration().set("shop.allow-stacks", false); - getConfiguration().set("shop.display-allow-stacks", false); - getConfiguration().set("custom-item-stacksize", new ArrayList<>(0)); - getConfiguration().set("config-version", 96); + getConfig().set("shop.allow-stacks", false); + getConfig().set("shop.display-allow-stacks", false); + getConfig().set("custom-item-stacksize", new ArrayList<>(0)); + getConfig().set("config-version", 96); selectedVersion = 96; } if (selectedVersion == 96) { - getConfiguration().set("shop.deny-non-shop-items-to-shop-container", false); - getConfiguration().set("config-version", 97); + getConfig().set("shop.deny-non-shop-items-to-shop-container", false); + getConfig().set("config-version", 97); selectedVersion = 97; } if (selectedVersion == 97) { - getConfiguration().set("shop.disable-quick-create", false); - getConfiguration().set("config-version", 98); + getConfig().set("shop.disable-quick-create", false); + getConfig().set("config-version", 98); selectedVersion = 98; } if (selectedVersion == 98) { - getConfiguration().set("config-version", 99); + getConfig().set("config-version", 99); selectedVersion = 99; } if (selectedVersion == 99) { - getConfiguration().set("shop.currency-symbol-on-right", false); - getConfiguration().set("config-version", 100); + getConfig().set("shop.currency-symbol-on-right", false); + getConfig().set("config-version", 100); selectedVersion = 100; } if (selectedVersion == 100) { - getConfiguration().set("integration.towny.ignore-disabled-worlds", false); - getConfiguration().set("config-version", 101); + getConfig().set("integration.towny.ignore-disabled-worlds", false); + getConfig().set("config-version", 101); selectedVersion = 101; } if (selectedVersion == 101) { - getConfiguration().set("matcher.work-type", 1); - getConfiguration().remove("work-type"); - getConfiguration().set("plugin.LWC", true); - getConfiguration().set("config-version", 102); + getConfig().set("matcher.work-type", 1); + getConfig().set("work-type", null); + getConfig().set("plugin.LWC", true); + getConfig().set("config-version", 102); selectedVersion = 102; } if (selectedVersion == 102) { - getConfiguration().set("protect.entity", true); - getConfiguration().set("config-version", 103); + getConfig().set("protect.entity", true); + getConfig().set("config-version", 103); selectedVersion = 103; } if (selectedVersion == 103) { - getConfiguration().set("integration.worldguard.whitelist-mode", false); - getConfiguration().set("integration.factions.whitelist-mode", true); - getConfiguration().set("integration.plotsquared.whitelist-mode", true); - getConfiguration().set("integration.residence.whitelist-mode", true); - getConfiguration().set("config-version", 104); + getConfig().set("integration.worldguard.whitelist-mode", false); + getConfig().set("integration.factions.whitelist-mode", true); + getConfig().set("integration.plotsquared.whitelist-mode", true); + getConfig().set("integration.residence.whitelist-mode", true); + getConfig().set("config-version", 104); selectedVersion = 104; } if (selectedVersion == 104) { - getConfiguration().remove("cachingpool"); - getConfiguration().set("config-version", 105); + getConfig().set("cachingpool", null); + getConfig().set("config-version", 105); selectedVersion = 105; } if (selectedVersion == 105) { - getConfiguration().set("shop.interact.sneak-to-create", getConfiguration().getBoolean("shop.sneak-to-create")); - getConfiguration().remove("shop.sneak-to-create"); - getConfiguration().set("shop.interact.sneak-to-trade", getConfiguration().getBoolean("shop.sneak-to-trade")); - getConfiguration().remove("shop.sneak-to-trade"); - getConfiguration().set("shop.interact.sneak-to-control", getConfiguration().getBoolean("shop.sneak-to-control")); - getConfiguration().remove("shop.sneak-to-control"); - getConfiguration().set("config-version", 106); + getConfig().set("shop.interact.sneak-to-create", getConfig().getBoolean("shop.sneak-to-create")); + getConfig().set("shop.sneak-to-create", null); + getConfig().set("shop.interact.sneak-to-trade", getConfig().getBoolean("shop.sneak-to-trade")); + getConfig().set("shop.sneak-to-trade", null); + getConfig().set("shop.interact.sneak-to-control", getConfig().getBoolean("shop.sneak-to-control")); + getConfig().set("shop.sneak-to-control", null); + getConfig().set("config-version", 106); selectedVersion = 106; } if (selectedVersion == 106) { - getConfiguration().set("shop.use-enchantment-for-enchanted-book", false); - getConfiguration().set("config-version", 107); + getConfig().set("shop.use-enchantment-for-enchanted-book", false); + getConfig().set("config-version", 107); selectedVersion = 107; } if (selectedVersion == 107) { - getConfiguration().set("integration.lands.enable", false); - getConfiguration().set("integration.lands.whitelist-mode", false); - getConfiguration().set("integration.lands.ignore-disabled-worlds", true); - getConfiguration().set("config-version", 108); + getConfig().set("integration.lands.enable", false); + getConfig().set("integration.lands.whitelist-mode", false); + getConfig().set("integration.lands.ignore-disabled-worlds", true); + getConfig().set("config-version", 108); selectedVersion = 108; } if (selectedVersion == 108) { - getConfiguration().set("debug.shop-deletion", false); - getConfiguration().set("config-version", 109); + getConfig().set("debug.shop-deletion", false); + getConfig().set("config-version", 109); selectedVersion = 109; } if (selectedVersion == 109) { - getConfiguration().set("shop.protection-checking-blacklist", Collections.singletonList("disabled_world")); - getConfiguration().set("config-version", 110); + getConfig().set("shop.protection-checking-blacklist", Collections.singletonList("disabled_world")); + getConfig().set("config-version", 110); selectedVersion = 110; } if (selectedVersion == 110) { - getConfiguration().set("integration.worldguard.any-owner", true); - getConfiguration().set("config-version", 111); + getConfig().set("integration.worldguard.any-owner", true); + getConfig().set("config-version", 111); selectedVersion = 111; } if (selectedVersion == 111) { - getConfiguration().set("logging.enable", getConfiguration().getBoolean("log-actions")); - getConfiguration().set("logging.log-actions", getConfiguration().getBoolean("log-actions")); - getConfiguration().set("logging.log-balance", true); - getConfiguration().set("logging.file-size", 10); - getConfiguration().set("debug.disable-debuglogger", false); - getConfiguration().set("trying-fix-banlance-insuffient", false); - getConfiguration().remove("log-actions"); - getConfiguration().set("config-version", 112); + getConfig().set("logging.enable", getConfig().getBoolean("log-actions")); + getConfig().set("logging.log-actions", getConfig().getBoolean("log-actions")); + getConfig().set("logging.log-balance", true); + getConfig().set("logging.file-size", 10); + getConfig().set("debug.disable-debuglogger", false); + getConfig().set("trying-fix-banlance-insuffient", false); + getConfig().set("log-actions", null); + getConfig().set("config-version", 112); selectedVersion = 112; } if (selectedVersion == 112) { - getConfiguration().set("integration.lands.delete-on-lose-permission", false); - getConfiguration().set("config-version", 113); + getConfig().set("integration.lands.delete-on-lose-permission", false); + getConfig().set("config-version", 113); selectedVersion = 113; } if (selectedVersion == 113) { - getConfiguration().set("config-damaged", false); - getConfiguration().set("config-version", 114); + getConfig().set("config-damaged", false); + getConfig().set("config-version", 114); selectedVersion = 114; } if (selectedVersion == 114) { - getConfiguration().set("shop.interact.interact-mode", getConfiguration().getBoolean("shop.interact.switch-mode") ? 0 : 1); - getConfiguration().remove("shop.interact.switch-mode"); - getConfiguration().set("config-version", 115); + getConfig().set("shop.interact.interact-mode", getConfig().getBoolean("shop.interact.switch-mode") ? 0 : 1); + getConfig().set("shop.interact.switch-mode", null); + getConfig().set("config-version", 115); selectedVersion = 115; } if (selectedVersion == 115) { - getConfiguration().set("integration.griefprevention.enable", false); - getConfiguration().set("integration.griefprevention.whitelist-mode", false); - getConfiguration().set("integration.griefprevention.create", Collections.emptyList()); - getConfiguration().set("integration.griefprevention.trade", Collections.emptyList()); - getConfiguration().set("config-version", 116); + getConfig().set("integration.griefprevention.enable", false); + getConfig().set("integration.griefprevention.whitelist-mode", false); + getConfig().set("integration.griefprevention.create", Collections.emptyList()); + getConfig().set("integration.griefprevention.trade", Collections.emptyList()); + getConfig().set("config-version", 116); selectedVersion = 116; } if (selectedVersion == 116) { - getConfiguration().set("shop.sending-stock-message-to-staffs", false); - getConfiguration().set("integration.towny.delete-shop-on-resident-leave", false); - getConfiguration().set("config-version", 117); + getConfig().set("shop.sending-stock-message-to-staffs", false); + getConfig().set("integration.towny.delete-shop-on-resident-leave", false); + getConfig().set("config-version", 117); selectedVersion = 117; } if (selectedVersion == 117) { - getConfiguration().set("shop.finding.distance", getConfiguration().getInt("shop.find-distance")); - getConfiguration().set("shop.finding.limit", 10); - getConfiguration().remove("shop.find-distance"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.finding.distance", getConfig().getInt("shop.find-distance")); + getConfig().set("shop.finding.limit", 10); + getConfig().set("shop.find-distance", null); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 118) { - getConfiguration().set("shop.finding.oldLogic", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.finding.oldLogic", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 119) { - getConfiguration().set("debug.adventure", false); - getConfiguration().set("shop.finding.all", false); - getConfiguration().set("chat-type", 0); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("debug.adventure", false); + getConfig().set("shop.finding.all", false); + getConfig().set("chat-type", 0); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 120) { - getConfiguration().set("shop.finding.exclude-out-of-stock", false); - getConfiguration().set("chat-type", 0); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.finding.exclude-out-of-stock", false); + getConfig().set("chat-type", 0); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 121) { - getConfiguration().set("shop.protection-checking-handler", 0); - getConfiguration().set("shop.protection-checking-listener-blacklist", Collections.singletonList("ignored_listener")); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.protection-checking-handler", 0); + getConfig().set("shop.protection-checking-listener-blacklist", Collections.singletonList("ignored_listener")); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 122) { - getConfiguration().set("currency", ""); - getConfiguration().set("shop.alternate-currency-symbol-list", Arrays.asList("CNY;¥", "USD;$")); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("currency", ""); + getConfig().set("shop.alternate-currency-symbol-list", Arrays.asList("CNY;¥", "USD;$")); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 123) { - getConfiguration().set("integration.fabledskyblock.enable", false); - getConfiguration().set("integration.fabledskyblock.whitelist-mode", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.fabledskyblock.enable", false); + getConfig().set("integration.fabledskyblock.whitelist-mode", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 124) { - getConfiguration().set("plugin.BKCommonLib", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("plugin.BKCommonLib", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 125) { - getConfiguration().set("integration.superiorskyblock.enable", false); - getConfiguration().set("integration.superiorskyblock.owner-create-only", false); - getConfiguration().set("integration.superiorskyblock.delete-shop-on-member-leave", true); - getConfiguration().set("shop.interact.swap-click-behavior", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.superiorskyblock.enable", false); + getConfig().set("integration.superiorskyblock.owner-create-only", false); + getConfig().set("integration.superiorskyblock.delete-shop-on-member-leave", true); + getConfig().set("shop.interact.swap-click-behavior", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 126) { - getConfiguration().set("debug.delete-corrupt-shops", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("debug.delete-corrupt-shops", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 127) { - getConfiguration().set("integration.plotsquared.delete-when-user-untrusted", true); - getConfiguration().set("integration.towny.delete-shop-on-plot-clear", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.plotsquared.delete-when-user-untrusted", true); + getConfig().set("integration.towny.delete-shop-on-plot-clear", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 128) { - getConfiguration().set("shop.force-use-item-original-name", false); - getConfiguration().set("integration.griefprevention.delete-on-untrusted", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.force-use-item-original-name", false); + getConfig().set("integration.griefprevention.delete-on-untrusted", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 129) { - getConfiguration().set("shop.use-global-virtual-item-queue", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.use-global-virtual-item-queue", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 130) { - getConfiguration().set("plugin.WorldEdit", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("plugin.WorldEdit", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 131) { - getConfiguration().set("custom-commands", ImmutableList.of("shop", "chestshop", "cshop")); - getConfiguration().set("unlimited-shop-owner-change", false); - getConfiguration().set("unlimited-shop-owner-change-account", "quickshop"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("custom-commands", ImmutableList.of("shop", "chestshop", "cshop")); + getConfig().set("unlimited-shop-owner-change", false); + getConfig().set("unlimited-shop-owner-change-account", "quickshop"); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 132) { - getConfiguration().set("shop.sign-glowing", false); - getConfiguration().set("shop.sign-dye-color", "null"); - getConfiguration().set("unlimited-shop-owner-change-account", "quickshop"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.sign-glowing", false); + getConfig().set("shop.sign-dye-color", "null"); + getConfig().set("unlimited-shop-owner-change-account", "quickshop"); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 133) { - getConfiguration().set("integration.griefprevention.delete-on-unclaim", false); - getConfiguration().set("integration.griefprevention.delete-on-claim-expired", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.griefprevention.delete-on-unclaim", false); + getConfig().set("integration.griefprevention.delete-on-claim-expired", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 134) { - getConfiguration().set("integration.griefprevention.delete-on-claim-resized", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.griefprevention.delete-on-claim-resized", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 135) { - getConfiguration().set("integration.advancedregionmarket.enable", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.advancedregionmarket.enable", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 136) { - getConfiguration().remove("shop.use-global-virtual-item-queue"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("shop.use-global-virtual-item-queue", null); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 137) { - getConfiguration().remove("integration.griefprevention.create"); - getConfiguration().set("integration.griefprevention.create", "INVENTORY"); + getConfig().set("integration.griefprevention.create", null); + getConfig().set("integration.griefprevention.create", "INVENTORY"); - getConfiguration().remove("integration.griefprevention.trade"); - getConfiguration().set("integration.griefprevention.trade", Collections.emptyList()); + getConfig().set("integration.griefprevention.trade", null); + getConfig().set("integration.griefprevention.trade", Collections.emptyList()); - boolean oldValueUntrusted = getConfiguration().getOrDefault("integration.griefprevention.delete-on-untrusted", false); - getConfiguration().remove("integration.griefprevention.delete-on-untrusted"); - getConfiguration().set("integration.griefprevention.delete-on-claim-trust-changed", oldValueUntrusted); + boolean oldValueUntrusted = getConfig().getBoolean("integration.griefprevention.delete-on-untrusted", false); + getConfig().set("integration.griefprevention.delete-on-untrusted", null); + getConfig().set("integration.griefprevention.delete-on-claim-trust-changed", oldValueUntrusted); - boolean oldValueUnclaim = getConfiguration().getOrDefault("integration.griefprevention.delete-on-unclaim", false); - getConfiguration().remove("integration.griefprevention.delete-on-unclaim"); - getConfiguration().set("integration.griefprevention.delete-on-claim-unclaimed", oldValueUnclaim); + boolean oldValueUnclaim = getConfig().getBoolean("integration.griefprevention.delete-on-unclaim", false); + getConfig().set("integration.griefprevention.delete-on-unclaim", null); + getConfig().set("integration.griefprevention.delete-on-claim-unclaimed", oldValueUnclaim); - getConfiguration().set("integration.griefprevention.delete-on-subclaim-created", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.griefprevention.delete-on-subclaim-created", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 138) { - getConfiguration().set("integration.towny.whitelist-mode", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.towny.whitelist-mode", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 139) { - getConfiguration().set("integration.iridiumskyblock.enable", false); - getConfiguration().set("integration.iridiumskyblock.owner-create-only", false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.iridiumskyblock.enable", false); + getConfig().set("integration.iridiumskyblock.owner-create-only", false); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 140) { - getConfiguration().set("integration.towny.delete-shop-on-plot-destroy", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.towny.delete-shop-on-plot-destroy", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 141) { - getConfiguration().set("disabled-languages", Collections.singletonList("disable_here")); - getConfiguration().set("mojangapi-mirror", 0); - getConfiguration().set("purge.enabled", false); - getConfiguration().set("purge.days", 60); - getConfiguration().set("purge.banned", true); - getConfiguration().set("purge.skip-op", true); - getConfiguration().set("purge.return-create-fee", true); - getConfiguration().remove("shop.use-fast-shop-search-algorithm"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("disabled-languages", Collections.singletonList("disable_here")); + getConfig().set("mojangapi-mirror", 0); + getConfig().set("purge.enabled", false); + getConfig().set("purge.days", 60); + getConfig().set("purge.banned", true); + getConfig().set("purge.skip-op", true); + getConfig().set("purge.return-create-fee", true); + getConfig().set("shop.use-fast-shop-search-algorithm", null); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 142) { - getConfiguration().remove("disabled-languages"); - getConfiguration().set("enabled-languages", Collections.singletonList("*")); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("disabled-languages", null); + getConfig().set("enabled-languages", Collections.singletonList("*")); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 143) { -// if (getConfiguration().get("language") == null) { -// getConfiguration().set("language", "en-US"); +// if (getConfig().get("language") == null) { +// getConfig().set("language", "en-US"); // } - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 144) { // Updater set it to true because plugin upgrading // Default configuration disable it cause probably fresh install - getConfiguration().getOrDefault("legacy-updater.shop-sign", true); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("legacy-updater.shop-sign", true); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 145) { // Updater set it to true because plugin upgrading // Default configuration disable it cause probably fresh install - getConfiguration().set("logger.location", 0); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("logger.location", 0); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 146) { // Updater set it to true because plugin upgrading // Default configuration disable it cause probably fresh install - getConfiguration().remove("language"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("language", null); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 147) { // Updater set it to true because plugin upgrading // Default configuration disable it cause probably fresh install - getConfiguration().remove("plugin.BKCommonLib"); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("plugin.BKCommonLib", null); + getConfig().set("config-version", ++selectedVersion); } if (selectedVersion == 148) { - getConfiguration().set("integration.worldguard.respect-global-region",false); - getConfiguration().set("config-version", ++selectedVersion); + getConfig().set("integration.worldguard.respect-global-region", false); + getConfig().set("config-version", ++selectedVersion); } - if (getConfiguration().getInt("matcher.work-type") != 0 && GameVersion.get(ReflectFactory.getServerVersion()).name().contains("1_16")) { + if (getConfig().getInt("matcher.work-type") != 0 && GameVersion.get(ReflectFactory.getServerVersion()).name().contains("1_16")) { getLogger().warning("You are not using QS Matcher, it may meeting item comparing issue mentioned there: https://hub.spigotmc.org/jira/browse/SPIGOT-5063"); } try (InputStreamReader buildInConfigReader = new InputStreamReader(new BufferedInputStream(Objects.requireNonNull(getResource("config.yml"))), StandardCharsets.UTF_8)) { - if (new ConfigurationFixerLightning(this, new File(getDataFolder(), "config.yml"), getConfiguration(), YamlConfiguration.loadConfiguration(buildInConfigReader)).fix()) { + if (new ConfigurationFixer(this, new File(getDataFolder(), "config.yml"), getConfig(), YamlConfiguration.loadConfiguration(buildInConfigReader)).fix()) { reloadConfiguration(); } } @@ -2030,7 +2038,7 @@ public void setupBootError(BootError bootError, boolean unregisterListeners) { } public void registerCustomCommands() { - List customCommands = getConfiguration().getStringList("custom-commands"); + List customCommands = getConfig().getStringList("custom-commands"); PluginCommand quickShopCommand = getCommand("qs"); if (quickShopCommand == null) { getLogger().warning("Failed to get QuickShop PluginCommand instance."); diff --git a/src/main/java/org/maxgamer/quickshop/api/economy/AbstractEconomy.java b/src/main/java/org/maxgamer/quickshop/api/economy/AbstractEconomy.java index 95f21087f6..02d731e306 100644 --- a/src/main/java/org/maxgamer/quickshop/api/economy/AbstractEconomy.java +++ b/src/main/java/org/maxgamer/quickshop/api/economy/AbstractEconomy.java @@ -43,7 +43,7 @@ public AbstractEconomy() { * @return Economy type that QuickShop now using */ public static EconomyType getNowUsing() { - return EconomyType.fromID(QuickShop.getInstance().getConfiguration().getInt("economy-type")); + return EconomyType.fromID(QuickShop.getInstance().getConfig().getInt("economy-type")); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/api/economy/EconomyTransaction.java b/src/main/java/org/maxgamer/quickshop/api/economy/EconomyTransaction.java index d07947f750..01bca46396 100644 --- a/src/main/java/org/maxgamer/quickshop/api/economy/EconomyTransaction.java +++ b/src/main/java/org/maxgamer/quickshop/api/economy/EconomyTransaction.java @@ -103,7 +103,7 @@ public EconomyTransaction(@Nullable UUID from, @Nullable UUID to, double amount, //For passing Test //noinspection ConstantConditions if (QuickShop.getInstance() != null) { - this.tryingFixBalanceInsufficient = QuickShop.getInstance().getConfiguration().getBoolean("trying-fix-banlance-insuffient"); + this.tryingFixBalanceInsufficient = QuickShop.getInstance().getConfig().getBoolean("trying-fix-banlance-insuffient"); } else { this.tryingFixBalanceInsufficient = false; } diff --git a/src/main/java/org/maxgamer/quickshop/api/shop/AbstractDisplayItem.java b/src/main/java/org/maxgamer/quickshop/api/shop/AbstractDisplayItem.java index 05819b0fba..9c3bc13445 100644 --- a/src/main/java/org/maxgamer/quickshop/api/shop/AbstractDisplayItem.java +++ b/src/main/java/org/maxgamer/quickshop/api/shop/AbstractDisplayItem.java @@ -175,10 +175,10 @@ public static boolean checkIsTargetShopDisplay(@NotNull final ItemStack itemStac */ @NotNull public static DisplayType getNowUsing() { - DisplayType displayType = DisplayType.fromID(PLUGIN.getConfiguration().getInt("shop.display-type")); + DisplayType displayType = DisplayType.fromID(PLUGIN.getConfig().getInt("shop.display-type")); //Falling back to RealDisplayItem when VirtualDisplayItem is unsupported if (isNotSupportVirtualItem && displayType == DisplayType.VIRTUALITEM) { - PLUGIN.getConfiguration().set("shop.display-type", 0); + PLUGIN.getConfig().set("shop.display-type", 0); PLUGIN.saveConfiguration(); PLUGIN.getLogger().log(Level.WARNING, "Falling back to RealDisplayItem because VirtualDisplayItem is unsupported"); return DisplayType.REALITEM; @@ -204,7 +204,7 @@ public static ItemStack createGuardItemStack(@NotNull ItemStack itemStack, @NotN Util.debugLog("ItemStack " + itemStack + " cannot getting or creating ItemMeta, failed to create guarded ItemStack."); return itemStack; } - if (PLUGIN.getConfiguration().getBoolean("shop.display-item-use-name")) { + if (PLUGIN.getConfig().getBoolean("shop.display-item-use-name")) { if (iMeta.hasDisplayName()) { iMeta.setDisplayName(iMeta.getDisplayName()); } else { @@ -234,7 +234,7 @@ public static ShopProtectionFlag createShopProtectionFlag( } protected void init() { - DISPLAY_ALLOW_STACKS = PLUGIN.getConfiguration().getBoolean("shop.display-allow-stacks"); + DISPLAY_ALLOW_STACKS = PLUGIN.getConfig().getBoolean("shop.display-allow-stacks"); if (DISPLAY_ALLOW_STACKS) { //Prevent stack over the normal size originalItemStack.setAmount(Math.min(originalItemStack.getAmount(), originalItemStack.getMaxStackSize())); diff --git a/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java b/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java index 93f32ac561..3b7f387764 100644 --- a/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java +++ b/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java @@ -582,7 +582,7 @@ default boolean isShopSign(@NotNull Sign sign) { if (lines[1].startsWith(SHOP_SIGN_PATTERN)) { return true; } else { - if (!QuickShop.getInstance().getConfiguration().getOrDefault("legacy-updater.shop-sign", false)) { + if (!QuickShop.getInstance().getConfig().getBoolean("legacy-updater.shop-sign", false)) { return false; } String header = lines[0]; diff --git a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java index c561d42a3f..9fb2f1fd0e 100644 --- a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java +++ b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java @@ -389,7 +389,7 @@ public boolean onCommand( return true; } } - if (sender instanceof Player && plugin.getConfiguration().getBoolean("effect.sound.oncommand")) { + if (sender instanceof Player && plugin.getConfig().getBoolean("effect.sound.oncommand")) { Player player = (Player) sender; ((Player) sender) .playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 80.0F, 1.0F); @@ -501,7 +501,7 @@ private boolean isAdapt(CommandContainer container, CommandSender sender) { if (plugin.getBootError() != null) { return Collections.emptyList(); } - if (sender instanceof Player && plugin.getConfiguration().getBoolean("effect.sound.ontabcomplete")) { + if (sender instanceof Player && plugin.getConfig().getBoolean("effect.sound.ontabcomplete")) { Player player = (Player) sender; ((Player) sender).playSound(player.getLocation(), Sound.BLOCK_DISPENSER_FAIL, 80.0F, 1.0F); } 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 210266fab9..744e018c58 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 @@ -19,11 +19,11 @@ package org.maxgamer.quickshop.command.subcommand; -import de.leonhard.storage.sections.FlatFileSection; import lombok.SneakyThrows; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; @@ -73,7 +73,7 @@ public void onCommand(@NotNull ConsoleCommandSender sender, @NotNull String comm sender.sendMessage(ChatColor.RED + "Your database is already in MySQL!"); return; } - FlatFileSection dbCfg = plugin.getConfiguration().getSection("database"); + ConfigurationSection dbCfg = plugin.getConfig().getConfigurationSection("database"); String user = dbCfg.getString("user"); String pass = dbCfg.getString("password"); String host = dbCfg.getString("host"); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java index 32de8c5750..df6ca2b494 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java @@ -117,17 +117,17 @@ public List onTabComplete( } public void switchDebug(@NotNull CommandSender sender) { - final boolean debug = plugin.getConfiguration().getBoolean("dev-mode"); + final boolean debug = plugin.getConfig().getBoolean("dev-mode"); if (debug) { - plugin.getConfiguration().set("dev-mode", false); + plugin.getConfig().set("dev-mode", false); plugin.saveConfiguration(); plugin.reload(); plugin.text().of(sender, "command.now-nolonger-debuging").send(); return; } - plugin.getConfiguration().set("dev-mode", true); + plugin.getConfig().set("dev-mode", true); plugin.saveConfiguration(); plugin.reload(); plugin.text().of(sender, "command.now-debuging").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java index 65707387a2..f36556d2bf 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java @@ -59,11 +59,11 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not final String lookFor = sb.toString().toLowerCase(); - final double maxDistance = plugin.getConfiguration().getInt("shop.finding.distance"); - final boolean usingOldLogic = plugin.getConfiguration().getBoolean("shop.finding.oldLogic"); - final int shopLimit = usingOldLogic ? 1 : plugin.getConfiguration().getInt("shop.finding.limit"); - final boolean allShops = plugin.getConfiguration().getBoolean("shop.finding.all"); - final boolean excludeOutOfStock = plugin.getConfiguration().getBoolean("shop.finding.exclude-out-of-stock"); + final double maxDistance = plugin.getConfig().getInt("shop.finding.distance"); + final boolean usingOldLogic = plugin.getConfig().getBoolean("shop.finding.oldLogic"); + final int shopLimit = usingOldLogic ? 1 : plugin.getConfig().getInt("shop.finding.limit"); + final boolean allShops = plugin.getConfig().getBoolean("shop.finding.all"); + final boolean excludeOutOfStock = plugin.getConfig().getBoolean("shop.finding.exclude-out-of-stock"); //Rewrite by Ghost_chu - Use vector to replace old chunks finding. diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Item.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Item.java index 7e12347ba1..a4b7de628c 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Item.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Item.java @@ -65,10 +65,10 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not itemStack.setAmount(1); } SimplePriceLimiter limiter = new SimplePriceLimiter( - plugin.getConfiguration().getDouble("shop.minimum-price"), - plugin.getConfiguration().getInt("shop.maximum-price"), - plugin.getConfiguration().getBoolean("shop.allow-free-shop"), - plugin.getConfiguration().getBoolean("whole-number-prices-only")); + plugin.getConfig().getDouble("shop.minimum-price"), + plugin.getConfig().getInt("shop.maximum-price"), + plugin.getConfig().getBoolean("shop.allow-free-shop"), + plugin.getConfig().getBoolean("whole-number-prices-only")); PriceLimiterCheckResult checkResult = limiter.check(itemStack, shop.getPrice()); if (checkResult.getStatus() != PriceLimiterStatus.PASS) { plugin.text().of(sender, "restricted-prices", MsgUtil.getTranslateText(shop.getItem()), diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java index fcaa81a361..173c9d73d4 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Price.java @@ -68,12 +68,12 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not return; } - final boolean format = plugin.getConfiguration().getBoolean("use-decimal-format"); + final boolean format = plugin.getConfig().getBoolean("use-decimal-format"); double fee = 0; if (plugin.isPriceChangeRequiresFee()) { - fee = plugin.getConfiguration().getDouble("shop.fee-for-price-change"); + fee = plugin.getConfig().getDouble("shop.fee-for-price-change"); } final BlockIterator bIt = new BlockIterator(sender, 10); @@ -84,10 +84,10 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not } SimplePriceLimiter limiter = new SimplePriceLimiter( - plugin.getConfiguration().getDouble("shop.minimum-price"), - plugin.getConfiguration().getInt("shop.maximum-price"), - plugin.getConfiguration().getBoolean("shop.allow-free-shop"), - plugin.getConfiguration().getBoolean("whole-number-prices-only")); + plugin.getConfig().getDouble("shop.minimum-price"), + plugin.getConfig().getInt("shop.maximum-price"), + plugin.getConfig().getBoolean("shop.allow-free-shop"), + plugin.getConfig().getBoolean("whole-number-prices-only")); while (bIt.hasNext()) { final Block b = bIt.next(); @@ -129,7 +129,7 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not if (fee > 0) { EconomyTransaction transaction = EconomyTransaction.builder() - .allowLoan(plugin.getConfiguration().getOrDefault("shop.allow-economy-loan", false)) + .allowLoan(plugin.getConfig().getBoolean("shop.allow-economy-loan", false)) .core(plugin.getEconomy()) .from(sender.getUniqueId()) .amount(fee) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java index a23f13f6ba..16f1a5fab4 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Refill.java @@ -61,7 +61,7 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not if (StringUtils.isNumeric(cmdArg[0])) { add = Integer.parseInt(cmdArg[0]); } else { - if (cmdArg[0].equals(plugin.getConfiguration().getString("shop.word-for-trade-all-items"))) { + if (cmdArg[0].equals(plugin.getConfig().getString("shop.word-for-trade-all-items"))) { add = shop.getRemainingSpace(); } else { plugin.text().of(sender, "thats-not-a-number").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Reset.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Reset.java index 61ae88ff02..762a617e9b 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Reset.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Reset.java @@ -60,7 +60,7 @@ public void onCommand(@NotNull CommandSender sender, @NotNull String commandLabe item.delete(); ench.delete(); potion.delete(); - MsgUtil.loadGameLanguage(Objects.requireNonNull(plugin.getConfiguration().getOrDefault("game-language", "default"))); + MsgUtil.loadGameLanguage(Objects.requireNonNull(plugin.getConfig().getString("game-language", "default"))); MsgUtil.loadItemi18n(); MsgUtil.loadEnchi18n(); MsgUtil.loadPotioni18n(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java index 47f71afe96..0cd2c20873 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java @@ -55,14 +55,14 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not if (shop.isUnlimited()) { plugin.text().of(sender, "command.toggle-unlimited.unlimited").send(); - if (plugin.getConfiguration().getBoolean("unlimited-shop-owner-change")) { + if (plugin.getConfig().getBoolean("unlimited-shop-owner-change")) { plugin.getShopManager().migrateOwnerToUnlimitedShopOwner(shop); plugin.text().of(sender, "unlimited-shop-owner-changed", ((SimpleShopManager) plugin.getShopManager()).getCacheUnlimitedShopAccount().getName()).send(); } return; } plugin.text().of(sender, "command.toggle-unlimited.limited").send(); - if (plugin.getConfiguration().getBoolean("unlimited-shop-owner-change")) { + if (plugin.getConfig().getBoolean("unlimited-shop-owner-change")) { plugin.text().of(sender, "unlimited-shop-owner-keeped").send(); } } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Size.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Size.java index baec8e1142..f43c6b0e8a 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Size.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Size.java @@ -69,10 +69,10 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not ItemStack pendingItemStack = shop.getItem().clone(); pendingItemStack.setAmount(amount); SimplePriceLimiter limiter = new SimplePriceLimiter( - plugin.getConfiguration().getDouble("shop.minimum-price"), - plugin.getConfiguration().getInt("shop.maximum-price"), - plugin.getConfiguration().getBoolean("shop.allow-free-shop"), - plugin.getConfiguration().getBoolean("whole-number-prices-only")); + plugin.getConfig().getDouble("shop.minimum-price"), + plugin.getConfig().getInt("shop.maximum-price"), + plugin.getConfig().getBoolean("shop.allow-free-shop"), + plugin.getConfig().getBoolean("whole-number-prices-only")); PriceLimiterCheckResult checkResult = limiter.check(pendingItemStack, shop.getPrice()); if (checkResult.getStatus() != PriceLimiterStatus.PASS) { plugin.text().of(sender, "restricted-prices", MsgUtil.getTranslateText(shop.getItem()), diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Unlimited.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Unlimited.java index 57b930f668..d52c8723ca 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Unlimited.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Unlimited.java @@ -48,14 +48,14 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not shop.update(); if (shop.isUnlimited()) { plugin.text().of(sender, "command.toggle-unlimited.unlimited").send(); - if (plugin.getConfiguration().getBoolean("unlimited-shop-owner-change")) { + if (plugin.getConfig().getBoolean("unlimited-shop-owner-change")) { plugin.getShopManager().migrateOwnerToUnlimitedShopOwner(shop); plugin.text().of(sender, "unlimited-shop-owner-changed", ((SimpleShopManager) plugin.getShopManager()).getCacheUnlimitedShopAccount().getName()).send(); } return; } plugin.text().of(sender, "command.toggle-unlimited.limited").send(); - if (plugin.getConfiguration().getBoolean("unlimited-shop-owner-change")) { + if (plugin.getConfig().getBoolean("unlimited-shop-owner-change")) { plugin.text().of(sender, "unlimited-shop-owner-keeped").send(); } return; diff --git a/src/main/java/org/maxgamer/quickshop/database/DatabaseManager.java b/src/main/java/org/maxgamer/quickshop/database/DatabaseManager.java index 29edcef99a..bfd20b7260 100644 --- a/src/main/java/org/maxgamer/quickshop/database/DatabaseManager.java +++ b/src/main/java/org/maxgamer/quickshop/database/DatabaseManager.java @@ -74,7 +74,7 @@ public DatabaseManager(@NotNull QuickShop plugin, @NotNull AbstractDatabaseCore } private void init() throws ConnectionException { - this.useQueue = plugin.getConfiguration().getBoolean("database.queue"); + this.useQueue = plugin.getConfig().getBoolean("database.queue"); if (task != null) { task.cancel(); plugin.getDatabaseManager().runTask(); @@ -93,7 +93,7 @@ private void init() throws ConnectionException { if (!task.isCancelled()) { plugin.getDatabaseManager().runTask(); } - }, 1, plugin.getConfiguration().getLong("database.queue-commit-interval") * 20); + }, 1, plugin.getConfig().getLong("database.queue-commit-interval") * 20); } catch (IllegalPluginAccessException e) { Util.debugLog("Plugin is disabled but trying create database task, move to Main Thread..."); plugin.getDatabaseManager().runTask(); diff --git a/src/main/java/org/maxgamer/quickshop/economy/Economy_GemsEconomy.java b/src/main/java/org/maxgamer/quickshop/economy/Economy_GemsEconomy.java index 2fe4d6c3b2..86944521f0 100644 --- a/src/main/java/org/maxgamer/quickshop/economy/Economy_GemsEconomy.java +++ b/src/main/java/org/maxgamer/quickshop/economy/Economy_GemsEconomy.java @@ -58,7 +58,7 @@ public Economy_GemsEconomy(@NotNull QuickShop plugin) { private void init() { - this.allowLoan = plugin.getConfiguration().getBoolean("shop.allow-economy-loan"); + this.allowLoan = plugin.getConfig().getBoolean("shop.allow-economy-loan"); } private void setupEconomy() { diff --git a/src/main/java/org/maxgamer/quickshop/economy/Economy_Mixed.java b/src/main/java/org/maxgamer/quickshop/economy/Economy_Mixed.java index 9a5a1c3140..c15b73d2e1 100644 --- a/src/main/java/org/maxgamer/quickshop/economy/Economy_Mixed.java +++ b/src/main/java/org/maxgamer/quickshop/economy/Economy_Mixed.java @@ -47,7 +47,7 @@ // Bukkit.dispatchCommand( // Bukkit.getConsoleSender(), // MsgUtil.fillArgs( -// plugin.getConfiguration().getString("mixedeconomy.deposit"), +// plugin.getConfig().getString("mixedeconomy.deposit"), // Bukkit.getOfflinePlayer(name).getName(), // String.valueOf(amount))); // return true; @@ -61,7 +61,7 @@ // Bukkit.dispatchCommand( // Bukkit.getConsoleSender(), // MsgUtil.fillArgs( -// plugin.getConfiguration().getString("mixedeconomy.deposit"), +// plugin.getConfig().getString("mixedeconomy.deposit"), // trader.getName(), // String.valueOf(amount))); // return true; @@ -104,7 +104,7 @@ // Bukkit.dispatchCommand( // Bukkit.getConsoleSender(), // MsgUtil.fillArgs( -// plugin.getConfiguration().getString("mixedeconomy.withdraw"), +// plugin.getConfig().getString("mixedeconomy.withdraw"), // Bukkit.getOfflinePlayer(name).getName(), // String.valueOf(amount))); // return true; @@ -118,7 +118,7 @@ // Bukkit.dispatchCommand( // Bukkit.getConsoleSender(), // MsgUtil.fillArgs( -// plugin.getConfiguration().getString("mixedeconomy.withdraw"), +// plugin.getConfig().getString("mixedeconomy.withdraw"), // trader.getName(), // String.valueOf(amount))); // return true; diff --git a/src/main/java/org/maxgamer/quickshop/economy/Economy_TNE.java b/src/main/java/org/maxgamer/quickshop/economy/Economy_TNE.java index 804a09634e..a306e0465e 100644 --- a/src/main/java/org/maxgamer/quickshop/economy/Economy_TNE.java +++ b/src/main/java/org/maxgamer/quickshop/economy/Economy_TNE.java @@ -58,7 +58,7 @@ public Economy_TNE(@NotNull QuickShop plugin) { } private void init() { - this.allowLoan = plugin.getConfiguration().getBoolean("shop.allow-economy-loan"); + this.allowLoan = plugin.getConfig().getBoolean("shop.allow-economy-loan"); } private void setupEconomy() { diff --git a/src/main/java/org/maxgamer/quickshop/economy/Economy_Vault.java b/src/main/java/org/maxgamer/quickshop/economy/Economy_Vault.java index 1b18b8285e..64cd6ba4f1 100644 --- a/src/main/java/org/maxgamer/quickshop/economy/Economy_Vault.java +++ b/src/main/java/org/maxgamer/quickshop/economy/Economy_Vault.java @@ -68,7 +68,7 @@ public Economy_Vault(@NotNull QuickShop plugin) { } private void init() { - this.allowLoan = plugin.getConfiguration().getBoolean("shop.allow-economy-loan"); + this.allowLoan = plugin.getConfig().getBoolean("shop.allow-economy-loan"); } private boolean setupEconomy() { diff --git a/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java b/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java index 24b140bda9..1854b47f97 100644 --- a/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java +++ b/src/main/java/org/maxgamer/quickshop/eventmanager/QSEventManager.java @@ -66,7 +66,7 @@ public void pluginEnable(PluginEnableEvent event) { private synchronized void rescan() { this.ignoredListener.clear(); plugin - .getConfiguration() + .getConfig() .getStringList("shop.protection-checking-listener-blacklist") .forEach( input -> { diff --git a/src/main/java/org/maxgamer/quickshop/integration/SimpleIntegrationManager.java b/src/main/java/org/maxgamer/quickshop/integration/SimpleIntegrationManager.java index 1bfab75ae4..68ab77a862 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/SimpleIntegrationManager.java +++ b/src/main/java/org/maxgamer/quickshop/integration/SimpleIntegrationManager.java @@ -81,7 +81,7 @@ public void searchAndRegisterPlugins() { PluginManager pluginManager = plugin.getServer().getPluginManager(); for (Map.Entry> entry : INTEGRATION_MAPPING.entrySet()) { String pluginName = entry.getKey(); - if (pluginManager.isPluginEnabled(pluginName) && plugin.getConfiguration().getBoolean("integration." + pluginName.toLowerCase() + ".enable")) { + if (pluginManager.isPluginEnabled(pluginName) && plugin.getConfig().getBoolean("integration." + pluginName.toLowerCase() + ".enable")) { try { register(entry.getValue()); } catch (Exception exception) { diff --git a/src/main/java/org/maxgamer/quickshop/integration/fabledskyblock/FabledIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/fabledskyblock/FabledIntegration.java index 0c97ca477e..8d36b70c30 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/fabledskyblock/FabledIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/fabledskyblock/FabledIntegration.java @@ -46,8 +46,8 @@ public FabledIntegration(QuickShop plugin) { } private void loadConfiguration() { - ignoreDisabledWorlds = plugin.getConfiguration().getBoolean("integration.fabledskyblock.ignore-disabled-worlds"); - whitelist = plugin.getConfiguration().getBoolean("integration.fabledskyblock.whitelist-mode"); + ignoreDisabledWorlds = plugin.getConfig().getBoolean("integration.fabledskyblock.ignore-disabled-worlds"); + whitelist = plugin.getConfig().getBoolean("integration.fabledskyblock.whitelist-mode"); } /** diff --git a/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java index 68ae2dfdca..16e8e9e76c 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/factionsuuid/FactionsUUIDIntegration.java @@ -84,42 +84,42 @@ public FactionsUUIDIntegration(QuickShop plugin) { } private void init() { - this.createFlags = plugin.getConfiguration().getStringList("integration.factions.create.flags"); - this.tradeFlags = plugin.getConfiguration().getStringList("integration.factions.trade.flags"); + this.createFlags = plugin.getConfig().getStringList("integration.factions.create.flags"); + this.tradeFlags = plugin.getConfig().getStringList("integration.factions.trade.flags"); - this.whiteList = plugin.getConfiguration().getBoolean("integration.factions.whitelist-mode"); + this.whiteList = plugin.getConfig().getBoolean("integration.factions.whitelist-mode"); this.createRequireOpen = - plugin.getConfiguration().getBoolean("integration.factions.create.require.open"); + plugin.getConfig().getBoolean("integration.factions.create.require.open"); this.createRequireNormal = - plugin.getConfiguration().getBoolean("integration.factions.create.require.normal"); + plugin.getConfig().getBoolean("integration.factions.create.require.normal"); this.createRequireWilderness = - plugin.getConfiguration().getBoolean("integration.factions.create.require.wilderness"); + plugin.getConfig().getBoolean("integration.factions.create.require.wilderness"); this.createRequirePeaceful = - plugin.getConfiguration().getBoolean("integration.factions.create.require.peaceful"); + plugin.getConfig().getBoolean("integration.factions.create.require.peaceful"); this.createRequirePermanent = - plugin.getConfiguration().getBoolean("integration.factions.create.require.permanent"); + plugin.getConfig().getBoolean("integration.factions.create.require.permanent"); this.createRequireSafeZone = - plugin.getConfiguration().getBoolean("integration.factions.create.require.safezone"); + plugin.getConfig().getBoolean("integration.factions.create.require.safezone"); this.createRequireOwn = - plugin.getConfiguration().getBoolean("integration.factions.create.require.own"); + plugin.getConfig().getBoolean("integration.factions.create.require.own"); this.createRequireWarZone = - plugin.getConfiguration().getBoolean("integration.factions.create.require.warzone"); + plugin.getConfig().getBoolean("integration.factions.create.require.warzone"); this.tradeRequireOpen = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.open"); + plugin.getConfig().getBoolean("integration.factions.trade.require.open"); this.tradeRequireNormal = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.normal"); + plugin.getConfig().getBoolean("integration.factions.trade.require.normal"); this.tradeRequireWilderness = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.wilderness"); + plugin.getConfig().getBoolean("integration.factions.trade.require.wilderness"); this.tradeRequirePeaceful = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.peaceful"); + plugin.getConfig().getBoolean("integration.factions.trade.require.peaceful"); this.tradeRequirePermanent = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.permanent"); + plugin.getConfig().getBoolean("integration.factions.trade.require.permanent"); this.tradeRequireSafeZone = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.safezone"); - this.tradeRequireOwn = plugin.getConfiguration().getBoolean("integration.factions.trade.require.own"); + plugin.getConfig().getBoolean("integration.factions.trade.require.safezone"); + this.tradeRequireOwn = plugin.getConfig().getBoolean("integration.factions.trade.require.own"); this.tradeRequireWarZone = - plugin.getConfiguration().getBoolean("integration.factions.trade.require.warzone"); + plugin.getConfig().getBoolean("integration.factions.trade.require.warzone"); } private boolean check(@NotNull Player player, @NotNull Location location, boolean createRequireOpen, boolean createRequireSafeZone, boolean createRequirePermanent, boolean createRequirePeaceful, boolean createRequireWilderness, boolean createRequireWarZone, boolean createRequireNormal, boolean createRequireOwn, List createFlags, boolean whiteList) { diff --git a/src/main/java/org/maxgamer/quickshop/integration/griefprevention/GriefPreventionIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/griefprevention/GriefPreventionIntegration.java index db32345bf7..7b0bb263cc 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/griefprevention/GriefPreventionIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/griefprevention/GriefPreventionIntegration.java @@ -19,7 +19,6 @@ package org.maxgamer.quickshop.integration.griefprevention; -import de.leonhard.storage.sections.FlatFileSection; import me.ryanhamshire.GriefPrevention.Claim; import me.ryanhamshire.GriefPrevention.ClaimPermission; import me.ryanhamshire.GriefPrevention.GriefPrevention; @@ -27,6 +26,8 @@ import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.MemoryConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -66,7 +67,10 @@ public GriefPreventionIntegration(QuickShop plugin) { } private void init() { - FlatFileSection configurationSection = plugin.getConfiguration().getSection("integration.griefprevention"); + ConfigurationSection configurationSection = plugin.getConfig().getConfigurationSection("integration.griefprevention"); + if (configurationSection == null) { + configurationSection = new MemoryConfiguration(); + } this.whiteList = configurationSection.getBoolean("whitelist-mode"); this.deleteOnClaimTrustChanged = configurationSection.getBoolean("delete-on-claim-trust-changed"); this.deleteOnClaimUnclaimed = configurationSection.getBoolean("delete-on-claim-unclaimed"); diff --git a/src/main/java/org/maxgamer/quickshop/integration/iridiumskyblock/IridiumSkyblockIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/iridiumskyblock/IridiumSkyblockIntegration.java index 6af19d2b11..80dd5f20bf 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/iridiumskyblock/IridiumSkyblockIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/iridiumskyblock/IridiumSkyblockIntegration.java @@ -57,7 +57,7 @@ public IridiumSkyblockIntegration(QuickShop plugin) { } private void init() { - onlyOwnerCanCreateShop = plugin.getConfiguration().getBoolean("integration.iridiumskyblock.owner-create-only"); + onlyOwnerCanCreateShop = plugin.getConfig().getBoolean("integration.iridiumskyblock.owner-create-only"); } /** @@ -116,7 +116,7 @@ public boolean canTradeShopHere(@NotNull Player player, @NotNull Location locati */ @Override public void load() { - if (plugin.getConfiguration().getBoolean("integration.iridiumskyblock.delete-shop-on-member-leave")) { + if (plugin.getConfig().getBoolean("integration.iridiumskyblock.delete-shop-on-member-leave")) { Bukkit.getPluginManager().registerEvents(this, plugin); } } diff --git a/src/main/java/org/maxgamer/quickshop/integration/lands/LandsIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/lands/LandsIntegration.java index 2072ccdb7a..76013a8f9c 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/lands/LandsIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/lands/LandsIntegration.java @@ -59,9 +59,9 @@ public LandsIntegration(QuickShop plugin) { private void init() { landsIntegration = new me.angeschossen.lands.api.integration.LandsIntegration(plugin); - ignoreDisabledWorlds = plugin.getConfiguration().getBoolean("integration.lands.ignore-disabled-worlds"); - whitelist = plugin.getConfiguration().getBoolean("integration.lands.whitelist-mode"); - deleteWhenLosePermission = plugin.getConfiguration().getBoolean("integration.lands.delete-on-lose-permission"); + ignoreDisabledWorlds = plugin.getConfig().getBoolean("integration.lands.ignore-disabled-worlds"); + whitelist = plugin.getConfig().getBoolean("integration.lands.whitelist-mode"); + deleteWhenLosePermission = plugin.getConfig().getBoolean("integration.lands.delete-on-lose-permission"); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/integration/plotsquared/PlotSquaredIntegrationV6.java b/src/main/java/org/maxgamer/quickshop/integration/plotsquared/PlotSquaredIntegrationV6.java index 7099490dc2..5684debe5a 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/plotsquared/PlotSquaredIntegrationV6.java +++ b/src/main/java/org/maxgamer/quickshop/integration/plotsquared/PlotSquaredIntegrationV6.java @@ -78,8 +78,8 @@ public PlotSquaredIntegrationV6(QuickShop plugin) { } private void init() { - this.whiteList = plugin.getConfiguration().getBoolean("integration.plotsquared.whitelist-mode"); - this.deleteUntrusted = plugin.getConfiguration().getBoolean("integration.plotsquared.delete-when-user-untrusted"); + this.whiteList = plugin.getConfig().getBoolean("integration.plotsquared.whitelist-mode"); + this.deleteUntrusted = plugin.getConfig().getBoolean("integration.plotsquared.delete-when-user-untrusted"); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/integration/residence/ResidenceIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/residence/ResidenceIntegration.java index 6c20d354b4..50ab656bf4 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/residence/ResidenceIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/residence/ResidenceIntegration.java @@ -52,9 +52,9 @@ public ResidenceIntegration(QuickShop plugin) { } private void init() { - this.whiteList = plugin.getConfiguration().getBoolean("integration.residence.whitelist-mode"); - this.createLimits = plugin.getConfiguration().getStringList("integration.residence.create"); - this.tradeLimits = plugin.getConfiguration().getStringList("integration.residence.trade"); + this.whiteList = plugin.getConfig().getBoolean("integration.residence.whitelist-mode"); + this.createLimits = plugin.getConfig().getStringList("integration.residence.create"); + this.tradeLimits = plugin.getConfig().getStringList("integration.residence.trade"); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/integration/superiorskyblock/SuperiorSkyblock2Integration.java b/src/main/java/org/maxgamer/quickshop/integration/superiorskyblock/SuperiorSkyblock2Integration.java index 130bc1cd6d..c977371cad 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/superiorskyblock/SuperiorSkyblock2Integration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/superiorskyblock/SuperiorSkyblock2Integration.java @@ -55,8 +55,8 @@ public SuperiorSkyblock2Integration(QuickShop plugin) { } private void init() { - onlyOwnerCanCreateShop = plugin.getConfiguration().getBoolean("integration.superiorskyblock.owner-create-only"); - deleteShopOnMemberLeave = plugin.getConfiguration().getBoolean("integration.superiorskyblock.delete-shop-on-member-leave"); + onlyOwnerCanCreateShop = plugin.getConfig().getBoolean("integration.superiorskyblock.owner-create-only"); + deleteShopOnMemberLeave = plugin.getConfig().getBoolean("integration.superiorskyblock.delete-shop-on-member-leave"); } /** @@ -112,7 +112,7 @@ public boolean canTradeShopHere(@NotNull Player player, @NotNull Location locati */ @Override public void load() { - if (plugin.getConfiguration().getBoolean("integration.superiorskyblock.delete-shop-on-member-leave")) { + if (plugin.getConfig().getBoolean("integration.superiorskyblock.delete-shop-on-member-leave")) { Bukkit.getPluginManager().registerEvents(this, plugin); } } diff --git a/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java index 52fab60bac..d2b3c712a3 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/towny/TownyIntegration.java @@ -79,13 +79,13 @@ public TownyIntegration(QuickShop plugin) { } private void init() { - createFlags = TownyFlags.deserialize(plugin.getConfiguration().getStringList("integration.towny.create")); - tradeFlags = TownyFlags.deserialize(plugin.getConfiguration().getStringList("integration.towny.trade")); - ignoreDisabledWorlds = plugin.getConfiguration().getBoolean("integration.towny.ignore-disabled-worlds"); - deleteShopOnLeave = plugin.getConfiguration().getBoolean("integration.towny.delete-shop-on-resident-leave"); - deleteShopOnPlotClear = plugin.getConfiguration().getBoolean("integration.towny.delete-shop-on-plot-clear"); - deleteShopOnPlotDestroy = plugin.getConfiguration().getBoolean("integration.towny.delete-shop-on-plot-destroy"); - whiteList = plugin.getConfiguration().getBoolean("integration.towny.whitelist-mode"); + createFlags = TownyFlags.deserialize(plugin.getConfig().getStringList("integration.towny.create")); + tradeFlags = TownyFlags.deserialize(plugin.getConfig().getStringList("integration.towny.trade")); + ignoreDisabledWorlds = plugin.getConfig().getBoolean("integration.towny.ignore-disabled-worlds"); + deleteShopOnLeave = plugin.getConfig().getBoolean("integration.towny.delete-shop-on-resident-leave"); + deleteShopOnPlotClear = plugin.getConfig().getBoolean("integration.towny.delete-shop-on-plot-clear"); + deleteShopOnPlotDestroy = plugin.getConfig().getBoolean("integration.towny.delete-shop-on-plot-destroy"); + whiteList = plugin.getConfig().getBoolean("integration.towny.whitelist-mode"); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java index dbe0497178..1161abcb2c 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java @@ -90,15 +90,15 @@ public void load() { } private void init() { - this.whiteList = plugin.getConfiguration().getBoolean("integration.worldguard.whitelist-mode"); - this.anyOwner = plugin.getConfiguration().getBoolean("integration.worldguard.any-owner"); - respectGlobalRegion = plugin.getConfiguration().getBoolean("integration.worldguard.respect-global-region"); + this.whiteList = plugin.getConfig().getBoolean("integration.worldguard.whitelist-mode"); + this.anyOwner = plugin.getConfig().getBoolean("integration.worldguard.any-owner"); + respectGlobalRegion = plugin.getConfig().getBoolean("integration.worldguard.respect-global-region"); createFlags = WorldGuardFlags.deserialize( - plugin.getConfiguration().getStringList("integration.worldguard.create")); + plugin.getConfig().getStringList("integration.worldguard.create")); tradeFlags = WorldGuardFlags.deserialize( - plugin.getConfiguration().getStringList("integration.worldguard.trade")); + plugin.getConfig().getStringList("integration.worldguard.trade")); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/listener/BlockListener.java b/src/main/java/org/maxgamer/quickshop/listener/BlockListener.java index 1617e0a8f9..8bda493272 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/BlockListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/BlockListener.java @@ -63,7 +63,7 @@ public BlockListener(@NotNull final QuickShop plugin, @Nullable final Cache cach } private void init() { - this.update_sign_when_inventory_moving = super.getPlugin().getConfiguration().getOrDefault("shop.update-sign-when-inventory-moving", true); + this.update_sign_when_inventory_moving = super.getPlugin().getConfig().getBoolean("shop.update-sign-when-inventory-moving", true); } /* @@ -83,7 +83,7 @@ public void onBreak(BlockBreakEvent e) { if (p.getGameMode() == GameMode.CREATIVE && !p.getUniqueId().equals(shop.getOwner())) { // Check SuperTool if (p.getInventory().getItemInMainHand().getType() == Material.GOLDEN_AXE) { - if (getPlugin().getConfiguration().getBoolean("shop.disable-super-tool")) { + if (getPlugin().getConfig().getBoolean("shop.disable-super-tool")) { e.setCancelled(true); plugin.text().of(p, "supertool-is-disabled").send(); return; @@ -109,8 +109,8 @@ public void onBreak(BlockBreakEvent e) { BlockState state = PaperLib.getBlockState(b, false).getState(); if (state instanceof Sign) { Sign sign = (Sign) state; - if (sign.getLine(0).equals(super.getPlugin().getConfiguration().getString("lockette.private")) - || sign.getLine(0).equals(super.getPlugin().getConfiguration().getString("lockette.more_users"))) { + if (sign.getLine(0).equals(super.getPlugin().getConfig().getString("lockette.private")) + || sign.getLine(0).equals(super.getPlugin().getConfig().getString("lockette.more_users"))) { // Ignore break lockette sign return; } @@ -126,7 +126,7 @@ public void onBreak(BlockBreakEvent e) { if (p.getGameMode() == GameMode.CREATIVE && !p.getUniqueId().equals(shop.getOwner())) { // Check SuperTool if (p.getInventory().getItemInMainHand().getType() == Material.GOLDEN_AXE) { - if (getPlugin().getConfiguration().getBoolean("shop.disable-super-tool")) { + if (getPlugin().getConfig().getBoolean("shop.disable-super-tool")) { e.setCancelled(true); plugin.text().of(p, "supertool-is-disabled").send(); return; @@ -142,7 +142,7 @@ public void onBreak(BlockBreakEvent e) { return; } //Allow Shop owner break the shop sign(for sign replacement) - if (getPlugin().getConfiguration().getBoolean("shop.allow-owner-break-shop-sign") && p.getUniqueId().equals(shop.getOwner())) { + if (getPlugin().getConfig().getBoolean("shop.allow-owner-break-shop-sign") && p.getUniqueId().equals(shop.getOwner())) { return; } Util.debugLog("Player cannot break the shop infomation sign."); diff --git a/src/main/java/org/maxgamer/quickshop/listener/ChatListener.java b/src/main/java/org/maxgamer/quickshop/listener/ChatListener.java index 0ce3a42c2c..4998b630f4 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/ChatListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/ChatListener.java @@ -38,7 +38,7 @@ public ChatListener(QuickShop plugin) { @EventHandler(priority = EventPriority.LOWEST) public void onChat(AsyncPlayerChatEvent e) { - if (e.isCancelled() && plugin.getConfiguration().getBoolean("shop.ignore-cancel-chat-event")) { + if (e.isCancelled() && plugin.getConfig().getBoolean("shop.ignore-cancel-chat-event")) { Util.debugLog("Ignored a chat event (Cancelled by another plugin, you can force process by turn on ignore-cancel-chat-event)"); return; } diff --git a/src/main/java/org/maxgamer/quickshop/listener/DisplayProtectionListener.java b/src/main/java/org/maxgamer/quickshop/listener/DisplayProtectionListener.java index 28d5424f47..86408fecd2 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/DisplayProtectionListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/DisplayProtectionListener.java @@ -50,7 +50,7 @@ public class DisplayProtectionListener extends AbstractProtectionListener { public DisplayProtectionListener(QuickShop plugin, Cache cache) { super(plugin, cache); - useEnhanceProtection = plugin.getConfiguration().getBoolean("shop.enchance-display-protect"); + useEnhanceProtection = plugin.getConfig().getBoolean("shop.enchance-display-protect"); if (useEnhanceProtection) { plugin.getServer().getPluginManager().registerEvents(new EnhanceDisplayProtectionListener(plugin, cache), plugin); } @@ -63,7 +63,7 @@ public DisplayProtectionListener(QuickShop plugin, Cache cache) { */ @Override public ReloadResult reloadModule() { - if (useEnhanceProtection == plugin.getConfiguration().getBoolean("shop.enchance-display-protect")) { + if (useEnhanceProtection == plugin.getConfig().getBoolean("shop.enchance-display-protect")) { return ReloadResult.builder().status(ReloadStatus.SUCCESS).build(); } return ReloadResult.builder().status(ReloadStatus.REQUIRE_RESTART).build(); @@ -71,7 +71,7 @@ public ReloadResult reloadModule() { private void sendAlert(@NotNull String msg) { - if (!plugin.getConfiguration().getBoolean("send-display-item-protection-alert")) { + if (!plugin.getConfig().getBoolean("send-display-item-protection-alert")) { return; } MsgUtil.sendGlobalAlert(msg); diff --git a/src/main/java/org/maxgamer/quickshop/listener/EnhanceDisplayProtectionListener.java b/src/main/java/org/maxgamer/quickshop/listener/EnhanceDisplayProtectionListener.java index 9c32f5b701..7496e2cd5f 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/EnhanceDisplayProtectionListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/EnhanceDisplayProtectionListener.java @@ -56,7 +56,7 @@ public EnhanceDisplayProtectionListener(QuickShop plugin, Cache cache) { } private void sendAlert(@NotNull String msg) { - if (!plugin.getConfiguration().getBoolean("send-display-item-protection-alert")) { + if (!plugin.getConfig().getBoolean("send-display-item-protection-alert")) { return; } MsgUtil.sendGlobalAlert(msg); diff --git a/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java b/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java index 349557f347..ce2b39a425 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java @@ -49,8 +49,8 @@ public InternalListener(QuickShop plugin) { } private void readConfig() { - this.loggingBalance = plugin.getConfiguration().getBoolean("logging.log-balance"); - this.loggingAction = plugin.getConfiguration().getBoolean("logging.log-actions"); + this.loggingBalance = plugin.getConfig().getBoolean("logging.log-balance"); + this.loggingAction = plugin.getConfig().getBoolean("logging.log-actions"); } public boolean isForbidden(@NotNull Material shopMaterial, @NotNull Material itemMaterial) { diff --git a/src/main/java/org/maxgamer/quickshop/listener/LockListener.java b/src/main/java/org/maxgamer/quickshop/listener/LockListener.java index cf451ca074..ee1b4251ff 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/LockListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/LockListener.java @@ -47,7 +47,7 @@ public LockListener(@NotNull final QuickShop plugin, @Nullable final Cache cache @Override public void register() { - if (plugin.getConfiguration().getBoolean("shop.lock")) { + if (plugin.getConfig().getBoolean("shop.lock")) { super.register(); } else { super.unregister(); @@ -74,8 +74,8 @@ public void onBreak(BlockBreakEvent e) { BlockState state = PaperLib.getBlockState(b, false).getState(); if (state instanceof Sign) { final Sign sign = (Sign) state; - if (sign.getLine(0).equals(super.getPlugin().getConfiguration().getString("lockette.private")) - || sign.getLine(0).equals(super.getPlugin().getConfiguration().getString("lockette.more_users"))) { + if (sign.getLine(0).equals(super.getPlugin().getConfig().getString("lockette.private")) + || sign.getLine(0).equals(super.getPlugin().getConfig().getString("lockette.more_users"))) { // Ignore break lockette sign Util.debugLog("Skipped a dead-lock shop sign.(Lockette or other sign-lock plugin)"); return; @@ -100,8 +100,8 @@ public void onBreak(BlockBreakEvent e) { if (b instanceof Sign) { final Sign sign = (Sign) b; - if (sign.getLine(0).equals(super.getPlugin().getConfiguration().getString("lockette.private")) - || sign.getLine(0).equals(super.getPlugin().getConfiguration().getString("lockette.more_users"))) { + if (sign.getLine(0).equals(super.getPlugin().getConfig().getString("lockette.private")) + || sign.getLine(0).equals(super.getPlugin().getConfig().getString("lockette.more_users"))) { // Ignore break lockette sign return; } diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index 8610faa590..f1b4e68c7a 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -61,7 +61,7 @@ public class PlayerListener extends AbstractQSListener { public PlayerListener(QuickShop plugin) { super(plugin); - swapBehavior = plugin.getConfiguration().getBoolean("shop.interact.swap-click-behavior"); + swapBehavior = plugin.getConfig().getBoolean("shop.interact.swap-click-behavior"); } @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) @@ -121,7 +121,7 @@ public void onAdventureClick(PlayerAnimationEvent event) { } private void playClickSound(@NotNull Player player) { - if (plugin.getConfiguration().getBoolean("effect.sound.onclick")) { + if (plugin.getConfig().getBoolean("effect.sound.onclick")) { player.playSound(player.getLocation(), Sound.BLOCK_DISPENSER_FAIL, 80.f, 1.0f); } } @@ -239,7 +239,7 @@ else if (e.useInteractedBlock() == Event.Result.ALLOW && p.getGameMode() != GameMode.CREATIVE) { if (e.useInteractedBlock() == Event.Result.DENY || !InteractUtil.check(InteractUtil.Action.CREATE, p.isSneaking()) - || plugin.getConfiguration().getBoolean("shop.disable-quick-create") + || plugin.getConfig().getBoolean("shop.disable-quick-create") || !plugin.getShopManager().canBuildShop(p, b, e.getBlockFace())) { // As of the new checking system, most plugins will tell the // player why they can't create a shop there. @@ -316,7 +316,7 @@ private int getPlayerCanSell(Shop shop, double ownerBalance, double price, Inven items = Math.min(items, shop.getRemainingSpace()); // Amount check player selling item total cost and the shop owner's balance items = Math.min(items, ownerCanAfford); - } else if (plugin.getConfiguration().getBoolean("shop.pay-unlimited-shop-owners")) { + } else if (plugin.getConfig().getBoolean("shop.pay-unlimited-shop-owners")) { // even if the shop is unlimited, the config option pay-unlimited-shop-owners is set to // true, // the unlimited shop owner should have enough money. @@ -358,7 +358,7 @@ public void onInventoryClose(InventoryCloseEvent e) { public void onJoin(PlayerJoinEvent e) { Util.debugLog("Player " + e.getPlayer().getName() + " using locale " + e.getPlayer().getLocale() + ": " + plugin.text().of(e.getPlayer(), "file-test").forLocale()); // Notify the player any messages they were sent - if (plugin.getConfiguration().getBoolean("shop.auto-fetch-shop-messages")) { + if (plugin.getConfig().getBoolean("shop.auto-fetch-shop-messages")) { MsgUtil.flush(e.getPlayer()); } } diff --git a/src/main/java/org/maxgamer/quickshop/listener/PluginListener.java b/src/main/java/org/maxgamer/quickshop/listener/PluginListener.java index 8f1538f83d..4dc842e0bf 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PluginListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PluginListener.java @@ -54,7 +54,7 @@ private void init() { @EventHandler(priority = EventPriority.MONITOR) public void onPluginDisabled(PluginDisableEvent event) { String pluginName = event.getPlugin().getName(); - if (integrationHelper.isRegistered(pluginName) && plugin.getConfiguration().getBoolean("integration." + pluginName.toLowerCase() + ".enable")) { + if (integrationHelper.isRegistered(pluginName) && plugin.getConfig().getBoolean("integration." + pluginName.toLowerCase() + ".enable")) { IntegratedPlugin integratedPlugin = integrationHelper.getIntegrationMap().get(pluginName); if (integratedPlugin != null) { Util.debugLog("[Hot Load] Calling for unloading " + integratedPlugin.getName()); @@ -70,7 +70,7 @@ public void onPluginDisabled(PluginDisableEvent event) { @EventHandler(priority = EventPriority.MONITOR) public void onPluginEnabled(PluginEnableEvent event) { String pluginName = event.getPlugin().getName(); - if (integrationHelper.isRegistered(pluginName) && plugin.getConfiguration().getBoolean("integration." + pluginName.toLowerCase() + ".enable")) { + if (integrationHelper.isRegistered(pluginName) && plugin.getConfig().getBoolean("integration." + pluginName.toLowerCase() + ".enable")) { integrationHelper.register(pluginName); IntegratedPlugin integratedPlugin = integrationHelper.getIntegrationMap().get(pluginName); if (integratedPlugin != null) { diff --git a/src/main/java/org/maxgamer/quickshop/listener/ShopProtectionListener.java b/src/main/java/org/maxgamer/quickshop/listener/ShopProtectionListener.java index 0be6c80af4..dbf51a15e8 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/ShopProtectionListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/ShopProtectionListener.java @@ -64,8 +64,8 @@ public ShopProtectionListener(@NotNull QuickShop plugin, @Nullable Cache cache) } private void init() { - this.sendProtectionAlert = plugin.getConfiguration().getOrDefault("send-shop-protection-alert", false); - useEnhanceProtection = plugin.getConfiguration().getBoolean("shop.enchance-shop-protect"); + this.sendProtectionAlert = plugin.getConfig().getBoolean("send-shop-protection-alert", false); + useEnhanceProtection = plugin.getConfig().getBoolean("shop.enchance-shop-protect"); scanAndFixPaperListener(); } @@ -81,7 +81,7 @@ public void onWorldLoad(WorldLoadEvent event) { } public void scanAndFixPaperListener() { - if (!plugin.getConfiguration().getBoolean("protect.hopper")) { + if (!plugin.getConfig().getBoolean("protect.hopper")) { return; } if (!Util.isClassAvailable("com.destroystokyo.paper.PaperWorldConfig")) { @@ -139,7 +139,7 @@ public void onBlockExplode(BlockExplodeEvent e) { shop = getShopNextTo(b.getLocation()); } if (shop != null) { - if (plugin.getConfiguration().getBoolean("protect.explode")) { + if (plugin.getConfig().getBoolean("protect.explode")) { e.setCancelled(true); } else { plugin.logEvent(new ShopRemoveLog(Util.getNilUniqueId(), "BlockBreak(explode)", shop.saveToInfoStorage())); @@ -233,7 +233,7 @@ public void onExplode(EntityExplodeEvent e) { if (shop == null) { continue; } - if (plugin.getConfiguration().getBoolean("protect.explode")) { + if (plugin.getConfig().getBoolean("protect.explode")) { e.setCancelled(true); } else { plugin.logEvent(new ShopRemoveLog(Util.getNilUniqueId(), "BlockBreak(explode)", shop.saveToInfoStorage())); @@ -244,7 +244,7 @@ public void onExplode(EntityExplodeEvent e) { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onInventoryMove(InventoryMoveItemEvent event) { - if (!plugin.getConfiguration().getBoolean("protect.hopper")) { + if (!plugin.getConfig().getBoolean("protect.hopper")) { return; } final Location loc = event.getSource().getLocation(); @@ -294,7 +294,7 @@ public void onMobChangeBlock(EntityChangeBlockEvent event) { return; } - if (plugin.getConfiguration().getBoolean("protect.entity")) { + if (plugin.getConfig().getBoolean("protect.entity")) { event.setCancelled(true); return; } diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 4a3f9e9634..93742fc95d 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -482,8 +482,8 @@ public void delete(boolean memoryOnly) { } // Delete it from the database // Refund if necessary - if (plugin.getConfiguration().getBoolean("shop.refund")) { - plugin.getEconomy().deposit(this.getOwner(), plugin.getConfiguration().getDouble("shop.cost"), + if (plugin.getConfig().getBoolean("shop.refund")) { + plugin.getEconomy().deposit(this.getOwner(), plugin.getConfig().getDouble("shop.cost"), Objects.requireNonNull(getLocation().getWorld()), getCurrency()); } plugin.getShopManager().removeShop(this); @@ -738,7 +738,7 @@ public List getSignText(@NotNull String locale) { lines.add(new ComponentPackage(new ComponentBuilder("").appendLegacy(SHOP_SIGN_PREFIX).reset().color(ChatColor.RESET).appendLegacy(line2).create())); //line 3 - if (plugin.getConfiguration().getBoolean("shop.force-use-item-original-name") || !this.getItem().hasItemMeta() || !this.getItem().getItemMeta().hasDisplayName()) { + if (plugin.getConfig().getBoolean("shop.force-use-item-original-name") || !this.getItem().hasItemMeta() || !this.getItem().getItemMeta().hasDisplayName()) { BaseComponent[] left = TextComponent.fromLegacyText(plugin.text().of("signs.item-left").forLocale()); BaseComponent[] right = TextComponent.fromLegacyText(plugin.text().of("signs.item-right").forLocale()); if (plugin.getNbtapi() == null) { @@ -808,7 +808,7 @@ public void setSignText(@NotNull List lines) { } } if (plugin.getGameVersion().isSignGlowingSupport()) { - boolean isGlowing = plugin.getConfiguration().getBoolean("shop.sign-glowing"); + boolean isGlowing = plugin.getConfig().getBoolean("shop.sign-glowing"); sign.setGlowingText(isGlowing); } sign.update(true); diff --git a/src/main/java/org/maxgamer/quickshop/shop/RealDisplayItem.java b/src/main/java/org/maxgamer/quickshop/shop/RealDisplayItem.java index fef6ca5fbc..53cf2de03c 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/RealDisplayItem.java +++ b/src/main/java/org/maxgamer/quickshop/shop/RealDisplayItem.java @@ -203,7 +203,7 @@ public void safeGuard(@NotNull Entity entity) { Item item = (Item) entity; // Set item protect in the armorstand's hand - if (PLUGIN.getConfiguration().getBoolean("shop.display-item-use-name")) { + if (PLUGIN.getConfig().getBoolean("shop.display-item-use-name")) { item.setCustomName(Util.getItemStackName(this.originalItemStack)); item.setCustomNameVisible(true); } else { diff --git a/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java b/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java index cf21fe4740..4f5718ad9b 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ShopLoader.java @@ -98,7 +98,7 @@ public void loadShops(@Nullable String worldName) { try (WarpedResultSet warpRS = plugin.getDatabaseHelper().selectAllShops(); ResultSet rs = warpRS.getResultSet()) { Timer timer = new Timer(); timer.start(); - boolean deleteCorruptShops = plugin.getConfiguration().getOrDefault("debug.delete-corrupt-shops", false); + boolean deleteCorruptShops = plugin.getConfig().getBoolean("debug.delete-corrupt-shops", false); this.plugin.getLogger().info("Loading shops from the database..."); while (rs.next()) { ++total; diff --git a/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java b/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java index 263cb0ca47..12f4289e1c 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java @@ -40,7 +40,7 @@ public ShopPurger(QuickShop plugin) { } public void purge() { - if (!plugin.getConfiguration().getBoolean("purge.enabled")) { + if (!plugin.getConfig().getBoolean("purge.enabled")) { plugin.getLogger().info("[Shop Purger] Purge not enabled!"); return; } @@ -58,10 +58,10 @@ public void run() { executing = true; Util.debugLog("[Shop Purger] Scanning and removing shops"); List pendingRemovalShops = new ArrayList<>(); - int days = plugin.getConfiguration().getOrDefault("purge.days", 360); - boolean deleteBanned = plugin.getConfiguration().getBoolean("purge.banned"); - boolean skipOp = plugin.getConfiguration().getBoolean("purge.skip-op"); - boolean returnCreationFee = plugin.getConfiguration().getBoolean("purge.return-create-fee"); + int days = plugin.getConfig().getInt("purge.days", 360); + boolean deleteBanned = plugin.getConfig().getBoolean("purge.banned"); + boolean skipOp = plugin.getConfig().getBoolean("purge.skip-op"); + boolean returnCreationFee = plugin.getConfig().getBoolean("purge.return-create-fee"); for (Shop shop : plugin.getShopManager().getAllShops()) { OfflinePlayer player = Bukkit.getOfflinePlayer(shop.getOwner()); if (!player.hasPlayedBefore()) { @@ -97,7 +97,7 @@ public void run() { if (returnCreationFee) { EconomyTransaction transaction = EconomyTransaction.builder() - .amount(plugin.getConfiguration().getDouble("shop.cost")) + .amount(plugin.getConfig().getDouble("shop.cost")) .allowLoan(false) .core(QuickShop.getInstance().getEconomy()) .currency(shop.getCurrency()) diff --git a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java index 45b539eb18..6dfec7d876 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java +++ b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java @@ -106,7 +106,7 @@ public SimpleShopManager(@NotNull QuickShop plugin) { private void init() { Util.debugLog("Loading caching tax account..."); - String taxAccount = plugin.getConfiguration().getOrDefault("tax-account", "tax"); + String taxAccount = plugin.getConfig().getString("tax-account", "tax"); if (!taxAccount.isEmpty()) { if (Util.isUUID(taxAccount)) { this.cacheTaxAccount = new Trader(taxAccount, @@ -119,19 +119,19 @@ private void init() { // disable tax account cacheTaxAccount = null; } - String uAccount = plugin.getConfiguration().getOrDefault("unlimited-shop-owner-change-account", "quickshop"); + String uAccount = plugin.getConfig().getString("unlimited-shop-owner-change-account", "quickshop"); if (Util.isUUID(uAccount)) { cacheUnlimitedShopAccount = new Trader(uAccount, Bukkit.getOfflinePlayer(UUID.fromString(uAccount))); } else { cacheUnlimitedShopAccount = new Trader(uAccount, Bukkit.getOfflinePlayer(uAccount)); } this.priceLimiter = new SimplePriceLimiter( - plugin.getConfiguration().getDouble("shop.minimum-price"), - plugin.getConfiguration().getInt("shop.maximum-price"), - plugin.getConfiguration().getBoolean("shop.allow-free-shop"), - plugin.getConfiguration().getBoolean("whole-number-prices-only")); - this.useOldCanBuildAlgorithm = plugin.getConfiguration().getBoolean("limits.old-algorithm"); - this.autoSign = plugin.getConfiguration().getBoolean("shop.auto-sign"); + plugin.getConfig().getDouble("shop.minimum-price"), + plugin.getConfig().getInt("shop.maximum-price"), + plugin.getConfig().getBoolean("shop.allow-free-shop"), + plugin.getConfig().getBoolean("whole-number-prices-only")); + this.useOldCanBuildAlgorithm = plugin.getConfig().getBoolean("limits.old-algorithm"); + this.autoSign = plugin.getConfig().getBoolean("shop.auto-sign"); } @Override @@ -293,7 +293,7 @@ public void createShop(@NotNull Shop shop, @NotNull Info info) { if (info.getSignBlock().getType().isAir() || info.getSignBlock().getType() == Material.WATER) { this.processWaterLoggedSign(shop.getLocation().getBlock(), info.getSignBlock()); } else { - if (!plugin.getConfiguration().getBoolean("shop.allow-shop-without-space-for-sign")) { + if (!plugin.getConfig().getBoolean("shop.allow-shop-without-space-for-sign")) { plugin.text().of(player, "failed-to-put-sign").send(); Util.debugLog("Sign cannot placed cause no enough space(Not air block)"); return; @@ -688,7 +688,7 @@ public void actionBuy( .world(shop.getLocation().getWorld()) .to(buyer); if (!shop.isUnlimited() - || (plugin.getConfiguration().getBoolean("shop.pay-unlimited-shop-owners") + || (plugin.getConfig().getBoolean("shop.pay-unlimited-shop-owners") && shop.isUnlimited())) { transaction = builder.from(shop.getOwner()).build(); } else { @@ -718,7 +718,7 @@ public void actionBuy( MsgUtil.TransactionMessage transactionMessage = new MsgUtil.TransactionMessage(msg, Util.serialize(shop.getItem()), null); - if (plugin.getConfiguration().getBoolean("shop.sending-stock-message-to-staffs")) { + if (plugin.getConfig().getBoolean("shop.sending-stock-message-to-staffs")) { for (UUID staff : shop.getModerator().getStaffs()) { MsgUtil.send(shop, staff, transactionMessage); } @@ -732,7 +732,7 @@ public void actionBuy( Integer.toString(shop.getLocation().getBlockZ())).forLocale(); transactionMessage = new MsgUtil.TransactionMessage(msg, Util.serialize(shop.getItem()), null); - if (plugin.getConfiguration().getBoolean("shop.sending-stock-message-to-staffs")) { + if (plugin.getConfig().getBoolean("shop.sending-stock-message-to-staffs")) { for (UUID staff : shop.getModerator().getStaffs()) { MsgUtil.send(shop, staff, transactionMessage); } @@ -767,7 +767,7 @@ public double getTax(@NotNull Shop shop, @NotNull Player p) { @Override public double getTax(@NotNull Shop shop, @NotNull UUID p) { Util.ensureThread(false); - double tax = plugin.getConfiguration().getDouble("tax"); + double tax = plugin.getConfig().getDouble("tax"); Player player = plugin.getServer().getPlayer(p); if (player != null) { if (QuickShop.getPermissionManager().hasPermission(player, "quickshop.tax")) { @@ -839,7 +839,7 @@ public void actionCreate(@NotNull Player p, Info info, @NotNull String message) if (autoSign) { if (info.getSignBlock() == null) { - if (!plugin.getConfiguration().getBoolean("shop.allow-shop-without-space-for-sign")) { + if (!plugin.getConfig().getBoolean("shop.allow-shop-without-space-for-sign")) { plugin.text().of(p, "failed-to-put-sign").send(); return; } @@ -847,7 +847,7 @@ public void actionCreate(@NotNull Player p, Info info, @NotNull String message) Material signType = info.getSignBlock().getType(); if (signType != Material.WATER && !signType.isAir() - && !plugin.getConfiguration().getBoolean("shop.allow-shop-without-space-for-sign")) { + && !plugin.getConfig().getBoolean("shop.allow-shop-without-space-for-sign")) { plugin.text().of(p, "failed-to-put-sign").send(); return; } @@ -866,8 +866,8 @@ public void actionCreate(@NotNull Player p, Info info, @NotNull String message) .replace(",", "."); String[] processedDouble = strFormat.split("\\."); if (processedDouble.length > 1) { - int maximumDigitsLimit = plugin.getConfiguration() - .getOrDefault("maximum-digits-in-price", -1); + int maximumDigitsLimit = plugin.getConfig() + .getInt("maximum-digits-in-price", -1); if (processedDouble[1].length() > maximumDigitsLimit && maximumDigitsLimit != -1) { plugin.text().of(p, "digits-reach-the-limit", String.valueOf(maximumDigitsLimit)).send(); @@ -881,7 +881,7 @@ public void actionCreate(@NotNull Player p, Info info, @NotNull String message) } // Price limit checking - boolean decFormat = plugin.getConfiguration().getBoolean("use-decimal-format"); + boolean decFormat = plugin.getConfig().getBoolean("use-decimal-format"); PriceLimiterCheckResult priceCheckResult = this.priceLimiter.check(info.getItem(), price); @@ -947,7 +947,7 @@ public void actionCreate(@NotNull Player p, Info info, @NotNull String message) // This must be called after the event has been called. // Else, if the event is cancelled, they won't get their // money back. - double createCost = plugin.getConfiguration().getDouble("shop.cost"); + double createCost = plugin.getConfig().getDouble("shop.cost"); if (QuickShop.getPermissionManager().hasPermission(p, "quickshop.bypasscreatefee")) { createCost = 0; } @@ -978,7 +978,7 @@ public void actionCreate(@NotNull Player p, Info info, @NotNull String message) // The shop about successfully created createShop(shop, info); - if (!plugin.getConfiguration().getBoolean("shop.lock")) { + if (!plugin.getConfig().getBoolean("shop.lock")) { plugin.text().of(p, "shops-arent-locked").send(); } @@ -1059,7 +1059,7 @@ public void actionSell( taxAccount = this.cacheTaxAccount; } EconomyTransaction.EconomyTransactionBuilder builder = EconomyTransaction.builder() - .allowLoan(plugin.getConfiguration().getOrDefault("shop.allow-economy-loan", false)) + .allowLoan(plugin.getConfig().getBoolean("shop.allow-economy-loan", false)) .core(eco) .from(seller) .amount(total) @@ -1068,7 +1068,7 @@ public void actionSell( .world(shop.getLocation().getWorld()) .currency(shop.getCurrency()); if (!shop.isUnlimited() - || (plugin.getConfiguration().getBoolean("shop.pay-unlimited-shop-owners") + || (plugin.getConfig().getBoolean("shop.pay-unlimited-shop-owners") && shop.isUnlimited())) { transaction = builder.to(shop.getOwner()).build(); } else { @@ -1093,7 +1093,7 @@ public void actionSell( String msg; // Notify the shop owner //TODO: move to a standalone method Player player = plugin.getServer().getPlayer(seller); - if (plugin.getConfiguration().getBoolean("show-tax")) { + if (plugin.getConfig().getBoolean("show-tax")) { msg = plugin.text().of(seller, "player-bought-from-your-store-tax", player != null ? player.getName() : seller.toString(), Integer.toString(amount * shop.getItem().getAmount()), @@ -1111,7 +1111,7 @@ public void actionSell( MsgUtil.TransactionMessage transactionMessage = new MsgUtil.TransactionMessage(msg, Util.serialize(shop.getItem()), null); MsgUtil.send(shop, shop.getOwner(), transactionMessage); - if (plugin.getConfiguration().getBoolean("shop.sending-stock-message-to-staffs")) { + if (plugin.getConfig().getBoolean("shop.sending-stock-message-to-staffs")) { for (UUID staff : shop.getModerator().getStaffs()) { MsgUtil.send(shop, staff, transactionMessage); } @@ -1126,7 +1126,7 @@ public void actionSell( transactionMessage = new MsgUtil.TransactionMessage(msg, Util.serialize(shop.getItem()), null); MsgUtil.send(shop, shop.getOwner(), transactionMessage); - if (plugin.getConfiguration().getBoolean("shop.sending-stock-message-to-staffs")) { + if (plugin.getConfig().getBoolean("shop.sending-stock-message-to-staffs")) { for (UUID staff : shop.getModerator().getStaffs()) { MsgUtil.send(shop, staff, transactionMessage); } @@ -1183,8 +1183,8 @@ public void sendSellSuccess(@NotNull UUID seller, @NotNull Shop shop, int amount Integer.toString(amount), MsgUtil.getTranslateText(shop.getItem()), format(amount * shop.getPrice(), shop)).forLocale()); - if (plugin.getConfiguration().getBoolean("show-tax")) { - double tax = plugin.getConfiguration().getDouble("tax"); + if (plugin.getConfig().getBoolean("show-tax")) { + double tax = plugin.getConfig().getDouble("tax"); double total = amount * shop.getPrice(); if (tax != 0) { if (!seller.equals(shop.getOwner())) { @@ -1306,7 +1306,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) plugin.text().of(p, "chest-was-removed").send(); return; } - if (p.getGameMode() == GameMode.CREATIVE && plugin.getConfiguration().getBoolean("shop.disable-creative-mode-trading")) { + if (p.getGameMode() == GameMode.CREATIVE && plugin.getConfig().getBoolean("shop.disable-creative-mode-trading")) { plugin.text().of(p, "trading-in-creative-mode-is-disabled").send(); return; } @@ -1320,7 +1320,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) amount = Integer.parseInt(message); } else { if (message.equalsIgnoreCase( - plugin.getConfiguration().getOrDefault("shop.word-for-trade-all-items", "all"))) { + plugin.getConfig().getString("shop.word-for-trade-all-items", "all"))) { int shopHaveSpaces = Util.countSpace(((ContainerShop) shop).getInventory(), shop.getItem()); int invHaveItems = Util.countItems(p.getInventory(), shop.getItem()); @@ -1344,7 +1344,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) // even if the shop is unlimited, the config option pay-unlimited-shop-owners is set to // true, // the unlimited shop owner should have enough money. - if (plugin.getConfiguration().getBoolean("shop.pay-unlimited-shop-owners")) { + if (plugin.getConfig().getBoolean("shop.pay-unlimited-shop-owners")) { amount = Math.min(amount, ownerCanAfford); } } @@ -1357,7 +1357,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) } if (ownerCanAfford == 0 && (!shop.isUnlimited() - || plugin.getConfiguration().getBoolean("shop.pay-unlimited-shop-owners"))) { + || plugin.getConfig().getBoolean("shop.pay-unlimited-shop-owners"))) { // when typed 'all' but the shop owner doesn't have enough money to buy at least 1 // item (and shop isn't unlimited or pay-unlimited is true) plugin.text().of(p, "the-owner-cant-afford-to-buy-from-you", @@ -1389,7 +1389,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) if (StringUtils.isNumeric(message)) { amount = Integer.parseInt(message); } else { - if (message.equalsIgnoreCase(plugin.getConfiguration().getOrDefault("shop.word-for-trade-all-items", "all"))) { + if (message.equalsIgnoreCase(plugin.getConfig().getString("shop.word-for-trade-all-items", "all"))) { int shopHaveItems = shop.getRemainingStock(); int invHaveSpaces = Util.countSpace(p.getInventory(), shop.getItem()); if (!shop.isUnlimited()) { diff --git a/src/main/java/org/maxgamer/quickshop/shop/VirtualDisplayItem.java b/src/main/java/org/maxgamer/quickshop/shop/VirtualDisplayItem.java index 607a806c9e..8621f78412 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/VirtualDisplayItem.java +++ b/src/main/java/org/maxgamer/quickshop/shop/VirtualDisplayItem.java @@ -406,7 +406,7 @@ private static PacketContainer createFakeItemMetaPacket(int entityID, ItemStack //Create a DataWatcher WrappedDataWatcher wpw = new WrappedDataWatcher(); //https://wiki.vg/index.php?title=Entity_metadata#Entity - if (PLUGIN.getConfiguration().getBoolean("shop.display-item-use-name")) { + if (PLUGIN.getConfig().getBoolean("shop.display-item-use-name")) { String itemName; if (QuickShop.isTesting()) { //Env Testing diff --git a/src/main/java/org/maxgamer/quickshop/util/InteractUtil.java b/src/main/java/org/maxgamer/quickshop/util/InteractUtil.java index dc74bcdc7f..97bef11e66 100644 --- a/src/main/java/org/maxgamer/quickshop/util/InteractUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/InteractUtil.java @@ -18,7 +18,8 @@ */ package org.maxgamer.quickshop.util; -import de.leonhard.storage.sections.FlatFileSection; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.MemoryConfiguration; import org.maxgamer.quickshop.QuickShop; import java.util.EnumMap; @@ -34,8 +35,11 @@ public class InteractUtil { private static Mode mode; private static boolean init; - public static void init(FlatFileSection configuration) { - mode = Mode.getMode(configuration.getOrDefault("interact-mode", 0)); + public static void init(ConfigurationSection configuration) { + if (configuration == null) { + configuration = new MemoryConfiguration(); + } + mode = Mode.getMode(configuration.getInt("interact-mode", 0)); SNEAKING_ACTION_MAPPING.put(Action.CREATE, configuration.getBoolean("sneak-to-create")); SNEAKING_ACTION_MAPPING.put(Action.TRADE, configuration.getBoolean("sneak-to-trade")); SNEAKING_ACTION_MAPPING.put(Action.CONTROL, configuration.getBoolean("sneak-to-control")); @@ -51,7 +55,7 @@ public static void init(FlatFileSection configuration) { */ public static boolean check(Action action, boolean isSneaking) { if (!init) { - init(QuickShop.getInstance().getConfiguration().getSection("shop.interact")); + init(QuickShop.getInstance().getConfig().getConfigurationSection("shop.interact")); } //Hopefully some coders can read this boolean sneakAllowed = SNEAKING_ACTION_MAPPING.get(action); diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index fabe8abe35..7fa3d0d39a 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -231,7 +231,7 @@ public static void loadI18nFile() { plugin.getLogger().info("Loading plugin translations files..."); //Load game language i18n - loadGameLanguage(plugin.getConfiguration().getOrDefault("game-language", "default")); + loadGameLanguage(plugin.getConfig().getString("game-language", "default")); } @Unstable @@ -377,7 +377,7 @@ public static void loadTransactionMessages() { */ @Deprecated public static void send(@NotNull UUID player, @NotNull TransactionMessage transactionMessage, boolean isUnlimited) { - if (isUnlimited && plugin.getConfiguration().getBoolean("shop.ignore-unlimited-shop-messages")) { + if (isUnlimited && plugin.getConfig().getBoolean("shop.ignore-unlimited-shop-messages")) { return; // Ignore unlimited shops messages. } Util.debugLog(transactionMessage.getMessage()); @@ -412,7 +412,7 @@ public static void send(@NotNull UUID player, @NotNull TransactionMessage transa * Else, if they're not online, queues them in the database. */ public static void send(@NotNull Shop shop, @NotNull UUID player, @NotNull TransactionMessage transactionMessage) { - if (shop.isUnlimited() && plugin.getConfiguration().getBoolean("shop.ignore-unlimited-shop-messages")) { + if (shop.isUnlimited() && plugin.getConfig().getBoolean("shop.ignore-unlimited-shop-messages")) { return; // Ignore unlimited shops messages. } OfflinePlayer p = Bukkit.getOfflinePlayer(player); @@ -470,7 +470,7 @@ public static void sendControlPanelInfo(@NotNull CommandSender sender, @NotNull plugin.text().of(sender, "controlpanel.setowner", shop.ownerName() - + ((plugin.getConfiguration().getBoolean("shop.show-owner-uuid-in-controlpanel-if-op") + + ((plugin.getConfig().getBoolean("shop.show-owner-uuid-in-controlpanel-if-op") && shop.isUnlimited()) ? (" (" + shop.getOwner() + ")") : "")).forLocale(), @@ -517,7 +517,7 @@ public static void sendControlPanelInfo(@NotNull CommandSender sender, @NotNull String text = MsgUtil.fillArgs( plugin.text().of(sender, "controlpanel.price").forLocale(), - (plugin.getConfiguration().getBoolean("use-decimal-format")) + (plugin.getConfig().getBoolean("use-decimal-format")) ? decimalFormat(shop.getPrice()) : Double.toString(shop.getPrice())); String hoverText = plugin.text().of(sender, "controlpanel.price-hover").forLocale(); @@ -581,7 +581,7 @@ public static String decimalFormat(double value) { if (decimalFormat == null) { //lazy initialize try { - String format = plugin.getConfiguration().getString("decimal-format"); + String format = plugin.getConfig().getString("decimal-format"); decimalFormat = format == null ? new DecimalFormat() : new DecimalFormat(format); } catch (Exception e) { QuickShop.getInstance().getLogger().log(Level.WARNING, "Error when processing decimal format, using system default: " + e.getMessage()); @@ -645,7 +645,7 @@ public static String getEnchi18n(@NotNull Enchantment key) { public static void printEnchantment(@NotNull Player p, @NotNull Shop shop, ChatSheetPrinter chatSheetPrinter) { - if (shop.getItem().hasItemMeta() && shop.getItem().getItemMeta().hasItemFlag(ItemFlag.HIDE_ENCHANTS) && plugin.getConfiguration().getBoolean("respect-item-flag")) { + if (shop.getItem().hasItemMeta() && shop.getItem().getItemMeta().hasItemFlag(ItemFlag.HIDE_ENCHANTS) && plugin.getConfig().getBoolean("respect-item-flag")) { return; } Map enchs = new HashMap<>(); diff --git a/src/main/java/org/maxgamer/quickshop/util/PermissionChecker.java b/src/main/java/org/maxgamer/quickshop/util/PermissionChecker.java index 13a5c57208..fcc68f29cc 100644 --- a/src/main/java/org/maxgamer/quickshop/util/PermissionChecker.java +++ b/src/main/java/org/maxgamer/quickshop/util/PermissionChecker.java @@ -64,8 +64,8 @@ public PermissionChecker(@NotNull QuickShop plugin) { } private void init() { - usePermissionChecker = this.plugin.getConfiguration().getBoolean("shop.protection-checking"); - if (plugin.getConfiguration().getInt("shop.protection-checking-handler") == 1) { + usePermissionChecker = this.plugin.getConfig().getBoolean("shop.protection-checking"); + if (plugin.getConfig().getInt("shop.protection-checking-handler") == 1) { this.eventManager = new QSEventManager(plugin); } else { this.eventManager = new BukkitEventManager(); @@ -93,7 +93,7 @@ public Result canBuild(@NotNull Player player, @NotNull Location location) { */ public Result canBuild(@NotNull Player player, @NotNull Block block) { - if (plugin.getConfiguration().getStringList("shop.protection-checking-blacklist").contains(block.getWorld().getName())) { + if (plugin.getConfig().getStringList("shop.protection-checking-blacklist").contains(block.getWorld().getName())) { Util.debugLog("Skipping protection checking in world " + block.getWorld().getName() + " causing it in blacklist."); return Result.SUCCESS; } @@ -114,7 +114,7 @@ public Result canBuild(@NotNull Player player, @NotNull Block block) { if (plugin.getBlockHubPlugin() != null) { BlocksHubBukkit blocksHubBukkit = (BlocksHubBukkit) plugin.getBlockHubPlugin(); boolean bhCanBuild = blocksHubBukkit.getApi().hasAccess(player.getUniqueId(), blocksHubBukkit.getApi().getWorld(block.getWorld().getName()), block.getX(), block.getY(), block.getZ()); - if (plugin.getConfiguration().getBoolean("plugin.BlockHub.only")) { + if (plugin.getConfig().getBoolean("plugin.BlockHub.only")) { Util.debugLog("BlockHub only mode response: " + bhCanBuild); return new Result("BlockHub"); } else { diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index f0234255ea..72ef8980f5 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -188,7 +188,7 @@ public static boolean isShoppables(@NotNull Material material) { } public static boolean isBlacklistWorld(@NotNull World world) { - return plugin.getConfiguration().getStringList("shop.blacklist-world").contains(world.getName()); + return plugin.getConfig().getStringList("shop.blacklist-world").contains(world.getName()); } /** @@ -276,10 +276,10 @@ public static ItemStack deserialize(@NotNull String config) throws InvalidConfig if (itemDataVersion > Bukkit.getUnsafe().getDataVersion()) { Util.debugLog("WARNING: DataVersion not matched with ItemStack: " + config); // okay we need some things to do - if (plugin.getConfiguration().getBoolean("shop.force-load-downgrade-items.enable")) { + if (plugin.getConfig().getBoolean("shop.force-load-downgrade-items.enable")) { // okay it enabled Util.debugLog("QuickShop is trying force loading " + config); - if (plugin.getConfiguration().getInt("shop.force-load-downgrade-items.method") == 0) { // Mode 0 + if (plugin.getConfig().getInt("shop.force-load-downgrade-items.method") == 0) { // Mode 0 //noinspection deprecation item.put("v", Bukkit.getUnsafe().getDataVersion() - 1); } else { // Mode other @@ -410,7 +410,7 @@ public static String getClassPrefix(@NotNull Class c) { } public static boolean useEnchantmentForEnchantedBook() { - return plugin.getConfiguration().getBoolean("shop.use-enchantment-for-enchanted-book"); + return plugin.getConfig().getBoolean("shop.use-enchantment-for-enchanted-book"); } @NotNull @@ -435,7 +435,7 @@ public static String getItemCustomName(@NotNull ItemStack itemStack) { } if (itemStack.hasItemMeta() && Objects.requireNonNull(itemStack.getItemMeta()).hasDisplayName() - && !QuickShop.getInstance().getConfiguration().getBoolean("shop.force-use-item-original-name")) { + && !QuickShop.getInstance().getConfig().getBoolean("shop.force-use-item-original-name")) { return itemStack.getItemMeta().getDisplayName(); } return null; @@ -569,9 +569,9 @@ public static void initialize() { SHOPABLES.clear(); RESTRICTED_PRICES.clear(); CUSTOM_STACKSIZE.clear(); - devMode = plugin.getConfiguration().getBoolean("dev-mode"); + devMode = plugin.getConfig().getBoolean("dev-mode"); - for (String s : plugin.getConfiguration().getStringList("shop-blocks")) { + for (String s : plugin.getConfig().getStringList("shop-blocks")) { Material mat = Material.matchMaterial(s.toUpperCase()); if (mat == null) { mat = Material.matchMaterial(s); @@ -582,7 +582,7 @@ public static void initialize() { SHOPABLES.add(mat); } } - List configBlacklist = plugin.getConfiguration().getStringList("blacklist"); + List configBlacklist = plugin.getConfig().getStringList("blacklist"); for (String s : configBlacklist) { Material mat = Material.getMaterial(s.toUpperCase()); if (mat == null) { @@ -595,7 +595,7 @@ public static void initialize() { BLACKLIST.add(mat); } - for (String s : plugin.getConfiguration().getStringList("shop.price-restriction")) { + for (String s : plugin.getConfig().getStringList("shop.price-restriction")) { String[] sp = s.split(";"); if (sp.length == 3) { try { @@ -610,7 +610,7 @@ public static void initialize() { } } } - for (String material : plugin.getConfiguration().getStringList("custom-item-stacksize")) { + for (String material : plugin.getConfig().getStringList("custom-item-stacksize")) { String[] data = material.split(":"); if (data.length != 2) { continue; @@ -626,13 +626,13 @@ public static void initialize() { } CUSTOM_STACKSIZE.put(mat, Integer.parseInt(data[1])); } - disableDebugLogger = plugin.getConfiguration().getOrDefault("debug.disable-debuglogger", false); + disableDebugLogger = plugin.getConfig().getBoolean("debug.disable-debuglogger", false); try { - dyeColor = DyeColor.valueOf(plugin.getConfiguration().getString("shop.sign-dye-color")); + dyeColor = DyeColor.valueOf(plugin.getConfig().getString("shop.sign-dye-color")); } catch (Exception ignored) { } - InteractUtil.init(plugin.getConfiguration().getSection("shop.interact")); + InteractUtil.init(plugin.getConfig().getConfigurationSection("shop.interact")); } /** @@ -724,7 +724,7 @@ public static boolean isBlacklisted(@NotNull ItemStack stack) { return false; } for (String lore : Objects.requireNonNull(stack.getItemMeta().getLore())) { - List blacklistLores = plugin.getConfiguration().getStringList("shop.blacklist-lores"); + List blacklistLores = plugin.getConfig().getStringList("shop.blacklist-lores"); for (String blacklistLore : blacklistLores) { if (lore.contains(blacklistLore)) { return true; @@ -1115,7 +1115,7 @@ public static String getClassPrefix() { */ @NotNull public static Material getSignMaterial() { - Material signMaterial = Material.matchMaterial(plugin.getConfiguration().getOrDefault("shop.sign-material", "OAK_WALL_SIGN")); + Material signMaterial = Material.matchMaterial(plugin.getConfig().getString("shop.sign-material", "OAK_WALL_SIGN")); if (signMaterial != null) { return signMaterial; } @@ -1186,13 +1186,13 @@ public static boolean isDevMode() { return devMode; } else { if (plugin != null) { - devMode = plugin.getConfiguration().getBoolean("dev-mode"); + devMode = plugin.getConfig().getBoolean("dev-mode"); return devMode; } else { return false; } } - //F return devMode != null ? devMode : (devMode = plugin.getConfiguration().getBoolean("dev-mode")); + //F return devMode != null ? devMode : (devMode = plugin.getConfig().getBoolean("dev-mode")); } /** @@ -1248,7 +1248,7 @@ public static File getCacheFolder() { @NotNull public static List getPlayerList() { List tabList; - if (plugin.getConfiguration().getBoolean("include-offlineplayer-list")) { + if (plugin.getConfig().getBoolean("include-offlineplayer-list")) { tabList = Arrays.stream(plugin.getServer().getOfflinePlayers()).map(OfflinePlayer::getName).collect(Collectors.toList()); } else { tabList = plugin.getServer().getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList()); diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixer.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixer.java index 851dc31f26..dd6bbc5521 100644 --- a/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixer.java +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixer.java @@ -20,6 +20,7 @@ package org.maxgamer.quickshop.util.config; import lombok.AllArgsConstructor; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.maxgamer.quickshop.QuickShop; @@ -60,9 +61,9 @@ public boolean fix() { for (String key : builtInConfig.getKeys(true)) { Object value = externalConfig.get(key); Object buildInValue = builtInConfig.get(key); - if (value == null || !value.getClass().getTypeName().equals(Objects.requireNonNull(buildInValue).getClass().getTypeName())) { + if (!(value instanceof ConfigurationSection) || !value.getClass().getTypeName().equals(Objects.requireNonNull(buildInValue).getClass().getTypeName())) { plugin.getLogger().warning("Fixing configuration use default value: " + key); - plugin.getConfiguration().set(key, buildInValue); + plugin.getConfig().set(key, buildInValue); } } plugin.getLogger().info("QuickShop fixed the corrupted parts in configuration that we can found. We recommend you restart the server and make fix apply."); diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixerLightning.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixerLightning.java index 095e75529d..fceedff37e 100644 --- a/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixerLightning.java +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationFixerLightning.java @@ -63,7 +63,7 @@ public boolean fix() { Object buildInValue = builtInConfig.get(key); if (value == null || !value.getClass().getTypeName().equals(Objects.requireNonNull(buildInValue).getClass().getTypeName())) { plugin.getLogger().warning("Fixing configuration use default value: " + key); - plugin.getConfiguration().set(key, buildInValue); + plugin.getConfig().set(key, buildInValue); } } plugin.getLogger().info("QuickShop fixed the corrupted parts in configuration that we can found. We recommend you restart the server and make fix apply."); diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationUpdater.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationUpdater.java index e948f5857a..7719f46f67 100644 --- a/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationUpdater.java +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigurationUpdater.java @@ -19,8 +19,8 @@ package org.maxgamer.quickshop.util.config; -import de.leonhard.storage.Yaml; import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.util.Util; @@ -34,11 +34,11 @@ public class ConfigurationUpdater { private final QuickShop plugin; @Getter - private final Yaml configuration; + private final ConfigurationSection configuration; public ConfigurationUpdater(QuickShop plugin) { this.plugin = plugin; - this.configuration = plugin.getConfiguration(); + this.configuration = plugin.getConfig(); } private void writeServerUniqueId() { diff --git a/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java b/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java index 8b351918c7..d0feb24fd9 100644 --- a/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java +++ b/src/main/java/org/maxgamer/quickshop/util/economyformatter/BuiltInEconomyFormatter.java @@ -47,9 +47,9 @@ public BuiltInEconomyFormatter(QuickShop plugin) { @Override public ReloadResult reloadModule() { CURRENCY_SYMBOL_MAPPING.clear(); - this.useDecimalFormat = plugin.getConfiguration().getOrDefault("use-decimal-format", false); - this.currencySymbolOnRight = plugin.getConfiguration().getOrDefault("shop.currency-symbol-on-right", false); - List symbols = plugin.getConfiguration().getStringList("shop.alternate-currency-symbol-list"); + this.useDecimalFormat = plugin.getConfig().getBoolean("use-decimal-format", false); + this.currencySymbolOnRight = plugin.getConfig().getBoolean("shop.currency-symbol-on-right", false); + List symbols = plugin.getConfig().getStringList("shop.alternate-currency-symbol-list"); symbols.forEach(entry -> { String[] splits = entry.split(";", 2); if (splits.length < 2) { @@ -65,7 +65,7 @@ public String getInternalFormat(double amount, @Nullable String currency) { if (StringUtils.isEmpty(currency)) { Util.debugLog("Format: Currency is null"); String formatted = useDecimalFormat ? MsgUtil.decimalFormat(amount) : Double.toString(amount); - return currencySymbolOnRight ? formatted + plugin.getConfiguration().getOrDefault("shop.alternate-currency-symbol", "$") : plugin.getConfiguration().getOrDefault("shop.alternate-currency-symbol", "$") + formatted; + return currencySymbolOnRight ? formatted + plugin.getConfig().getString("shop.alternate-currency-symbol", "$") : plugin.getConfig().getString("shop.alternate-currency-symbol", "$") + formatted; } else { Util.debugLog("Format: Currency is: [" + currency + "]"); String formatted = useDecimalFormat ? MsgUtil.decimalFormat(amount) : Double.toString(amount); diff --git a/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java b/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java index 923956bc3e..f43d6c2b91 100644 --- a/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java +++ b/src/main/java/org/maxgamer/quickshop/util/economyformatter/EconomyFormatter.java @@ -54,10 +54,10 @@ public EconomyFormatter(QuickShop plugin, AbstractEconomy economy) { @Override public ReloadResult reloadModule() { CURRENCY_SYMBOL_MAPPING.clear(); - this.disableVaultFormat = plugin.getConfiguration().getOrDefault("shop.disable-vault-format", false); - this.useDecimalFormat = plugin.getConfiguration().getOrDefault("use-decimal-format", false); - this.currencySymbolOnRight = plugin.getConfiguration().getOrDefault("shop.currency-symbol-on-right", false); - List symbols = plugin.getConfiguration().getStringList("shop.alternate-currency-symbol-list"); + this.disableVaultFormat = plugin.getConfig().getBoolean("shop.disable-vault-format", false); + this.useDecimalFormat = plugin.getConfig().getBoolean("use-decimal-format", false); + this.currencySymbolOnRight = plugin.getConfig().getBoolean("shop.currency-symbol-on-right", false); + List symbols = plugin.getConfig().getStringList("shop.alternate-currency-symbol-list"); symbols.forEach(entry -> { String[] splits = entry.split(";", 2); if (splits.length < 2) { @@ -119,7 +119,7 @@ private String getInternalFormat(double amount, @Nullable String currency) { if (StringUtils.isEmpty(currency)) { Util.debugLog("Format: Currency is null"); String formatted = useDecimalFormat ? MsgUtil.decimalFormat(amount) : Double.toString(amount); - return currencySymbolOnRight ? formatted + plugin.getConfiguration().getOrDefault("shop.alternate-currency-symbol", "$") : plugin.getConfiguration().getOrDefault("shop.alternate-currency-symbol", "$") + formatted; + return currencySymbolOnRight ? formatted + plugin.getConfig().getString("shop.alternate-currency-symbol", "$") : plugin.getConfig().getString("shop.alternate-currency-symbol", "$") + formatted; } else { Util.debugLog("Format: Currency is: [" + currency + "]"); String formatted = useDecimalFormat ? MsgUtil.decimalFormat(amount) : Double.toString(amount); diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java index d068d163d5..470f249835 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java @@ -19,12 +19,12 @@ package org.maxgamer.quickshop.util.matcher.item; -import de.leonhard.storage.sections.FlatFileSection; import de.tr7zw.nbtapi.NBTItem; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.bukkit.attribute.Attribute; import org.bukkit.block.ShulkerBox; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.*; @@ -58,8 +58,8 @@ public QuickShopItemMatcherImpl(@NotNull QuickShop plugin) { } private void init() { - itemMetaMatcher = new ItemMetaMatcher(plugin.getConfiguration().getSection("matcher.item"), this); - workType = plugin.getConfiguration().getInt("matcher.work-type"); + itemMetaMatcher = new ItemMetaMatcher(plugin.getConfig().getConfigurationSection("matcher.item"), this); + workType = plugin.getConfig().getInt("matcher.work-type"); } /** @@ -198,7 +198,7 @@ private static class ItemMetaMatcher { private final List matcherList = new ArrayList<>(); - public ItemMetaMatcher(@NotNull FlatFileSection itemMatcherConfig, @NotNull QuickShopItemMatcherImpl itemMatcher) { + public ItemMetaMatcher(@NotNull ConfigurationSection itemMatcherConfig, @NotNull QuickShopItemMatcherImpl itemMatcher) { addIfEnable(itemMatcherConfig, "damage", (meta1, meta2) -> { if (meta1 instanceof Damageable != meta2 instanceof Damageable) { @@ -514,7 +514,7 @@ public ItemMetaMatcher(@NotNull FlatFileSection itemMatcherConfig, @NotNull Quic } } - private void addIfEnable(FlatFileSection itemMatcherConfig, String path, Matcher matcher) { + private void addIfEnable(ConfigurationSection itemMatcherConfig, String path, Matcher matcher) { if (itemMatcherConfig.getBoolean(path)) { matcherList.add(matcher); } diff --git a/src/main/java/org/maxgamer/quickshop/util/paste/Paste.java b/src/main/java/org/maxgamer/quickshop/util/paste/Paste.java index b0dc0fbd4b..e948d8711e 100644 --- a/src/main/java/org/maxgamer/quickshop/util/paste/Paste.java +++ b/src/main/java/org/maxgamer/quickshop/util/paste/Paste.java @@ -20,10 +20,10 @@ package org.maxgamer.quickshop.util.paste; import com.google.common.cache.CacheStats; -import de.leonhard.storage.sections.FlatFileSection; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import org.bukkit.World; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -253,8 +253,8 @@ public class Paste { StandardCharsets.UTF_8); // Process the data to protect passwords. try { - FlatFileSection configurationSection = - plugin.getConfiguration().getSection("database"); + ConfigurationSection configurationSection = + plugin.getConfig().getConfigurationSection("database"); config = config.replaceAll( Objects.requireNonNull( diff --git a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java index 9652cbbe16..49bb497958 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java @@ -46,7 +46,7 @@ public DisplayAutoDespawnWatcher(@NotNull QuickShop plugin) { } private void init() { - this.range = plugin.getConfiguration().getInt("shop.display-despawn-range"); + this.range = plugin.getConfig().getInt("shop.display-despawn-range"); } @Override diff --git a/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java index 54abd2c4d5..b3da83f232 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/LogWatcher.java @@ -52,7 +52,7 @@ public LogWatcher(QuickShop plugin, File log) { //noinspection ResultOfMethodCallIgnored log.createNewFile(); } else { - if ((log.length() / 1024f / 1024f) > plugin.getConfiguration().getDouble("logging.file-size")) { + if ((log.length() / 1024f / 1024f) > plugin.getConfig().getDouble("logging.file-size")) { Path logPath = plugin.getDataFolder().toPath().resolve("logs"); Files.createDirectories(logPath); //Find a available name diff --git a/src/main/java/org/maxgamer/quickshop/watcher/OngoingFeeWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/OngoingFeeWatcher.java index d677742a94..d3a5ed6df9 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/OngoingFeeWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/OngoingFeeWatcher.java @@ -58,9 +58,9 @@ public void run() { return; } - boolean allowLoan = plugin.getConfiguration().getBoolean("shop.allow-economy-loan"); - boolean ignoreUnlimited = plugin.getConfiguration().getBoolean("shop.ongoing-fee.ignore-unlimited"); - double gobalCost = plugin.getConfiguration().getDouble("shop.ongoing-fee.cost-per-shop"); + boolean allowLoan = plugin.getConfig().getBoolean("shop.allow-economy-loan"); + boolean ignoreUnlimited = plugin.getConfig().getBoolean("shop.ongoing-fee.ignore-unlimited"); + double gobalCost = plugin.getConfig().getDouble("shop.ongoing-fee.cost-per-shop"); for (Shop shop : plugin.getShopManager().getAllShops()) { if ((!shop.isUnlimited() || !ignoreUnlimited) && !shop.isDeleted()) { UUID shopOwner = shop.getOwner(); diff --git a/src/test/java/org/maxgamer/quickshop/eventmanager/ListenerContainerTest.java b/src/test/java/org/maxgamer/quickshop/eventmanager/ListenerContainerTest.java index d175406e0a..a606e64b9e 100644 --- a/src/test/java/org/maxgamer/quickshop/eventmanager/ListenerContainerTest.java +++ b/src/test/java/org/maxgamer/quickshop/eventmanager/ListenerContainerTest.java @@ -20,7 +20,6 @@ package org.maxgamer.quickshop.eventmanager; -import de.leonhard.storage.sections.FlatFileSection; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -64,7 +63,7 @@ public FileConfiguration getConfig() { } @NotNull - public FlatFileSection getConfiguration() { + public FileConfiguration getConfiguration() { return null; } diff --git a/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java b/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java index 398efba5ae..8e39bd8d13 100644 --- a/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java +++ b/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java @@ -19,46 +19,44 @@ package org.maxgamer.quickshop.util; -import de.leonhard.storage.LightningBuilder; -import de.leonhard.storage.Yaml; -import de.leonhard.storage.sections.FlatFileSection; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.MemoryConfiguration; +import org.junit.Assert; import org.junit.Test; -import java.io.File; - public class InteractUtilTest { - private FlatFileSection genConfig(int mode, boolean allowSneaking) { - Yaml configurationSection = LightningBuilder.fromFile(new File("unit-test.yml")).createYaml(); + private ConfigurationSection genConfig(int mode, boolean allowSneaking) { + ConfigurationSection configurationSection = new MemoryConfiguration(); configurationSection.set("shop.interact.interact-mode", mode); configurationSection.set("shop.interact.sneak-to-create", allowSneaking); - return configurationSection.getSection(""); + return configurationSection; } @Test public void testInteractBoolean() { //ONLY -// InteractUtil.init(genConfig(0, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); -// Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, false)); -// InteractUtil.init(genConfig(0, false)); -// Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); -// //BOTH -// InteractUtil.init(genConfig(1, false)); -// Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); -// InteractUtil.init(genConfig(1, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); -// //REVERSED -// InteractUtil.init(genConfig(2, false)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); -// InteractUtil.init(genConfig(2, true)); -// Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); -// Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); + InteractUtil.init(genConfig(0, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); + Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, false)); + InteractUtil.init(genConfig(0, false)); + Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); +//BOTH + InteractUtil.init(genConfig(1, false)); + Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); + InteractUtil.init(genConfig(1, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); +//REVERSED + InteractUtil.init(genConfig(2, false)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); + InteractUtil.init(genConfig(2, true)); + Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); + Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); } } From 87412f5670f545be0ba728c44b4a0183478480cc Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 21:03:50 +0800 Subject: [PATCH 048/725] Refactor new language system [1/3] preparing local language files --- crowdin.yml | 2 +- .../game/game/MojangGameLanguageImpl.java | 4 +- ...tMapper.java => LanguageFilesManager.java} | 6 +- .../localization/text/SimpleTextManager.java | 138 ++++++++++-------- .../quickshop/shop/ContainerShop.java | 2 +- .../org/maxgamer/quickshop/util/MsgUtil.java | 9 +- .../resources/crowdin}/af-ZA/messages.json | 0 .../resources/crowdin}/ar-SA/messages.json | 0 .../resources/crowdin}/ca-ES/messages.json | 0 .../resources/crowdin}/cs-CZ/messages.json | 0 .../resources/crowdin}/da-DK/messages.json | 0 .../resources/crowdin}/de-DE/messages.json | 0 .../resources/crowdin}/el-GR/messages.json | 0 .../resources/crowdin}/en-US/messages.json | 0 .../resources/crowdin}/es-ES/messages.json | 0 .../resources/crowdin}/fi-FI/messages.json | 0 .../resources/crowdin}/fr-FR/messages.json | 0 .../resources/crowdin}/he-IL/messages.json | 0 .../resources/crowdin}/hu-HU/messages.json | 0 .../resources/crowdin}/it-IT/messages.json | 0 .../resources/crowdin}/ja-JP/messages.json | 0 .../resources/crowdin}/ko-KR/messages.json | 0 .../resources/crowdin}/nl-NL/messages.json | 0 .../resources/crowdin}/no-NO/messages.json | 0 .../resources/crowdin}/pl-PL/messages.json | 0 .../resources/crowdin}/pt-BR/messages.json | 0 .../resources/crowdin}/pt-PT/messages.json | 0 .../resources/crowdin}/ro-RO/messages.json | 0 .../resources/crowdin}/ru-RU/messages.json | 0 .../resources/crowdin}/sr-SP/messages.json | 0 .../resources/crowdin}/sv-SE/messages.json | 0 .../resources/crowdin}/tr-TR/messages.json | 0 .../resources/crowdin}/uk-UA/messages.json | 0 .../resources/crowdin}/vi-VN/messages.json | 0 .../resources/crowdin}/zh-CN/messages.json | 0 .../resources/crowdin}/zh-HK/messages.json | 0 .../resources/crowdin}/zh-TW/messages.json | 0 37 files changed, 92 insertions(+), 69 deletions(-) rename src/main/java/org/maxgamer/quickshop/localization/text/{TextMapper.java => LanguageFilesManager.java} (95%) rename {crowdin/lang => src/main/resources/crowdin}/af-ZA/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/ar-SA/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/ca-ES/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/cs-CZ/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/da-DK/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/de-DE/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/el-GR/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/en-US/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/es-ES/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/fi-FI/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/fr-FR/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/he-IL/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/hu-HU/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/it-IT/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/ja-JP/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/ko-KR/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/nl-NL/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/no-NO/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/pl-PL/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/pt-BR/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/pt-PT/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/ro-RO/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/ru-RU/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/sr-SP/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/sv-SE/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/tr-TR/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/uk-UA/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/vi-VN/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/zh-CN/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/zh-HK/messages.json (100%) rename {crowdin/lang => src/main/resources/crowdin}/zh-TW/messages.json (100%) diff --git a/crowdin.yml b/crowdin.yml index 15ad6b03b9..bba8990858 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,3 @@ files: - source: /src/main/resources/lang/*.json - translation: /crowdin/lang/%locale%/%original_file_name% + translation: /src/main/resources/crowdin/%locale%/%original_file_name% diff --git a/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java b/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java index 07dff80c7b..521cc6d3f0 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java +++ b/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java @@ -70,8 +70,8 @@ public class MojangGameLanguageImpl extends BukkitGameLanguageImpl implements Ga public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languageCode) { super(plugin); this.plugin = plugin; - languageCode = MsgUtil.processGameLanguageCode(languageCode); - switch (plugin.getConfiguration().getOrDefault("mojangapi-mirror", 0)) { + languageCode = MsgUtil.getGameLanguageCode(languageCode); + switch (plugin.getConfig().getInt("mojangapi-mirror", 0)) { case 0: mirror = new MojangApiOfficialMirror(); plugin.getLogger().info("Game assets server selected: Mojang API"); diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/TextMapper.java b/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java similarity index 95% rename from src/main/java/org/maxgamer/quickshop/localization/text/TextMapper.java rename to src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java index 671bef6b1f..a0b39dd727 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/TextMapper.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java @@ -22,14 +22,18 @@ import com.dumptruckman.bukkit.configuration.json.JsonConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.maxgamer.quickshop.util.Util; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class TextMapper { +//TODO: Refactor to a localeCode->localeContentBean class mapping +public class LanguageFilesManager { + //distributionPath->[localeCode->OTA files] private final Map> locale2ContentMapping = new ConcurrentHashMap<>(); + //distributionPath->bundled files private final Map bundledFile2ContentMapping = new ConcurrentHashMap<>(); /** diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 34eca19605..42cf7f2d48 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -22,6 +22,7 @@ import com.dumptruckman.bukkit.configuration.json.JsonConfiguration; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.configuration.ConfigurationSection; @@ -45,6 +46,7 @@ import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -54,12 +56,12 @@ import java.util.regex.PatternSyntaxException; public class SimpleTextManager implements TextManager, Reloadable { - private static final String CROWDIN_LANGUAGE_FILE = "/master/crowdin/lang/%locale%/messages.json"; + private static final String CROWDIN_LANGUAGE_FILE_PATH = "/master/crowdin/lang/%locale%/messages.json"; public final List postProcessors = new ArrayList<>(); private final QuickShop plugin; private final Distribution distribution; // > - private final TextMapper mapper = new TextMapper(); + private final LanguageFilesManager languageFilesManager = new LanguageFilesManager(); public SimpleTextManager(QuickShop plugin) { @@ -93,7 +95,7 @@ private File getOverrideFilesFolder(@NotNull String path) { * Reset everything */ private void reset() { - mapper.reset(); + languageFilesManager.reset(); postProcessors.clear(); } @@ -106,11 +108,27 @@ private void reset() { private JsonConfiguration loadBundled(String file) { JsonConfiguration bundledLang = new JsonConfiguration(); File fileObject = new File(file); + String parentStr = fileObject.getParent(); + String fileName = fileObject.getName(); try { - bundledLang.loadFromString(new String(IOUtils.toByteArray(new InputStreamReader(plugin.getResource("lang/" + fileObject.getName()), StandardCharsets.UTF_8), StandardCharsets.UTF_8))); + InputStream stream = null; + if (!StringUtils.isEmpty(parentStr)) { + //Try to fetch matched i18n resources + stream = plugin.getResource("crowdin/" + parentStr + "/" + fileName); + } + if (stream == null) { + //Fallback to default + stream = plugin.getResource("lang/" + fileName); + } + if (stream != null) { + bundledLang.loadFromString(new String(IOUtils.toByteArray(new InputStreamReader(stream, StandardCharsets.UTF_8), StandardCharsets.UTF_8))); + } else { + plugin.getLogger().log(Level.WARNING, "Cannot load bundled language file from jar, bundled language files " + (parentStr == null ? "" : parentStr) + "/" + fileName + " not found."); + bundledLang = new JsonConfiguration(); + } } catch (IOException | InvalidConfigurationException ex) { bundledLang = new JsonConfiguration(); - plugin.getLogger().log(Level.SEVERE, "Cannot load bundled language file from Jar, some strings may missing!", ex); + plugin.getLogger().log(Level.SEVERE, "Cannot load bundled language file from jar, some strings may missing!", ex); } return bundledLang; } @@ -121,43 +139,44 @@ private JsonConfiguration loadBundled(String file) { public void load() { plugin.getLogger().info("Checking for translation updates, this may need a while..."); this.reset(); - distribution.getAvailableLanguages(); // Make a request that loading the manifest to create manifest cache for - // parallel threads - List enabledLanguagesRegex = plugin.getConfiguration().getStringList("enabled-languages"); + List enabledLanguagesRegex = plugin.getConfig().getStringList("enabled-languages"); //Make sure is a lowercase regex, prevent case-sensitive and underscore issue for (int i = 0; i < enabledLanguagesRegex.size(); i++) { enabledLanguagesRegex.set(i, enabledLanguagesRegex.get(i).toLowerCase(Locale.ROOT).replace("-", "_")); } - // Multi File and Multi-Language loader - // Offline Initiated - mapper.deployBundled("/master/crowdin/lang/%locale%/messages.json", loadBundled("/master/crowdin/lang/%locale%/messages.json")); - distribution.getAvailableLanguages().parallelStream().forEach(crowdinCode -> distribution.getAvailableFiles().parallelStream().forEach(crowdinFile -> { - try { - // Minecraft client use lowercase wi - String minecraftCode = crowdinCode.toLowerCase(Locale.ROOT).replace("-", "_"); - if (!localeEnabled(minecraftCode, enabledLanguagesRegex)) { - Util.debugLog("Locale: " + minecraftCode + " not enabled in configuration."); - return; - } - Util.debugLog("Loading translation for locale: " + crowdinCode + " (" + minecraftCode + ")"); - // Deploy bundled to mapper - mapper.deployBundled(crowdinFile, loadBundled(crowdinFile)); - JsonConfiguration configuration = getDistributionConfiguration(crowdinFile, crowdinCode); - // Loading override text (allow user modification the translation) - JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); - applyOverrideConfiguration(configuration, override); - // Deploy distribution to mapper - mapper.deploy(crowdinFile, minecraftCode, configuration, loadBundled(crowdinFile)); - Util.debugLog("Locale " + crowdinFile.replace("%locale%", crowdinCode) + " has been successfully loaded"); - } // Key founds in available locales but not in custom mapping on crowdin platform - catch (IOException e) { - // Network error - plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + " please check your network connection.", e); - } catch (Exception e) { - // Translation syntax error or other exceptions - plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + ".", e); - } - })); + //====Multi File and Multi-Language loader start==== + //Init offline default file + languageFilesManager.deployBundled(CROWDIN_LANGUAGE_FILE_PATH, loadBundled(CROWDIN_LANGUAGE_FILE_PATH)); + //Get language code first + distribution.getAvailableLanguages().parallelStream().forEach(crowdinCode -> + //Then load all the files in this language code + distribution.getAvailableFiles().forEach(crowdinFile -> { + try { + // Minecraft client use lowercase + String minecraftCode = crowdinCode.toLowerCase(Locale.ROOT).replace("-", "_"); + if (!localeEnabled(minecraftCode, enabledLanguagesRegex)) { + Util.debugLog("Locale: " + minecraftCode + " not enabled in configuration."); + return; + } + Util.debugLog("Loading translation for locale: " + crowdinCode + " (" + minecraftCode + ")"); + // Deploy bundled to mapper + languageFilesManager.deployBundled(crowdinFile, loadBundled(crowdinFile)); + JsonConfiguration configuration = getDistributionConfiguration(crowdinFile, crowdinCode); + // Loading override text (allow user modification the translation) + JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); + applyOverrideConfiguration(configuration, override); + // Deploy distribution to mapper + languageFilesManager.deploy(crowdinFile, minecraftCode, configuration, loadBundled(crowdinFile)); + Util.debugLog("Locale " + crowdinFile.replace("%locale%", crowdinCode) + " has been successfully loaded"); + } // Key founds in available locales but not in custom mapping on crowdin platform + catch (IOException e) { + // Network error + plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + " please check your network connection.", e); + } catch (Exception e) { + // Translation syntax error or other exceptions + plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + ".", e); + } + })); // Register post processor postProcessors.add(new FillerProcessor()); @@ -256,7 +275,7 @@ private JsonConfiguration getOverrideConfiguration(@NotNull String overrideFile, */ @Override public @NotNull Text of(@NotNull String path, Object... args) { - return new Text(this, (CommandSender) null, mapper.getDistribution(CROWDIN_LANGUAGE_FILE), mapper.getBundled(CROWDIN_LANGUAGE_FILE), path, args); + return new Text(this, (CommandSender) null, languageFilesManager.getDistribution(CROWDIN_LANGUAGE_FILE_PATH), languageFilesManager.getBundled(CROWDIN_LANGUAGE_FILE_PATH), path, args); } /** @@ -269,7 +288,7 @@ private JsonConfiguration getOverrideConfiguration(@NotNull String overrideFile, */ @Override public @NotNull Text of(@Nullable CommandSender sender, @NotNull String path, Object... args) { - return new Text(this, sender, mapper.getDistribution(CROWDIN_LANGUAGE_FILE), mapper.getBundled(CROWDIN_LANGUAGE_FILE), path, args); + return new Text(this, sender, languageFilesManager.getDistribution(CROWDIN_LANGUAGE_FILE_PATH), languageFilesManager.getBundled(CROWDIN_LANGUAGE_FILE_PATH), path, args); } /** @@ -282,7 +301,7 @@ private JsonConfiguration getOverrideConfiguration(@NotNull String overrideFile, */ @Override public @NotNull Text of(@Nullable UUID sender, @NotNull String path, Object... args) { - return new Text(this, sender, mapper.getDistribution(CROWDIN_LANGUAGE_FILE), mapper.getBundled(CROWDIN_LANGUAGE_FILE), path, args); + return new Text(this, sender, languageFilesManager.getDistribution(CROWDIN_LANGUAGE_FILE_PATH), languageFilesManager.getBundled(CROWDIN_LANGUAGE_FILE_PATH), path, args); } /** @@ -294,7 +313,7 @@ private JsonConfiguration getOverrideConfiguration(@NotNull String overrideFile, */ @Override public @NotNull TextList ofList(@NotNull String path, Object... args) { - return new TextList(this, (CommandSender) null, mapper.getDistribution(CROWDIN_LANGUAGE_FILE), mapper.getBundled(CROWDIN_LANGUAGE_FILE), path, args); + return new TextList(this, (CommandSender) null, languageFilesManager.getDistribution(CROWDIN_LANGUAGE_FILE_PATH), languageFilesManager.getBundled(CROWDIN_LANGUAGE_FILE_PATH), path, args); } /** @@ -307,7 +326,7 @@ private JsonConfiguration getOverrideConfiguration(@NotNull String overrideFile, */ @Override public @NotNull TextList ofList(@Nullable UUID sender, @NotNull String path, Object... args) { - return new TextList(this, sender, mapper.getDistribution(CROWDIN_LANGUAGE_FILE), mapper.getBundled(CROWDIN_LANGUAGE_FILE), path, args); + return new TextList(this, sender, languageFilesManager.getDistribution(CROWDIN_LANGUAGE_FILE_PATH), languageFilesManager.getBundled(CROWDIN_LANGUAGE_FILE_PATH), path, args); } /** @@ -320,7 +339,7 @@ private JsonConfiguration getOverrideConfiguration(@NotNull String overrideFile, */ @Override public @NotNull TextList ofList(@Nullable CommandSender sender, @NotNull String path, Object... args) { - return new TextList(this, sender, mapper.getDistribution(CROWDIN_LANGUAGE_FILE), mapper.getBundled(CROWDIN_LANGUAGE_FILE), path, args); + return new TextList(this, sender, languageFilesManager.getDistribution(CROWDIN_LANGUAGE_FILE_PATH), languageFilesManager.getBundled(CROWDIN_LANGUAGE_FILE_PATH), path, args); } @Override @@ -332,14 +351,13 @@ public ReloadResult reloadModule() { public static class TextList implements org.maxgamer.quickshop.api.localization.text.TextList { private final SimpleTextManager manager; private final String path; - private final QuickShop plugin; private final Map mapping; private final CommandSender sender; private final Object[] args; + @Nullable private final JsonConfiguration bundled; - private TextList(SimpleTextManager manager, CommandSender sender, Map mapping, JsonConfiguration bundled, String path, Object... args) { - this.plugin = manager.plugin; + private TextList(SimpleTextManager manager, CommandSender sender, Map mapping, @Nullable JsonConfiguration bundled, String path, Object... args) { this.manager = manager; this.sender = sender; this.mapping = mapping; @@ -348,8 +366,7 @@ private TextList(SimpleTextManager manager, CommandSender sender, Map mapping, JsonConfiguration bundled, String path, Object... args) { - this.plugin = manager.plugin; + private TextList(SimpleTextManager manager, UUID sender, Map mapping, @Nullable JsonConfiguration bundled, String path, Object... args) { this.manager = manager; if (sender != null) { this.sender = Bukkit.getPlayer(sender); @@ -400,14 +417,15 @@ public List forLocale(@NotNull String locale) { JsonConfiguration index = mapping.get(locale); if (index == null) { Util.debugLog("Fallback " + locale + " to default game-language locale caused by QuickShop doesn't support this locale"); - if (MsgUtil.processGameLanguageCode(plugin.getConfiguration().getOrDefault("game-language", "default")).equals(locale)) { + String languageCode = MsgUtil.getDefaultGameLanguageCode(); + if (languageCode.equals(locale)) { List str = fallbackLocal(); if (str.isEmpty()) { return Collections.singletonList("Fallback Missing Language Key: " + path + ", report to QuickShop!"); } return postProcess(str); } else { - return forLocale(MsgUtil.processGameLanguageCode(plugin.getConfiguration().getOrDefault("game-language", "default"))); + return forLocale(languageCode); } } else { List str = index.getStringList(path); @@ -434,7 +452,7 @@ public List forLocale() { if (sender instanceof Player) { return forLocale(((Player) sender).getLocale()); } else { - return forLocale(MsgUtil.processGameLanguageCode(plugin.getConfiguration().getOrDefault("game-language", "default"))); + return forLocale(MsgUtil.getDefaultGameLanguageCode()); } } @@ -455,14 +473,13 @@ public void send() { public static class Text implements org.maxgamer.quickshop.api.localization.text.Text { private final SimpleTextManager manager; private final String path; - private final QuickShop plugin; private final Map mapping; private final CommandSender sender; private final Object[] args; + @Nullable private final JsonConfiguration bundled; - private Text(SimpleTextManager manager, CommandSender sender, Map mapping, JsonConfiguration bundled, String path, Object... args) { - this.plugin = manager.plugin; + private Text(SimpleTextManager manager, CommandSender sender, Map mapping, @Nullable JsonConfiguration bundled, String path, Object... args) { this.manager = manager; this.sender = sender; this.mapping = mapping; @@ -471,8 +488,7 @@ private Text(SimpleTextManager manager, CommandSender sender, Map mapping, JsonConfiguration bundled, String path, Object... args) { - this.plugin = manager.plugin; + private Text(SimpleTextManager manager, UUID sender, Map mapping, @Nullable JsonConfiguration bundled, String path, Object... args) { this.manager = manager; if (sender != null) { this.sender = Bukkit.getPlayer(sender); @@ -492,7 +508,7 @@ private Text(SimpleTextManager manager, UUID sender, Map cachedGameLanguageCode = null; + public static String getDefaultGameLanguageCode() { + return getGameLanguageCode(plugin.getConfig().getString("game-language", "default")); + } + @Unstable - public static String processGameLanguageCode(String languageCode) { + public static String getGameLanguageCode(String languageCode) { if (cachedGameLanguageCode != null && cachedGameLanguageCode.getKey().equals(languageCode)) { return cachedGameLanguageCode.getValue(); - } String copyCode = languageCode; if ("default".equalsIgnoreCase(languageCode)) { @@ -212,7 +215,7 @@ public static void loadGameLanguage(@NotNull String languageCode) { } public static String getTranslateText(ItemStack stack) { - if (plugin.getConfiguration().getBoolean("force-use-item-original-name") || !stack.hasItemMeta() || !stack.getItemMeta().hasDisplayName()) { + if (plugin.getConfig().getBoolean("force-use-item-original-name") || !stack.hasItemMeta() || !stack.getItemMeta().hasDisplayName()) { return convertItemStackToTranslateText(stack.getType()); } else { return Util.getItemStackName(stack); diff --git a/crowdin/lang/af-ZA/messages.json b/src/main/resources/crowdin/af-ZA/messages.json similarity index 100% rename from crowdin/lang/af-ZA/messages.json rename to src/main/resources/crowdin/af-ZA/messages.json diff --git a/crowdin/lang/ar-SA/messages.json b/src/main/resources/crowdin/ar-SA/messages.json similarity index 100% rename from crowdin/lang/ar-SA/messages.json rename to src/main/resources/crowdin/ar-SA/messages.json diff --git a/crowdin/lang/ca-ES/messages.json b/src/main/resources/crowdin/ca-ES/messages.json similarity index 100% rename from crowdin/lang/ca-ES/messages.json rename to src/main/resources/crowdin/ca-ES/messages.json diff --git a/crowdin/lang/cs-CZ/messages.json b/src/main/resources/crowdin/cs-CZ/messages.json similarity index 100% rename from crowdin/lang/cs-CZ/messages.json rename to src/main/resources/crowdin/cs-CZ/messages.json diff --git a/crowdin/lang/da-DK/messages.json b/src/main/resources/crowdin/da-DK/messages.json similarity index 100% rename from crowdin/lang/da-DK/messages.json rename to src/main/resources/crowdin/da-DK/messages.json diff --git a/crowdin/lang/de-DE/messages.json b/src/main/resources/crowdin/de-DE/messages.json similarity index 100% rename from crowdin/lang/de-DE/messages.json rename to src/main/resources/crowdin/de-DE/messages.json diff --git a/crowdin/lang/el-GR/messages.json b/src/main/resources/crowdin/el-GR/messages.json similarity index 100% rename from crowdin/lang/el-GR/messages.json rename to src/main/resources/crowdin/el-GR/messages.json diff --git a/crowdin/lang/en-US/messages.json b/src/main/resources/crowdin/en-US/messages.json similarity index 100% rename from crowdin/lang/en-US/messages.json rename to src/main/resources/crowdin/en-US/messages.json diff --git a/crowdin/lang/es-ES/messages.json b/src/main/resources/crowdin/es-ES/messages.json similarity index 100% rename from crowdin/lang/es-ES/messages.json rename to src/main/resources/crowdin/es-ES/messages.json diff --git a/crowdin/lang/fi-FI/messages.json b/src/main/resources/crowdin/fi-FI/messages.json similarity index 100% rename from crowdin/lang/fi-FI/messages.json rename to src/main/resources/crowdin/fi-FI/messages.json diff --git a/crowdin/lang/fr-FR/messages.json b/src/main/resources/crowdin/fr-FR/messages.json similarity index 100% rename from crowdin/lang/fr-FR/messages.json rename to src/main/resources/crowdin/fr-FR/messages.json diff --git a/crowdin/lang/he-IL/messages.json b/src/main/resources/crowdin/he-IL/messages.json similarity index 100% rename from crowdin/lang/he-IL/messages.json rename to src/main/resources/crowdin/he-IL/messages.json diff --git a/crowdin/lang/hu-HU/messages.json b/src/main/resources/crowdin/hu-HU/messages.json similarity index 100% rename from crowdin/lang/hu-HU/messages.json rename to src/main/resources/crowdin/hu-HU/messages.json diff --git a/crowdin/lang/it-IT/messages.json b/src/main/resources/crowdin/it-IT/messages.json similarity index 100% rename from crowdin/lang/it-IT/messages.json rename to src/main/resources/crowdin/it-IT/messages.json diff --git a/crowdin/lang/ja-JP/messages.json b/src/main/resources/crowdin/ja-JP/messages.json similarity index 100% rename from crowdin/lang/ja-JP/messages.json rename to src/main/resources/crowdin/ja-JP/messages.json diff --git a/crowdin/lang/ko-KR/messages.json b/src/main/resources/crowdin/ko-KR/messages.json similarity index 100% rename from crowdin/lang/ko-KR/messages.json rename to src/main/resources/crowdin/ko-KR/messages.json diff --git a/crowdin/lang/nl-NL/messages.json b/src/main/resources/crowdin/nl-NL/messages.json similarity index 100% rename from crowdin/lang/nl-NL/messages.json rename to src/main/resources/crowdin/nl-NL/messages.json diff --git a/crowdin/lang/no-NO/messages.json b/src/main/resources/crowdin/no-NO/messages.json similarity index 100% rename from crowdin/lang/no-NO/messages.json rename to src/main/resources/crowdin/no-NO/messages.json diff --git a/crowdin/lang/pl-PL/messages.json b/src/main/resources/crowdin/pl-PL/messages.json similarity index 100% rename from crowdin/lang/pl-PL/messages.json rename to src/main/resources/crowdin/pl-PL/messages.json diff --git a/crowdin/lang/pt-BR/messages.json b/src/main/resources/crowdin/pt-BR/messages.json similarity index 100% rename from crowdin/lang/pt-BR/messages.json rename to src/main/resources/crowdin/pt-BR/messages.json diff --git a/crowdin/lang/pt-PT/messages.json b/src/main/resources/crowdin/pt-PT/messages.json similarity index 100% rename from crowdin/lang/pt-PT/messages.json rename to src/main/resources/crowdin/pt-PT/messages.json diff --git a/crowdin/lang/ro-RO/messages.json b/src/main/resources/crowdin/ro-RO/messages.json similarity index 100% rename from crowdin/lang/ro-RO/messages.json rename to src/main/resources/crowdin/ro-RO/messages.json diff --git a/crowdin/lang/ru-RU/messages.json b/src/main/resources/crowdin/ru-RU/messages.json similarity index 100% rename from crowdin/lang/ru-RU/messages.json rename to src/main/resources/crowdin/ru-RU/messages.json diff --git a/crowdin/lang/sr-SP/messages.json b/src/main/resources/crowdin/sr-SP/messages.json similarity index 100% rename from crowdin/lang/sr-SP/messages.json rename to src/main/resources/crowdin/sr-SP/messages.json diff --git a/crowdin/lang/sv-SE/messages.json b/src/main/resources/crowdin/sv-SE/messages.json similarity index 100% rename from crowdin/lang/sv-SE/messages.json rename to src/main/resources/crowdin/sv-SE/messages.json diff --git a/crowdin/lang/tr-TR/messages.json b/src/main/resources/crowdin/tr-TR/messages.json similarity index 100% rename from crowdin/lang/tr-TR/messages.json rename to src/main/resources/crowdin/tr-TR/messages.json diff --git a/crowdin/lang/uk-UA/messages.json b/src/main/resources/crowdin/uk-UA/messages.json similarity index 100% rename from crowdin/lang/uk-UA/messages.json rename to src/main/resources/crowdin/uk-UA/messages.json diff --git a/crowdin/lang/vi-VN/messages.json b/src/main/resources/crowdin/vi-VN/messages.json similarity index 100% rename from crowdin/lang/vi-VN/messages.json rename to src/main/resources/crowdin/vi-VN/messages.json diff --git a/crowdin/lang/zh-CN/messages.json b/src/main/resources/crowdin/zh-CN/messages.json similarity index 100% rename from crowdin/lang/zh-CN/messages.json rename to src/main/resources/crowdin/zh-CN/messages.json diff --git a/crowdin/lang/zh-HK/messages.json b/src/main/resources/crowdin/zh-HK/messages.json similarity index 100% rename from crowdin/lang/zh-HK/messages.json rename to src/main/resources/crowdin/zh-HK/messages.json diff --git a/crowdin/lang/zh-TW/messages.json b/src/main/resources/crowdin/zh-TW/messages.json similarity index 100% rename from crowdin/lang/zh-TW/messages.json rename to src/main/resources/crowdin/zh-TW/messages.json From 07ca3a13fc4eb27bdc8359d38b666d2d3ceed977 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 21:04:28 +0800 Subject: [PATCH 049/725] Fix color issue with certain input --- .../quickshop/localization/text/LanguageFilesManager.java | 5 +++++ .../quickshop/localization/text/SimpleTextManager.java | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java index a0b39dd727..47724d1073 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java @@ -53,6 +53,9 @@ public void reset() { * @param bundled The values from bundled file */ public void deploy(@NotNull String distributionPath, @NotNull String locale, @NotNull JsonConfiguration distribution, @NotNull JsonConfiguration bundled) { + //Parsed color + Util.parseColours(bundled); + Util.parseColours(distribution); this.bundledFile2ContentMapping.put(distributionPath, bundled); this.locale2ContentMapping.computeIfAbsent(distributionPath, e -> new HashMap<>()); this.locale2ContentMapping.get(distributionPath).put(locale, distribution); @@ -65,6 +68,8 @@ public void deploy(@NotNull String distributionPath, @NotNull String locale, @No * @param bundled The values from bundled file */ public void deployBundled(@NotNull String distributionPath, @NotNull JsonConfiguration bundled) { + //Parsed color + Util.parseColours(bundled); this.bundledFile2ContentMapping.put(distributionPath, bundled); } diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 42cf7f2d48..fd030a6df8 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -35,7 +35,6 @@ import org.maxgamer.quickshop.api.localization.text.postprocessor.PostProcessor; import org.maxgamer.quickshop.localization.text.distributions.Distribution; import org.maxgamer.quickshop.localization.text.distributions.crowdin.CrowdinOTA; -import org.maxgamer.quickshop.localization.text.postprocessing.impl.ColorProcessor; import org.maxgamer.quickshop.localization.text.postprocessing.impl.FillerProcessor; import org.maxgamer.quickshop.localization.text.postprocessing.impl.PlaceHolderApiProcessor; import org.maxgamer.quickshop.util.MsgUtil; @@ -181,7 +180,8 @@ public void load() { // Register post processor postProcessors.add(new FillerProcessor()); postProcessors.add(new PlaceHolderApiProcessor()); - postProcessors.add(new ColorProcessor()); + //We done this when deploys language + //postProcessors.add(new ColorProcessor()); } /** From a87fda2889ee012fbb32a6fb072b3652054cf98e Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 21:04:52 +0800 Subject: [PATCH 050/725] Fix testing and bump spigot-api to 1.18.1-R0.1-SNAPSHOT --- pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index ceda44a4d2..0cf5c12936 100644 --- a/pom.xml +++ b/pom.xml @@ -621,14 +621,8 @@ org.spigotmc spigot-api - 1.18-rc3-R0.1-SNAPSHOT + 1.18.1-R0.1-SNAPSHOT provided - - - commons-lang - commons-lang - - org.apache.commons From 77df889b3d743558a4a7dd2942b6d00072f095e3 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 11 Dec 2021 21:20:17 +0800 Subject: [PATCH 051/725] Fix test --- .../java/org/maxgamer/quickshop/util/InteractUtilTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java b/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java index 8e39bd8d13..ec7584adec 100644 --- a/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java +++ b/src/test/java/org/maxgamer/quickshop/util/InteractUtilTest.java @@ -31,7 +31,7 @@ private ConfigurationSection genConfig(int mode, boolean allowSneaking) { ConfigurationSection configurationSection = new MemoryConfiguration(); configurationSection.set("shop.interact.interact-mode", mode); configurationSection.set("shop.interact.sneak-to-create", allowSneaking); - return configurationSection; + return configurationSection.getConfigurationSection("shop.interact"); } @Test @@ -43,14 +43,14 @@ public void testInteractBoolean() { InteractUtil.init(genConfig(0, false)); Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); -//BOTH + //BOTH InteractUtil.init(genConfig(1, false)); Assert.assertFalse(InteractUtil.check(InteractUtil.Action.CREATE, true)); Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); InteractUtil.init(genConfig(1, true)); Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); -//REVERSED + //REVERSED InteractUtil.init(genConfig(2, false)); Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, true)); Assert.assertTrue(InteractUtil.check(InteractUtil.Action.CREATE, false)); From 9b8a32e436a172a4873f58c1d2f4256f9b0d2ba8 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 02:56:15 +0800 Subject: [PATCH 052/725] Fix comment missing issue, implement itself comment updater --- .../org/maxgamer/quickshop/QuickShop.java | 11 +- .../util/config/ConfigCommentUpdater.java | 209 ++++++++++++++++++ 2 files changed, 216 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 9036621957..60470bebb6 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -81,6 +81,7 @@ import org.maxgamer.quickshop.util.Timer; import org.maxgamer.quickshop.util.*; import org.maxgamer.quickshop.util.compatibility.SimpleCompatibilityManager; +import org.maxgamer.quickshop.util.config.ConfigCommentUpdater; import org.maxgamer.quickshop.util.config.ConfigProvider; import org.maxgamer.quickshop.util.config.ConfigurationFixer; import org.maxgamer.quickshop.util.envcheck.*; @@ -90,10 +91,7 @@ import org.maxgamer.quickshop.util.reporter.error.RollbarErrorReporter; import org.maxgamer.quickshop.watcher.*; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -2004,6 +2002,11 @@ private void updateConfig(int selectedVersion) throws IOException { saveConfiguration(); reloadConfiguration(); + //Add comment for config.yml + try (InputStream inputStream = Objects.requireNonNull(getResource("config.yml"))) { + new ConfigCommentUpdater(this, inputStream, new File(getDataFolder(), "config.yml")).updateComment(); + } + //Delete old example configuration files Files.deleteIfExists(new File(getDataFolder(), "example.config.yml").toPath()); Files.deleteIfExists(new File(getDataFolder(), "example-configuration.txt").toPath()); diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java new file mode 100644 index 0000000000..f09224d064 --- /dev/null +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java @@ -0,0 +1,209 @@ +/* + * This file is a part of project QuickShop, the name is ConfigCommentUpdater.java + * Copyright (C) PotatoCraft Studio and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.maxgamer.quickshop.util.config; + +import org.maxgamer.quickshop.QuickShop; +import org.maxgamer.quickshop.util.holder.QuickShopInstanceHolder; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.*; +import java.util.logging.Level; + +/** + * A node based yaml comment updater + * + * @author sandtechnology + */ +public class ConfigCommentUpdater extends QuickShopInstanceHolder { + private static final String HEADER = "HEAD-" + UUID.randomUUID(); + private static final String FOOTER = "END-" + UUID.randomUUID(); + private final InputStream builtInConfig; + private final File externalConfig; + + public ConfigCommentUpdater(QuickShop plugin, InputStream builtInConfig, File externalConfig) { + super(plugin); + this.builtInConfig = builtInConfig; + this.externalConfig = externalConfig; + } + + public void updateComment() { + boolean hasBackup = false; + boolean hasWrite = false; + Path backupFile = externalConfig.toPath().resolve(UUID.randomUUID() + "-bak.yml"); + try { + Files.copy(externalConfig.toPath(), backupFile, StandardCopyOption.REPLACE_EXISTING); + hasBackup = true; + BufferedReader reader = new BufferedReader(new InputStreamReader(builtInConfig, StandardCharsets.UTF_8)); + List builtInContent = new ArrayList<>(); + while (true) { + String result = reader.readLine(); + if (result == null) { + break; + } + builtInContent.add(result); + } + + PathMarker pathMarker = new PathMarker(); + Map> key2NonKeyContentMap = new LinkedHashMap<>(); + Set pendingComment = new LinkedHashSet<>(); + for (String s : builtInContent) { + String trimmedStr = s.trim(); + if (trimmedStr.isEmpty()) { + pendingComment.add(""); + continue; + } + if (trimmedStr.startsWith("#")) { + pendingComment.add(s); + } else + //First node is header, so just use current + if (pathMarker.parseRawInput(s)) { + String pathNow = pathMarker.getPath(); + key2NonKeyContentMap.merge(pathNow, new LinkedHashSet<>(pendingComment), (oldList, newList) -> { + oldList.addAll(newList); + return oldList; + }); + pendingComment.clear(); + } + } + if (!pendingComment.isEmpty()) { + key2NonKeyContentMap.put(FOOTER, pendingComment); + } + + List externalContent = Files.readAllLines(externalConfig.toPath()); + List output = new ArrayList<>(externalContent.size()); + int offset = 0; + for (int i = 0; i < externalContent.size(); i++) { + String s = externalContent.get(i); + if (s.isEmpty() || s.trim().startsWith("#")) { + pendingComment.add(s); + offset--; + continue; + } + output.add(s); + if (pathMarker.parseRawInput(s)) { + String pathNow = pathMarker.getPath(); + Set comments = key2NonKeyContentMap.getOrDefault(pathNow, Collections.emptySet()); + pendingComment.addAll(comments); + for (String comment : pendingComment) { + output.add(i + offset, comment); + offset++; + } + pendingComment.clear(); + } + } + + output.addAll(key2NonKeyContentMap.getOrDefault(FOOTER, Collections.emptySet())); + hasWrite = true; + Files.write(externalConfig.toPath(), output, StandardCharsets.UTF_8); + } catch (Throwable e) { + if (hasBackup && hasWrite) { + plugin.getLogger().log(Level.WARNING, "Failed to update comment for config.yml, rollback...", e); + try { + Files.copy(backupFile, externalConfig.toPath(), StandardCopyOption.REPLACE_EXISTING); + } catch (Throwable ex) { + plugin.getLogger().log(Level.WARNING, "Failed to rollback config.yml! Please rollback it manually by renaming " + backupFile.getFileName() + " to config.yml!", ex); + } + } else { + plugin.getLogger().log(Level.WARNING, "Failed to update comment for config.yml, no changes taken.", e); + } + } + } + + private static class PathMarker { + private final List path = new ArrayList<>(Collections.singletonList(HEADER)); + private int pathDepth = 0; + + public void addNode(String s) { + path.add(s); + } + + private int countSpace(String s) { + int i = 0; + for (char c : s.toCharArray()) { + if (c == ' ') { + i++; + } else { + break; + } + } + return i; + } + + public boolean parseRawInput(String str) { + String trimmedStr = str.trim(); + if (trimmedStr.startsWith("#") || !(trimmedStr.contains(": ") || trimmedStr.endsWith(":"))) { + return false; + } + int pathDepthNow = countSpace(str); + String nodeStr = trimmedStr.split(":", 2)[0]; + if (!nodeStr.isEmpty()) { + if (pathDepthNow > pathDepth) { + addNode(nodeStr); + } else if (pathDepthNow < pathDepth) { + for (int j = 0; j < pathDepth - pathDepthNow; j++) { + removeNode(); + } + addNode(nodeStr); + } else { + replaceNode(nodeStr); + } + pathDepth = pathDepthNow; + return true; + } else { + return false; + } + } + + public void replaceNode(String s) { + if (!path.isEmpty()) { + path.set(path.size() - 1, s); + } else { + path.add(s); + } + } + + public void reset() { + path.clear(); + } + + public void removeNode() { + if (!path.isEmpty()) { + path.remove(path.size() - 1); + } + } + + + public String getPath() { + StringJoiner stringJoiner = new StringJoiner("."); + for (String s : path) { + stringJoiner.add(s); + } + return stringJoiner.toString(); + } + } +} + From a0d415ecf872c568ef0c50446ea02f76cbcc2424 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 09:28:57 +0800 Subject: [PATCH 053/725] Delete backup when update successful --- .../org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java index f09224d064..33badedf4c 100644 --- a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java @@ -119,6 +119,7 @@ public void updateComment() { output.addAll(key2NonKeyContentMap.getOrDefault(FOOTER, Collections.emptySet())); hasWrite = true; Files.write(externalConfig.toPath(), output, StandardCharsets.UTF_8); + backupFile.toFile().delete(); } catch (Throwable e) { if (hasBackup && hasWrite) { plugin.getLogger().log(Level.WARNING, "Failed to update comment for config.yml, rollback...", e); From 133a97b7432a00a9bb6c3042533e2c461562e305 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 09:57:04 +0800 Subject: [PATCH 054/725] Handle local files loading --- .../distributions/crowdin/CrowdinOTA.java | 33 ++++++++----------- .../distributions/crowdin/bean/Manifest.java | 1 + .../org/maxgamer/quickshop/util/HttpUtil.java | 26 +++++++++++++-- 3 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java b/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java index 70562c82ad..04a4554a04 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java @@ -29,7 +29,6 @@ import org.apache.commons.codec.digest.DigestUtils; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.localization.text.distributions.Distribution; import org.maxgamer.quickshop.localization.text.distributions.crowdin.bean.Manifest; @@ -62,7 +61,7 @@ public CrowdinOTA(QuickShop plugin) { * @return The distribution manifest */ - @Nullable + @NotNull public Manifest getManifest() { return JsonUtil.regular().fromJson(getManifestJson(), Manifest.class); } @@ -70,12 +69,12 @@ public Manifest getManifest() { /** * Getting the Crowdin distribution manifest json * - * @return The distribution manifest json + * @return The distribution manifest json, return local one when failed */ - @Nullable + @NotNull public String getManifestJson() { String url = CROWDIN_OTA_HOST + "manifest.json"; - return HttpUtil.createGet(url); + return HttpUtil.createGet(url, "{\"files\":[\"\\/master\\/crowdin\\/lang\\/%locale%\\/messages.json\"],\"languages\":[\"af\",\"ar\",\"ca\",\"zh-CN\",\"zh-TW\",\"zh-HK\",\"cs\",\"da\",\"nl\",\"en\",\"fi\",\"fr\",\"de\",\"el\",\"he\",\"hu\",\"it\",\"ja\",\"ko\",\"no\",\"pl\",\"pt-PT\",\"pt-BR\",\"ro\",\"ru\",\"sr\",\"es-ES\",\"sv-SE\",\"tr\",\"uk\",\"vi\"],\"language_mapping\":{\"ro\":{\"locale\":\"ro-RO\"},\"fr\":{\"locale\":\"fr-FR\"},\"es-ES\":{\"locale\":\"es-ES\"},\"af\":{\"locale\":\"af-ZA\"},\"ar\":{\"locale\":\"ar-SA\"},\"ca\":{\"locale\":\"ca-ES\"},\"cs\":{\"locale\":\"cs-CZ\"},\"da\":{\"locale\":\"da-DK\"},\"de\":{\"locale\":\"de-DE\"},\"el\":{\"locale\":\"el-GR\"},\"fi\":{\"locale\":\"fi-FI\"},\"he\":{\"locale\":\"he-IL\"},\"hu\":{\"locale\":\"hu-HU\"},\"it\":{\"locale\":\"it-IT\"},\"ja\":{\"locale\":\"ja-JP\"},\"ko\":{\"locale\":\"ko-KR\"},\"nl\":{\"locale\":\"nl-NL\"},\"no\":{\"locale\":\"no-NO\"},\"pl\":{\"locale\":\"pl-PL\"},\"pt-PT\":{\"locale\":\"pt-PT\"},\"ru\":{\"locale\":\"ru-RU\"},\"sr\":{\"locale\":\"sr-SP\"},\"sv-SE\":{\"locale\":\"sv-SE\"},\"tr\":{\"locale\":\"tr-TR\"},\"uk\":{\"locale\":\"uk-UA\"},\"zh-CN\":{\"locale\":\"zh-CN\"},\"zh-TW\":{\"locale\":\"zh-TW\"},\"en\":{\"locale\":\"en-US\"},\"vi\":{\"locale\":\"vi-VN\"},\"pt-BR\":{\"locale\":\"pt-BR\"},\"zh-HK\":{\"locale\":\"zh-HK\"}},\"custom_languages\":[],\"timestamp\":1639272930,\"local\":true}"); } /** @@ -85,9 +84,6 @@ public String getManifestJson() { * @return The language mapping */ public Map genLanguageMapping() { - if (getManifestJson() == null) { - return new HashMap<>(); - } Map mapping = new HashMap<>(); JsonElement parser = new JsonParser().parse(getManifestJson()); for (Map.Entry set : parser.getAsJsonObject().getAsJsonObject("language_mapping").entrySet()) { @@ -127,9 +123,6 @@ public List getAvailableLanguages() { @NotNull public List getAvailableFiles() { Manifest manifest = getManifest(); - if (manifest == null) { - return Collections.emptyList(); - } return manifest.getFiles(); } @@ -143,12 +136,13 @@ public List getAvailableFiles() { public String getFile(String fileCrowdinPath, String crowdinLocale, boolean forceFlush) throws Exception { Manifest manifest = getManifest(); // Validate - if (manifest == null) { - throw new IllegalStateException("Failed to get project manifest"); - } if (!manifest.getFiles().contains(fileCrowdinPath)) { throw new IllegalArgumentException("The file " + fileCrowdinPath + " not exists on Crowdin"); } + //Local stub + if (manifest.isLocal()) { + return "{}"; + } // if (manifest.getCustom_languages() != null && !manifest.getCustom_languages().contains(crowdinLocale)) { // throw new IllegalArgumentException("The locale " + crowdinLocale + " not exists on Crowdin"); // } @@ -178,10 +172,10 @@ public String getFile(String fileCrowdinPath, String crowdinLocale, boolean forc // Out of the cache String url = CROWDIN_OTA_HOST + "content" + fileCrowdinPath.replace("%locale%", crowdinLocale); plugin.getLogger().info("Updating translation " + crowdinLocale + " from: " + url); - String data = HttpUtil.createGet(url); + String data = HttpUtil.createGet(url, forceFlush); if (data == null) { // Failed to grab data - throw new OTAException(); + throw new OTAException("Failed to grab data"); } // Successfully grab the data from the remote server otaCacheControl.writeObjectCache(postProcessingPath, data.getBytes(StandardCharsets.UTF_8), manifestTimestamp); @@ -232,10 +226,11 @@ public String getFile(String fileCrowdinPath, String crowdinLocale, boolean forc } @EqualsAndHashCode(callSuper = true) - @AllArgsConstructor - @Builder @Data - public static class OTAException extends Exception { + public static class OTAException extends RuntimeException { + public OTAException(String message) { + super(message); + } } @AllArgsConstructor diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/bean/Manifest.java b/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/bean/Manifest.java index df7aac8ced..c80bed00e8 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/bean/Manifest.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/bean/Manifest.java @@ -34,4 +34,5 @@ public class Manifest { private List languages; private List custom_languages; private long timestamp; + private boolean local; } diff --git a/src/main/java/org/maxgamer/quickshop/util/HttpUtil.java b/src/main/java/org/maxgamer/quickshop/util/HttpUtil.java index 2078ae533c..f331d3e0fd 100644 --- a/src/main/java/org/maxgamer/quickshop/util/HttpUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/HttpUtil.java @@ -23,6 +23,7 @@ import lombok.val; import okhttp3.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; @@ -43,10 +44,29 @@ public static Response makeGet(@NotNull String url) throws IOException { return client.newCall(new Request.Builder().get().url(url).build()).execute(); } + @NotNull + public static String createGet(@NotNull String url, String def) { + String result = createGet(url, false); + if (result == null) { + result = def; + } + requestCachePool.put(url, result); + return result; + } + + @Nullable public static String createGet(@NotNull String url) { - String cache = requestCachePool.getIfPresent(url); - if (cache != null) { - return cache; + return createGet(url, false); + } + + @Nullable + public static String createGet(@NotNull String url, boolean flushCache) { + String cache; + if (!flushCache) { + cache = requestCachePool.getIfPresent(url); + if (cache != null) { + return cache; + } } try (Response response = client.newCall(new Request.Builder().get().url(url).build()).execute()) { val body = response.body(); From de4bc9c16488010329b2ff3a48cf729e2e56b984 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 10:07:59 +0800 Subject: [PATCH 055/725] Fix plugin loading stuck on i18n loading --- .../java/org/maxgamer/quickshop/ServiceInjector.java | 4 ++-- .../game/game/MojangGameLanguageImpl.java | 11 +++++++---- .../text/distributions/crowdin/CrowdinOTA.java | 8 ++++---- .../java/org/maxgamer/quickshop/util/MsgUtil.java | 6 +++++- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/ServiceInjector.java b/src/main/java/org/maxgamer/quickshop/ServiceInjector.java index 6ffc069b70..3f47ee70ce 100644 --- a/src/main/java/org/maxgamer/quickshop/ServiceInjector.java +++ b/src/main/java/org/maxgamer/quickshop/ServiceInjector.java @@ -55,11 +55,11 @@ public class ServiceInjector { } } - public static @NotNull GameLanguage getGameLanguage(@NotNull GameLanguage def) { + public static @Nullable GameLanguage getGameLanguage() { @Nullable RegisteredServiceProvider registeredServiceProvider = Bukkit.getServicesManager().getRegistration(GameLanguage.class); if (registeredServiceProvider == null) { - return def; + return null; } else { return registeredServiceProvider.getProvider(); } diff --git a/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java b/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java index 521cc6d3f0..da909c4b3e 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java +++ b/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java @@ -62,15 +62,16 @@ public class MojangGameLanguageImpl extends BukkitGameLanguageImpl implements Ga private final static Lock LOCK = new ReentrantLock(); private static final Condition DOWNLOAD_CONDITION = LOCK.newCondition(); private final QuickShop plugin; + private final String languageCode; @Nullable - private final JsonObject lang; + private volatile JsonObject lang = null; private MojangApiMirror mirror; @SneakyThrows public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languageCode) { super(plugin); this.plugin = plugin; - languageCode = MsgUtil.getGameLanguageCode(languageCode); + this.languageCode = MsgUtil.getGameLanguageCode(languageCode); switch (plugin.getConfig().getInt("mojangapi-mirror", 0)) { case 0: mirror = new MojangApiOfficialMirror(); @@ -95,8 +96,9 @@ public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languag plugin.getLogger().warning("You're selected unofficial game assets server, use at your own risk."); break; } + } - + public void load() { LOCK.lock(); try { final GameLanguageLoadThread loadThread = new GameLanguageLoadThread(plugin, languageCode, mirror); @@ -107,10 +109,11 @@ public MojangGameLanguageImpl(@NotNull QuickShop plugin, @NotNull String languag plugin.getLogger().info("No longer waiting file downloading because it now timed out, now downloading in background, please reset itemi18n.yml, potioni18n.yml and enchi18n.yml after download completed."); } this.lang = loadThread.getLang(); // Get the Lang whatever thread running or died. + } catch (InterruptedException exception) { + plugin.getLogger().warning("Failed to wait game language thread loading"); } finally { LOCK.unlock(); } - } @Override diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java b/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java index 04a4554a04..ccf863359d 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/distributions/crowdin/CrowdinOTA.java @@ -41,7 +41,10 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.locks.ReentrantLock; public class CrowdinOTA implements Distribution { @@ -108,9 +111,6 @@ public Map genLanguageMapping() { @NotNull public List getAvailableLanguages() { Manifest manifest = getManifest(); - if (manifest == null) { - return Collections.emptyList(); - } List languages = new ArrayList<>(); Map mapping = genLanguageMapping(); for (String language : manifest.getLanguages()) { diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index ae202a3383..b03fe12fa2 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -211,7 +211,11 @@ public static String getGameLanguageCode(String languageCode) { @Unstable @Deprecated public static void loadGameLanguage(@NotNull String languageCode) { - gameLanguage = ServiceInjector.getGameLanguage(new MojangGameLanguageImpl(plugin, languageCode)); + gameLanguage = ServiceInjector.getGameLanguage(); + if (gameLanguage == null) { + gameLanguage = new MojangGameLanguageImpl(plugin, languageCode); + ((MojangGameLanguageImpl) gameLanguage).load(); + } } public static String getTranslateText(ItemStack stack) { From 0756cbe75a3523156f376f452160c8d00fd78a6c Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 10:14:44 +0800 Subject: [PATCH 056/725] Printing errors when cannot create column --- .../org/maxgamer/quickshop/database/SimpleDatabaseHelper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java b/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java index 0ced6acd04..647d77e7d5 100644 --- a/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java +++ b/src/main/java/org/maxgamer/quickshop/database/SimpleDatabaseHelper.java @@ -187,11 +187,13 @@ public void edit(PreparedStatement ps) { @Override public void onFailed(SQLException e) { - Util.debugLog("Cannot create column " + columnName + " casued by:" + e.getMessage()); + QuickShop.getInstance().getLogger().log(Level.WARNING, "Cannot create column " + columnName, e); + Util.debugLog("Cannot create column " + columnName + ", caused by:" + e.getMessage()); } })); return true; } catch (SQLException sqlException) { + QuickShop.getInstance().getLogger().log(Level.WARNING, "Cannot create column " + columnName, sqlException); Util.debugLog("Cannot create column " + columnName + " casued by:" + sqlException.getMessage()); return false; } From 15e11ef0365f399aeb0d962e0e50ea61bb4f7e70 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 10:34:46 +0800 Subject: [PATCH 057/725] Fix misleading message and apply tradeAllWord to trade message --- .../command/subcommand/SubCommand_Create.java | 2 +- .../maxgamer/quickshop/listener/PlayerListener.java | 9 +++++---- src/main/resources/lang/messages.json | 11 ++++++----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Create.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Create.java index 8aeaafa37e..3525603c73 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Create.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Create.java @@ -152,7 +152,7 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not plugin.getShopManager().handleChat(sender, price); return; } - plugin.text().of(sender, "not-looking-at-shop").send(); + plugin.text().of(sender, "not-looking-at-valid-shop-block").send(); } @NotNull diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index f1b4e68c7a..509f324a6f 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -200,6 +200,7 @@ private void postTrade(PlayerInteractEvent e) { final AbstractEconomy eco = plugin.getEconomy(); final double price = shop.getPrice(); final Inventory playerInventory = p.getInventory(); + final String tradeAllWord = plugin.getConfig().getString("shop.word-for-trade-all-items", "all"); if (shop.isSelling()) { if (shop.getRemainingStock() == 0) { plugin.text().of(p, "purchase-out-of-stock", shop.ownerName()).send(); @@ -208,9 +209,9 @@ private void postTrade(PlayerInteractEvent e) { final double traderBalance = eco.getBalance(p.getUniqueId(), shop.getLocation().getWorld(), shop.getCurrency()); int itemAmount = getPlayerCanBuy(shop, traderBalance, price, playerInventory); if (shop.isStackingShop()) { - plugin.text().of(p, "how-many-buy-stack", Integer.toString(shop.getItem().getAmount()), Integer.toString(itemAmount)).send(); + plugin.text().of(p, "how-many-buy-stack", Integer.toString(shop.getItem().getAmount()), Integer.toString(itemAmount), tradeAllWord).send(); } else { - plugin.text().of(p, "how-many-buy", Integer.toString(itemAmount)).send(); + plugin.text().of(p, "how-many-buy", Integer.toString(itemAmount), tradeAllWord).send(); } } else { if (shop.getRemainingSpace() == 0) { @@ -220,9 +221,9 @@ private void postTrade(PlayerInteractEvent e) { final double ownerBalance = eco.getBalance(shop.getOwner(), shop.getLocation().getWorld(), shop.getCurrency()); int items = getPlayerCanSell(shop, ownerBalance, price, playerInventory); if (shop.isStackingShop()) { - plugin.text().of(p, "how-many-sell-stack", Integer.toString(shop.getItem().getAmount()), Integer.toString(items)).send(); + plugin.text().of(p, "how-many-sell-stack", Integer.toString(shop.getItem().getAmount()), Integer.toString(items), tradeAllWord).send(); } else { - plugin.text().of(p, "how-many-sell", Integer.toString(items)).send(); + plugin.text().of(p, "how-many-sell", Integer.toString(items), tradeAllWord).send(); } } // Add the new action diff --git a/src/main/resources/lang/messages.json b/src/main/resources/lang/messages.json index e8f4a107ab..355f5c6138 100644 --- a/src/main/resources/lang/messages.json +++ b/src/main/resources/lang/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From ca66f41f93b28b070a6ada99e4f62956ce4f1abd Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 11:41:19 +0800 Subject: [PATCH 058/725] Fix NoSuchFileException --- .../maxgamer/quickshop/util/config/ConfigCommentUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java index 33badedf4c..671a701353 100644 --- a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java @@ -53,7 +53,7 @@ public ConfigCommentUpdater(QuickShop plugin, InputStream builtInConfig, File ex public void updateComment() { boolean hasBackup = false; boolean hasWrite = false; - Path backupFile = externalConfig.toPath().resolve(UUID.randomUUID() + "-bak.yml"); + Path backupFile = externalConfig.toPath().getParent().resolve("config-" + UUID.randomUUID() + "-bak.yml"); try { Files.copy(externalConfig.toPath(), backupFile, StandardCopyOption.REPLACE_EXISTING); hasBackup = true; From e574c33d648ecbe94538f7f40bde9e03913f8bfd Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 12:02:56 +0800 Subject: [PATCH 059/725] Loading bundled file for not internet connection --- .../quickshop/localization/text/SimpleTextManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index fd030a6df8..c4efedd2cc 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -160,7 +160,9 @@ public void load() { Util.debugLog("Loading translation for locale: " + crowdinCode + " (" + minecraftCode + ")"); // Deploy bundled to mapper languageFilesManager.deployBundled(crowdinFile, loadBundled(crowdinFile)); - JsonConfiguration configuration = getDistributionConfiguration(crowdinFile, crowdinCode); + // Loading bundled file (for no internet connection or failed loading) + JsonConfiguration configuration = loadBundled(crowdinFile.replace("%locale%", crowdinCode)); + applyOverrideConfiguration(configuration, getDistributionConfiguration(crowdinFile, crowdinCode)); // Loading override text (allow user modification the translation) JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); applyOverrideConfiguration(configuration, override); @@ -221,7 +223,7 @@ private void applyOverrideConfiguration(@NotNull JsonConfiguration distributionC if (content instanceof ConfigurationSection) { continue; } - Util.debugLog("Override key " + key + " with content: " + content); + //Util.debugLog("Override key " + key + " with content: " + content); distributionConfiguration.set(key, content); } } From d531acc64ef9864ba0b270ffae0f315036d9daaa Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 12:48:20 +0800 Subject: [PATCH 060/725] Language System improvement Let cachedGameLanguageCode only caching default one Fix stuck loading issue for textManager Add related languages code matching, Fix #1 --- .../org/maxgamer/quickshop/QuickShop.java | 1 + .../api/localization/text/TextManager.java | 7 + .../localization/text/SimpleTextManager.java | 172 ++++++++++++------ .../org/maxgamer/quickshop/util/MsgUtil.java | 15 +- 4 files changed, 129 insertions(+), 66 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index 60470bebb6..edf1090cf3 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -612,6 +612,7 @@ public final void onLoad() { this.bootError = null; getLogger().info("Loading messages translation over-the-air (this may need take a while)."); this.textManager = new SimpleTextManager(this); + textManager.load(); getLogger().info("Loading up integration modules."); this.integrationHelper = new SimpleIntegrationManager(this); this.integrationHelper.callIntegrationsLoad(IntegrateStage.onLoadBegin); diff --git a/src/main/java/org/maxgamer/quickshop/api/localization/text/TextManager.java b/src/main/java/org/maxgamer/quickshop/api/localization/text/TextManager.java index bc583c3870..99ab24ed8a 100644 --- a/src/main/java/org/maxgamer/quickshop/api/localization/text/TextManager.java +++ b/src/main/java/org/maxgamer/quickshop/api/localization/text/TextManager.java @@ -82,6 +82,13 @@ public interface TextManager { @NotNull TextList ofList(@NotNull String path, Object... args); + /** + * Return the set of available Languages + * + * @return the set of available Languages + */ + List getAvailableLanguages(); + /** * Getting the translation with path with player's locale (if available) * diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index c4efedd2cc..2b47d5b5f5 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -20,6 +20,8 @@ package org.maxgamer.quickshop.localization.text; import com.dumptruckman.bukkit.configuration.json.JsonConfiguration; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -50,6 +52,8 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; @@ -68,7 +72,6 @@ public SimpleTextManager(QuickShop plugin) { plugin.getReloadManager().register(this); plugin.getLogger().info("Translation over-the-air platform selected: Crowdin"); this.distribution = new CrowdinOTA(plugin); - load(); } /** @@ -90,13 +93,7 @@ private File getOverrideFilesFolder(@NotNull String path) { return moduleFolder; } - /** - * Reset everything - */ - private void reset() { - languageFilesManager.reset(); - postProcessors.clear(); - } + private final List availableLanguages = new CopyOnWriteArrayList<>(); /** * Loading bundled files from Jar file @@ -132,58 +129,27 @@ private JsonConfiguration loadBundled(String file) { return bundledLang; } + private final Cache languagesCache = + CacheBuilder.newBuilder().expireAfterAccess(30, TimeUnit.MINUTES).build(); + /** - * Loading Crowdin OTA module and i18n system + * Reset everything */ - public void load() { - plugin.getLogger().info("Checking for translation updates, this may need a while..."); - this.reset(); - List enabledLanguagesRegex = plugin.getConfig().getStringList("enabled-languages"); - //Make sure is a lowercase regex, prevent case-sensitive and underscore issue - for (int i = 0; i < enabledLanguagesRegex.size(); i++) { - enabledLanguagesRegex.set(i, enabledLanguagesRegex.get(i).toLowerCase(Locale.ROOT).replace("-", "_")); - } - //====Multi File and Multi-Language loader start==== - //Init offline default file - languageFilesManager.deployBundled(CROWDIN_LANGUAGE_FILE_PATH, loadBundled(CROWDIN_LANGUAGE_FILE_PATH)); - //Get language code first - distribution.getAvailableLanguages().parallelStream().forEach(crowdinCode -> - //Then load all the files in this language code - distribution.getAvailableFiles().forEach(crowdinFile -> { - try { - // Minecraft client use lowercase - String minecraftCode = crowdinCode.toLowerCase(Locale.ROOT).replace("-", "_"); - if (!localeEnabled(minecraftCode, enabledLanguagesRegex)) { - Util.debugLog("Locale: " + minecraftCode + " not enabled in configuration."); - return; - } - Util.debugLog("Loading translation for locale: " + crowdinCode + " (" + minecraftCode + ")"); - // Deploy bundled to mapper - languageFilesManager.deployBundled(crowdinFile, loadBundled(crowdinFile)); - // Loading bundled file (for no internet connection or failed loading) - JsonConfiguration configuration = loadBundled(crowdinFile.replace("%locale%", crowdinCode)); - applyOverrideConfiguration(configuration, getDistributionConfiguration(crowdinFile, crowdinCode)); - // Loading override text (allow user modification the translation) - JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); - applyOverrideConfiguration(configuration, override); - // Deploy distribution to mapper - languageFilesManager.deploy(crowdinFile, minecraftCode, configuration, loadBundled(crowdinFile)); - Util.debugLog("Locale " + crowdinFile.replace("%locale%", crowdinCode) + " has been successfully loaded"); - } // Key founds in available locales but not in custom mapping on crowdin platform - catch (IOException e) { - // Network error - plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + " please check your network connection.", e); - } catch (Exception e) { - // Translation syntax error or other exceptions - plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + ".", e); - } - })); + private void reset() { + languagesCache.cleanUp(); + languageFilesManager.reset(); + postProcessors.clear(); + availableLanguages.clear(); + } - // Register post processor - postProcessors.add(new FillerProcessor()); - postProcessors.add(new PlaceHolderApiProcessor()); - //We done this when deploys language - //postProcessors.add(new ColorProcessor()); + /** + * Return the set of available Languages + * + * @return the set of available Languages + */ + @Override + public List getAvailableLanguages() { + return Collections.unmodifiableList(availableLanguages); } /** @@ -249,6 +215,95 @@ private JsonConfiguration getDistributionConfiguration(@NotNull String distribut return configuration; } + /** + * Loading Crowdin OTA module and i18n system + */ + public void load() { + plugin.getLogger().info("Checking for translation updates, this may need a while..."); + this.reset(); + List enabledLanguagesRegex = plugin.getConfig().getStringList("enabled-languages"); + //Make sure is a lowercase regex, prevent case-sensitive and underscore issue + for (int i = 0; i < enabledLanguagesRegex.size(); i++) { + enabledLanguagesRegex.set(i, enabledLanguagesRegex.get(i).toLowerCase(Locale.ROOT).replace("-", "_")); + } + //====Multi File and Multi-Language loader start==== + //Init offline default file + languageFilesManager.deployBundled(CROWDIN_LANGUAGE_FILE_PATH, loadBundled(CROWDIN_LANGUAGE_FILE_PATH)); + //Get language code first + distribution.getAvailableLanguages().parallelStream().forEach(crowdinCode -> + //Then load all the files in this language code + distribution.getAvailableFiles().forEach(crowdinFile -> { + try { + // Minecraft client use lowercase + String minecraftCode = crowdinCode.toLowerCase(Locale.ROOT).replace("-", "_"); + if (!localeEnabled(minecraftCode, enabledLanguagesRegex)) { + Util.debugLog("Locale: " + minecraftCode + " not enabled in configuration."); + return; + } + availableLanguages.add(crowdinCode); + Util.debugLog("Loading translation for locale: " + crowdinCode + " (" + minecraftCode + ")"); + // Deploy bundled to mapper + languageFilesManager.deployBundled(crowdinFile, loadBundled(crowdinFile)); + // Loading bundled file (for no internet connection or failed loading) + JsonConfiguration configuration = loadBundled(crowdinFile.replace("%locale%", crowdinCode)); + applyOverrideConfiguration(configuration, getDistributionConfiguration(crowdinFile, crowdinCode)); + // Loading override text (allow user modification the translation) + JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); + applyOverrideConfiguration(configuration, override); + // Deploy distribution to mapper + languageFilesManager.deploy(crowdinFile, minecraftCode, configuration, loadBundled(crowdinFile)); + Util.debugLog("Locale " + crowdinFile.replace("%locale%", crowdinCode) + " has been successfully loaded"); + } // Key founds in available locales but not in custom mapping on crowdin platform + catch (IOException e) { + // Network error + plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + " please check your network connection.", e); + } catch (Exception e) { + // Translation syntax error or other exceptions + plugin.getLogger().log(Level.WARNING, "Couldn't update the translation for locale " + crowdinCode + ".", e); + } + })); + + // Register post processor + postProcessors.add(new FillerProcessor()); + postProcessors.add(new PlaceHolderApiProcessor()); + //We done this when deploys language + //postProcessors.add(new ColorProcessor()); + } + + private String findRelativeLanguages(String langCode) { + if (langCode.isEmpty()) { + return "en_us"; + } + String result = languagesCache.getIfPresent(langCode); + if (result == null) { + result = "en_us"; + if (availableLanguages.contains(langCode)) { + result = langCode; + } else { + String[] splits = langCode.split("_", 2); + if (splits.length != 2) { + for (String availableLanguage : availableLanguages) { + if (availableLanguage.startsWith(langCode) || availableLanguage.endsWith(langCode)) { + result = availableLanguage; + break; + } + } + } else { + String start = splits[0] + "_"; + String end = "_" + splits[1]; + for (String availableLanguage : availableLanguages) { + if (availableLanguage.startsWith(start) || availableLanguage.endsWith(end)) { + result = availableLanguage; + break; + } + } + } + } + } + languagesCache.put(langCode, result); + return result; + } + /** * Getting user's override configuration for specific distribution path * @@ -406,7 +461,6 @@ private List postProcess(@NotNull List text) { } return texts; } - /** * Getting the text that use specify locale * @@ -416,7 +470,7 @@ private List postProcess(@NotNull List text) { @Override @NotNull public List forLocale(@NotNull String locale) { - JsonConfiguration index = mapping.get(locale); + JsonConfiguration index = mapping.get(manager.findRelativeLanguages(locale)); if (index == null) { Util.debugLog("Fallback " + locale + " to default game-language locale caused by QuickShop doesn't support this locale"); String languageCode = MsgUtil.getDefaultGameLanguageCode(); diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index b03fe12fa2..58ba8f0b61 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -168,18 +168,20 @@ public static String fillArgs(@Nullable String raw, @Nullable String... args) { return raw; } - private static Map.Entry cachedGameLanguageCode = null; + private volatile static Map.Entry cachedGameLanguageCode = null; public static String getDefaultGameLanguageCode() { - return getGameLanguageCode(plugin.getConfig().getString("game-language", "default")); + String languageCode = plugin.getConfig().getString("game-language", "default"); + if (cachedGameLanguageCode != null && cachedGameLanguageCode.getKey().equals(languageCode)) { + return cachedGameLanguageCode.getValue(); + } + String result = getGameLanguageCode(languageCode); + cachedGameLanguageCode = new AbstractMap.SimpleEntry<>(languageCode, result); + return result; } @Unstable public static String getGameLanguageCode(String languageCode) { - if (cachedGameLanguageCode != null && cachedGameLanguageCode.getKey().equals(languageCode)) { - return cachedGameLanguageCode.getValue(); - } - String copyCode = languageCode; if ("default".equalsIgnoreCase(languageCode)) { Locale locale = Locale.getDefault(); String language = locale.getLanguage(); @@ -201,7 +203,6 @@ public static String getGameLanguageCode(String languageCode) { } } languageCode = languageCode.replace("-", "_").toLowerCase(Locale.ROOT); - cachedGameLanguageCode = new AbstractMap.SimpleEntry<>(copyCode, languageCode); return languageCode; } else { return languageCode.replace("-", "_").toLowerCase(Locale.ROOT); From f28ec1adcd2bcdeb28eb51dfed0f3e9a88b4b065 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 12:49:07 +0800 Subject: [PATCH 061/725] Update languagesCache only when no cache --- .../maxgamer/quickshop/localization/text/SimpleTextManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 2b47d5b5f5..137d98d4f2 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -299,8 +299,8 @@ private String findRelativeLanguages(String langCode) { } } } + languagesCache.put(langCode, result); } - languagesCache.put(langCode, result); return result; } From 172ae9a6ccaac63f1cedcd02a72b1309e0d007f6 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 13:23:09 +0800 Subject: [PATCH 062/725] Fix misleading sell messages --- src/main/resources/crowdin/zh-HK/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/crowdin/zh-HK/messages.json b/src/main/resources/crowdin/zh-HK/messages.json index fdf027e3e6..98a2f71dd5 100644 --- a/src/main/resources/crowdin/zh-HK/messages.json +++ b/src/main/resources/crowdin/zh-HK/messages.json @@ -110,7 +110,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &ball&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -307,7 +307,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &ball&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 4eaafb7330ce80b5e14fdabcf00cc8c896041ebf Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 13:31:28 +0800 Subject: [PATCH 063/725] Fix misleading sell messages --- src/main/resources/lang/messages.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/lang/messages.json b/src/main/resources/lang/messages.json index 355f5c6138..6944ca2125 100644 --- a/src/main/resources/lang/messages.json +++ b/src/main/resources/lang/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 97ab93bc22dfa074d2bbbd7f965a172c712d58bc Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 14:04:29 +0800 Subject: [PATCH 064/725] Try to fix crowdin issue --- crowdin.yml | 2 +- .../maxgamer/quickshop/localization/text/SimpleTextManager.java | 2 +- src/main/resources/crowdin/{ => lang}/af-ZA/messages.json | 0 src/main/resources/crowdin/{ => lang}/ar-SA/messages.json | 0 src/main/resources/crowdin/{ => lang}/ca-ES/messages.json | 0 src/main/resources/crowdin/{ => lang}/cs-CZ/messages.json | 0 src/main/resources/crowdin/{ => lang}/da-DK/messages.json | 0 src/main/resources/crowdin/{ => lang}/de-DE/messages.json | 0 src/main/resources/crowdin/{ => lang}/el-GR/messages.json | 0 src/main/resources/crowdin/{ => lang}/en-US/messages.json | 0 src/main/resources/crowdin/{ => lang}/es-ES/messages.json | 0 src/main/resources/crowdin/{ => lang}/fi-FI/messages.json | 0 src/main/resources/crowdin/{ => lang}/fr-FR/messages.json | 0 src/main/resources/crowdin/{ => lang}/he-IL/messages.json | 0 src/main/resources/crowdin/{ => lang}/hu-HU/messages.json | 0 src/main/resources/crowdin/{ => lang}/it-IT/messages.json | 0 src/main/resources/crowdin/{ => lang}/ja-JP/messages.json | 0 src/main/resources/crowdin/{ => lang}/ko-KR/messages.json | 0 src/main/resources/crowdin/{ => lang}/nl-NL/messages.json | 0 src/main/resources/crowdin/{ => lang}/no-NO/messages.json | 0 src/main/resources/crowdin/{ => lang}/pl-PL/messages.json | 0 src/main/resources/crowdin/{ => lang}/pt-BR/messages.json | 0 src/main/resources/crowdin/{ => lang}/pt-PT/messages.json | 0 src/main/resources/crowdin/{ => lang}/ro-RO/messages.json | 0 src/main/resources/crowdin/{ => lang}/ru-RU/messages.json | 0 src/main/resources/crowdin/{ => lang}/sr-SP/messages.json | 0 src/main/resources/crowdin/{ => lang}/sv-SE/messages.json | 0 src/main/resources/crowdin/{ => lang}/tr-TR/messages.json | 0 src/main/resources/crowdin/{ => lang}/uk-UA/messages.json | 0 src/main/resources/crowdin/{ => lang}/vi-VN/messages.json | 0 src/main/resources/crowdin/{ => lang}/zh-CN/messages.json | 0 src/main/resources/crowdin/{ => lang}/zh-HK/messages.json | 0 src/main/resources/crowdin/{ => lang}/zh-TW/messages.json | 0 33 files changed, 2 insertions(+), 2 deletions(-) rename src/main/resources/crowdin/{ => lang}/af-ZA/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/ar-SA/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/ca-ES/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/cs-CZ/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/da-DK/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/de-DE/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/el-GR/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/en-US/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/es-ES/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/fi-FI/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/fr-FR/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/he-IL/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/hu-HU/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/it-IT/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/ja-JP/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/ko-KR/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/nl-NL/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/no-NO/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/pl-PL/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/pt-BR/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/pt-PT/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/ro-RO/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/ru-RU/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/sr-SP/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/sv-SE/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/tr-TR/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/uk-UA/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/vi-VN/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/zh-CN/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/zh-HK/messages.json (100%) rename src/main/resources/crowdin/{ => lang}/zh-TW/messages.json (100%) diff --git a/crowdin.yml b/crowdin.yml index bba8990858..a844a5a5ae 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,3 @@ files: - source: /src/main/resources/lang/*.json - translation: /src/main/resources/crowdin/%locale%/%original_file_name% + translation: /**/crowdin/%locale%/%original_file_name% diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 137d98d4f2..250ab0c382 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -110,7 +110,7 @@ private JsonConfiguration loadBundled(String file) { InputStream stream = null; if (!StringUtils.isEmpty(parentStr)) { //Try to fetch matched i18n resources - stream = plugin.getResource("crowdin/" + parentStr + "/" + fileName); + stream = plugin.getResource("crowdin/lang/" + parentStr + "/" + fileName); } if (stream == null) { //Fallback to default diff --git a/src/main/resources/crowdin/af-ZA/messages.json b/src/main/resources/crowdin/lang/af-ZA/messages.json similarity index 100% rename from src/main/resources/crowdin/af-ZA/messages.json rename to src/main/resources/crowdin/lang/af-ZA/messages.json diff --git a/src/main/resources/crowdin/ar-SA/messages.json b/src/main/resources/crowdin/lang/ar-SA/messages.json similarity index 100% rename from src/main/resources/crowdin/ar-SA/messages.json rename to src/main/resources/crowdin/lang/ar-SA/messages.json diff --git a/src/main/resources/crowdin/ca-ES/messages.json b/src/main/resources/crowdin/lang/ca-ES/messages.json similarity index 100% rename from src/main/resources/crowdin/ca-ES/messages.json rename to src/main/resources/crowdin/lang/ca-ES/messages.json diff --git a/src/main/resources/crowdin/cs-CZ/messages.json b/src/main/resources/crowdin/lang/cs-CZ/messages.json similarity index 100% rename from src/main/resources/crowdin/cs-CZ/messages.json rename to src/main/resources/crowdin/lang/cs-CZ/messages.json diff --git a/src/main/resources/crowdin/da-DK/messages.json b/src/main/resources/crowdin/lang/da-DK/messages.json similarity index 100% rename from src/main/resources/crowdin/da-DK/messages.json rename to src/main/resources/crowdin/lang/da-DK/messages.json diff --git a/src/main/resources/crowdin/de-DE/messages.json b/src/main/resources/crowdin/lang/de-DE/messages.json similarity index 100% rename from src/main/resources/crowdin/de-DE/messages.json rename to src/main/resources/crowdin/lang/de-DE/messages.json diff --git a/src/main/resources/crowdin/el-GR/messages.json b/src/main/resources/crowdin/lang/el-GR/messages.json similarity index 100% rename from src/main/resources/crowdin/el-GR/messages.json rename to src/main/resources/crowdin/lang/el-GR/messages.json diff --git a/src/main/resources/crowdin/en-US/messages.json b/src/main/resources/crowdin/lang/en-US/messages.json similarity index 100% rename from src/main/resources/crowdin/en-US/messages.json rename to src/main/resources/crowdin/lang/en-US/messages.json diff --git a/src/main/resources/crowdin/es-ES/messages.json b/src/main/resources/crowdin/lang/es-ES/messages.json similarity index 100% rename from src/main/resources/crowdin/es-ES/messages.json rename to src/main/resources/crowdin/lang/es-ES/messages.json diff --git a/src/main/resources/crowdin/fi-FI/messages.json b/src/main/resources/crowdin/lang/fi-FI/messages.json similarity index 100% rename from src/main/resources/crowdin/fi-FI/messages.json rename to src/main/resources/crowdin/lang/fi-FI/messages.json diff --git a/src/main/resources/crowdin/fr-FR/messages.json b/src/main/resources/crowdin/lang/fr-FR/messages.json similarity index 100% rename from src/main/resources/crowdin/fr-FR/messages.json rename to src/main/resources/crowdin/lang/fr-FR/messages.json diff --git a/src/main/resources/crowdin/he-IL/messages.json b/src/main/resources/crowdin/lang/he-IL/messages.json similarity index 100% rename from src/main/resources/crowdin/he-IL/messages.json rename to src/main/resources/crowdin/lang/he-IL/messages.json diff --git a/src/main/resources/crowdin/hu-HU/messages.json b/src/main/resources/crowdin/lang/hu-HU/messages.json similarity index 100% rename from src/main/resources/crowdin/hu-HU/messages.json rename to src/main/resources/crowdin/lang/hu-HU/messages.json diff --git a/src/main/resources/crowdin/it-IT/messages.json b/src/main/resources/crowdin/lang/it-IT/messages.json similarity index 100% rename from src/main/resources/crowdin/it-IT/messages.json rename to src/main/resources/crowdin/lang/it-IT/messages.json diff --git a/src/main/resources/crowdin/ja-JP/messages.json b/src/main/resources/crowdin/lang/ja-JP/messages.json similarity index 100% rename from src/main/resources/crowdin/ja-JP/messages.json rename to src/main/resources/crowdin/lang/ja-JP/messages.json diff --git a/src/main/resources/crowdin/ko-KR/messages.json b/src/main/resources/crowdin/lang/ko-KR/messages.json similarity index 100% rename from src/main/resources/crowdin/ko-KR/messages.json rename to src/main/resources/crowdin/lang/ko-KR/messages.json diff --git a/src/main/resources/crowdin/nl-NL/messages.json b/src/main/resources/crowdin/lang/nl-NL/messages.json similarity index 100% rename from src/main/resources/crowdin/nl-NL/messages.json rename to src/main/resources/crowdin/lang/nl-NL/messages.json diff --git a/src/main/resources/crowdin/no-NO/messages.json b/src/main/resources/crowdin/lang/no-NO/messages.json similarity index 100% rename from src/main/resources/crowdin/no-NO/messages.json rename to src/main/resources/crowdin/lang/no-NO/messages.json diff --git a/src/main/resources/crowdin/pl-PL/messages.json b/src/main/resources/crowdin/lang/pl-PL/messages.json similarity index 100% rename from src/main/resources/crowdin/pl-PL/messages.json rename to src/main/resources/crowdin/lang/pl-PL/messages.json diff --git a/src/main/resources/crowdin/pt-BR/messages.json b/src/main/resources/crowdin/lang/pt-BR/messages.json similarity index 100% rename from src/main/resources/crowdin/pt-BR/messages.json rename to src/main/resources/crowdin/lang/pt-BR/messages.json diff --git a/src/main/resources/crowdin/pt-PT/messages.json b/src/main/resources/crowdin/lang/pt-PT/messages.json similarity index 100% rename from src/main/resources/crowdin/pt-PT/messages.json rename to src/main/resources/crowdin/lang/pt-PT/messages.json diff --git a/src/main/resources/crowdin/ro-RO/messages.json b/src/main/resources/crowdin/lang/ro-RO/messages.json similarity index 100% rename from src/main/resources/crowdin/ro-RO/messages.json rename to src/main/resources/crowdin/lang/ro-RO/messages.json diff --git a/src/main/resources/crowdin/ru-RU/messages.json b/src/main/resources/crowdin/lang/ru-RU/messages.json similarity index 100% rename from src/main/resources/crowdin/ru-RU/messages.json rename to src/main/resources/crowdin/lang/ru-RU/messages.json diff --git a/src/main/resources/crowdin/sr-SP/messages.json b/src/main/resources/crowdin/lang/sr-SP/messages.json similarity index 100% rename from src/main/resources/crowdin/sr-SP/messages.json rename to src/main/resources/crowdin/lang/sr-SP/messages.json diff --git a/src/main/resources/crowdin/sv-SE/messages.json b/src/main/resources/crowdin/lang/sv-SE/messages.json similarity index 100% rename from src/main/resources/crowdin/sv-SE/messages.json rename to src/main/resources/crowdin/lang/sv-SE/messages.json diff --git a/src/main/resources/crowdin/tr-TR/messages.json b/src/main/resources/crowdin/lang/tr-TR/messages.json similarity index 100% rename from src/main/resources/crowdin/tr-TR/messages.json rename to src/main/resources/crowdin/lang/tr-TR/messages.json diff --git a/src/main/resources/crowdin/uk-UA/messages.json b/src/main/resources/crowdin/lang/uk-UA/messages.json similarity index 100% rename from src/main/resources/crowdin/uk-UA/messages.json rename to src/main/resources/crowdin/lang/uk-UA/messages.json diff --git a/src/main/resources/crowdin/vi-VN/messages.json b/src/main/resources/crowdin/lang/vi-VN/messages.json similarity index 100% rename from src/main/resources/crowdin/vi-VN/messages.json rename to src/main/resources/crowdin/lang/vi-VN/messages.json diff --git a/src/main/resources/crowdin/zh-CN/messages.json b/src/main/resources/crowdin/lang/zh-CN/messages.json similarity index 100% rename from src/main/resources/crowdin/zh-CN/messages.json rename to src/main/resources/crowdin/lang/zh-CN/messages.json diff --git a/src/main/resources/crowdin/zh-HK/messages.json b/src/main/resources/crowdin/lang/zh-HK/messages.json similarity index 100% rename from src/main/resources/crowdin/zh-HK/messages.json rename to src/main/resources/crowdin/lang/zh-HK/messages.json diff --git a/src/main/resources/crowdin/zh-TW/messages.json b/src/main/resources/crowdin/lang/zh-TW/messages.json similarity index 100% rename from src/main/resources/crowdin/zh-TW/messages.json rename to src/main/resources/crowdin/lang/zh-TW/messages.json From 662205bd29245c4fe230a0d175d522b12949005b Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 14:09:27 +0800 Subject: [PATCH 065/725] Update Crowdin configuration file --- crowdin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crowdin.yml b/crowdin.yml index a844a5a5ae..ba89c9604a 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,3 @@ files: - source: /src/main/resources/lang/*.json - translation: /**/crowdin/%locale%/%original_file_name% + translation: /**/crowdin/lang/%locale%/%original_file_name% From 210dff8b15768cd31351b4943d89ba6420311ca2 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 17:44:25 +0800 Subject: [PATCH 066/725] Try to fix crowdin issue again --- crowdin.yml | 2 +- .../resources/crowdin => crowdin}/lang/af-ZA/messages.json | 0 .../resources/crowdin => crowdin}/lang/ar-SA/messages.json | 0 .../resources/crowdin => crowdin}/lang/ca-ES/messages.json | 0 .../resources/crowdin => crowdin}/lang/cs-CZ/messages.json | 0 .../resources/crowdin => crowdin}/lang/da-DK/messages.json | 0 .../resources/crowdin => crowdin}/lang/de-DE/messages.json | 0 .../resources/crowdin => crowdin}/lang/el-GR/messages.json | 0 .../resources/crowdin => crowdin}/lang/en-US/messages.json | 0 .../resources/crowdin => crowdin}/lang/es-ES/messages.json | 0 .../resources/crowdin => crowdin}/lang/fi-FI/messages.json | 0 .../resources/crowdin => crowdin}/lang/fr-FR/messages.json | 0 .../resources/crowdin => crowdin}/lang/he-IL/messages.json | 0 .../resources/crowdin => crowdin}/lang/hu-HU/messages.json | 0 .../resources/crowdin => crowdin}/lang/it-IT/messages.json | 0 .../resources/crowdin => crowdin}/lang/ja-JP/messages.json | 0 .../resources/crowdin => crowdin}/lang/ko-KR/messages.json | 0 .../resources/crowdin => crowdin}/lang/nl-NL/messages.json | 0 .../resources/crowdin => crowdin}/lang/no-NO/messages.json | 0 .../resources/crowdin => crowdin}/lang/pl-PL/messages.json | 0 .../resources/crowdin => crowdin}/lang/pt-BR/messages.json | 0 .../resources/crowdin => crowdin}/lang/pt-PT/messages.json | 0 .../resources/crowdin => crowdin}/lang/ro-RO/messages.json | 0 .../resources/crowdin => crowdin}/lang/ru-RU/messages.json | 0 .../resources/crowdin => crowdin}/lang/sr-SP/messages.json | 0 .../resources/crowdin => crowdin}/lang/sv-SE/messages.json | 0 .../resources/crowdin => crowdin}/lang/tr-TR/messages.json | 0 .../resources/crowdin => crowdin}/lang/uk-UA/messages.json | 0 .../resources/crowdin => crowdin}/lang/vi-VN/messages.json | 0 .../resources/crowdin => crowdin}/lang/zh-CN/messages.json | 0 .../resources/crowdin => crowdin}/lang/zh-HK/messages.json | 0 .../resources/crowdin => crowdin}/lang/zh-TW/messages.json | 0 pom.xml | 5 +++++ 33 files changed, 6 insertions(+), 1 deletion(-) rename {src/main/resources/crowdin => crowdin}/lang/af-ZA/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/ar-SA/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/ca-ES/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/cs-CZ/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/da-DK/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/de-DE/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/el-GR/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/en-US/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/es-ES/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/fi-FI/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/fr-FR/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/he-IL/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/hu-HU/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/it-IT/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/ja-JP/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/ko-KR/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/nl-NL/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/no-NO/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/pl-PL/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/pt-BR/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/pt-PT/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/ro-RO/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/ru-RU/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/sr-SP/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/sv-SE/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/tr-TR/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/uk-UA/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/vi-VN/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/zh-CN/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/zh-HK/messages.json (100%) rename {src/main/resources/crowdin => crowdin}/lang/zh-TW/messages.json (100%) diff --git a/crowdin.yml b/crowdin.yml index ba89c9604a..15ad6b03b9 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,3 @@ files: - source: /src/main/resources/lang/*.json - translation: /**/crowdin/lang/%locale%/%original_file_name% + translation: /crowdin/lang/%locale%/%original_file_name% diff --git a/src/main/resources/crowdin/lang/af-ZA/messages.json b/crowdin/lang/af-ZA/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/af-ZA/messages.json rename to crowdin/lang/af-ZA/messages.json diff --git a/src/main/resources/crowdin/lang/ar-SA/messages.json b/crowdin/lang/ar-SA/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/ar-SA/messages.json rename to crowdin/lang/ar-SA/messages.json diff --git a/src/main/resources/crowdin/lang/ca-ES/messages.json b/crowdin/lang/ca-ES/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/ca-ES/messages.json rename to crowdin/lang/ca-ES/messages.json diff --git a/src/main/resources/crowdin/lang/cs-CZ/messages.json b/crowdin/lang/cs-CZ/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/cs-CZ/messages.json rename to crowdin/lang/cs-CZ/messages.json diff --git a/src/main/resources/crowdin/lang/da-DK/messages.json b/crowdin/lang/da-DK/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/da-DK/messages.json rename to crowdin/lang/da-DK/messages.json diff --git a/src/main/resources/crowdin/lang/de-DE/messages.json b/crowdin/lang/de-DE/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/de-DE/messages.json rename to crowdin/lang/de-DE/messages.json diff --git a/src/main/resources/crowdin/lang/el-GR/messages.json b/crowdin/lang/el-GR/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/el-GR/messages.json rename to crowdin/lang/el-GR/messages.json diff --git a/src/main/resources/crowdin/lang/en-US/messages.json b/crowdin/lang/en-US/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/en-US/messages.json rename to crowdin/lang/en-US/messages.json diff --git a/src/main/resources/crowdin/lang/es-ES/messages.json b/crowdin/lang/es-ES/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/es-ES/messages.json rename to crowdin/lang/es-ES/messages.json diff --git a/src/main/resources/crowdin/lang/fi-FI/messages.json b/crowdin/lang/fi-FI/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/fi-FI/messages.json rename to crowdin/lang/fi-FI/messages.json diff --git a/src/main/resources/crowdin/lang/fr-FR/messages.json b/crowdin/lang/fr-FR/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/fr-FR/messages.json rename to crowdin/lang/fr-FR/messages.json diff --git a/src/main/resources/crowdin/lang/he-IL/messages.json b/crowdin/lang/he-IL/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/he-IL/messages.json rename to crowdin/lang/he-IL/messages.json diff --git a/src/main/resources/crowdin/lang/hu-HU/messages.json b/crowdin/lang/hu-HU/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/hu-HU/messages.json rename to crowdin/lang/hu-HU/messages.json diff --git a/src/main/resources/crowdin/lang/it-IT/messages.json b/crowdin/lang/it-IT/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/it-IT/messages.json rename to crowdin/lang/it-IT/messages.json diff --git a/src/main/resources/crowdin/lang/ja-JP/messages.json b/crowdin/lang/ja-JP/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/ja-JP/messages.json rename to crowdin/lang/ja-JP/messages.json diff --git a/src/main/resources/crowdin/lang/ko-KR/messages.json b/crowdin/lang/ko-KR/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/ko-KR/messages.json rename to crowdin/lang/ko-KR/messages.json diff --git a/src/main/resources/crowdin/lang/nl-NL/messages.json b/crowdin/lang/nl-NL/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/nl-NL/messages.json rename to crowdin/lang/nl-NL/messages.json diff --git a/src/main/resources/crowdin/lang/no-NO/messages.json b/crowdin/lang/no-NO/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/no-NO/messages.json rename to crowdin/lang/no-NO/messages.json diff --git a/src/main/resources/crowdin/lang/pl-PL/messages.json b/crowdin/lang/pl-PL/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/pl-PL/messages.json rename to crowdin/lang/pl-PL/messages.json diff --git a/src/main/resources/crowdin/lang/pt-BR/messages.json b/crowdin/lang/pt-BR/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/pt-BR/messages.json rename to crowdin/lang/pt-BR/messages.json diff --git a/src/main/resources/crowdin/lang/pt-PT/messages.json b/crowdin/lang/pt-PT/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/pt-PT/messages.json rename to crowdin/lang/pt-PT/messages.json diff --git a/src/main/resources/crowdin/lang/ro-RO/messages.json b/crowdin/lang/ro-RO/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/ro-RO/messages.json rename to crowdin/lang/ro-RO/messages.json diff --git a/src/main/resources/crowdin/lang/ru-RU/messages.json b/crowdin/lang/ru-RU/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/ru-RU/messages.json rename to crowdin/lang/ru-RU/messages.json diff --git a/src/main/resources/crowdin/lang/sr-SP/messages.json b/crowdin/lang/sr-SP/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/sr-SP/messages.json rename to crowdin/lang/sr-SP/messages.json diff --git a/src/main/resources/crowdin/lang/sv-SE/messages.json b/crowdin/lang/sv-SE/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/sv-SE/messages.json rename to crowdin/lang/sv-SE/messages.json diff --git a/src/main/resources/crowdin/lang/tr-TR/messages.json b/crowdin/lang/tr-TR/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/tr-TR/messages.json rename to crowdin/lang/tr-TR/messages.json diff --git a/src/main/resources/crowdin/lang/uk-UA/messages.json b/crowdin/lang/uk-UA/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/uk-UA/messages.json rename to crowdin/lang/uk-UA/messages.json diff --git a/src/main/resources/crowdin/lang/vi-VN/messages.json b/crowdin/lang/vi-VN/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/vi-VN/messages.json rename to crowdin/lang/vi-VN/messages.json diff --git a/src/main/resources/crowdin/lang/zh-CN/messages.json b/crowdin/lang/zh-CN/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/zh-CN/messages.json rename to crowdin/lang/zh-CN/messages.json diff --git a/src/main/resources/crowdin/lang/zh-HK/messages.json b/crowdin/lang/zh-HK/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/zh-HK/messages.json rename to crowdin/lang/zh-HK/messages.json diff --git a/src/main/resources/crowdin/lang/zh-TW/messages.json b/crowdin/lang/zh-TW/messages.json similarity index 100% rename from src/main/resources/crowdin/lang/zh-TW/messages.json rename to crowdin/lang/zh-TW/messages.json diff --git a/pom.xml b/pom.xml index 0cf5c12936..319deedfce 100644 --- a/pom.xml +++ b/pom.xml @@ -338,6 +338,11 @@ false src/main/resources/lang + + crowdin/lang + false + crowdin/lang + From 5930b732be5956209728c1947d31081f7bd3f0db Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:00 +0800 Subject: [PATCH 067/725] New translations messages.json (Romanian) --- crowdin/lang/ro-RO/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/ro-RO/messages.json b/crowdin/lang/ro-RO/messages.json index e728af2cc7..063641d296 100644 --- a/crowdin/lang/ro-RO/messages.json +++ b/crowdin/lang/ro-RO/messages.json @@ -5,7 +5,8 @@ "translation-version": "Versiune suport: Reproducere", "translation-contributors": "Contribuitori: Turnul, Netherfoam, KaiNoMood, Mgazul, JackTheChicken și Andre_601", "translation-country": "Zona de Limbă: Engleză (ro_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cNu am putut gasi un magazin. Trebuie sa te uiti la unul.", "no-anythings-in-your-hand": "&cNu este nimic in mana.", "no-permission": "&cNu ai permisiunea să faci asta.\".", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aIntra in chat, cat de mult doresti sa ai &dSELL&a. Ai &{0}&un disponibil. Introdu &ball&la chat, pentru a vinde pe toate.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNu poti crea un magazin aici.", "blacklisted-item": "&cNu poti vinde acest obiect pentru ca este pe lista neagra", "how-much-to-trade-for": "&aIntra in chat, cat de mult doresti sa tranzacționezi &{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From ea66c3cf690004cf030980af7a1373d031875a3b Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:01 +0800 Subject: [PATCH 068/725] New translations messages.json (Dutch) --- crowdin/lang/nl-NL/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/nl-NL/messages.json b/crowdin/lang/nl-NL/messages.json index 0b0ab273e5..94e7a52854 100644 --- a/crowdin/lang/nl-NL/messages.json +++ b/crowdin/lang/nl-NL/messages.json @@ -5,7 +5,8 @@ "translation-version": "ondersteunende versie: Reremake", "translation-contributors": "Medewerkers", "translation-country": "Taal Zone: Engels (nl_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cGeen QuickShop gevonden, je moet naar een QuickShop kijken.", "no-anythings-in-your-hand": "&cJe hebt niks in je hand.", "no-permission": "&cJe hebt hiervoor geen rechten.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing van een QuickShop vergrendeling!", "that-is-locked": "&cDeze winkel is vergrendeld.", - "how-many-buy": "&aEnter in de chat, hoeveel je wilt om &bBUY&a. Je kunt &e{0}&a kopen. Voer &ball&a in om ze allemaal te kopen.", - "how-many-sell": "&aEnter in de chat, hoeveel je wilt met &dSELL&a. Je hebt &e{0}&a beschikbaar. Voer &ball&een in de chat in om alles te verkopen.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cU kunt hier geen winkel aanmaken.", "blacklisted-item": "&cJe kunt dit item niet verkopen omdat het op de zwarte lijst staat", "how-much-to-trade-for": "&aEnter in de chat, voor hoeveel u wilt handelen &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cU kunt niet handelen met deze winkel omdat deze bevroren is.", "shop-freezed-at-location": "&eUw winkel {0} om {1} is bevroren!", "denied-put-in-item": "&cU kunt dit item niet in uw winkel plaatsen!", - "how-many-buy-stack": "&eEnter in de chat, hoeveel bulks u wenst te &bBUY&a. Er zijn &{0}&een items in elk bulk en je kunt &e{1}&een aantal soorten kopen. Voer &ball&in de chat in om alles te kopen.", - "how-many-sell-stack": "&aEnter in de chat, hoeveel bulk u wenst te &dSELL&a. Er zijn &e{0}&een items per bulk en je hebt &e{1}&een bulks beschikbaar. Voer &ball&een in de chat in om alles te verkopen.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNaam: &6{0}", "code": "&eCode: &6{0}", From 1395d7b88cd7023028a669749b0377e182efe329 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:02 +0800 Subject: [PATCH 069/725] New translations messages.json (Portuguese, Brazilian) --- crowdin/lang/pt-BR/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/pt-BR/messages.json b/crowdin/lang/pt-BR/messages.json index dfb85bf924..b02c7138c7 100644 --- a/crowdin/lang/pt-BR/messages.json +++ b/crowdin/lang/pt-BR/messages.json @@ -5,7 +5,8 @@ "translation-version": "Versão de suporte: Remake", "translation-contributors": "Contribuidores: Torre de Timor, Netherfoam, KaiNoMood, Mgazul, JackTheChicken e Andre_601", "translation-country": "Zona do idioma: Português Brasileiro (pt_BR)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "Não conseguimos encontrar uma QuickShop. Você precisa estar olhando para uma.", "no-anythings-in-your-hand": "&cNão há nada na sua mão.", "no-permission": "&cVocê não tem permissão para fazer isso.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cIgnorarando um bloqueio da loja!", "that-is-locked": "&cEssa loja está bloqueada.", - "how-many-buy": "&aEscreva quantos você deseja &bCOMPRAR&a no chat. Você pode comprar até &e{0}&a. Digite &ball&a para comprar tudo.", - "how-many-sell": "&aEscreva quantos você deseja &bVENDER&a no chat. Você pode vender até &e{0}&a. Digite &ball&a para vender tudo.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cVocê não pode criar uma loja aqui.", "blacklisted-item": "&cVocê não pode vender este item porque ele está na lista negra", "how-much-to-trade-for": "&aDigite no chat, por quanto você deseja vender &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cVocê não pode negociar com esta loja porque ela está congelada.", "shop-freezed-at-location": "&eA sua loja {0} em {1} foi congelada!", "denied-put-in-item": "&CVocê não pode colocar este item na sua loja!", - "how-many-buy-stack": "&aDigite quantos pacotes você deseja &bCOMPRAR&a no chat. Há &e{0}&a itens em cada pacote e você pode comprar &e{1}&a pacote(s). Digite &ball&a para comprar todos.", - "how-many-sell-stack": "&aDigite no chat, quantos pacotes você deseja &eVENDER&a. Há &e{0}&a itens em cada pacote e você tem &e{1}&a pacotes disponíveis. Digite &ball no chat para vender tudo.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNome: &6{0}", "code": "&eCódigo: &6{0}", From d34559356a4d3fe5ca8b78d29cfa8a4438aaab38 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:03 +0800 Subject: [PATCH 070/725] New translations messages.json (Vietnamese) --- crowdin/lang/vi-VN/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/vi-VN/messages.json b/crowdin/lang/vi-VN/messages.json index 80f8db7c36..855e9a339c 100644 --- a/crowdin/lang/vi-VN/messages.json +++ b/crowdin/lang/vi-VN/messages.json @@ -5,7 +5,8 @@ "translation-version": "Phiên bản hỗ trợ: Reremake", "translation-contributors": "Người đóng góp: huyhhuy", "translation-country": "Vùng ngôn ngữ: Tiếng Việt (vi_VN)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cKhông thể tìm ra QuickShop. Bạn cần phải nhìn vào nó trước.", "no-anythings-in-your-hand": "&cChẳng có gì trong tay bạn cả.", "no-permission": "&cBạn không có quyền làm thế.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aNhập vào chat số lượng bạn muốn &bMUA&a. Hiện tại có thể mua tổng cộng &e{0}&a. Nhập vào &ball&a để mua hết.", - "how-many-sell": "&aNhập vào chat số lượng bạn muốn &dBÁN&a. Bạn có thể bán &e{0}&a. Nhập vào &ball&a để bán hết chúng.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From e8b83280affcffdaf92630e5e8b8bf0460e42af7 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:04 +0800 Subject: [PATCH 071/725] New translations messages.json (English) --- crowdin/lang/en-US/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/en-US/messages.json b/crowdin/lang/en-US/messages.json index 50de1bf7fb..06bd26e436 100644 --- a/crowdin/lang/en-US/messages.json +++ b/crowdin/lang/en-US/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. Make sure you look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how many you wish to &dSELL&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 6d036662726a2e2248d07fb59a83424b684a26f8 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:05 +0800 Subject: [PATCH 072/725] New translations messages.json (Chinese Traditional) --- crowdin/lang/zh-TW/messages.json | 43 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/crowdin/lang/zh-TW/messages.json b/crowdin/lang/zh-TW/messages.json index 46c1c14553..113cac97a5 100644 --- a/crowdin/lang/zh-TW/messages.json +++ b/crowdin/lang/zh-TW/messages.json @@ -5,7 +5,8 @@ "translation-version": "支持版本 : Reremake (重製版)", "translation-contributors": "貢獻人員 : Timtower、Netherfoam、KaiNoMood、Mgazul、JackTheChicken 和 Andre_601", "translation-country": "語言 : &b&l繁體中文 Chinese Traditional (zh_TW)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&c無法找到儲物箱商店,你需要注視著儲物箱。", "no-anythings-in-your-hand": "&c手上沒有任何東西。", "no-permission": "&4你沒有使用該指令的權限。", @@ -68,7 +69,7 @@ "break-shop-use-supertool": "&e你可以使用超級工具破壞商店。", "failed-to-put-sign": "&c你的商店周圍沒有足夠的空間,放置商店的資訊告示牌。", "failed-to-paste": "&c無法將資料上傳至 Pastebin ,請檢查你的連線再重試。 (詳見控制台)", - "warn-to-paste": "&e正在收集資料並上傳到 Pastebin ,這可能需要一點時間。&c&l警告 : &c資料上傳後,此連結會公開一星期 ! 可能會洩漏伺服器中的設定或其它資料。請確保傳送此連結的人是 &l伺服器員工 或 開發者&c。", + "warn-to-paste": "&e正在收集資料並上傳到 Pastebin ,這可能需要一點時間。&c&l警告 : &c資料上傳後,此連結會公開一星期 ! 可能會洩漏伺服器中的設定或其它資料。請確保傳送此連結的人是 &l伺服器員工或開發者&c。", "price-too-high": "&c商店價格太高了 ! 請設定在 {0} 元以內。", "you-cant-create-shop-in-there": "&c你沒有在這個地方建立商店的權限。", "unknown-player": "&c找不到相對應的玩家,請檢查你輸入的玩家名稱是否正確。", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&c你繞過了 Quickshop 鎖 !", "that-is-locked": "&c此商店已上鎖。", - "how-many-buy": "&a在聊天室中輸入你想要 &b購買 &a的數量,你可以購買 &e{0} &a個。輸入 &bALL &a購買全部。", - "how-many-sell": "&a在聊天室中輸入你想要 &d出售 &a的數量,你有 &e{0} &a個可以出售。輸入 &bALL &a賣出全部。", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&c你無法在此建立商店。", "blacklisted-item": "&c由於這是黑名單的物品,所以你不能賣。", "how-much-to-trade-for": "&a請在聊天室中輸入你想買賣 &e{1} 個 {0} &a的價格。", @@ -179,7 +180,7 @@ "lock": "&e切換商店上鎖狀態", "taxaccount": "&e設定商店使用的稅金帳戶", "toggledisplay": "&e切換商店顯示物品狀態", - "purge": "&eStart the shop purge task in background" + "purge": "&e在背景啟動商店清理任務" }, "disabled": "&c這個指令被停用 : &e{0}", "feature-not-enabled": "該功能沒有在設定檔案中啟用。" @@ -229,8 +230,8 @@ "lock-hover": "&e開啟/關閉商店鎖保護。", "freeze": "&e凍結模式 : &b{0} &e[&d&l切換&e]", "freeze-hover": "&e切換商店凍結狀態。", - "toggledisplay": "&eDisplayItem: &b{0} &e[&d&lToggle&e]", - "toggledisplay-hover": "&eToggle the shop's displayitem status" + "toggledisplay": "&e懸浮物顯示 : &b{0} &e[&d&l切換&e]", + "toggledisplay-hover": "&e切換商店是否顯示懸浮物" }, "tableformat": { "full_line": "+---------------------------------------------------+", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&c你不能與這間商店交易,因為它已被凍結。", "shop-freezed-at-location": "&e你在 {1} 的商店 {0} 被凍結了 !", "denied-put-in-item": "&c你不能將此物品放入你的商店 !", - "how-many-buy-stack": "&a在聊天室中輸入你想 &b購買&a 的數量,每份中有 &e{0}&a 個物品,你目前可以買 &e{1}&a 份。輸入 &bAll&a 來購買所有物品。", - "how-many-sell-stack": "&a在聊天室中輸入你想 &b售出&a 的數量,每份中有 &e{0}&a 個物品,你目前可以售出 &e{1}&a 份。輸入 &bAll&a 來售出所有物品。", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&e名稱 : &6{0}", "code": "&e代碼 : &6{0}", @@ -324,7 +325,7 @@ "backup-success": "&a備份成功。", "console-only": "&c該指令只能在控制台執行。", "console-only-danger": "&c由於這個是一個有風險的指令,請你在控制台中執行。", - "clean-warning": "&eThis command will purge &call &eshops if the shop is corrupted, was created in not allowed worlds, is selling/buying not allowed items or &c&lEXISTS IN A UNLOADED WORLD&e. Make sure to create a full backup of your shop data first and use &b/qs cleanghost confirm &eto continue.", + "clean-warning": "&e該指令將清理&c所有&e在不允許建立商店的世界的──出售/購買不允許的物品,以及&c&l所有在伺服器沒有載入世界的商店,請確保你的商店資料備份完整後繼續使用 &b/qs cleanghost confirm &e。", "shop-creation-failed": "&c商店建立失敗,請與伺服器管理員聯繫。", "shop-owner-self-trade": "&e你正在跟自己開的商店進行交易 , 所以你的存款不會改變。", "chest-title": "QuickShop 商店", @@ -333,19 +334,19 @@ "unlimited-shop-owner-keeped": "&e注意 : 該商店店主還是屬於無限商店店主類型,你需要自己重新設定新的商店店主。", "server-crash-warning": "&c如果你更換或刪除 QuickShop 插件 Jar 檔案後,執行指令 /qs reload 可能導致伺服器崩潰。", "reloading-status": { - "success": "&aReload completed without any errors.", - "require-restart": "&aReload completed. &e(Some changes require server restart to affect)", - "failed": "&cReload failed, check the server console", - "scheduled": "&aReload completed. &7(Some changes required a while to affect)" + "success": "&a重新載入且沒有發生任何錯誤。", + "require-restart": "&a重新載入完成。&e(一些更改需要重新啟動伺服器後作用)", + "failed": "&c無法重新載入,請檢查伺服器控制台", + "scheduled": "&a重新載入完成。&e(一些更改需要一段時間後作用)" }, - "client-language-changed": "&aQuickShop detected your client language setting has been changed, we're now using {0} locale for you.", - "client-language-unsupported": "&eQuickShop doesn't support your client language, we're fallback to {0} locale now.", + "client-language-changed": "&aQuickShop 偵測到你的客戶端語言已切換,我們現在為你切換為 {0}。", + "client-language-unsupported": "&eQuickShop 不支援你的客戶端語言,我們現在還原為 {0}。", "taxaccount-set": "&a已經設定 &e{0} &a為該商店的稅金帳戶", "taxaccount-unset": "&a該商店的稅金帳戶現在按照伺服器全域設定。", "taxaccount-invalid": "&c無效的目標帳戶,請輸入有效的玩家名稱或 uuid(須加破折號)。", - "display-turn-on": "&aSuccessfully turn on the shop display.", - "display-turn-off": "&aSuccessfully turn off the shop display.", - "shop-purged-start": "&aShop purge started, check the console for details.", - "purchase-out-of-stock": "&cThis shop run out of the stock, Contact shop owner or staffs to refill the stock.", - "purchase-out-of-space": "&cThis shop run out of the space, Contact shop owner or staffs to empty the shop." + "display-turn-on": "&a成功開啟商店懸浮物顯示", + "display-turn-off": "&a成功關閉商店懸浮物顯示", + "shop-purged-start": "&a已開始商店清理,請查看控制台以獲得詳細資訊。", + "purchase-out-of-stock": "&c該商店已缺貨,請聯繫商店商店店主或商店員工補充庫存。", + "purchase-out-of-space": "&c該商店空間不足,請聯繫商店商店店主或商店員工清空商店。" } From 0524dc4d86b375131d40a6821fbcdb318575bc09 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:06 +0800 Subject: [PATCH 073/725] New translations messages.json (Chinese Simplified) --- crowdin/lang/zh-CN/messages.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crowdin/lang/zh-CN/messages.json b/crowdin/lang/zh-CN/messages.json index c44a3e629e..832a52161e 100644 --- a/crowdin/lang/zh-CN/messages.json +++ b/crowdin/lang/zh-CN/messages.json @@ -5,7 +5,8 @@ "translation-version": "支持版本:Reremake", "translation-contributors": "开发贡献者:Timtower, Netherfoam, KaiNoMood JackTheChicken 和 Andre_601", "translation-country": "本地化语言:简体中文 (zh_CN)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&c无法找到创建商店的方块,您需要注视着一个商店方块", "not-looking-at-shop": "&c无法找到商店,您需要注视着你想要操作的商店。", "no-anythings-in-your-hand": "&c你的手里没有任何物品。", "no-permission": "&c你没有权限这样做。", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&c你绕过了QuickShop的锁!", "that-is-locked": "&c这个商店已上锁。", - "how-many-buy": "&a在聊天中输入您想要&b购买&a的数量。您可以购买&e{0}&a个,输入&ball&a以购买全部。", - "how-many-sell": "&a在聊天栏中输入想 &d出售 &a的物品数量. 您的背包中拥有 &e{0} &a件物品。输入 &ball&a 来出售全部。", + "how-many-buy": "&a在聊天中输入您想要&b购买&a的数量。您可以购买&e{0}&a个,输入&b{1}&a以购买全部。", + "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所需的价格。", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&c您不能与这家商店交易,因为它已被冻结。", "shop-freezed-at-location": "&e你在 {1} 的商店 {0} 被冻结了!", "denied-put-in-item": "&c您不能将此物品放入您的商店!", - "how-many-buy-stack": "&a在聊天栏中输入你想&b买&a的份数. 每份中有 &e{0}&a 个该物品, 你可以买 &e{1}&a 份. 输入 &ball&a 以买下所有该物品.", - "how-many-sell-stack": "&a在聊天栏中输入你想 &d卖&a 的份数. 每份中有 &e{0}&a 个该物品, 你目前拥有 &e{1}&a 份这样的物品可卖出,输入 &ball&a 以卖出所有此项物品。", + "how-many-buy-stack": "&a聊天栏中输入你想&b买&a的份数. 每份中有 &e{0}&a 个该物品, 你可以买 &e{1}&a 份. 输入 &b{2}&a 以买下所有该物品.", + "how-many-sell-stack": "&a在聊天栏中输入你想 &d卖&a 的份数. 每份中有 &e{0}&a 个该物品, 你目前拥有 &e{1}&a 份这样的物品可卖出,输入 &b{2}&a 以卖出所有此项物品。", "language": { "name": "&e名称: &6{0}", "code": "&e代码: &6{0}", @@ -326,7 +327,7 @@ "console-only-danger": "&c这是一个危险的命令,只有控制台才能执行它。", "clean-warning": "&e这个命令将清理&c所有&e在不允许创建商店的世界的、出售/购买不允许的物品的,以及 &c&l所有在服务器没有加载的世界的商店, 请在确保您的商店数据备份完整后使用 &b/qs cleanghost confirm &e来继续。", "shop-creation-failed": "&c商店创建失败,请与服务器管理员联系。", - "shop-owner-self-trade": "&e你正在和自己的商店进行交易,你可能不会得到任何钱。", + "shop-owner-self-trade": "&e你正在和自己的商店进行交易,所以你的金钱可能并不会增长。", "chest-title": "QuickShop商店", "command-type-mismatch": "&c此命令只能由 &b{0} 执行。", "unlimited-shop-owner-changed": "&e这个无限商店的店主已更改为 {0}。", From 27a91525ff8cc2a82e3cce16c71102a513c4a062 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:07 +0800 Subject: [PATCH 074/725] New translations messages.json (Ukrainian) --- crowdin/lang/uk-UA/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/uk-UA/messages.json b/crowdin/lang/uk-UA/messages.json index e8f4a107ab..355f5c6138 100644 --- a/crowdin/lang/uk-UA/messages.json +++ b/crowdin/lang/uk-UA/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From ec64063b8d596ff0baee3f2ea4bf9321de19717b Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:08 +0800 Subject: [PATCH 075/725] New translations messages.json (Turkish) --- crowdin/lang/tr-TR/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/tr-TR/messages.json b/crowdin/lang/tr-TR/messages.json index 2137576bd7..6dfa9ceca3 100644 --- a/crowdin/lang/tr-TR/messages.json +++ b/crowdin/lang/tr-TR/messages.json @@ -5,7 +5,8 @@ "translation-version": "Destek Versiyonu: Reremake", "translation-contributors": "Katkıda Bulunanlar: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Dil Bölgesi: Türkçe (tr_TR)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&sHiç QuickShop bulunamadı. Birine bakman lazım.", "no-anythings-in-your-hand": "&cElinde hiçbir şey yok.", "no-permission": "&cBunu yapmaya iznin yok.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBir QuickShop kilidi atlanıyor!", "that-is-locked": "&cBu market kilitli.", - "how-many-buy": "&aNe kadar &bSATIN ALMAK&a istediğini sohbete yaz. &e{0}&a tane satın alabilirsiniz. Hepsini satın almak için &ball&a yaz.", - "how-many-sell": "&aNe kadar &dSATMAK&a istediğini sohbete yaz. &e{0}&a tane satabilirsiniz. Hepsini satmak için &ball&a yaz.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cBurada bir market oluşturamazsın.", "blacklisted-item": "&cBu öğeyi satamazsın çünkü kara listede", "how-much-to-trade-for": "&e{1} &atane &e{0} &aiçin ne kadar ticaret yapmak istediğini sohbete yaz.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cBu markette ticaret yapamazsın çünkü donmuş.", "shop-freezed-at-location": "{1} yerindeki {0} marketiniz donduruldu!", "denied-put-in-item": "&cBu öğeyi marketine koyamazsın!", - "how-many-buy-stack": "&aKaç yığın &bALMAK&a istediğini sohbete yaz. Her yığında &e{0}&a öğe var ve &e{1}&a yığın alabilirsin. Hepsini almak için &ball&a yaz.", - "how-many-sell-stack": "&aKaç yığın &bSATMAK&a istediğini sohbete yaz. Her yığında &e{0}&a öğe var ve &e{1}&a yığın alabilirsin. Hepsini almak için &ball&a yaz.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eİsim: &6{0}", "code": "&eKod: &6{0}", From 3ebfeba8c3b32f47f99fa529a2118067946e883e Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:09 +0800 Subject: [PATCH 076/725] New translations messages.json (Swedish) --- crowdin/lang/sv-SE/messages.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crowdin/lang/sv-SE/messages.json b/crowdin/lang/sv-SE/messages.json index 002d151ba0..dff733d05c 100644 --- a/crowdin/lang/sv-SE/messages.json +++ b/crowdin/lang/sv-SE/messages.json @@ -5,7 +5,8 @@ "translation-version": "Supportversion: Reremake", "translation-contributors": "Medhjälpare: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken och Andre_601", "translation-country": "Språkområde: Svenska (sv_SE)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cKunde inte hitta en QuickShop. Du måste titta på en.", "no-anythings-in-your-hand": "&cDet finns inget i din hand.", "no-permission": "&cDu har inte tillåtelse till att göra detta.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cIgnorerar ett butikslås!", "that-is-locked": "&cDenna butik är låst.", - "how-many-buy": "&aAnge i chatten, hur många du vill &bKÖPA&a. Du kan köpa &e{0}&a. Ange &ball&a för att köpa alla.", - "how-many-sell": "&aAnge i chatten, hur mycket du vill &dSÄLJA&a. Du har &{0}& tillgängliga. Ange &ball&a i chatten, för att sälja alla.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cDu får inte skapa en butik här.", "blacklisted-item": "&cDu kan inte sälja detta föremål eftersom det finns på svartlistan", "how-much-to-trade-for": "&aAnge i chatten, hur mycket du vill sälja &e{1}x {0}&a för.", @@ -127,7 +128,7 @@ "no-owner-given": "&cIngen ägare angiven", "new-owner": "&aNy ägare: &e{0}", "now-buying": "&dBUYING&a numera&e{0}", - "now-selling": "&bSELLING&a numera&e{0}", + "now-selling": "&bSÄLJER &anumera &e{0}", "cleaning": "&aTar bort tomma butiker...", "reloading": "&aKonfiguration laddad. &eVissa ändringar kan kräva omstart för att påverka. \n&7(Notis: Laddningsbeteende har ändrats efter 4.. 9.10, vi nu bara ladda om konfigurationen men inte hela plugin för att säkerställa att servern inte kraschar.)", "cleaned": "&aTog bort &{0}&a butiker.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cDu kan inte handla med denna butik eftersom den är fryst.", "shop-freezed-at-location": "&eDin butik {0} vid {1} blev frusen!", "denied-put-in-item": "&cDu kan inte lägga in detta objekt i din butik!", - "how-many-buy-stack": "&eAnge i chatten, hur många paket du vill &bKÖPA&a. Det finns &e{0}&a föremål i varje paket och du kan köpa &e{1}&a paket. Ange &ball&a i chatten för att köpa alla.", - "how-many-sell-stack": "&aAnge i chatten, hur många paket du vill &dSÄLJA&a. Det finns &e{0}&a föremål per paket och du har &e{1}&a paket tillgängliga. Ange &ball&a i chatten för att sälja alla.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNamn: &6{0}", "code": "&eKod: &6{0}", From db4df239e2932caa23f355188dec9b44a226e5dc Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:10 +0800 Subject: [PATCH 077/725] New translations messages.json (Serbian (Cyrillic)) --- crowdin/lang/sr-SP/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/sr-SP/messages.json b/crowdin/lang/sr-SP/messages.json index e8f4a107ab..355f5c6138 100644 --- a/crowdin/lang/sr-SP/messages.json +++ b/crowdin/lang/sr-SP/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 84d95227ade1c2c32f4e0edf0bc89781d996846e Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:11 +0800 Subject: [PATCH 078/725] New translations messages.json (Russian) --- crowdin/lang/ru-RU/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/ru-RU/messages.json b/crowdin/lang/ru-RU/messages.json index 13d686c998..a8d6a51692 100644 --- a/crowdin/lang/ru-RU/messages.json +++ b/crowdin/lang/ru-RU/messages.json @@ -5,7 +5,8 @@ "translation-version": "Поддерживаемая версия: Reremake", "translation-contributors": "Участники: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken и Andre_601", "translation-country": "Языковой регион: Русский (ru_RU)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cНе удалось найти блок для создания магазина. Вас нужно посмотреть.", "not-looking-at-shop": "&cНе удалось найти магазин, возможно не зарегистрирован.", "no-anythings-in-your-hand": "&cУ вас ничего нет в руках.", "no-permission": "&cУ вас нет прав.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "Обход блокировки магазина!", "that-is-locked": "&cЭтот магазин заперт.", - "how-many-buy": "&aВведите в чат, сколько вы хотите &bКУПИТЬ&a. У вас есть &e{0}&a доступных. Введите &ball&a чтобы купить на все.", - "how-many-sell": "&aВведите в чат, сколько вы хотите &dПРОДАТЬ&a. У вас есть &e{0}&a доступных. Введите &ball&a чтобы продать все.", + "how-many-buy": "&aВведите в чат, сколько вы хотите &bКУПИТЬ&a. Вы можете купить &e{0}&a. Введите &b{1}&a чтобы купить их все.", + "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}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cВы не можете торговать с этим магазином, потому что он заморожен.", "shop-freezed-at-location": "&eВаш магазин {0} на {1} был заморожен!", "denied-put-in-item": "&cВы не можете поместить этот товар в ваш магазин!", - "how-many-buy-stack": "&eВведите в чат, сколько массу вы хотите &bКУПИТЬ&а. &e{0} товар в каждой массой и вы можете купить за &e{1}&a. Введите &ball&a в чате, чтобы купить все.", - "how-many-sell-stack": "&eВведите в чат, сколько массу вы хотите &bПРОДАТЬ&а. &e{0} товар в каждой массой и вы можете продать за &e{1}&a. Введите &ball&a в чате, чтобы купить все.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eИмя: &6{0}", "code": "&eКод: &6{0}", From 061e014a2b1c7fcf66f5af77e0e8e8d30c53e207 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:12 +0800 Subject: [PATCH 079/725] New translations messages.json (Portuguese) --- crowdin/lang/pt-PT/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/pt-PT/messages.json b/crowdin/lang/pt-PT/messages.json index f6b3a929af..9f07f977c3 100644 --- a/crowdin/lang/pt-PT/messages.json +++ b/crowdin/lang/pt-PT/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&Não tens nada na mão.", "no-permission": "&cNão tens permissão para fazer isso.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From e7909408fb46928b56d2eaab78242dd53b6a2922 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:13 +0800 Subject: [PATCH 080/725] New translations messages.json (Polish) --- crowdin/lang/pl-PL/messages.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crowdin/lang/pl-PL/messages.json b/crowdin/lang/pl-PL/messages.json index bf180a7311..59e99d605b 100644 --- a/crowdin/lang/pl-PL/messages.json +++ b/crowdin/lang/pl-PL/messages.json @@ -5,7 +5,8 @@ "translation-version": "Wspierana wersja: Reremake", "translation-contributors": "Współtwórcy: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken i Andre_601", "translation-country": "Język: Polski (pl_PL)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cNie można znaleźć QuickShop. Musisz na niego patrzeć.", "no-anythings-in-your-hand": "&cW twojej ręce nic nie ma.", "no-permission": "&cNie masz uprawnień, aby to zrobić.", @@ -93,7 +94,7 @@ "stored-enchants": "&5Przechowywane Enchanty", "shop-information": "&aInfo:", "owner": "&aWłaściciel: {0}", - "item": "&aItem: &e{0}", + "item": "&aPrzedmiot: &e{0}", "item-holochat-error": "&c[Error]", "preview": "&b[Podgląd przedmiotu]", "space": "&aMiejsce: &e{0}", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cOmijanie blokady QuickShop!", "that-is-locked": "&cTen sklep jest zablokowany.", - "how-many-buy": "&aWpisz ilość jaką chcesz &bKUPIĆ&a na czacie. Możesz kupić &e{0}&a. Wpisz &ball&a, jeśli chcesz kupić wszystko.", - "how-many-sell": "&aWpisz ilość jaką chcesz &dSPRZEDAĆ&a na chat. Posiadasz &e{0}&a przedmiotów. Wpisz &ball&a, jeśli chcesz sprzedać wszystko.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cTu nie zrobisz sklepu.", "blacklisted-item": "&cNie możesz sprzedać tego przedmiotu, ponieważ znajduje się na czarnej liście", "how-much-to-trade-for": "&aWpisz na czacie cenę za &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cNie możesz handlować z tym sklepem, ponieważ jest zamrożony.", "shop-freezed-at-location": "&eTwój sklep {0} w {1} został zamrożony!", "denied-put-in-item": "&cNie możesz umieścić tego przedmiotu w swoim sklepie!", - "how-many-buy-stack": "&eWejdź na czat, ile jednostek chcesz &bBUY&a. &Istnieją &{0} przedmioty w każdym zbiorze i możesz kupić &{1} luzek. Wprowadź &ball&na czacie, aby kupić wszystko.", - "how-many-sell-stack": "&aWejdź na czat, ile chcesz do &dSELL&a. Istnieje &{0} przedmiotów &luzem i masz &{1} luzem. Wprowadź &ball&na czacie, aby sprzedać wszystkie.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNazwa: &6{0}", "code": "&eKod: &6{0}", From 88b8b6d731be33ba593abc90ded2c77d586581ab Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:14 +0800 Subject: [PATCH 081/725] New translations messages.json (Norwegian) --- crowdin/lang/no-NO/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/no-NO/messages.json b/crowdin/lang/no-NO/messages.json index dce6f3eb5a..5ea6911012 100644 --- a/crowdin/lang/no-NO/messages.json +++ b/crowdin/lang/no-NO/messages.json @@ -5,7 +5,8 @@ "translation-version": "Støttet versjon: Reremake", "translation-contributors": "Bidragsytere: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Språksone: Norsk (no_NO)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cKunne ikke finne en QuickShop. Du må se på en butikk.", "no-anythings-in-your-hand": "&cDet er ingenting i hånden din.", "no-permission": "&cDu har ikke tillatelse til å gjøre det.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cIgnorerer en QuickShop lås!", "that-is-locked": "&cDenne butikken er låst.", - "how-many-buy": "&aSkriv i chat hvor mange du ønsker å &bKJØPE&a. Du kan kjøpe maks &e{0}&a. Skriv &ball&a om du vil kjøpe alle.", - "how-many-sell": "&aSkriv i chat hvor mange du ønsker å &dSELGE&a. Du har &e{0}&a tilgjengelig. Skriv &ball&a for å selge alle.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cDu kan ikke opprette en butikk her.", "blacklisted-item": "&cDu kan ikke selge denne gjenstanden fordi den er på svartelisten", "how-much-to-trade-for": "&aSkriv i chat hvor mye du ønsker å selge &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cDu kan ikke handle med denne butikken fordi den er frosset.", "shop-freezed-at-location": "&eDin butikk {0} på {1} ble frosset!", "denied-put-in-item": "&cDu kan ikke legge denne varen i butikken din!", - "how-many-buy-stack": "&eSkriv i chat hvor mange pakker du ønsker å &bKJØPE&a. Det er &e{0}&a varer i hver pakke og du kan kjøpe totalt &e{1}&a pakker. Skriv &ball&a om du vil kjøpe alle.", - "how-many-sell-stack": "&eSkriv i chat hvor mange pakker du ønsker å &bSELGE&a. Det er &e{0}&a varer i hver pakke og du har &e{1}&a pakker tilgjengelig. Skriv &ball&a om du vil selge alle.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNavn: &6{0}", "code": "&eKode: &6{0}", From a599cfba2b0d4f4ed65d7a265e159ead84bafba5 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:14 +0800 Subject: [PATCH 082/725] New translations messages.json (Korean) --- crowdin/lang/ko-KR/messages.json | 55 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/crowdin/lang/ko-KR/messages.json b/crowdin/lang/ko-KR/messages.json index 7b6899e0c9..e4a95d75c3 100644 --- a/crowdin/lang/ko-KR/messages.json +++ b/crowdin/lang/ko-KR/messages.json @@ -1,11 +1,12 @@ { "_comment": "안녕하세요 번역가님! 만약 당신이 깃헙이나 소스코드에서 번역 중이라면 다음 사이트를 가보시기 바래요! https://crowdin.com/project/quickshop-reremake", "file-test": "이것은텍스트파일일까요? 한국어 일까yo? :)", - "translation-author": "번역: Chicki_yeah(번역에 이상한 부분이 있다면 치키이예#0032로 연락해주시면 수정하겠습니다.), jho5245, Kim dong kwon, Ppag", + "translation-author": "번역: Chicki_yeah(번역에 이상한 부분이 있다면 치키이예#0032로 연락해주시면 수정하겠습니다.)", "translation-version": "지원 버전: Reremake", "translation-contributors": "기여자: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "언어 지역: 한국어 (ko_KR)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&c상점을 만들수 잇는 블럭을 찾을수 없습니다. 상점으로 만들 블럭을 봐야합니다.", "not-looking-at-shop": "&c상점을 찾을수 없습니다. 상점을 보고있어야만 합니다.", "no-anythings-in-your-hand": "&c당신의 손에 아무것도 없습니다.", "no-permission": "&c당신에게는 이것을 사용할 권한이 없습니다.", @@ -15,32 +16,32 @@ "no-creative-break": "&c크리에이티브 모드 상태론 다른 플레이어의 상점을 파괴할 수 없습니다, 서바이벌 모드로 전환하거나 슈퍼툴 {0} 을(를) 사용해주세요.", "trading-in-creative-mode-is-disabled": "&c크리에이티브 모드 상태에서는 상점에서 거래할 수 없습니다.", "supertool-is-disabled": "&c슈퍼툴이 비활성화 되어있습니다. 어느 상점도 부술 수 없습니다.", - "no-double-chests": "&c당신은 큰상자(일반 상자를 두개붙인)를 이용한 상점을 만들 수 없습니다.", + "no-double-chests": "&c당신은 큰상자(일반 상자를 두개붙인)를 이용한 상점을 만들 수 없습니다. (권한 부족입니다.)", "not-managed-shop": "&c당신은 상점의 주인이나 관리자가 아닙니다", "shop-already-owned": "&c이것은 이미 상점입니다.", "chest-was-removed": "&c상자는 제거되었습니다.", "price-too-cheap": "&c가격은 반드시 &e${0} 원 &c보다 높아야만 합니다.", "no-price-change": "&c입력한 금액이 이전 가격과 똑같습니다. 금액을 변경 하려면 다른 금액을 입력해주세요.", "you-cant-afford-a-new-shop": "&c새 상점 생성에 {0} 원이 소모됩니다!", - "player-bought-from-your-store-tax": "&c{0} 님이 유저님의 상점 에서 {1} {2} 을(를) 구입했으며 당신은 {3} 원 을(를) 얻으셨습니다! (세금 : {4}원)", + "player-bought-from-your-store-tax": "&c{0} 님이 상점 에서 {2} 을(를) {1}개 구입했으며 {3} 원 을(를) 얻으셨습니다! (세금 : {4}원)", "you-cant-afford-to-change-price": "&c상점 물품의 가격을 변경할때 {0} 원이 소모됩니다.", "success-created-shop": "&c상점이 정상적으로 생성되었습니다.", "success-removed-shop": "&a상점을 제거했습니다.", "shops-arent-locked": "&c기억하세요, 상점은 도둑질로부터 보호되지 &4&l않습니다!!! &c도둑질로부터 보호하고 싶으면 잠금 플러그인을 이용하여 상자를 잠궈주세요!", "shop-creation-cancelled": "&c상점 생성이 취소되었습니다.", "shop-purchase-cancelled": "&c구입이 취소되었습니다.", - "shop-stock-too-low": "&c상점에는 오직 {0} {1} 개의 상품이 남아 있습니다!", - "you-cant-afford-to-buy": "&c비용은 {0} 원 이지만, 당신은 {1} 원 만 가지고 있습니다. (잔액이 모자랍니다.)", - "negative-amount": "&c갯수는 음수일수 없습니다. 양수로 입력해주세요.", - "not-a-number": "&c당신은 숫자만을 입력해야하지만 {0} 을 입력하였습니다.", + "shop-stock-too-low": "&c상점에는 오직 {0} 개의 {1} 만 남아 있습니다!", + "you-cant-afford-to-buy": "&c가격은 {0} 원 이지만, 당신은 {1} 원 만 가지고 있습니다. (잔액이 모자랍니다.)", + "negative-amount": "&c갯수는 음수(-)일수 없습니다. 양수로 입력해주세요. (숫자만 입력해주세요.)", + "not-a-number": "&c당신은 숫자만 입력해야하지만 {0} 을(를) 입력하였습니다.", "exceeded-maximum": "&c자바에서 허용하는 최대 값을 초과했습니다.", - "not-a-integer": "&c당신은 숫자만을 입력해야하지만 {0} 을 입력하였습니다.", + "not-a-integer": "&c당신은 숫자만 입력해야하지만 {0} 을(를) 입력하였습니다.", "player-bought-from-your-store": "&c{0} 님이 당신의 상점 에서 {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} 밖에 없습니다.", + "shop-has-no-space": "&c{1} 의 공간은 {0} 칸만 있습니다.", + "you-dont-have-that-many-items": "&c{1} 개를 판매하기엔 갯수가 모자랍니다. 소유중 갯수 {0}", "the-owner-cant-afford-to-buy-from-you": "&c비용은 {0} 이지만, 상점의 주인이 {1} 원을 가지고 있습니다. (상점 주인의 잔액이 부족합니다.)", - "player-sold-to-your-store": "&a{0} 님이 {1} {2} 을 (를) 유저님의 상점에 판매했습니다.", + "player-sold-to-your-store": "&a{0} 님이 {2} {1} 개을 (를) 유저님의 상점에 판매했습니다.", "shop-out-of-space": "&5유저님의 {0}, {1}, {2} 에 있는 상점이 가득 찼습니다. 더 이상 구매할 수 없습니다! 계속 구매를 원하신다면 상자를 비워주세요!", "fee-charged-for-price-change": "&a가격 변경비&c{0} 원을 &a지불 하였습니다.", "price-is-now": "&a새로운 상점의 가격은 &e{0}&a입니다.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&a QuickShop의 잠금을 무시합니다!", "that-is-locked": "&c이 상점은 잠겨있습니다.", - "how-many-buy": "&a채팅으로 원하는 &b구매&a 개수를 입력해주세요. 당신은 &e{0}&a개를 구매할 수 있습니다. &ball&a을 입력해 전부 구매 가능합니다.", - "how-many-sell": "&a채팅으로 원하는 &b판매&a 개수를 입력해주세요. 당신은 &e{0}&a개를 판매할 수 있습니다. &ball&a을 입력해 전부 판매 할 수 있습니다.", + "how-many-buy": "&a채팅으로 원하는 &b구매&a 개수를 입력해주세요. 당신은 &e{0}&a개를 구매할 수 있습니다. &b{1}&a을 입력해 전부 구매 가능합니다.", + "how-many-sell": "&a채팅으로 원하는 &b판매&a 개수를 입력해주세요. 당신은 &e{0}&a개를 판매할 수 있습니다. &b{1}&a을 입력해 전부 판매 할 수 있습니다.", "not-allowed-to-create": "&c 당신은 이곳에 상점을 만들수 없습니다.", "blacklisted-item": "&c당신은 이아이템을 판매할수 없습니다. 블랙리스트에 등록되어있는 아이템입니다.", "how-much-to-trade-for": "&a채팅에 {0}의 {1}개당 가격을 얼마로 할건지 입력해주세요.", @@ -187,11 +188,11 @@ "signs": { "selling": "&6판매 {0} 개", "stack-selling": "&6판매중 {0} 개", - "header": "{1}{0}", + "header": "{1}{0}의 상점", "buying": "&b구매 {0} 개", "stack-buying": "&b구매중 {0} 개", - "item-left": "&f", - "item-right": "&f", + "item-left": "", + "item-right": "", "price": "개당 {0}", "stack-price": "아이템 {2}, {1} 개당 {0}원", "unlimited": "무제한", @@ -243,9 +244,9 @@ "failed": "&c✘" }, "tabcomplete": { - "price": "[가격]", - "range": "[범위]", - "amount": "[수량]", + "price": "[price]", + "range": "[range]", + "amount": "[amount]", "currency": "[통화명]", "item": "[item]" }, @@ -274,11 +275,11 @@ ], "remote-disable-warning": "이 버전의 QuickShop은 원격 서버에 의해 비활성화되어 있습니다. 이 버전에는 심각한 문제가 있을 수 있습니다. SpigotMC 페이지에서 자세한 내용을 확인하십시오 : {0}.이 경고는 당신이 안정된 버전을 사용할 때까지 뜰 것입니다. 서버 구동에는 영향을 주지 않습니다.", "label": { - "unstable": "[불안정함]", - "stable": "[안정됨]", - "lts": "[장기 지원 버전]", - "qualityverifyed": "[품질]", - "github": "[깃헙(GitHub)]", + "unstable": "[불안정함] [Unstable]", + "stable": "[안정됨] [Stable]\n", + "lts": "[장기 지원 버전] [LTS]", + "qualityverifyed": "[품질] [Quality]", + "github": "[깃헙(GitHub)] [GitHub]", "spigotmc": "[SpigotMC]", "bukkitdev": "[BukkitDev]", "master": "[Master]" @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&c이 상점은 얼어있기때문에 거래할 수 없습니다.", "shop-freezed-at-location": "&e당신의 상점 {1} 에 있는 {0} 이 얼었습니다!", "denied-put-in-item": "&c당신은 이아이템을 당신에 상점에 넣을수 없습니다!!", - "how-many-buy-stack": "&e채팅에 입력하세요, 묶음을 얼마나 &b구매&a할것인지 &e{0}&a 개의 아이템의 하나의 묶음마다 들어있으며 당신은 &e{1}&a개의 묶음을 구매할수 있습니다 &ball&a을 입력하여 모두 구매할수 있습니다", - "how-many-sell-stack": "&e채팅에 입력하세요, 묶음을 얼마나 &d판매&a할것인지 &e{0}&a 개의 아이템의 하나의 묶음마다 들어있으며 당신은 &e{1}&a개의 묶음을 가지고 있습니다 &ball&a을 입력하여 모두 판매할수 있습니다", + "how-many-buy-stack": "&e채팅에 입력하세요, 묶음을 얼마나 &b구매&a할것인지 &e{0}&a 개의 아이템의 하나의 묶음마다 들어있으며 당신은 &e{1}&a개의 묶음을 구매할수 있습니다 &b{2}&a을 입력하여 모두 구매할수 있습니다", + "how-many-sell-stack": "&e채팅에 입력하세요, 묶음을 얼마나 &d판매&a할것인지 &e{0}&a 개의 아이템의 하나의 묶음마다 들어있으며 당신은 &e{1}&a개의 묶음을 가지고 있습니다 &b{2}&a을 입력하여 모두 판매할수 있습니다", "language": { "name": "&e이름: &6{0}", "code": "&e코드: &6{0}", From 19b206b23876f9c85f31bf24cb85e823e8efd043 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:16 +0800 Subject: [PATCH 083/725] New translations messages.json (French) --- crowdin/lang/fr-FR/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/fr-FR/messages.json b/crowdin/lang/fr-FR/messages.json index 31fc00db68..206e0ddd3e 100644 --- a/crowdin/lang/fr-FR/messages.json +++ b/crowdin/lang/fr-FR/messages.json @@ -5,7 +5,8 @@ "translation-version": "Version suportée: Reremake", "translation-contributors": "Contributeurs : Timtower, Netherfoam, KaiNoMood, Mgazul, JackThePicken, Andre_601 et brunopaiva15, HiiRaZ", "translation-country": "Langue: Français (fr_FR)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cImpossible de trouver un QuickShop. Vous devez en regarder un.", "no-anythings-in-your-hand": "&cVous n'avez aucun objet dans votre main.", "no-permission": "&cVous n'avez pas la permission de faire ceci.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cContournement d'un verrou de QuickShop!", "that-is-locked": "&cCette boutique est verouillée.", - "how-many-buy": "&aEntrez le nombre d'objets que vous souhaitez &bACHETER&a dans le chat. Vous en avez &e{0}&a dans votre inventaire. Entrez &ball&a pour tous les acheter.", - "how-many-sell": "&aEntrez le nombre d'objets que vous souhaitez &bVENDRE&a dans le chat. Vous en avez &e{0}&a dans votre inventaire. Entrez &ball&a pour tous les vendre.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cVous ne pouvez pas créer un shop ici.", "blacklisted-item": "&cVous ne pouvez pas vendre cet objet car il se trouve sur la liste noire", "how-much-to-trade-for": "&aEntrez dans le chat, combien vous souhaitez échanger &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cVous ne pouvez pas échanger avec cette boutique car elle est gelée.", "shop-freezed-at-location": "&eVotre boutique {0} à {1} a été gelée!", "denied-put-in-item": "&cVous ne pouvez pas mettre cet objet dans votre boutique!", - "how-many-buy-stack": "&eEntrez dans le tchat, combien de blocs vous souhaitez &bACHETER&a. Il y a &e{0}&a articles dans chaque vrac et vous pouvez acheter &e{1}&a vrac. Entrez &ball&a dans le chat pour tout acheter.", - "how-many-sell-stack": "&eEntrez dans le chat, combien de blocs vous souhaitez &bACHETER&a. Il y a &e{0}&a articles dans chaque vrac et vous pouvez acheter &e{1}&a vrac. Entrez &ball&a dans le chat pour tout acheter.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNom: &6{0}", "code": "&eNom: &6{0}", From 549592335c0fc69c2d2e2c81f49fd15bddfc8e67 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:17 +0800 Subject: [PATCH 084/725] New translations messages.json (Japanese) --- crowdin/lang/ja-JP/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/ja-JP/messages.json b/crowdin/lang/ja-JP/messages.json index f1401c89a9..3980d77329 100644 --- a/crowdin/lang/ja-JP/messages.json +++ b/crowdin/lang/ja-JP/messages.json @@ -5,7 +5,8 @@ "translation-version": "&c&lサポートバージョン: &b&lReremake", "translation-contributors": "貢献者: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken, Andre_601 and Namiu", "translation-country": "&c&l言語圏: &b&l日本語 (ja_JP)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cQuickShopが見つかりませんでした。確認する必要があります。", "no-anythings-in-your-hand": "&cあなたは手に何も持っていません。", "no-permission": "&cあなたは権限を持っていないため実行できません。", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cQuickShopロックをバイパスします!", "that-is-locked": "&cこのショップはロックされています。", - "how-many-buy": "&aチャットで&b購入&aしたい個数を入力してください。&e{0} 個&a 購入できます。&ball&aで全て購入", - "how-many-sell": "&aチャットで&d売却&aしたい個数を入力してください。&e{0} 個&a所持しています。&ball&aで全て売却", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cあなたはここでショップを作る事ができません", "blacklisted-item": "&cブラックリストに載っているので、この商品を販売することはできません", "how-much-to-trade-for": "&aチャットで&e{1}個の {0}&aをいくらで取引したいか入力してください。", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&c凍結されているため、このショップと取引できません。", "shop-freezed-at-location": "&e {0} のショップ {1} が凍結されました!", "denied-put-in-item": "&cショップにこのアイテムを入れることはできません!", - "how-many-buy-stack": "&eチャットで&b購入&aしたい商品の数を入力して下さい。1つの商品に &e{0} 個&a のアイテムが含まれており、あなたは&e{1} つ&a の商品を購入することができます。すべて購入するにはチャットで &ball&a と入力して下さい。", - "how-many-sell-stack": "&eチャットで&b売却&aしたい商品の数を入力して下さい。1つの商品に &e{0} 個&a のアイテムが含まれており、あなたは&e{1} つ&a の商品を売却することができます。すべて売却するにはチャットで &ball&a と入力して下さい。", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&e名前: &6{0}", "code": "&eコード: &6{0}", From df476d2cc92dda65e46d3c562b846b9addb20420 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:18 +0800 Subject: [PATCH 085/725] New translations messages.json (Italian) --- crowdin/lang/it-IT/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/it-IT/messages.json b/crowdin/lang/it-IT/messages.json index 3287d3a88c..b020cdc808 100644 --- a/crowdin/lang/it-IT/messages.json +++ b/crowdin/lang/it-IT/messages.json @@ -5,7 +5,8 @@ "translation-version": "Versione di Supporto: Reremake", "translation-contributors": "Collaboratori: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (it_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cImpossibile trovare un negozio. È necessario guardarne uno.", "no-anythings-in-your-hand": "&cNon hai nulla in mano.", "no-permission": "&cNon hai il permesso per farlo.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassa un blocco QuickShop!", "that-is-locked": "&cQuesto negozio è bloccato.", - "how-many-buy": "&aScrivi in chat, quanti vuoi &bCOMPRARE&a. Puoi comprare &e{0}&a. Scrivi &ball&a per comprarli tutti.", - "how-many-sell": "&aScrivi in chat, quanti vuoi a &dVENDERE&. Hai &e{0}&a disponibile. Scrivi &ball&a in chat, per venderne tutti.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNon puoi creare un negozio qui.", "blacklisted-item": "&cNon puoi vendere questo oggetto perché è nella blacklist", "how-much-to-trade-for": "&aScrivi in chat, per quanto desideri fare trading &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cNon puoi operare con questo negozio perché è congelato.", "shop-freezed-at-location": "&eIl tuo negozio {0} a {1} è stato congelato!", "denied-put-in-item": "&cNon puoi mettere questo oggetto nel tuo negozio!", - "how-many-buy-stack": "&eScrivi in chat, quale è la quantità di massa per &bACQUISTARE&a. Ci sono &e{0}&a oggetti in ogni massa e puoi comprare &e{1}&a masse. Inserisci &ball&a in chat per comprare tutto.", - "how-many-sell-stack": "&eScrivi in chat, quale è la quantità di massa per &bVENDERE&a. Ci sono &e{0}&a oggetti in ogni massa e puoi comprare &e{1}&a masse. Inserisci &ball&a in chat per vendere tutto.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNome: &6{0}", "code": "&eCodice: &6{0}", From 8c1da4b39c04e8b1dbf3c891c76178a734fe20d3 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:19 +0800 Subject: [PATCH 086/725] New translations messages.json (Hungarian) --- crowdin/lang/hu-HU/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/hu-HU/messages.json b/crowdin/lang/hu-HU/messages.json index 6fac070b60..0f45240212 100644 --- a/crowdin/lang/hu-HU/messages.json +++ b/crowdin/lang/hu-HU/messages.json @@ -5,7 +5,8 @@ "translation-version": "Támogatott Verzió: Reremake", "translation-contributors": "Közreműködők: Timtower, Netherfoam, KaiNoMood and Mgazul", "translation-country": "Nyelv Zóna: Magyar (hu_HU)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cEz nem egy bolt amire nézel.", "no-anythings-in-your-hand": "&cNincs semmi a kezedben.", "no-permission": "&cNincs jogod ehhez!", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cA &agyorsbolt&c zárva van", "that-is-locked": "&cEz a bolt le van zárva.", - "how-many-buy": "&aÍrd be, hogy mennyit szeretnél &bvenni&a a chatre. Tudsz venni &e{0}t&a. Írd be azt, hogy &ball&a, ha meg szeretnéd venni az összeset.", - "how-many-sell": "&aÍrd be, hogy mennyit szeretnél &deladni&a a chatre. Neked összesen van:&e{0}d&a. Írd be, hogy &ball&a, ha el szeretnéd adni az összeset.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNem tudsz boltot létrehozni itt.", "blacklisted-item": "&cEz a tárgy a feketelistán van! Nem tudod eladni!", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop cause it under freezing.", "shop-freezed-at-location": "&eA te boltod: {0}, itt: {1}, le lett fagyasztva!", "denied-put-in-item": "&cThis item cannot put in this shop!", - "how-many-buy-stack": "&aEnter how many bulks you wish to &bBUY&a in chat. There have &e{0}&a items in each bulk and You can buy &e{1}&a bulks. Enter &ball&a to buy them all.", - "how-many-sell-stack": "&aEnter how many bulks you wish to &dSELL&a in chat. There have &e{0}&a items in each bulk and You have &e{1}&a bulks available. Enter &ball&a to sell them all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&aNév: &6{0}", "code": "&eKód: &6{0}", From 41229daae54ada581450e08b73b2c004f7fcbab0 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:19 +0800 Subject: [PATCH 087/725] New translations messages.json (Hebrew) --- crowdin/lang/he-IL/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/he-IL/messages.json b/crowdin/lang/he-IL/messages.json index e8f4a107ab..355f5c6138 100644 --- a/crowdin/lang/he-IL/messages.json +++ b/crowdin/lang/he-IL/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 9e86aa7289ada9c973f29ad523440f220c0e9c7e Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:21 +0800 Subject: [PATCH 088/725] New translations messages.json (Finnish) --- crowdin/lang/fi-FI/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/fi-FI/messages.json b/crowdin/lang/fi-FI/messages.json index 7e6292f989..9f6f0834d7 100644 --- a/crowdin/lang/fi-FI/messages.json +++ b/crowdin/lang/fi-FI/messages.json @@ -5,7 +5,8 @@ "translation-version": "Tuettu versio: Reremake", "translation-contributors": "Avustajat: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Kielialue: Suomi (fi_FI)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cQuickShoppia ei löytynyt. Sinun täytyy katsoa yhtä.", "no-anythings-in-your-hand": "&cKädessäsi ei ole mitään.", "no-permission": "&cSinulla ei ole oikeutta tehdä noin.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cOhitetaan QuickShop lukitus!", "that-is-locked": "&cTämä kauppa on lukossa.", - "how-many-buy": "&aKirjoita chattiin, kuinka monta haluat &bOSTAA&a. Voit ostaa &e{0}&a. Kirjoita &ball&a ostaaksesi kaiken.", - "how-many-sell": "&aKirjoita chattiin, kuinka monta haluat &bMYYDÄ&a. Sinulla on &e{0}&a saatavilla. Kirjoita &ball&a myydäksesi kaiken.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cEt luultavasti voi luoda kauppaa tänne.", "blacklisted-item": "&cEt voi myydä tätä tavaraa, koska se on mustalla listalla", "how-much-to-trade-for": "&aKirjoita chattiin, mihin hintaan haluat vaihtaa &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cEt voi vaihtaa tämän kaupan kanssa, koska se on jäässä.", "shop-freezed-at-location": "&eKauppasi {0} {1} jäätyi!", "denied-put-in-item": "&cEt voi laittaa tätä tavaraa kauppaasi!", - "how-many-buy-stack": "&eKirjoita chattiin, kuinka monta bulkkitavaraa haluat &bOSTAA&a. Yhdessä bulkissa on &e{0}&a tavaraa ja voit ostaa &e{1}&a bulkkia. Kirjoita chattiin &ball&a ostaaksesi kaiken.", - "how-many-sell-stack": "&eKirjoita chattiin, kuinka monta bulkkitavaraa haluat &bMYYDÄ&a. Yhdessä bulkissa on &e{0}&a tavaraa ja sinulla on &e{1}&a bulkkia käytössä. Kirjoita chattiin &ball&a myydäksesi kaiken.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNimi: &6{0}", "code": "&eKoodi: &6{0}", From abc4a1b02b8f58d04f8c722e88ae63220a20e03a Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:22 +0800 Subject: [PATCH 089/725] New translations messages.json (Greek) --- crowdin/lang/el-GR/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/el-GR/messages.json b/crowdin/lang/el-GR/messages.json index e8f4a107ab..355f5c6138 100644 --- a/crowdin/lang/el-GR/messages.json +++ b/crowdin/lang/el-GR/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From d205c9a95b9dda3978642e086dba67452cc1a76d Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:22 +0800 Subject: [PATCH 090/725] New translations messages.json (German) --- crowdin/lang/de-DE/messages.json | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/crowdin/lang/de-DE/messages.json b/crowdin/lang/de-DE/messages.json index 458564ca3a..b6d32f97c6 100644 --- a/crowdin/lang/de-DE/messages.json +++ b/crowdin/lang/de-DE/messages.json @@ -5,7 +5,8 @@ "translation-version": "Unterstütze Version: Reremake", "translation-contributors": "Mitwirkende: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken und Andre_601", "translation-country": "Sprache: Deutsch (de_DE)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cKonnte keinen QuickShop finden. Du musst auf einen schauen.", "no-anythings-in-your-hand": "&cEs befindet sich nichts in deiner Hand.", "no-permission": "&cDu hast keine Berechtigung um das zu tun.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cUmgehe eine QuickShop Sicherung!", "that-is-locked": "&cDieser Shop ist geschützt.", - "how-many-buy": "&aSchreibe in den Chat, wieviele du &bKAUFEN&a möchtest. Du kannst &e{0}&a Stück kaufen. Gib &ball&a ein um alle zu kaufen.", - "how-many-sell": "&aSchreibe in den Chat, wieviele du &dVERKAUFEN&a willst. Du hast &e{0}&a verfügbar. Gib &ball&a in den Chat ein um alles zu verkazfen.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cDu kannst hier keinen Shop erstellen.", "blacklisted-item": "&cDu kannst dieses Item nicht verkaufen, da es auf der schwarzen Liste steht", "how-much-to-trade-for": "&aGib im Chat ein, für wieviel du {1}x &e{0}&a handeln willst.", @@ -162,7 +163,7 @@ "paste": "&eLädt Serverdaten zu Pastebin hoch", "staff": "&eVerwalte deine Shopmitarbeiter", "remove": "&eEntfernt den Shop, den du ansiehst", - "amount": "&eZum Festlegen der Itenanzahl (Nützlich bei Chatproblemen)", + "amount": "&eZum Festlegen der Itemanzahl (Nützlich bei Chatproblemen)", "about": "&eZeigt QuickShop Informationen", "help": "&eZeigt QuickShop-Hilfe", "item": "&eÄndert das Shopitem eines Shops", @@ -194,7 +195,7 @@ "item-right": "", "price": "{0} p. St.", "stack-price": "{0} pro {1}x {2}", - "unlimited": "Unlimitiert ", + "unlimited": "Unlimitiert", "status-available": "&a", "status-unavailable": "&c", "out-of-stock": "Ausverkauft", @@ -219,8 +220,8 @@ "empty-hover": "&eKlicke hier um den Shop zu leeren.", "remove": "&c&l[Shop entfernen]", "remove-hover": "&eKlicke um diesen Shop zu entfernen.", - "stack": "&aPro Menge: &b{0} &e[&d&lChange&e]", - "stack-hover": "&eKlicke um die Anzahl an Items pro Menge zu ändern. Setze es zu 1 für normales Verhalten.", + "stack": "&aMengeneinheit: &b{0} &e[&d&lÄndern&e]", + "stack-hover": "&eKlicke um die Anzahl an Items pro Mengeneinheit zu ändern. Setze es zu 1 für normales Verhalten.", "item": "&aShopitem: {0} &e[&d&lÄndern&e]", "item-hover": "&eKlicke, um das Shopitem zu ändern", "currency": "&aWährung: &b{0} &e[&d&lÄndern&e]", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cDu kannst mit diesem Shop nicht handeln, da er eingefroren ist.", "shop-freezed-at-location": "&eDein Shop {0} bei {1} wurde eingefroren!", "denied-put-in-item": "&cDu kannst dieses Item nicht in deinen Shop setzen!", - "how-many-buy-stack": "&aGib im Chat ein, wie viele Mengen du &bKAUFEN&a möchtest. Es gibt &e{0}&aItems pro Menge und du kannst &e{1}&a Mengen kaufen. Gib &ball&a ein um alle zu kaufen.", - "how-many-sell-stack": "&aGib im Chat ein, wie viele Mengen du &bVERKAUFEN&a möchtest. Es gibt &e{0}&aItems pro Menge und du kannst &e{1}&a Mengen kaufen. Gib &ball&a ein um alle zu kaufen.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 7c0dac8e77880bbb305a6d64fbac14d469a507bf Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:23 +0800 Subject: [PATCH 091/725] New translations messages.json (Danish) --- crowdin/lang/da-DK/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/da-DK/messages.json b/crowdin/lang/da-DK/messages.json index c75ee124a1..c01ed8a66a 100644 --- a/crowdin/lang/da-DK/messages.json +++ b/crowdin/lang/da-DK/messages.json @@ -5,7 +5,8 @@ "translation-version": "Supportversion: Reremake", "translation-contributors": "Bidragydere: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken og Andre_601", "translation-country": "Sprogzone: dansk (da_DA)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cKunne ikke finde en QuickShop. Du skal kigge på en.", "no-anythings-in-your-hand": "&cDer er intet i din hånd.", "no-permission": "&cDu har ikke rettighederne til at gøre dette.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From e7c2bafe0fb3a8fb66aa9b6c6738ca80ec0d8a9d Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:24 +0800 Subject: [PATCH 092/725] New translations messages.json (Czech) --- crowdin/lang/cs-CZ/messages.json | 401 ++++++++++++++++--------------- 1 file changed, 201 insertions(+), 200 deletions(-) diff --git a/crowdin/lang/cs-CZ/messages.json b/crowdin/lang/cs-CZ/messages.json index c12b2d577b..24327006b2 100644 --- a/crowdin/lang/cs-CZ/messages.json +++ b/crowdin/lang/cs-CZ/messages.json @@ -1,11 +1,12 @@ { - "_comment": "Ahoj překladateli! Pokud toto upravujeteš z Githubu nebo ze zdrojového kódu, měl bys mrknout na https://crowdin.com/project/quickshop-reremake", - "file-test": "Toto je zkušební textový soubor. Používáme jej k testování, pokud jde o zprávy .json je rozbitý. Můžete jej vyplnit jakýmkoliv východním vejci, které se vám zde líbí :)", - "translation-author": "Translator: Ghost_chu, Andre_601, LixCisCZ", - "translation-version": "Verze: Reremake", + "_comment": "Ahoj překladateli! Pokud toto upravuješ z Githubu nebo ze zdrojového kódu, měl bys mrknout na https://crowdin.com/project/quickshop-reremake", + "file-test": "Toto je zkušební textový soubor. Používáme jej k testování, pokud jde o zprávy json je rozbitý. Můžete jej vyplnit jakýmkoliv východním vejci, které se vám zde líbí :)", + "translation-author": "Translator: Ghost_chu, Andre_601", + "translation-version": "Podpora verze: Reremake", "translation-contributors": "Přispěli: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Jazyková Zóna: Czech (cs_CZ)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cNelze najít QuickShop. Musíš se na něj podívat.", "no-anythings-in-your-hand": "&cNemáš v ruce žádný předmět.", "no-permission": "&cNa tuto akci nemáš práva.", @@ -34,162 +35,162 @@ "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ě.", - "not-a-integer": "&cMužeš zadat pouze celé číslo, zadal jsi {0}.", - "player-bought-from-your-store": "&c{0} zakoupen {1} {2} z tvého obchodu a ty jsi zaplatil {3} na daních.", - "shop-out-of-stock": "&5Váš obchod v {0}, {1}, {2}, vyčerpal {3}!", - "shop-has-no-space": "&cObchod má pouze místo pro {0} více {1}.", - "you-dont-have-that-many-items": "&cMáš pouze {0} {1}.", - "the-owner-cant-afford-to-buy-from-you": "&cTohle stojí {0}, ale vlastník má pouze {1}", - "player-sold-to-your-store": "&a{0} prodala {1} {2} do tvého obchodu.", - "shop-out-of-space": "&5Tvůj obchod v {0}, {1}, {2}, je nyní plný.", - "fee-charged-for-price-change": "&aZaplatili jste &c{0}&a za změnu ceny.", - "price-is-now": "&aNová cena obchodu je &e{0}", - "thats-not-a-number": "&cNeplatné číslo", - "forbidden-vanilla-behavior": "Operace je zakázána, protože není v souladu s chováním vanilla verze", - "no-price-given": "Zadejte platnou cenu", - "average-price-nearby": "&aBlízká průměrná cena: &e{0}", - "shop-has-changed": "&cObchod, který jste se pokusili použít, se změnil od doby, kdy jste na něj klikli!", - "shop-not-exist": "&cNení žádný obchod.", - "nearby-shop-this-way": "&aShop je od vás {0} bloků.", - "nearby-shop-header": "&aNejbližší obchod odpovídající &b{0}&a:", - "nearby-shop-entry": "&a - Info: {0}&aCena:&b{1} &ax:&b{3} &az:&b{4} &avzdálenost: &b{5} &ablok(y)", - "no-nearby-shop": "&cŽádný blízký obchod odpovídající {0}.", + "not-a-integer": "&b▪&8▏ &bSystem &8› &cMužeš zadat pouze celé číslo, zadal jsi {0}.", + "player-bought-from-your-store": "&b▪&8▏ &bSystem &8› &7{0} zakoupil {1} {2} z tvého obchodu a ty jsi zaplatil {3} na daních.", + "shop-out-of-stock": "&b▪&8▏ &bSystem &8› &7Váš obchod v {0}, {1}, {2}, vyčerpal {3}!", + "shop-has-no-space": "&b▪&8▏ &bSystem &8› &cObchod má pouze místo pro {0} více {1}.", + "you-dont-have-that-many-items": "&b▪&8▏ &bSystem &8› &cMáš pouze {0} {1}.", + "the-owner-cant-afford-to-buy-from-you": "&b▪&8▏ &bSystem &8› &cTohle stojí {0}, ale vlastník má pouze {1}", + "player-sold-to-your-store": "&b▪&8▏ &bSystem &8› &7Hráč {0} prodal {1} {2} do tvého obchodu.", + "shop-out-of-space": "&b▪&8▏ &bSystem &8› &7Tvůj obchod v {0}, {1}, {2}, je nyní plný.", + "fee-charged-for-price-change": "&b▪&8▏ &bSystem &8› &7Zaplatili jste &c{0}&7 za změnu ceny.", + "price-is-now": "&b▪&8▏ &bSystem &8› &7Nová cena obchodu je &b{0}", + "thats-not-a-number": "&b▪&8▏ &bSystem &8› &cNeplatné číslo", + "forbidden-vanilla-behavior": "&b▪&8▏ &bSystem &8› &7Operace je zakázána, protože není v souladu s chováním vanilla verze", + "no-price-given": "&b▪&8▏ &bSystem &8› &7Zadejte platnou cenu.", + "average-price-nearby": "&b▪&8▏ &bSystem &8› &7Blízká průměrná cena: &b{0}", + "shop-has-changed": "&b▪&8▏ &bSystem &8› &cObchod, který jste se pokusili použít, se změnil od doby, kdy jste na něj klikli!", + "shop-not-exist": "&b▪&8▏ &bSystem &8› &cNemáš žádný obchod.", + "nearby-shop-this-way": "&b▪&8▏ &bSystem &8› &7Shop je od vás {0} bloků.", + "nearby-shop-header": "&b▪&8▏ &bSystem &8› &7Nejbližší obchod odpovídající &b{0}&7:", + "nearby-shop-entry": "&b▪&8▏ &bInfo &8› {0}&fCena:&b{1} &fx:&b{2} &fy:&b{3} &fz:&b{4} &fvzdálenost: &b{5} &fblok(y)", + "no-nearby-shop": "&b▪&8▏ &bSystem &8› &cŽádný blízký obchod odpovídající {0}.", "buying-more-than-selling": "&cVAROVÁNÍ: Kupujete předměty za více, než je prodáváte!", - "not-enough-space": "&cObchod má pouze místo pro {0} více!", + "not-enough-space": "&b▪&8▏ &bSystem &8› &cObchod má pouze místo pro {0} více!", "refill-success": "&aDoplnění úspěšně proběhlo.", - "empty-success": "&aEmptying obchod byl úspěšný", - "admin-shop": "ServerObchod", - "unknown-owner": "Neznámé", - "owner-bypass-check": "&eProšel všechny kontroly. Obchod byl úspěšný! (Nyní jste vlastníkem obchodu!)", - "reached-maximum-can-create": "&cJiž jste vytvořili maximum {0}/{1} obchodů!", - "restricted-prices": "&cOmezená cena za {0}: Min {1}, max {2}", - "no-enough-money-to-keep-shops": "&cNemáte dostatek peněz na udržení svých obchodů! Všechny obchody byly odstraněny...", - "nothing-to-flush": "&aNemáte žádné nové zprávy o obchodu.", - "break-shop-use-supertool": "&eObchod můžete rozbít pomocí SuperTool.", + "empty-success": "&b▪&8▏ &bSystem &8› &7Emptying obchod byl úspěšný", + "admin-shop": "Server", + "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ů!", + "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.", + "break-shop-use-supertool": "&b▪&8▏ &bSystem &8› &7Obchod můžete rozbít pomocí SuperTool.", "failed-to-put-sign": "&cNení dostatek místa v okolí obchodu a umístit informační značku.", - "failed-to-paste": "&cNepodařilo se nahrát data do Pastebinu. Zkontrolujte připojení k internetu a zkuste to znovu. (Podrobnosti naleznete v konzoli)", - "warn-to-paste": "&eShromažďování dat a jejich nahrávání do Pastebinu, to může chvíli trvat. &c&lVarování:&c Data jsou po dobu jednoho týdne veřejně uchovávána! Může dojít k úniku konfigurace serveru a dalších citlivých informací. Ujistěte se, že jste jej poslali pouze &ldůvěryhodnému personálu/vývojářům.", - "price-too-high": "&cCena obchodu je příliš vysoká! Nelze vytvořit s cenou vyšší než {0}.", - "you-cant-create-shop-in-there": "Nemáte oprávnění vytvořit shop v tomto místě.", - "unknown-player": "&cCílový hráč neexistuje, zkontrolujte prosím uživatelské jméno, které jste zadali.", - "shop-staff-cleared": "&aÚspěšně byli odebráni všichni členi z tvého obchodu.", - "shop-staff-added": "&aÚspěšně byli odebráni všichni členi z tvého obchodu.", - "shop-staff-deleted": "&aÚspěšně byli odebráni {0} všichni členi z tvého obchodu.", - "no-permission-build": "&cZde nelze postavit obchod.", - "success-change-owner-to-server": "&aÚspěšně nastaveno vlastníka obchodu na Server.", - "flush-finished": "&aÚspěšně smazány zprávy.", - "purchase-failed": "&cNákup selhal: Vnitřní chyba. Obraťte se na správce serveru.", - "no-pending-action": "&cNemáte žádné čekající akce", - "permission-denied-3rd-party": "&cOprávnění odepřeno: Plugin třetí strany [{0}].", - "shops-removed-in-world": "Celkem &b{0}&e obchodů bylo smazáno ve světě &b{1}&e.", - "world-not-exists": "&cSvět &e{0}&c neexistuje", + "failed-to-paste": "&b▪&8▏ &bSystem &8› &cNepodařilo se nahrát data do Pastebinu. Zkontrolujte připojení k internetu a zkuste to znovu. (Podrobnosti naleznete v konzoli)", + "warn-to-paste": "&b▪&8▏ &bSystem &8› &7Shromažďování dat a jejich nahrávání do Pastebinu, to může chvíli trvat. &4Varování:&c&c Data jsou po dobu jednoho týdne veřejně uchovávána! Může dojít k úniku konfigurace serveru a dalších citlivých informací. Ujistěte se, že jste jej poslali pouze &ldůvěryhodnému personálu/vývojářům.", + "price-too-high": "&b▪&8▏ &bSystem &8› &cCena obchodu je příliš vysoká! Nelze vytvořit s cenou vyšší než {0}.", + "you-cant-create-shop-in-there": "&b▪&8▏ &bSystem &8› &7Nemáte oprávnění vytvořit shop v tomto místě.", + "unknown-player": "&b▪&8▏ &bSystem &8› &cCílový hráč neexistuje, zkontrolujte prosím uživatelské jméno, které jste zadali.", + "shop-staff-cleared": "&b▪&8▏ &bSystem &8› &7Úspěšně byli odebráni všichni členi z tvého obchodu.", + "shop-staff-added": "&b▪&8▏ &bSystem &8› &7Úspěšně byl přidán {0} jako člen tvého obchodu.", + "shop-staff-deleted": "&b▪&8▏ &bSystem &8› &7Úspěšně byl odebrán {0} jako člen z tvého obchodu.", + "no-permission-build": "&b▪&8▏ &bSystem &8› &cZde nelze postavit obchod.", + "success-change-owner-to-server": "&b▪&8▏ &bSystem &8› &7Úspěšně nastaveno vlastníka obchodu na Server.", + "flush-finished": "&b▪&8▏ &bSystem &8› &7Úspěšně smazány zprávy.", + "purchase-failed": "&b▪&8▏ &bSystem &8› &cNákup selhal: Vnitřní chyba. Obraťte se na správce serveru.", + "no-pending-action": "&b▪&8▏ &bSystem &8› &cNemáte žádné čekající akce", + "permission-denied-3rd-party": "&b▪&8▏ &bSystem &8› &cOprávnění odepřeno: Plugin třetí strany [{0}].", + "shops-removed-in-world": "&b▪&8▏ &bSystem &8› &7Celkem &b{0}&7 obchodů bylo smazáno ve světě &b{1}&7.", + "world-not-exists": "&b▪&8▏ &bSystem &8› &cSvět &b{0}&c neexistuje", "menu": { - "successful-purchase": "&aÚspěšně zakoupeno:", - "successfully-sold": "&aÚspěšně prodáno:", + "successful-purchase": "&b▪&8▏ &bSystem &8› &7Úspěšně zakoupeno:", + "successfully-sold": "&b▪&8▏ &bSystem &8› &7Úspěšně prodáno:", "item-name-and-price": "&e{0} {1} &aza &e{2}", - "sell-tax": "&aZaplatil jste &e{0} &ana daních.", - "sell-tax-self": "&aNeplatil jste daně, protože vlastníte tento obchod.", - "enchants": "&5Enchanty", - "stored-enchants": "&5Uložené enchanty", - "shop-information": "&aInformace o obchodě:", - "owner": "&aVlastník: {0}", - "item": "&aItem: &e{0}\n", - "item-holochat-error": "&c[Error]\n", - "preview": "&b[Náhled itemu]", - "space": "&aMezera: &e{0}", - "stock": "&aSkladem &e{0}", - "price-per": "&aCena za &e{0} &a- &e{1}", - "price-per-stack": "&aCena za &e{2}x {0} - {1}", - "total-value-of-chest": "&aCelková hodnota chesty: &e{0}", - "damage-percent-remaining": "&e{0}% &azbývá.", - "this-shop-is-buying": "&aTento obchod &dNAKUPUJE &aitemy.", - "this-shop-is-selling": "&aTento obchod &dPRODÁVÁ &aitemy.", - "shop-stack": "&aPočet stacků: &e{0}", - "effects": "&aEfekty" + "sell-tax": "&b▪&8▏ &bSystem &8› &7Zaplatil jste &b{0} &7na daních.", + "sell-tax-self": "&b▪&8▏ &bSystem &8› &7Neplatil jste daně, protože vlastníte tento obchod.", + "enchants": "&bEnchanty", + "stored-enchants": "&bUložené enchanty", + "shop-information": "&bInformace o obchodě:", + "owner": "&r &fVlastník: &b{0}", + "item": "&r &fItem: &b{0}", + "item-holochat-error": "&r &c[Error]", + "preview": "&r &b[Náhled itemu]", + "space": "&r &fMezera: &b{0}", + "stock": "&r &fSkladem: &b{0}", + "price-per": "&r &fCena za &b{0} &7- &b{1}", + "price-per-stack": "&r &fCena za &b{2}x {0} - {1}", + "total-value-of-chest": "&r &fCelková hodnota chesty: &b{0}", + "damage-percent-remaining": "&b{0}% &fzbývá.", + "this-shop-is-buying": "&7Tento obchod &bNakupuje &7itemy.", + "this-shop-is-selling": "&7Tento obchod &bProdává &7itemy.", + "shop-stack": "&7Počet stacků: &b{0}", + "effects": "&fEfekty" }, - "bypassing-lock": "&cBypassujete zámek QuickShopu!", + "bypassing-lock": "&cObcházíte zámek QuickShopu!", "that-is-locked": "&cTento obchod je uzamčen.", - "how-many-buy": "&aNapište do chatu, kolik si přejete &bKOUPIT&a. Můžete si koupit &e{0}&a. Zadejte &ball&a pro zakoupení všech.", - "how-many-sell": "&aZadejte do chatu, kolik si přejete &dPRODAT&a. Máte k dispozici &e{0}&a. Zadejte &ball&a do chatu, k prodeji všeho.", - "not-allowed-to-create": "&cZde nemůžete vytvořit obchod.", - "blacklisted-item": "&cNemůžete prodat tento item, protože je na černé listině", - "how-much-to-trade-for": "&aZadejte do chatu: Cenu za kolik chcete prodávat &e{1}x {0}&a.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "not-allowed-to-create": "&b▪&8▏ &bSystem &8› &cZde nemůžete vytvořit obchod.", + "blacklisted-item": "&b▪&8▏ &bSystem &8› &cNemůžete prodat tento item, protože je na černé listině", + "how-much-to-trade-for": "&7Zadejte do chatu: Cenu za kolik chcete prodávat &b{1}x {0}&7.", "command": { - "format": "&a/{0} {1} &e- {2}", - "format-disabled": "&c/{0} {1} &7- {2}", + "format": "&8| &f/{0} {1} &7- &f{2}", + "format-disabled": "&8| &c/{0} {1} &7- &f{2}", "toggle-unlimited": { - "unlimited": "&aObchod je nyní neomezený", - "limited": "&aObchod je nyní omezený" + "unlimited": "&7Obchod je nyní neomezený", + "limited": "&7Obchod je nyní omezený" }, - "transfer-success": "&aPřeneseno &e{0} &aobchodů &e{1}", - "transfer-success-other": "&aPřeneseno &e{0} &aobchodů &e{1}", - "some-shops-removed": "&e{0} &aobchod(ů) odstraněno", + "transfer-success": "&7Přeneseno &b{0} &7obchodů &b{1}", + "transfer-success-other": "&7Přeneseno &b{0} &7obchodů &b{1}", + "some-shops-removed": "&b{0} &7obchod(ů) odstraněno", "no-owner-given": "&cŽádný vlastník", - "new-owner": "&aNový majitel: &e{0}", - "now-buying": "&aNyní &dKUPUJETE &e{0}", - "now-selling": "&aNyní &bPRODÁVÁTE &e{0}", - "cleaning": "&aOdstraňuji obchody bez skladu...", - "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.)", - "cleaned": "&aOdstraněno &e{0}&a obchodů.", - "no-type-given": "&cPoužití: /qs find ", + "new-owner": "&fNový majitel: &b{0}", + "now-buying": "&7Nyní &bKupujete &f{0}", + "now-selling": "&7Nyní &bProdáváte &f{0}", + "cleaning": "&7Odstraňuji obchody bez skladu...", + "reloading": "&bKonfigurace a soubory znovu načteny. Některé změny budou znatelné až po restartu serveru. &7(Pozor: Znovunačítání bylo změněno u verze 4.0.9.10, nově se znovu načítá jen konfigurace, ne vše.)", + "cleaned": "&7Odstraněno &b{0}&7 obchodů.", + "no-type-given": "&cPoužití: &7/qs find ", "no-world-given": "&cZadejte název světa", - "bulk-size-not-set": "&cPoužití: /qs size ", - "bulk-size-now": "&aNyní tradujete &e{0}x {1}", + "bulk-size-not-set": "&cPoužití: &7/qs size ", + "bulk-size-now": "&7Nyní tradujete &b{0}x {1}", "invalid-bulk-amount": "&cZadaná hodnota {0} je větší než maximální velikost stacku nebo menší než jedna", - "no-trade-item": "&aPodržte prosím item obchodu, který chcete změnit v hlavní ruce", - "trade-item-now": "&aNyní tradujete &e{0}x {1}", - "no-amount-given": "&cNebyla poskytnuta žádná hodnota. Použijte &a/qs refill &c", - "now-debuging": "&aÚspěšně povolen vývojářský režim. Reloaduji QuickShop...", - "now-nolonger-debuging": "&aÚspěšně zakázán vývojářský režim. Reloaduji QuickShop...", + "no-trade-item": "&7Podržte prosím item obchodu, který chcete změnit v hlavní ruce", + "trade-item-now": "&7Nyní tradujete &b{0}x {1}", + "no-amount-given": "&cNebyla poskytnuta žádná hodnota. Použijte &b/qs refill &c", + "now-debuging": "&7Úspěšně povolen vývojářský režim. Reloaduji QuickShop...", + "now-nolonger-debuging": "&7Úspěšně zakázán vývojářský režim. Reloaduji QuickShop...", "wrong-args": "&cNeplatné argumenty. Použij &l/qs help &cpro zobrazení seznamu příkazů.", "description": { - "title": "&aNápověda pro QuickShop", - "unlimited": "&eDá obchodu neomezený sklad.", - "setowner": "&eZmění vlastnictví obchodu.", - "owner": "&eZmění vlastnictví obchodu.", - "buy": "&eZmění obchod na režim &dBUY&e", - "sell": "&eZmění obchod na režim &dBUY&e", - "price": "&eZmění kupní cenu obchodu", - "clean": "&eOdstraní všechny (načtené) obchody bez skladu", - "find": "&eNajde nejbližší obchod konkrétního typu.", - "reload": "&eZnovu načte config.yml QuickShopu", - "refill": "&ePřidá zadaný počet položek do obchodu", - "empty": "&eOdstraní všechny položky z obchodu", - "debug": "&eZapnut Vývojářský mód", - "create": "&eVytvoří nový obchod z cílené truhly", - "fetchmessage": "&eZobrazit zprávy o nepřečtených obchodech", - "info": "&eZobrazit statistiky v QuickShopu", - "paste": "&eNahrává data serveru do Pastebinu", - "staff": "&eSpravovat zaměstnance obchodu", - "remove": "&eOdstraní obchod, na kterém se díváte", - "amount": "&eMožnost nastavit částku položky (Useful když máte problémy s chatem)", - "about": "&eZobrazí informace o QuickShopu", - "help": "&eZobrazí informace o QuickShopu", - "item": "&eZměnit položku v obchodě", - "size": "&eZměna na hromadné množství obchodu", - "supercreate": "&eVytvořit obchod při obcházení všech ochranných kontrol", - "language": "Změní aktuální jazyk bota na serveru", - "removeall": "&eOdebrat VŠECHNY obchody zadaného hráče", - "transfer": "&ePřeneste všechny obchody do jiného", - "removeworld": "&eOdebrat VŠECHNY obchody zadaného hráče", - "currency": "&eNastavte nebo odeberte nastavení měny obchodu", - "ban": "&eZabanování hráče z obchodu", - "unban": "&eOdbanování hráče z obchodu", - "freeze": "&eZakázat nebo povolit obchodování obchodu", - "lock": "&ePřepnout stav zámku obchodu", - "taxaccount": "&eSet the tax account that shop using", - "toggledisplay": "&eToggle the shop display item status", - "purge": "&eStart the shop purge task in background" + "title": "&bNápověda pro QuickShop", + "unlimited": "&fDá obchodu neomezený sklad.", + "setowner": "&fZmění vlastnictví obchodu.", + "owner": "&fZmění vlastnictví obchodu.", + "buy": "&fZmění obchod na režim &dBUY&e", + "sell": "&fZmění obchod na režim &dBUY&e", + "price": "&fZmění kupní cenu obchodu", + "clean": "&fOdstraní všechny (načtené) obchody bez skladu", + "find": "&fNajde nejbližší obchod konkrétního typu.", + "reload": "&fZnovu načte config.yml QuickShopu", + "refill": "&fPřidá zadaný počet položek do obchodu", + "empty": "&fOdstraní všechny položky z obchodu", + "debug": "&fZapne Vývojářský mód", + "create": "&fVytvoří nový obchod z cílené truhly", + "fetchmessage": "&fZobrazit zprávy o nepřečtených obchodech", + "info": "&fZobrazit statistiky v QuickShopu", + "paste": "&fNahrává data serveru do Pastebinu", + "staff": "&fSpravovat zaměstnance obchodu", + "remove": "&fOdstraní obchod, na kterém se díváte", + "amount": "&fMožnost nastavit částku položky (Useful když máte problémy s chatem)", + "about": "&fZobrazí informace o QuickShopu", + "help": "&fZobrazí informace o QuickShopu", + "item": "&fZměnit položku v obchodě", + "size": "&fZměna na hromadné množství obchodu", + "supercreate": "&fVytvořit obchod při obcházení všech ochranných kontrol", + "language": "&fZmění aktuální jazyk bota na serveru", + "removeall": "&fOdebrat VŠECHNY obchody zadaného hráče", + "transfer": "&fPřeneste všechny obchody do jiného", + "removeworld": "&fOdebrat VŠECHNY obchody zadaného hráče", + "currency": "&fNastavte nebo odeberte nastavení měny obchodu", + "ban": "&fZabanování hráče z obchodu", + "unban": "&fOdbanování hráče z obchodu", + "freeze": "&fZakázat nebo povolit obchodování obchodu", + "lock": "&fPřepnout stav zámku obchodu", + "taxaccount": "&fNastaví daně, které obchod zaplatí", + "toggledisplay": "&fPřepne obchodu status ukazovaného předmětu", + "purge": "&fZačne promazávání obchodů na pozadí" }, - "disabled": "&cTento příkaz je zakázán: &e{0}", + "disabled": "&cTento příkaz je zakázán: &b{0}", "feature-not-enabled": "Funkce není v konfiguraci povolena." }, "signs": { "selling": "Prodej {0}", "stack-selling": "Prodej {0}", "header": "{1}{0}", - "buying": "Koupit {0}", - "stack-buying": "Buy {0}", + "buying": "Koupě {0}", + "stack-buying": "Koupě {0}", "item-left": "", "item-right": "", "price": "{0} každý", @@ -202,55 +203,55 @@ "freeze": "Obchod je zakázán" }, "controlpanel": { - "setowner": "&aVlastník: &b{0} &e[&d&lZměna&e]", - "infomation": "Ovládací panel &aShop:", - "setowner-hover": "&eKlikni pro přepnutí vlastníka.", - "unlimited": "&aNeomezeno: {0} &e[&d&lZměna&e]", - "unlimited-hover": "&eKliknutím přepnete pokud obchod není omezený.", - "mode-selling": "&aRežim obchodu: &bSelling &e[&d&lChange&e]", - "mode-selling-hover": "&eKliknutím změníte obchod na režim BUY.", - "mode-buying": "&aRežim obchodu: &bSelling &e[&d&lChange&e]", - "mode-buying-hover": "&eKliknutím změníte obchod na SELL režim.", - "price": "&aVlastník: &b{0} &e[&d&lZměna&e]", - "price-hover": "&eKliknutím nastavíte novou cenu itemu.", - "refill": "&aRefill: Doplnit itemy&e[&d&lOK&e]", - "refill-hover": "&eKlikněte pro doplnění obchodu.", - "empty": "&aEmpty: Odstranit všechny itemy &e[&d&lOK&e]", - "empty-hover": "&eKlikněte pro vymazání inventáře obchodu.", - "remove": "&c&l[Odstranit obchod]", - "remove-hover": "&eKlikněte pro odstranění tohoto obchodu.", - "stack": "&aCena za stack: &b{0} &e[&d&lZměnit&e]", - "stack-hover": "&eKliknutím nastavíte množství položky za každý bulk. Nastavte na 1 pro normální chování.", - "item": "&aItem obchodu: {0} &e[&d&lZměnit&e]", - "item-hover": "&eKlikněte pro změnu itemu obchodu", - "currency": "&aMěna: &b{0} &e[&d&lNastavit&e]", - "currency-hover": "&eKlikněte pro nastavení nebo odebrání měny, kterou tento obchod používá", - "lock": "&eZámek obchodu: &b{0} &e[&d&lPřepnout&e]", - "lock-hover": "&ePovolit/Zakázat ochranu zámku obchodu.", - "freeze": "&eRežim zmražení: &b{0} &e[&d&lPřepnout&e]", - "freeze-hover": "&ePřepnout stav zmrazení obchodu.", - "toggledisplay": "&eDisplayItem: &b{0} &e[&d&lToggle&e]", - "toggledisplay-hover": "&eToggle the shop's displayitem status" + "setowner": "&fVlastník: &b{0} &7[&d&3Změna&7]", + "infomation": "Ovládací panel &bShop:", + "setowner-hover": "&bKlikni pro přepnutí vlastníka.", + "unlimited": "&fNeomezeno: &b{0} &7[&d&3Změna&7]", + "unlimited-hover": "&bKliknutím přepnete pokud obchod není omezený.", + "mode-selling": "&7Režim obchodu: &bSelling &7[&d&3Change&7]", + "mode-selling-hover": "&bKliknutím změníte obchod na režim BUY.", + "mode-buying": "&fRežim obchodu: &bSelling &7[&d&3Change&7]", + "mode-buying-hover": "&bKliknutím změníte obchod na SELL režim.", + "price": "&fVlastník: &b{0} &7[&d&3Změna&7]", + "price-hover": "&bKliknutím nastavíte novou cenu itemu.", + "refill": "&fRefill: Doplnit itemy&7[&d&3OK&7]", + "refill-hover": "&bKlikněte pro doplnění obchodu.", + "empty": "&fEmpty: Odstranit všechny itemy &7[&d&3OK&7]", + "empty-hover": "&bKlikněte pro vymazání inventáře obchodu.", + "remove": "&4[&cOdstranit obchod&4]", + "remove-hover": "&bKlikněte pro odstranění tohoto obchodu.", + "stack": "&fCena za stack: &b{0} &7[&d&3Změnit&7]", + "stack-hover": "&bKliknutím nastavíte množství položky za každý bulk. Nastavte na 1 pro normální chování.", + "item": "&fItem obchodu: &b{0} &7[&d&3Změnit&7]", + "item-hover": "&bKlikněte pro změnu itemu obchodu", + "currency": "&fMěna: &b{0} &7[&d&3Nastavit&7]", + "currency-hover": "&bKlikněte pro nastavení nebo odebrání měny, kterou tento obchod používá", + "lock": "&fZámek obchodu: &b{0} &7[&d&3Přepnout&7]", + "lock-hover": "&bPovolit/Zakázat ochranu zámku obchodu.", + "freeze": "&fRežim zmražení: &b{0} &7[&d&3Přepnout&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" }, "tableformat": { - "full_line": "+---------------------------------------------------+", - "left_half_line": "+--------------------", - "right_half_line": "--------------------+", - "left_begin": "| " + "full_line": "&r", + "left_half_line": "&r", + "right_half_line": "&r", + "left_begin": "&8| &7» " }, "booleanformat": { "success": "&a✔", "failed": "&c✘" }, "tabcomplete": { - "price": "[cena]", - "range": "[rozsah]", - "amount": "[množství]", - "currency": "[název měny]", + "price": "[price]", + "range": "[range]", + "amount": "[amount]", + "currency": "[currency name]", "item": "[item]" }, "updatenotify": { - "buttontitle": "[Aktualizovat teď]", + "buttontitle": "[Update Now]", "onekeybuttontitle": "[OneKey Update]", "list": [ "{0} byla vydána. Stále používáte {1}!", @@ -301,42 +302,42 @@ "help": "Pomozte nám", "translate-on-crowdin": "Přeložit na Crowdin" }, - "shop-now-freezed": "&aZmrazili jste obchod. Nikdo nemůže obchodovat s tímto obchodem!", - "shop-nolonger-freezed": "&aOdzmrazil jsi obchod. Nyní je to zpět do normální!", + "shop-now-freezed": "&bZmrazili jste obchod. Nikdo nemůže obchodovat s tímto obchodem!", + "shop-nolonger-freezed": "&bOdzmrazil jsi obchod. Nyní je to zpět do normální!", "shop-cannot-trade-when-freezing": "&cNemůžete obchodovat s tímto obchodem, protože je zmražený.", - "shop-freezed-at-location": "&eVáš obchod {0} v {1} byl zmražen!", + "shop-freezed-at-location": "&bVáš obchod {0} v {1} byl zmražen!", "denied-put-in-item": "&cTuto položku nelze vložit do vašeho obchodu!", - "how-many-buy-stack": "&eEnter in chat, kolik bulků si přejete &bBUY&a. Existuje &e{0}&a položek v každém balíku a můžete koupit &e{1}&a bulks. Vložte &ball&do chatu pro nákup všech.", - "how-many-sell-stack": "&eEnter in chat, kolik bulků si přejete &bBUY&a. Existuje &e{0}&a položek v každém balíku a můžete koupit &e{1}&a bulks. Vložte &ball&do chatu pro nákup všech.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { - "name": "&eJméno: &6{0}", - "code": "&eJméno: &6{0}", - "translate-progress": "&ePrůběh překladu: &b{0}%", - "approval-progress": "&ePostup schválení: &b{0}%", - "qa-issues": "&eOtázky zabezpečení kvality: &b{0}%", - "help-us": "&a[Pomozte nám zlepšit kvalitu překladu]" + "name": "&fJméno: &b{0}", + "code": "&fKod: &b{0}", + "translate-progress": "&fPrůběh překladu: &b{0}%", + "approval-progress": "&fPostup schválení: &b{0}%", + "qa-issues": "&fOtázky zabezpečení kvality: &b{0}%", + "help-us": "&f[Pomozte nám zlepšit kvalitu překladu]" }, "currency-not-exists": "&cNelze najít měnu, kterou chcete nastavit. Možná je pravopis špatný nebo není měna v tomto světě k dispozici.", - "currency-set": "Měna &aShopu byla úspěšně nastavena na {0}.", - "currency-unset": "Měna &aShopu byla úspěšně odstraněna. Nyní se používá výchozí nastavení.", + "currency-set": "Měna Shopu byla úspěšně nastavena na {0}.", + "currency-unset": "Měna Shopu byla úspěšně odstraněna. Nyní se používá výchozí nastavení.", "currency-not-support": "&cDoplněk pro ekonomiku nepodporuje funkci více ekonomik.", - "item-not-exist": "&cPoložka &e{0} neexistuje, prosím zkontrolujte pravopis.", - "backup-success": "&aZáloha byla úspěšně provedena.", + "item-not-exist": "&cPoložka &b{0} &cneexistuje, prosím zkontrolujte pravopis.", + "backup-success": "&bZáloha byla úspěšně provedena.", "console-only": "&cTento příkaz může být použit pouze z konzole.", "console-only-danger": "&cTento příkaz není bezpečný, můžete ho použít pouze v konzoly.", - "clean-warning": "&eThis command will purge &call &eshops if the shop is corrupted, was created in not allowed worlds, is selling/buying not allowed items or &c&lEXISTS IN A UNLOADED WORLD&e. Make sure to create a full backup of your shop data first and use &b/qs cleanghost confirm &eto continue.", + "clean-warning": "&7Tento příkaz promaže &c&cvšechny &7obchody, pokud jsou jakýmkoliv způsobem poškozeny, byly vytvořeny ve světě, který už neexistuje a podobné problémy.", "shop-creation-failed": "&cVytvoření ochodu se nezdařilo, kontaktujte prosím správce serveru.", - "shop-owner-self-trade": "&eObchodujete se svým obchodem, takže nebudete moci získat žádné peníze.", + "shop-owner-self-trade": "&7Obchodujete se svým obchodem, takže nebudete moci získat žádné peníze.", "chest-title": "Obchod QuickShop", "command-type-mismatch": "&cTento příkaz může být spuštěn pouze v &b{0}.", - "unlimited-shop-owner-changed": "&eMajitel tohoto neomezeného obchodu byl změněn na {0}.", - "unlimited-shop-owner-keeped": "&eUpozornění: Vlastník obchodu je stále neomezený vlastník obchodu, musíte si nastavit nového vlastníka obchodu sami.", + "unlimited-shop-owner-changed": "&7Majitel tohoto neomezeného obchodu byl změněn na {0}.", + "unlimited-shop-owner-keeped": "&cUpozornění: &7Vlastník obchodu je stále neomezený vlastník obchodu, musíte si nastavit nového vlastníka obchodu sami.", "server-crash-warning": "&cServer může spadnout po spustění příkazu /qs reload pokud nahradíš/smažeš jar soubor QuickShop pluginu při spuštěném serveru.", "reloading-status": { - "success": "&aReload completed without any errors.", - "require-restart": "&aReload completed. &e(Some changes require server restart to affect)", - "failed": "&cReload failed, check the server console", - "scheduled": "&aReload completed. &7(Some changes required a while to affect)" + "success": "&bZnovunačtení konfigurace proběhlo bez problému.", + "require-restart": "&bZnovunačtení dokončeno. Některé změny budou mít efekt po restartu", + "failed": "&cZnovunačtení selhalo, zkontroluj konzoli", + "scheduled": "&bZnovunačtení dokončeno. Některé změny budou mít efekt za chvíli" }, "client-language-changed": "&aQuickShop detected your client language setting has been changed, we're now using {0} locale for you.", "client-language-unsupported": "&eQuickShop doesn't support your client language, we're fallback to {0} locale now.", From 8a417bd48e7451fa779cc494972041477ffade65 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:25 +0800 Subject: [PATCH 093/725] New translations messages.json (Catalan) --- crowdin/lang/ca-ES/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/ca-ES/messages.json b/crowdin/lang/ca-ES/messages.json index c3f7c2b7b7..808aab5088 100644 --- a/crowdin/lang/ca-ES/messages.json +++ b/crowdin/lang/ca-ES/messages.json @@ -5,7 +5,8 @@ "translation-version": "Versió suportada: Reremake", "translation-contributors": "Contributors: Hoswolf, Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Zona de l'idioma: Català (ca_ES)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "No s'ha trobat cap QuickShop. N'has d'estar mirant una.", "no-anythings-in-your-hand": "No tens res a la mà.", "no-permission": "No tens permisos per fer això.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cSobrepassant un bloqueig de QuickShop!", "that-is-locked": "&cAquesta botiga està bloquejada.", - "how-many-buy": "&aIntrodueix al xat quants ítems vols &bCOMPRAR&a. Pots comprar-ne &e{0}&a. Introdueix '&ball&a' per comprar-los tots.", - "how-many-sell": "&aIntrodueix al xat quants ítems vols &dVENDRE&a. En tens &e{0}&a de disponibles. Introdueix &ball&a al xat per a vendre'ls tots.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNo pots crear una botiga aquí.", "blacklisted-item": "&cNo pots vendre aquest objecte perquè està a la llista negra.", "how-much-to-trade-for": "&aIntrodueix al xat per quant vols intercambiar &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cNo pots interectuar amb aquesta botiga perquè està congelada.", "shop-freezed-at-location": "&eLa teva botiga {0} a {1} s'ha congelat!", "denied-put-in-item": "&cNo pots posar aquest ítem a la botiga!", - "how-many-buy-stack": "&eEscriu al xat quants grups vols &bCOMPRAR&a. Hi ha &e{0}&a ítems a cada grup i pots comprar &e{1}&a grups. Escriu &ball&a al xat per comprar-los tots.", - "how-many-sell-stack": "&aEscriu al xat quants grups vols &dVENDRE&a. Hi ha &e{0}&a ítems a cada grup i tens &e{1}&a grups disponibles. Escriu &ball&a al xat per vendre'ls tots.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNom: &6{0}", "code": "&eCodi: &6{0}", From 66bb8e7fd5976034f84b1ca14650034f86b3b983 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:26 +0800 Subject: [PATCH 094/725] New translations messages.json (Arabic) --- crowdin/lang/ar-SA/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/ar-SA/messages.json b/crowdin/lang/ar-SA/messages.json index 07dcd92186..56433ae192 100644 --- a/crowdin/lang/ar-SA/messages.json +++ b/crowdin/lang/ar-SA/messages.json @@ -5,7 +5,8 @@ "translation-version": "إصدار الدعم: إعادة التشكيل", "translation-contributors": "المساهمون: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken و Andre_601", "translation-country": "منطقة اللغة: العربية (ar_AR)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cلا يمكن العثور على QuickShop. تحتاج إلى النظر إلى واحد.", "no-anythings-in-your-hand": "&cلا يوجد شيء في يديك.", "no-permission": "لا تملك الصلاحيّات للقيام بذلك.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From 55b331b697c1fe0d876c5ee5d20e49bf1d4fd5be Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:27 +0800 Subject: [PATCH 095/725] New translations messages.json (Afrikaans) --- crowdin/lang/af-ZA/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/af-ZA/messages.json b/crowdin/lang/af-ZA/messages.json index e8f4a107ab..355f5c6138 100644 --- a/crowdin/lang/af-ZA/messages.json +++ b/crowdin/lang/af-ZA/messages.json @@ -5,7 +5,8 @@ "translation-version": "Support Version: Reremake", "translation-contributors": "Contributors: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Language Zone: English (en_US)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cCould not find a QuickShop. You need to look at one.", "no-anythings-in-your-hand": "&cThere is nothing in your hand.", "no-permission": "&cYou do not have permission to do that.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From f244da8ae50e5d95855f34895445ecc65beeb9ca Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:28 +0800 Subject: [PATCH 096/725] New translations messages.json (Spanish) --- crowdin/lang/es-ES/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/es-ES/messages.json b/crowdin/lang/es-ES/messages.json index 574bfe049a..9662c0a8d6 100644 --- a/crowdin/lang/es-ES/messages.json +++ b/crowdin/lang/es-ES/messages.json @@ -5,7 +5,8 @@ "translation-version": "&c&lVersión Soportada: &b&lReremake", "translation-contributors": "Contribuidores: Randall_Rut, Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken y Andre_601", "translation-country": "&c&lZona de idioma: &b&lEspañol (es_ES)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&cNo se pudo encontrar ninguna tienda. Tienes que mirar hacia una.", "no-anythings-in-your-hand": "&cNo hay nada en tu mano.", "no-permission": "&cNo tienes permiso para hacer eso.", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&c¡Omitiendo el bloqueo de una QuickShop!", "that-is-locked": "&cEsta tienda está bloqueada.", - "how-many-buy": "&aIntroduce en el chat cuántos quieres &bCOMPRAR&a. Puedes comprar &e{0}&a. Introduce &ball&a para comprarlos todos.", - "how-many-sell": "&aIngresa en el chat cuántos quieres &dVENDER&a. Dispones de &e{0}&a. Introduce &ball&a para venderlos todos.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNo puedes crear una tienda aquí.", "blacklisted-item": "&cNo puedes vender esto porque está en la lista negra", "how-much-to-trade-for": "&aIngresa en el chat, por cuánto deseas intercambiar &e{1}x {0}&a.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cNo puedes comerciar con esta tienda porque se encuentra congelada.", "shop-freezed-at-location": "&eTú tienda {0} en {1} se ha congelado!", "denied-put-in-item": "&c¡No puedes poner este ítem en tu tienda!", - "how-many-buy-stack": "&eIntroduce en el chat cuántos stacks quieres &bCOMPRAR&a. Hay &e{0}&a ítems en cada stack y puedes comprar &e{1}&a stacks. Introduce &ball&a en el chat para comprarlos todos.", - "how-many-sell-stack": "&eIntroduce en el chat cuántos stacks quieres &bVENDER&a. Hay &e{0}&a ítems en cada stack y dispones de &e{1}&a stacks. Introduce &ball&a en el chat para venderlos todos.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNombre: &6{0}", "code": "&eCódigo: &6{0}", From 9879552e893e076c886fb3df841b69e11d4544a5 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 17:49:29 +0800 Subject: [PATCH 097/725] New translations messages.json (Chinese Traditional, Hong Kong) --- crowdin/lang/zh-HK/messages.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crowdin/lang/zh-HK/messages.json b/crowdin/lang/zh-HK/messages.json index 98a2f71dd5..b38137146e 100644 --- a/crowdin/lang/zh-HK/messages.json +++ b/crowdin/lang/zh-HK/messages.json @@ -5,7 +5,8 @@ "translation-version": "支援版本: Reremake", "translation-contributors": "貢獻者: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken 同埋 Andre_601", "translation-country": "語言區域: 中文(zh_HK)", - "language-version": "62", + "language-version": "63", + "not-looking-at-valid-shop-block": "&cCould not find a block for creating shop. You need to look at one.", "not-looking-at-shop": "&c我搵唔到一個箱子商店, 唔該望住個箱, 如果唔係我辨認唔到", "no-anythings-in-your-hand": "&c 你隻手都冇嘢", "no-permission": "&c你冇權啊", @@ -109,8 +110,8 @@ }, "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &ball&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &ball&a in chat, to sell all.", + "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -306,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cYou cannot trade with this shop because it is frozen.", "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &ball&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &ball&a in chat to sell all.", + "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From f2a3b3a2114fceb78fbee326201e09371a997f11 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 18:14:54 +0800 Subject: [PATCH 098/725] Only apply right language-version for client --- .../quickshop/localization/text/SimpleTextManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 250ab0c382..1f9c2611e2 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -246,7 +246,11 @@ public void load() { languageFilesManager.deployBundled(crowdinFile, loadBundled(crowdinFile)); // Loading bundled file (for no internet connection or failed loading) JsonConfiguration configuration = loadBundled(crowdinFile.replace("%locale%", crowdinCode)); - applyOverrideConfiguration(configuration, getDistributionConfiguration(crowdinFile, crowdinCode)); + JsonConfiguration remoteConfiguration = getDistributionConfiguration(crowdinFile, crowdinCode); + // Only apply right language-version for client + if (configuration.isSet("language-version") && configuration.getString("language-version", "0").equals(remoteConfiguration.getString("language-version", "0"))) { + applyOverrideConfiguration(configuration, remoteConfiguration); + } // Loading override text (allow user modification the translation) JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); applyOverrideConfiguration(configuration, override); From 316c8b10b6c723fda29ea31ba3da6a04993e666f Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 18:53:16 +0800 Subject: [PATCH 099/725] Fix local file not loading and language not matching --- .../localization/text/SimpleTextManager.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 1f9c2611e2..e774c6406a 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -51,6 +51,7 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; @@ -104,7 +105,8 @@ private File getOverrideFilesFolder(@NotNull String path) { private JsonConfiguration loadBundled(String file) { JsonConfiguration bundledLang = new JsonConfiguration(); File fileObject = new File(file); - String parentStr = fileObject.getParent(); + Path parentPath = fileObject.toPath().getParent(); + String parentStr = parentPath != null ? parentPath.toFile().getName() : ""; String fileName = fileObject.getName(); try { InputStream stream = null; @@ -240,22 +242,25 @@ public void load() { Util.debugLog("Locale: " + minecraftCode + " not enabled in configuration."); return; } - availableLanguages.add(crowdinCode); + //Offline default file + JsonConfiguration defaultFile = loadBundled(crowdinFile); + //Add available language (minecraftCode) + availableLanguages.add(minecraftCode); Util.debugLog("Loading translation for locale: " + crowdinCode + " (" + minecraftCode + ")"); // Deploy bundled to mapper - languageFilesManager.deployBundled(crowdinFile, loadBundled(crowdinFile)); + languageFilesManager.deployBundled(crowdinFile, defaultFile); // Loading bundled file (for no internet connection or failed loading) JsonConfiguration configuration = loadBundled(crowdinFile.replace("%locale%", crowdinCode)); JsonConfiguration remoteConfiguration = getDistributionConfiguration(crowdinFile, crowdinCode); // Only apply right language-version for client - if (configuration.isSet("language-version") && configuration.getString("language-version", "0").equals(remoteConfiguration.getString("language-version", "0"))) { + if (defaultFile.isSet("language-version") && defaultFile.getString("language-version", "0").equals(remoteConfiguration.getString("language-version", "0"))) { applyOverrideConfiguration(configuration, remoteConfiguration); } // Loading override text (allow user modification the translation) JsonConfiguration override = getOverrideConfiguration(crowdinFile, minecraftCode); applyOverrideConfiguration(configuration, override); // Deploy distribution to mapper - languageFilesManager.deploy(crowdinFile, minecraftCode, configuration, loadBundled(crowdinFile)); + languageFilesManager.deploy(crowdinFile, minecraftCode, configuration, defaultFile); Util.debugLog("Locale " + crowdinFile.replace("%locale%", crowdinCode) + " has been successfully loaded"); } // Key founds in available locales but not in custom mapping on crowdin platform catch (IOException e) { From adc730efa482d2148f75f91d64c961c3e9eeeb04 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 18:54:46 +0800 Subject: [PATCH 100/725] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index eaa27db1b5..e83f6c54ca 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # QuickShop-Reremake -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/8e9a5689cb3f4d6b8315a270a1252c2b)](https://www.codacy.com/gh/Ghost-chu/QuickShop-Reremake/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Ghost-chu/QuickShop-Reremake&utm_campaign=Badge_Grade) -[![CodeFactor](https://www.codefactor.io/repository/github/ghost-chu/quickshop-reremake/badge)](https://www.codefactor.io/repository/github/ghost-chu/quickshop-reremake) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/8e9a5689cb3f4d6b8315a270a1252c2b)](https://www.codacy.com/gh/PotatoCraft-Studio/QuickShop-Reremake/dashboard?utm_source=github.com&utm_medium=referral&utm_content=PotatoCraft-Studio/QuickShop-Reremake&utm_campaign=Badge_Grade) +[![CodeFactor](https://www.codefactor.io/repository/github/ghost-chu/quickshop-reremake/badge)](https://www.codefactor.io/repository/github/PotatoCraft-Studio/quickshop-reremake) ![BuildStatus](https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake/21/badge/icon) ![TestsPassed](https://img.shields.io/jenkins/tests?compact_message&jobUrl=https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake) ![Contributors](https://img.shields.io/github/contributors/Ghost-chu/QuickShop-Reremake) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FGhost-chu%2FQuickShop-Reremake.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FGhost-chu%2FQuickShop-Reremake?ref=badge_shield) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FPotatoCraft-Studio%2FQuickShop-Reremake.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FGhost-chu%2FQuickShop-Reremake?ref=badge_shield) --- ![Java](https://img.shields.io/badge/java-version%208%2B%20(currently%20is%208--16)-orange) @@ -99,4 +99,4 @@ if(plugin != null){ QuickShopAPI api = (QuickShopAPI)plugin; api.xxxx; } -``` \ No newline at end of file +``` From f422876184847b8e7a2b8bbfced57bed3490c201 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 19:01:03 +0800 Subject: [PATCH 101/725] Fix local file UTF-8 issue --- .../maxgamer/quickshop/localization/text/SimpleTextManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index e774c6406a..b5a74e7c89 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -119,7 +119,7 @@ private JsonConfiguration loadBundled(String file) { stream = plugin.getResource("lang/" + fileName); } if (stream != null) { - bundledLang.loadFromString(new String(IOUtils.toByteArray(new InputStreamReader(stream, StandardCharsets.UTF_8), StandardCharsets.UTF_8))); + bundledLang.loadFromString(new String(IOUtils.toByteArray(new InputStreamReader(stream, StandardCharsets.UTF_8), StandardCharsets.UTF_8), StandardCharsets.UTF_8)); } else { plugin.getLogger().log(Level.WARNING, "Cannot load bundled language file from jar, bundled language files " + (parentStr == null ? "" : parentStr) + "/" + fileName + " not found."); bundledLang = new JsonConfiguration(); From 0ba79ea0b52fd7eb8eb7eaacd86ecb66cd40b5e8 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 19:19:14 +0800 Subject: [PATCH 102/725] Fix broken potion effect --- src/main/java/org/maxgamer/quickshop/util/MsgUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index 58ba8f0b61..d3a5ba3f21 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -337,7 +337,7 @@ public static void loadPotioni18n() { continue; } String potionI18n = potioni18n.getString("potioni18n." + potion.getName()); - if (StringUtils.isEmpty(potionI18n)) { + if (potionI18n != null && StringUtils.isEmpty(potionI18n)) { continue; } String potionName = gameLanguage.getPotion(potion); From 02129691616f77ef248a675df02f71e09e13a9f7 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 20:02:58 +0800 Subject: [PATCH 103/725] New Crowdin updates (#28) * Update source file messages.json * New translations messages.json (Chinese Simplified) * New translations messages.json (Swedish) * New translations messages.json (Romanian) * New translations messages.json (Dutch) * New translations messages.json (Portuguese, Brazilian) * New translations messages.json (Vietnamese) * New translations messages.json (English) * New translations messages.json (Chinese Traditional) * New translations messages.json (Chinese Simplified) * New translations messages.json (Ukrainian) * New translations messages.json (Turkish) * New translations messages.json (Swedish) * New translations messages.json (Serbian (Cyrillic)) * New translations messages.json (Russian) * New translations messages.json (Portuguese) * New translations messages.json (Polish) * New translations messages.json (Norwegian) * New translations messages.json (Korean) * New translations messages.json (French) * New translations messages.json (Japanese) * New translations messages.json (Italian) * New translations messages.json (Hungarian) * New translations messages.json (Hebrew) * New translations messages.json (Finnish) * New translations messages.json (Greek) * New translations messages.json (German) * New translations messages.json (Danish) * New translations messages.json (Czech) * New translations messages.json (Catalan) * New translations messages.json (Arabic) * New translations messages.json (Afrikaans) * New translations messages.json (Spanish) * New translations messages.json (Chinese Traditional, Hong Kong) --- crowdin/lang/af-ZA/messages.json | 4 ++-- crowdin/lang/ar-SA/messages.json | 4 ++-- crowdin/lang/ca-ES/messages.json | 4 ++-- crowdin/lang/cs-CZ/messages.json | 4 ++-- crowdin/lang/da-DK/messages.json | 4 ++-- crowdin/lang/de-DE/messages.json | 4 ++-- crowdin/lang/el-GR/messages.json | 4 ++-- crowdin/lang/en-US/messages.json | 4 ++-- crowdin/lang/es-ES/messages.json | 4 ++-- crowdin/lang/fi-FI/messages.json | 4 ++-- crowdin/lang/fr-FR/messages.json | 4 ++-- crowdin/lang/he-IL/messages.json | 4 ++-- crowdin/lang/hu-HU/messages.json | 4 ++-- crowdin/lang/it-IT/messages.json | 4 ++-- crowdin/lang/ja-JP/messages.json | 4 ++-- crowdin/lang/ko-KR/messages.json | 4 ++-- crowdin/lang/nl-NL/messages.json | 4 ++-- crowdin/lang/no-NO/messages.json | 4 ++-- crowdin/lang/pl-PL/messages.json | 4 ++-- crowdin/lang/pt-BR/messages.json | 4 ++-- crowdin/lang/pt-PT/messages.json | 4 ++-- crowdin/lang/ro-RO/messages.json | 4 ++-- crowdin/lang/ru-RU/messages.json | 4 ++-- crowdin/lang/sr-SP/messages.json | 4 ++-- crowdin/lang/sv-SE/messages.json | 10 +++++----- crowdin/lang/tr-TR/messages.json | 4 ++-- crowdin/lang/uk-UA/messages.json | 4 ++-- crowdin/lang/vi-VN/messages.json | 4 ++-- crowdin/lang/zh-CN/messages.json | 4 ++-- crowdin/lang/zh-HK/messages.json | 4 ++-- crowdin/lang/zh-TW/messages.json | 4 ++-- src/main/resources/lang/messages.json | 4 ++-- 32 files changed, 67 insertions(+), 67 deletions(-) diff --git a/crowdin/lang/af-ZA/messages.json b/crowdin/lang/af-ZA/messages.json index 355f5c6138..6944ca2125 100644 --- a/crowdin/lang/af-ZA/messages.json +++ b/crowdin/lang/af-ZA/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/ar-SA/messages.json b/crowdin/lang/ar-SA/messages.json index 56433ae192..e91cf35e1a 100644 --- a/crowdin/lang/ar-SA/messages.json +++ b/crowdin/lang/ar-SA/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/ca-ES/messages.json b/crowdin/lang/ca-ES/messages.json index 808aab5088..617cadec7a 100644 --- a/crowdin/lang/ca-ES/messages.json +++ b/crowdin/lang/ca-ES/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cSobrepassant un bloqueig de QuickShop!", "that-is-locked": "&cAquesta botiga està bloquejada.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNo pots crear una botiga aquí.", "blacklisted-item": "&cNo pots vendre aquest objecte perquè està a la llista negra.", "how-much-to-trade-for": "&aIntrodueix al xat per quant vols intercambiar &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eLa teva botiga {0} a {1} s'ha congelat!", "denied-put-in-item": "&cNo pots posar aquest ítem a la botiga!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNom: &6{0}", "code": "&eCodi: &6{0}", diff --git a/crowdin/lang/cs-CZ/messages.json b/crowdin/lang/cs-CZ/messages.json index 24327006b2..06a6016897 100644 --- a/crowdin/lang/cs-CZ/messages.json +++ b/crowdin/lang/cs-CZ/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cObcházíte zámek QuickShopu!", "that-is-locked": "&cTento obchod je uzamčen.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&b▪&8▏ &bSystem &8› &cZde nemůžete vytvořit obchod.", "blacklisted-item": "&b▪&8▏ &bSystem &8› &cNemůžete prodat tento item, protože je na černé listině", "how-much-to-trade-for": "&7Zadejte do chatu: Cenu za kolik chcete prodávat &b{1}x {0}&7.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&bVáš obchod {0} v {1} byl zmražen!", "denied-put-in-item": "&cTuto položku nelze vložit do vašeho obchodu!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&fJméno: &b{0}", "code": "&fKod: &b{0}", diff --git a/crowdin/lang/da-DK/messages.json b/crowdin/lang/da-DK/messages.json index c01ed8a66a..00bcb13fa2 100644 --- a/crowdin/lang/da-DK/messages.json +++ b/crowdin/lang/da-DK/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/de-DE/messages.json b/crowdin/lang/de-DE/messages.json index b6d32f97c6..0a3c4588d4 100644 --- a/crowdin/lang/de-DE/messages.json +++ b/crowdin/lang/de-DE/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cUmgehe eine QuickShop Sicherung!", "that-is-locked": "&cDieser Shop ist geschützt.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cDu kannst hier keinen Shop erstellen.", "blacklisted-item": "&cDu kannst dieses Item nicht verkaufen, da es auf der schwarzen Liste steht", "how-much-to-trade-for": "&aGib im Chat ein, für wieviel du {1}x &e{0}&a handeln willst.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eDein Shop {0} bei {1} wurde eingefroren!", "denied-put-in-item": "&cDu kannst dieses Item nicht in deinen Shop setzen!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/el-GR/messages.json b/crowdin/lang/el-GR/messages.json index 355f5c6138..6944ca2125 100644 --- a/crowdin/lang/el-GR/messages.json +++ b/crowdin/lang/el-GR/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/en-US/messages.json b/crowdin/lang/en-US/messages.json index 06bd26e436..78177798b3 100644 --- a/crowdin/lang/en-US/messages.json +++ b/crowdin/lang/en-US/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/es-ES/messages.json b/crowdin/lang/es-ES/messages.json index 9662c0a8d6..053e0875dd 100644 --- a/crowdin/lang/es-ES/messages.json +++ b/crowdin/lang/es-ES/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&c¡Omitiendo el bloqueo de una QuickShop!", "that-is-locked": "&cEsta tienda está bloqueada.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNo puedes crear una tienda aquí.", "blacklisted-item": "&cNo puedes vender esto porque está en la lista negra", "how-much-to-trade-for": "&aIngresa en el chat, por cuánto deseas intercambiar &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eTú tienda {0} en {1} se ha congelado!", "denied-put-in-item": "&c¡No puedes poner este ítem en tu tienda!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNombre: &6{0}", "code": "&eCódigo: &6{0}", diff --git a/crowdin/lang/fi-FI/messages.json b/crowdin/lang/fi-FI/messages.json index 9f6f0834d7..88ae58575c 100644 --- a/crowdin/lang/fi-FI/messages.json +++ b/crowdin/lang/fi-FI/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cOhitetaan QuickShop lukitus!", "that-is-locked": "&cTämä kauppa on lukossa.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cEt luultavasti voi luoda kauppaa tänne.", "blacklisted-item": "&cEt voi myydä tätä tavaraa, koska se on mustalla listalla", "how-much-to-trade-for": "&aKirjoita chattiin, mihin hintaan haluat vaihtaa &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eKauppasi {0} {1} jäätyi!", "denied-put-in-item": "&cEt voi laittaa tätä tavaraa kauppaasi!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNimi: &6{0}", "code": "&eKoodi: &6{0}", diff --git a/crowdin/lang/fr-FR/messages.json b/crowdin/lang/fr-FR/messages.json index 206e0ddd3e..528f414639 100644 --- a/crowdin/lang/fr-FR/messages.json +++ b/crowdin/lang/fr-FR/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cContournement d'un verrou de QuickShop!", "that-is-locked": "&cCette boutique est verouillée.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cVous ne pouvez pas créer un shop ici.", "blacklisted-item": "&cVous ne pouvez pas vendre cet objet car il se trouve sur la liste noire", "how-much-to-trade-for": "&aEntrez dans le chat, combien vous souhaitez échanger &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eVotre boutique {0} à {1} a été gelée!", "denied-put-in-item": "&cVous ne pouvez pas mettre cet objet dans votre boutique!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNom: &6{0}", "code": "&eNom: &6{0}", diff --git a/crowdin/lang/he-IL/messages.json b/crowdin/lang/he-IL/messages.json index 355f5c6138..6944ca2125 100644 --- a/crowdin/lang/he-IL/messages.json +++ b/crowdin/lang/he-IL/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/hu-HU/messages.json b/crowdin/lang/hu-HU/messages.json index 0f45240212..4a02403e02 100644 --- a/crowdin/lang/hu-HU/messages.json +++ b/crowdin/lang/hu-HU/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cA &agyorsbolt&c zárva van", "that-is-locked": "&cEz a bolt le van zárva.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNem tudsz boltot létrehozni itt.", "blacklisted-item": "&cEz a tárgy a feketelistán van! Nem tudod eladni!", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eA te boltod: {0}, itt: {1}, le lett fagyasztva!", "denied-put-in-item": "&cThis item cannot put in this shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&aNév: &6{0}", "code": "&eKód: &6{0}", diff --git a/crowdin/lang/it-IT/messages.json b/crowdin/lang/it-IT/messages.json index b020cdc808..2da01c5abb 100644 --- a/crowdin/lang/it-IT/messages.json +++ b/crowdin/lang/it-IT/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassa un blocco QuickShop!", "that-is-locked": "&cQuesto negozio è bloccato.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNon puoi creare un negozio qui.", "blacklisted-item": "&cNon puoi vendere questo oggetto perché è nella blacklist", "how-much-to-trade-for": "&aScrivi in chat, per quanto desideri fare trading &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eIl tuo negozio {0} a {1} è stato congelato!", "denied-put-in-item": "&cNon puoi mettere questo oggetto nel tuo negozio!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNome: &6{0}", "code": "&eCodice: &6{0}", diff --git a/crowdin/lang/ja-JP/messages.json b/crowdin/lang/ja-JP/messages.json index 3980d77329..772a1d27f2 100644 --- a/crowdin/lang/ja-JP/messages.json +++ b/crowdin/lang/ja-JP/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cQuickShopロックをバイパスします!", "that-is-locked": "&cこのショップはロックされています。", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cあなたはここでショップを作る事ができません", "blacklisted-item": "&cブラックリストに載っているので、この商品を販売することはできません", "how-much-to-trade-for": "&aチャットで&e{1}個の {0}&aをいくらで取引したいか入力してください。", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&e {0} のショップ {1} が凍結されました!", "denied-put-in-item": "&cショップにこのアイテムを入れることはできません!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&e名前: &6{0}", "code": "&eコード: &6{0}", diff --git a/crowdin/lang/ko-KR/messages.json b/crowdin/lang/ko-KR/messages.json index e4a95d75c3..1f8e882669 100644 --- a/crowdin/lang/ko-KR/messages.json +++ b/crowdin/lang/ko-KR/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&a QuickShop의 잠금을 무시합니다!", "that-is-locked": "&c이 상점은 잠겨있습니다.", "how-many-buy": "&a채팅으로 원하는 &b구매&a 개수를 입력해주세요. 당신은 &e{0}&a개를 구매할 수 있습니다. &b{1}&a을 입력해 전부 구매 가능합니다.", - "how-many-sell": "&a채팅으로 원하는 &b판매&a 개수를 입력해주세요. 당신은 &e{0}&a개를 판매할 수 있습니다. &b{1}&a을 입력해 전부 판매 할 수 있습니다.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&c 당신은 이곳에 상점을 만들수 없습니다.", "blacklisted-item": "&c당신은 이아이템을 판매할수 없습니다. 블랙리스트에 등록되어있는 아이템입니다.", "how-much-to-trade-for": "&a채팅에 {0}의 {1}개당 가격을 얼마로 할건지 입력해주세요.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&e당신의 상점 {1} 에 있는 {0} 이 얼었습니다!", "denied-put-in-item": "&c당신은 이아이템을 당신에 상점에 넣을수 없습니다!!", "how-many-buy-stack": "&e채팅에 입력하세요, 묶음을 얼마나 &b구매&a할것인지 &e{0}&a 개의 아이템의 하나의 묶음마다 들어있으며 당신은 &e{1}&a개의 묶음을 구매할수 있습니다 &b{2}&a을 입력하여 모두 구매할수 있습니다", - "how-many-sell-stack": "&e채팅에 입력하세요, 묶음을 얼마나 &d판매&a할것인지 &e{0}&a 개의 아이템의 하나의 묶음마다 들어있으며 당신은 &e{1}&a개의 묶음을 가지고 있습니다 &b{2}&a을 입력하여 모두 판매할수 있습니다", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&e이름: &6{0}", "code": "&e코드: &6{0}", diff --git a/crowdin/lang/nl-NL/messages.json b/crowdin/lang/nl-NL/messages.json index 94e7a52854..3c14cc9b67 100644 --- a/crowdin/lang/nl-NL/messages.json +++ b/crowdin/lang/nl-NL/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing van een QuickShop vergrendeling!", "that-is-locked": "&cDeze winkel is vergrendeld.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cU kunt hier geen winkel aanmaken.", "blacklisted-item": "&cJe kunt dit item niet verkopen omdat het op de zwarte lijst staat", "how-much-to-trade-for": "&aEnter in de chat, voor hoeveel u wilt handelen &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eUw winkel {0} om {1} is bevroren!", "denied-put-in-item": "&cU kunt dit item niet in uw winkel plaatsen!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNaam: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/no-NO/messages.json b/crowdin/lang/no-NO/messages.json index 5ea6911012..ced5203e9c 100644 --- a/crowdin/lang/no-NO/messages.json +++ b/crowdin/lang/no-NO/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cIgnorerer en QuickShop lås!", "that-is-locked": "&cDenne butikken er låst.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cDu kan ikke opprette en butikk her.", "blacklisted-item": "&cDu kan ikke selge denne gjenstanden fordi den er på svartelisten", "how-much-to-trade-for": "&aSkriv i chat hvor mye du ønsker å selge &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eDin butikk {0} på {1} ble frosset!", "denied-put-in-item": "&cDu kan ikke legge denne varen i butikken din!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNavn: &6{0}", "code": "&eKode: &6{0}", diff --git a/crowdin/lang/pl-PL/messages.json b/crowdin/lang/pl-PL/messages.json index 59e99d605b..4a537f61d7 100644 --- a/crowdin/lang/pl-PL/messages.json +++ b/crowdin/lang/pl-PL/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cOmijanie blokady QuickShop!", "that-is-locked": "&cTen sklep jest zablokowany.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cTu nie zrobisz sklepu.", "blacklisted-item": "&cNie możesz sprzedać tego przedmiotu, ponieważ znajduje się na czarnej liście", "how-much-to-trade-for": "&aWpisz na czacie cenę za &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eTwój sklep {0} w {1} został zamrożony!", "denied-put-in-item": "&cNie możesz umieścić tego przedmiotu w swoim sklepie!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNazwa: &6{0}", "code": "&eKod: &6{0}", diff --git a/crowdin/lang/pt-BR/messages.json b/crowdin/lang/pt-BR/messages.json index b02c7138c7..b86e21ae81 100644 --- a/crowdin/lang/pt-BR/messages.json +++ b/crowdin/lang/pt-BR/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cIgnorarando um bloqueio da loja!", "that-is-locked": "&cEssa loja está bloqueada.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cVocê não pode criar uma loja aqui.", "blacklisted-item": "&cVocê não pode vender este item porque ele está na lista negra", "how-much-to-trade-for": "&aDigite no chat, por quanto você deseja vender &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eA sua loja {0} em {1} foi congelada!", "denied-put-in-item": "&CVocê não pode colocar este item na sua loja!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNome: &6{0}", "code": "&eCódigo: &6{0}", diff --git a/crowdin/lang/pt-PT/messages.json b/crowdin/lang/pt-PT/messages.json index 9f07f977c3..2fc6bf6077 100644 --- a/crowdin/lang/pt-PT/messages.json +++ b/crowdin/lang/pt-PT/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/ro-RO/messages.json b/crowdin/lang/ro-RO/messages.json index 063641d296..d41f2fb6f7 100644 --- a/crowdin/lang/ro-RO/messages.json +++ b/crowdin/lang/ro-RO/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cNu poti crea un magazin aici.", "blacklisted-item": "&cNu poti vinde acest obiect pentru ca este pe lista neagra", "how-much-to-trade-for": "&aIntra in chat, cat de mult doresti sa tranzacționezi &{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/ru-RU/messages.json b/crowdin/lang/ru-RU/messages.json index a8d6a51692..e91c796122 100644 --- a/crowdin/lang/ru-RU/messages.json +++ b/crowdin/lang/ru-RU/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "Обход блокировки магазина!", "that-is-locked": "&cЭтот магазин заперт.", "how-many-buy": "&aВведите в чат, сколько вы хотите &bКУПИТЬ&a. Вы можете купить &e{0}&a. Введите &b{1}&a чтобы купить их все.", - "how-many-sell": "&aВведите в чат, сколько вы хотите &dПРОДАТЬ&a. У вас есть &e{0}&a. Введите &b{1}&a в чате, чтобы продать все.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cВы не можете создать магазин здесь.", "blacklisted-item": "&cВы не можете продать, оно находится в черном списке", "how-much-to-trade-for": "&aВводите в чат, сколько вы хотите обменивать &e{1}x {0}&a.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eВаш магазин {0} на {1} был заморожен!", "denied-put-in-item": "&cВы не можете поместить этот товар в ваш магазин!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eИмя: &6{0}", "code": "&eКод: &6{0}", diff --git a/crowdin/lang/sr-SP/messages.json b/crowdin/lang/sr-SP/messages.json index 355f5c6138..6944ca2125 100644 --- a/crowdin/lang/sr-SP/messages.json +++ b/crowdin/lang/sr-SP/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/sv-SE/messages.json b/crowdin/lang/sv-SE/messages.json index dff733d05c..8be0d755a5 100644 --- a/crowdin/lang/sv-SE/messages.json +++ b/crowdin/lang/sv-SE/messages.json @@ -6,7 +6,7 @@ "translation-contributors": "Medhjälpare: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken och Andre_601", "translation-country": "Språkområde: Svenska (sv_SE)", "language-version": "63", - "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": "&cKunde inte hitta ett block för att skapa butik. Du måste titta på ett.", "not-looking-at-shop": "&cKunde inte hitta en QuickShop. Du måste titta på en.", "no-anythings-in-your-hand": "&cDet finns inget i din hand.", "no-permission": "&cDu har inte tillåtelse till att göra detta.", @@ -110,8 +110,8 @@ }, "bypassing-lock": "&cIgnorerar ett butikslås!", "that-is-locked": "&cDenna butik är låst.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-buy": "&aAnge i chatten, hur många du vill &bKÖPA&a. Du kan köpa &e{0}&a. Ange &b{1}&a för att köpa alla.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cDu får inte skapa en butik här.", "blacklisted-item": "&cDu kan inte sälja detta föremål eftersom det finns på svartlistan", "how-much-to-trade-for": "&aAnge i chatten, hur mycket du vill sälja &e{1}x {0}&a för.", @@ -307,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cDu kan inte handla med denna butik eftersom den är fryst.", "shop-freezed-at-location": "&eDin butik {0} vid {1} blev frusen!", "denied-put-in-item": "&cDu kan inte lägga in detta objekt i din butik!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-buy-stack": "&eAnge i chatten, hur många paket du vill &bKÖPA&a. Det finns &e{0}&a föremål i varje paket och du kan köpa &e{1}&a paket. Ange &b{2}&a i chatten för att köpa alla.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eNamn: &6{0}", "code": "&eKod: &6{0}", diff --git a/crowdin/lang/tr-TR/messages.json b/crowdin/lang/tr-TR/messages.json index 6dfa9ceca3..fa4a1ca098 100644 --- a/crowdin/lang/tr-TR/messages.json +++ b/crowdin/lang/tr-TR/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBir QuickShop kilidi atlanıyor!", "that-is-locked": "&cBu market kilitli.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cBurada bir market oluşturamazsın.", "blacklisted-item": "&cBu öğeyi satamazsın çünkü kara listede", "how-much-to-trade-for": "&e{1} &atane &e{0} &aiçin ne kadar ticaret yapmak istediğini sohbete yaz.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "{1} yerindeki {0} marketiniz donduruldu!", "denied-put-in-item": "&cBu öğeyi marketine koyamazsın!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eİsim: &6{0}", "code": "&eKod: &6{0}", diff --git a/crowdin/lang/uk-UA/messages.json b/crowdin/lang/uk-UA/messages.json index 355f5c6138..6944ca2125 100644 --- a/crowdin/lang/uk-UA/messages.json +++ b/crowdin/lang/uk-UA/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/vi-VN/messages.json b/crowdin/lang/vi-VN/messages.json index 855e9a339c..4dbfd86554 100644 --- a/crowdin/lang/vi-VN/messages.json +++ b/crowdin/lang/vi-VN/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/zh-CN/messages.json b/crowdin/lang/zh-CN/messages.json index 832a52161e..27d95112de 100644 --- a/crowdin/lang/zh-CN/messages.json +++ b/crowdin/lang/zh-CN/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&c你绕过了QuickShop的锁!", "that-is-locked": "&c这个商店已上锁。", "how-many-buy": "&a在聊天中输入您想要&b购买&a的数量。您可以购买&e{0}&a个,输入&b{1}&a以购买全部。", - "how-many-sell": "&a聊天栏中输入想 &d出售 &a的物品数量. 您的背包中拥有 &e{0} &a件物品。输入 &b{1}&a 来出售全部物品。", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&c你不能在这里创建商店", "blacklisted-item": "&c这件物品已经被拉黑,你不能出售它", "how-much-to-trade-for": "&a请在聊天中输入交易&e{1}个{0}&a所需的价格。", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&e你在 {1} 的商店 {0} 被冻结了!", "denied-put-in-item": "&c您不能将此物品放入您的商店!", "how-many-buy-stack": "&a聊天栏中输入你想&b买&a的份数. 每份中有 &e{0}&a 个该物品, 你可以买 &e{1}&a 份. 输入 &b{2}&a 以买下所有该物品.", - "how-many-sell-stack": "&a在聊天栏中输入你想 &d卖&a 的份数. 每份中有 &e{0}&a 个该物品, 你目前拥有 &e{1}&a 份这样的物品可卖出,输入 &b{2}&a 以卖出所有此项物品。", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&e名称: &6{0}", "code": "&e代码: &6{0}", diff --git a/crowdin/lang/zh-HK/messages.json b/crowdin/lang/zh-HK/messages.json index b38137146e..41fc908d37 100644 --- a/crowdin/lang/zh-HK/messages.json +++ b/crowdin/lang/zh-HK/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/zh-TW/messages.json b/crowdin/lang/zh-TW/messages.json index 113cac97a5..0d7237a941 100644 --- a/crowdin/lang/zh-TW/messages.json +++ b/crowdin/lang/zh-TW/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&c你繞過了 Quickshop 鎖 !", "that-is-locked": "&c此商店已上鎖。", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&c你無法在此建立商店。", "blacklisted-item": "&c由於這是黑名單的物品,所以你不能賣。", "how-much-to-trade-for": "&a請在聊天室中輸入你想買賣 &e{1} 個 {0} &a的價格。", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&e你在 {1} 的商店 {0} 被凍結了 !", "denied-put-in-item": "&c你不能將此物品放入你的商店 !", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&e名稱 : &6{0}", "code": "&e代碼 : &6{0}", diff --git a/src/main/resources/lang/messages.json b/src/main/resources/lang/messages.json index 6944ca2125..355f5c6138 100644 --- a/src/main/resources/lang/messages.json +++ b/src/main/resources/lang/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From a8b7ec93347643ebe295539cf14d87fb342c58d7 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 19:54:35 +0800 Subject: [PATCH 104/725] Fix broken potion effect again --- .../localization/game/game/MojangGameLanguageImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java b/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java index da909c4b3e..ef9cc8a725 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java +++ b/src/main/java/org/maxgamer/quickshop/localization/game/game/MojangGameLanguageImpl.java @@ -163,12 +163,18 @@ public String getBlock(@NotNull Material material) { return jsonElement.getAsString(); } + private static final boolean isPotionSupportMinecraftKey = Util.isMethodAvailable("org.bukkit.potion.PotionEffectType", "getKey"); @Override public @NotNull String getPotion(@NotNull PotionEffectType potionEffectType) { if (lang == null) { return super.getPotion(potionEffectType); } - JsonElement jsonElement = lang.get("effect.minecraft." + potionEffectType.getName().toLowerCase()); + JsonElement jsonElement; + if (isPotionSupportMinecraftKey) { + jsonElement = lang.get("effect.minecraft." + potionEffectType.getKey().getKey().toLowerCase()); + } else { + jsonElement = lang.get("effect.minecraft." + potionEffectType.getName().toLowerCase()); + } if (jsonElement == null) { return super.getPotion(potionEffectType); } From be352fda21e1a324df7d9d0276b27c46b1b99549 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 19:54:58 +0800 Subject: [PATCH 105/725] Add missed findRelativeLanguages --- .../maxgamer/quickshop/localization/text/SimpleTextManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index b5a74e7c89..8891ddfac0 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -599,7 +599,7 @@ private String postProcess(@NotNull String text) { @Override @NotNull public String forLocale(@NotNull String locale) { - JsonConfiguration index = mapping.get(locale); + JsonConfiguration index = mapping.get(manager.findRelativeLanguages(locale)); if (index == null) { Util.debugLog("Fallback " + locale + " to default game-language locale caused by QuickShop doesn't support this locale"); if (MsgUtil.getDefaultGameLanguageCode().equals(locale)) { From 3a2f4b436686b60a43265bbaa2b3cce247897835 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 19:55:31 +0800 Subject: [PATCH 106/725] Deleted getContributors which not supported by 1.15 --- .../quickshop/util/collector/adapter/CollectorAdapter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/collector/adapter/CollectorAdapter.java b/src/main/java/org/maxgamer/quickshop/util/collector/adapter/CollectorAdapter.java index fe2a26a3c7..e94e34c6bf 100644 --- a/src/main/java/org/maxgamer/quickshop/util/collector/adapter/CollectorAdapter.java +++ b/src/main/java/org/maxgamer/quickshop/util/collector/adapter/CollectorAdapter.java @@ -166,7 +166,6 @@ public class CollectorAdapter { perPlugin.put("data_folder", pl.getDataFolder()); perPlugin.put("api_version", pl.getDescription().getAPIVersion()); perPlugin.put("authors", Util.list2String(pl.getDescription().getAuthors())); - perPlugin.put("contributors", Util.list2String(pl.getDescription().getContributors())); perPlugin.put("depend", Util.list2String(pl.getDescription().getDepend())); perPlugin.put("soft_depend", Util.list2String(pl.getDescription().getSoftDepend())); perPlugin.put("is_addon", pl.getDescription().getDepend().contains("QuickShop") || pl.getDescription().getSoftDepend().contains("QuickShop")); From 3c99c5a905cedb0233970f692961e5f1821293e6 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 12 Dec 2021 20:04:27 +0800 Subject: [PATCH 107/725] Bump to 5.1.0.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 503bc5e2ad..9716e0b1b6 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ QuickShop - 5.0.0.17 + 5.1.0.0 org.maxgamer.quickshop Ghost-chu UTF-8 From 4550c5a54c9fd75e0d0a09e420128c5b550248a0 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Sun, 12 Dec 2021 20:34:40 +0800 Subject: [PATCH 108/725] 5.1.0.0 (#29) (#30) * Allow addon to hook the Inventory getting * bump ver * New translations messages.json (Dutch) * Update config.yml * Bump sqlite-jdbc from 3.34.0 to 3.36.0.3 Bumps [sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) from 3.34.0 to 3.36.0.3. - [Release notes](https://github.com/xerial/sqlite-jdbc/releases) - [Changelog](https://github.com/xerial/sqlite-jdbc/blob/master/CHANGELOG) - [Commits](https://github.com/xerial/sqlite-jdbc/compare/3.34.0...3.36.0.3) --- updated-dependencies: - dependency-name: org.xerial:sqlite-jdbc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Bump okhttp from 4.9.2 to 4.9.3 Bumps [okhttp](https://github.com/square/okhttp) from 4.9.2 to 4.9.3. - [Release notes](https://github.com/square/okhttp/releases) - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-4.9.2...parent-4.9.3) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Fix broken readme * Fix broken readme again * [FactionUUID] Drop support for 0.5.x and support 0.6.x * New translations messages.json (English) * New translations messages.json (Korean) * Bump paperlib from 1.0.6 to 1.0.7 Bumps [paperlib](https://github.com/PaperMC/PaperLib) from 1.0.6 to 1.0.7. - [Release notes](https://github.com/PaperMC/PaperLib/releases) - [Changelog](https://github.com/PaperMC/PaperLib/blob/master/CHANGELOG.md) - [Commits](https://github.com/PaperMC/PaperLib/compare/1.0.6...v1.0.7) --- updated-dependencies: - dependency-name: io.papermc:paperlib dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * [WorldGuardIntegration] Fix global region issue * New translations messages.json (Korean) * Try to fix sync issue * Fix shade issue * Change to common-lang3, adapt to spigot 1.18 lib changes * Revert wrong changes * Volatile the dev-mode, prevent some issues * Target to 1.18-rc3 * Remove lombok.NonNull and javax.annotation.Nonnull usage * Fix auto despawn watcher * Deprecated DisplayWatcher * Re-add "Enchantment name shows on enchanted books" feature * Fix ShopPurger * Update crowdin.yml * Fixed a bug in which the Find command would display the result multiple times. * Fix case-sensitive and underscore issue in enabled languages * Fix NoClassDefFoundError not handled by catch statement * Bump junit-jupiter-api from 5.8.1 to 5.8.2 Bumps [junit-jupiter-api](https://github.com/junit-team/junit5) from 5.8.1 to 5.8.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Adapt to 1.18 * Fix item namespace method finding issue, also fix fallback * Fix caching issue, invalidate cache when getting * Fix case-sensitive issue in enabled languages * Switch access token to new one * Bump IridiumSkyblock from 3.1.2 to 3.2.2 Bumps IridiumSkyblock from 3.1.2 to 3.2.2. --- updated-dependencies: - dependency-name: com.iridium:IridiumSkyblock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * #16 Try to fix cache method issue * Delete incorrect reloaction * Fix mistaken on update message * Fix price command bypassing the integer only option. * Bump advanced-region-market from 3.3.5 to 3.3.6 Bumps advanced-region-market from 3.3.5 to 3.3.6. --- updated-dependencies: - dependency-name: com.github.alex9849:advanced-region-market dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Bump SongodaCore from 2.5.14 to 2.6.3 Bumps SongodaCore from 2.5.14 to 2.6.3. --- updated-dependencies: - dependency-name: com.songoda:SongodaCore dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Fix #20, correct the event using * Fix #17 * Change misleading configuration description * Backport for NPE fix * Don't use SimplixStorage * Refactor new language system [1/3] preparing local language files * Fix color issue with certain input * Fix testing and bump spigot-api to 1.18.1-R0.1-SNAPSHOT * Fix test * Fix comment missing issue, implement itself comment updater * Delete backup when update successful * Handle local files loading * Fix plugin loading stuck on i18n loading * Printing errors when cannot create column * Fix misleading message and apply tradeAllWord to trade message * Fix NoSuchFileException * Loading bundled file for not internet connection * Language System improvement Let cachedGameLanguageCode only caching default one Fix stuck loading issue for textManager Add related languages code matching, Fix #1 * Update languagesCache only when no cache * Fix misleading sell messages * Fix misleading sell messages * Try to fix crowdin issue * Update Crowdin configuration file * Try to fix crowdin issue again * New translations messages.json (Romanian) * New translations messages.json (Dutch) * New translations messages.json (Portuguese, Brazilian) * New translations messages.json (Vietnamese) * New translations messages.json (English) * New translations messages.json (Chinese Traditional) * New translations messages.json (Chinese Simplified) * New translations messages.json (Ukrainian) * New translations messages.json (Turkish) * New translations messages.json (Swedish) * New translations messages.json (Serbian (Cyrillic)) * New translations messages.json (Russian) * New translations messages.json (Portuguese) * New translations messages.json (Polish) * New translations messages.json (Norwegian) * New translations messages.json (Korean) * New translations messages.json (French) * New translations messages.json (Japanese) * New translations messages.json (Italian) * New translations messages.json (Hungarian) * New translations messages.json (Hebrew) * New translations messages.json (Finnish) * New translations messages.json (Greek) * New translations messages.json (German) * New translations messages.json (Danish) * New translations messages.json (Czech) * New translations messages.json (Catalan) * New translations messages.json (Arabic) * New translations messages.json (Afrikaans) * New translations messages.json (Spanish) * New translations messages.json (Chinese Traditional, Hong Kong) * Only apply right language-version for client * Fix local file not loading and language not matching * Update README.md * Fix local file UTF-8 issue * Fix broken potion effect * New Crowdin updates (#28) * Update source file messages.json * New translations messages.json (Chinese Simplified) * New translations messages.json (Swedish) * New translations messages.json (Romanian) * New translations messages.json (Dutch) * New translations messages.json (Portuguese, Brazilian) * New translations messages.json (Vietnamese) * New translations messages.json (English) * New translations messages.json (Chinese Traditional) * New translations messages.json (Chinese Simplified) * New translations messages.json (Ukrainian) * New translations messages.json (Turkish) * New translations messages.json (Swedish) * New translations messages.json (Serbian (Cyrillic)) * New translations messages.json (Russian) * New translations messages.json (Portuguese) * New translations messages.json (Polish) * New translations messages.json (Norwegian) * New translations messages.json (Korean) * New translations messages.json (French) * New translations messages.json (Japanese) * New translations messages.json (Italian) * New translations messages.json (Hungarian) * New translations messages.json (Hebrew) * New translations messages.json (Finnish) * New translations messages.json (Greek) * New translations messages.json (German) * New translations messages.json (Danish) * New translations messages.json (Czech) * New translations messages.json (Catalan) * New translations messages.json (Arabic) * New translations messages.json (Afrikaans) * New translations messages.json (Spanish) * New translations messages.json (Chinese Traditional, Hong Kong) * Fix broken potion effect again * Add missed findRelativeLanguages * Deleted getContributors which not supported by 1.15 * Bump to 5.1.0.0 Co-authored-by: Ghost_chu <2908803755@qq.com> Co-authored-by: Ghost_chu <30802565+Ghost-chu@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: nikomaru <76208219+nlkomaru@users.noreply.github.com> Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com> Co-authored-by: Ghost_chu <30802565+Ghost-chu@users.noreply.github.com> Co-authored-by: Ghost_chu <2908803755@qq.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: nikomaru <76208219+nlkomaru@users.noreply.github.com> Co-authored-by: Warrior <50800980+Warriorrrr@users.noreply.github.com> From acb174df5cb6b9261dc3acf3850a6b25915fd468 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 00:46:03 +0800 Subject: [PATCH 109/725] Fix purging wrong shop issue How can this code was write????? --- src/main/java/org/maxgamer/quickshop/util/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 72ef8980f5..05266c4c8d 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -1302,7 +1302,7 @@ public static LocalDateTime getDateTimeFromTimestamp(long timestamp) { if (timestamp == 0) { return null; } - return LocalDateTime.ofInstant(Instant.ofEpochSecond(timestamp), TimeZone + return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), TimeZone .getDefault().toZoneId()); } From b644f56600210e9313727bd80f1ec653c0b13913 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 00:52:59 +0800 Subject: [PATCH 110/725] Make a backup before purging --- src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java b/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java index 12f4289e1c..e505571b80 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ShopPurger.java @@ -29,6 +29,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; +import java.util.UUID; public class ShopPurger implements Runnable { @@ -56,7 +57,10 @@ public void purge() { public void run() { Util.ensureThread(true); executing = true; - Util.debugLog("[Shop Purger] Scanning and removing shops"); + + String backupFileName = "shop-purge-backup-" + UUID.randomUUID() + ".txt"; + Util.makeExportBackup(backupFileName); + plugin.getLogger().info("[Shop Purger] Scanning and removing shops, we have backup shop data as" + backupFileName + ", if you ran into any trouble, please rename it to recovery.txt then use /qs recovery in console to rollback"); List pendingRemovalShops = new ArrayList<>(); int days = plugin.getConfig().getInt("purge.days", 360); boolean deleteBanned = plugin.getConfig().getBoolean("purge.banned"); From 1078d45a6f585fbfd4300f102e6461ffe54a36fa Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 00:55:14 +0800 Subject: [PATCH 111/725] 5.1.0.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9716e0b1b6..3038972539 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ QuickShop - 5.1.0.0 + 5.1.0.1 org.maxgamer.quickshop Ghost-chu UTF-8 From 737d9f1cdb8228d442f631aa447a1d2eaf5d34f7 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 13:19:56 +0800 Subject: [PATCH 112/725] Fix silent command throwing exception when input is invalid --- .../command/subcommand/SubCommand_SilentBuy.java | 11 +++++++++-- .../command/subcommand/SubCommand_SilentEmpty.java | 12 ++++++++++-- .../command/subcommand/SubCommand_SilentPreview.java | 12 ++++++++++-- .../command/subcommand/SubCommand_SilentRemove.java | 12 ++++++++++-- .../command/subcommand/SubCommand_SilentSell.java | 12 ++++++++++-- .../subcommand/SubCommand_SilentUnlimited.java | 12 ++++++++++-- 6 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java index c5fee44b37..fc77131560 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java @@ -38,12 +38,19 @@ public class SubCommand_SilentBuy implements CommandHandler { @Override public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length < 1) { + if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; } + UUID uuid; + try { + uuid = UUID.fromString(cmdArg[0]); + } catch (IllegalArgumentException e) { + //Not valid, return for doing nothing + return; + } - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(UUID.fromString(cmdArg[0])); + Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); if (shop == null || !shop.getModerator().isModerator(sender.getUniqueId())) { plugin.text().of(sender, "not-looking-at-shop").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java index 98f8eea7a5..5ef928a5dd 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java @@ -39,12 +39,20 @@ public class SubCommand_SilentEmpty implements CommandHandler { @Override public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length < 1) { + if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; } - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(UUID.fromString(cmdArg[0])); + UUID uuid; + try { + uuid = UUID.fromString(cmdArg[0]); + } catch (IllegalArgumentException e) { + //Not valid, return for doing nothing + return; + } + + Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); if (!(shop instanceof ContainerShop)) { plugin.text().of(sender, "not-looking-at-shop").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java index 03ed0f3744..91867abfe8 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java @@ -37,12 +37,20 @@ public class SubCommand_SilentPreview implements CommandHandler { @Override public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length < 1) { + if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; } - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(UUID.fromString(cmdArg[0])); + UUID uuid; + try { + uuid = UUID.fromString(cmdArg[0]); + } catch (IllegalArgumentException e) { + //Not valid, return for doing nothing + return; + } + + Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); if (!(shop instanceof ContainerShop)) { diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java index ea6723a6ed..cdf0d0132f 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java @@ -37,12 +37,20 @@ public class SubCommand_SilentRemove implements CommandHandler { @Override public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length < 1) { + if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; } - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(UUID.fromString(cmdArg[0])); + UUID uuid; + try { + uuid = UUID.fromString(cmdArg[0]); + } catch (IllegalArgumentException e) { + //Not valid, return for doing nothing + return; + } + + Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); if (shop == null) { plugin.text().of(sender, "not-looking-at-shop").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java index 2769e29d0d..d6835bc658 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java @@ -38,12 +38,20 @@ public class SubCommand_SilentSell implements CommandHandler { @Override public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length < 1) { + if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; } - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(UUID.fromString(cmdArg[0])); + UUID uuid; + try { + uuid = UUID.fromString(cmdArg[0]); + } catch (IllegalArgumentException e) { + //Not valid, return for doing nothing + return; + } + + Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); if (shop == null || !shop.getModerator().isModerator(sender.getUniqueId())) { plugin.text().of(sender, "not-looking-at-shop").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java index 0cd2c20873..1d20ae087a 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java @@ -37,12 +37,20 @@ public class SubCommand_SilentUnlimited implements CommandHandler { @Override public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length < 1) { + if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; } - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(UUID.fromString(cmdArg[0])); + UUID uuid; + try { + uuid = UUID.fromString(cmdArg[0]); + } catch (IllegalArgumentException e) { + //Not valid, return for doing nothing + return; + } + + Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); if (shop == null) { plugin.text().of(sender, "not-looking-at-shop").send(); From 28def09c1ccea6d7be773eda6d7e76eb8002af9d Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 13:20:16 +0800 Subject: [PATCH 113/725] Bump to 5.1.0.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3038972539..9d6cf03326 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ QuickShop - 5.1.0.1 + 5.1.0.2 org.maxgamer.quickshop Ghost-chu UTF-8 From 1bf758b9cc6e9f8432bc5366eb6a26487ccb5f21 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 13:59:12 +0800 Subject: [PATCH 114/725] =?UTF-8?q?Fix=20"=C2=A7r"=20is=20not=20working?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/maxgamer/quickshop/util/Util.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 05266c4c8d..bc6cb81e84 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -975,7 +975,8 @@ public static String parseColours(@Nullable String text) { MineDownParser parser = MINEDOWN.get().parser(); parser.reset(); StringBuilder builder = new StringBuilder(); - BaseComponent[] components = parser.enable(MineDownParser.Option.LEGACY_COLORS).parse(text).create(); + BaseComponent[] components = parser.enable(MineDownParser.Option.LEGACY_COLORS).backwardsCompatibility(true).parse(text).create(); + BaseComponent lastComponent = null; for (BaseComponent component : components) { ChatColor color = component.getColorRaw(); String legacyText = component.toLegacyText(); @@ -983,7 +984,17 @@ public static String parseColours(@Nullable String text) { //Remove redundant §f added by toLegacyText legacyText = legacyText.substring(2); } + if (lastComponent != null && ( + lastComponent.isBold() != component.isBold() || + lastComponent.isItalic() != component.isItalic() || + lastComponent.isObfuscated() != component.isObfuscated() || + lastComponent.isStrikethrough() != component.isStrikethrough() || + lastComponent.isUnderlined() != lastComponent.isUnderlined() + )) { + builder.append("§r"); + } builder.append(legacyText); + lastComponent = component; } return builder.toString(); } From 0d0c41e53e516b897af0fc6f53808b8d9eae9e0b Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 13 Dec 2021 18:44:46 +0800 Subject: [PATCH 115/725] Fix coloring issue --- .../platform/minedown/BungeeQuickChat.java | 124 +++++++++++++++--- .../command/subcommand/SubCommand_Find.java | 6 +- .../quickshop/shop/ContainerShop.java | 41 +++--- .../org/maxgamer/quickshop/util/MsgUtil.java | 6 +- .../org/maxgamer/quickshop/util/Util.java | 33 +---- 5 files changed, 140 insertions(+), 70 deletions(-) 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 4139a47e14..cfa2952904 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 @@ -51,12 +51,8 @@ public class BungeeQuickChat implements QuickChat { private final QuickShop plugin; - @Override - public void send(@NotNull CommandSender receiver, @Nullable String message) { - if (StringUtils.isEmpty(message)) { - return; - } - receiver.spigot().sendMessage(TextComponent.fromLegacyText(message)); + public static BaseComponent[] fromLegacyText(String text) { + return TextComponent.fromLegacyText(text, null); } @Override @@ -76,22 +72,54 @@ public void send(@NotNull CommandSender receiver, @Nullable QuickComponent compo } + public static String toLegacyText(BaseComponent[] components) { + StringBuilder builder = new StringBuilder(); + BaseComponent lastComponent = null; + for (BaseComponent component : components) { + net.md_5.bungee.api.ChatColor color = component.getColorRaw(); + String legacyText = component.toLegacyText(); + if (color == null && legacyText.startsWith("§f")) { + //Remove redundant §f added by toLegacyText + legacyText = legacyText.substring(2); + } + if (lastComponent != null && ( + lastComponent.isBold() != component.isBold() || + lastComponent.isItalic() != component.isItalic() || + lastComponent.isObfuscated() != component.isObfuscated() || + lastComponent.isStrikethrough() != component.isStrikethrough() || + lastComponent.isUnderlined() != lastComponent.isUnderlined() + )) { + builder.append("§r"); + } + builder.append(legacyText); + lastComponent = component; + } + return builder.toString(); + } + + @Override + public void send(@NotNull CommandSender receiver, @Nullable String message) { + if (StringUtils.isEmpty(message)) { + return; + } + receiver.spigot().sendMessage(fromLegacyText(message)); + } + @Override public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @NotNull ItemStack itemStack) { TextComponent errorComponent = new TextComponent(plugin.text().of(player, "menu.item-holochat-error").forLocale()); try { String json = ReflectFactory.convertBukkitItemStackToJson(itemStack); - ComponentBuilder builder = new ComponentBuilder(""); + BungeeComponentBuilder builder = new BungeeComponentBuilder(); builder.event(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(json).create())); TextSplitter.SpilledString spilledString = TextSplitter.deBakeItem(text); if (spilledString == null) { Util.debugLog("Spilled string is null"); builder.appendLegacy(text); } else { - builder.appendLegacy(spilledString.getLeft()); - net.md_5.bungee.api.ChatColor color = builder.getCurrentComponent().getColorRaw(); - builder.append(spilledString.getComponents()).color(color); - builder.appendLegacy(spilledString.getRight()).color(color); + builder.appendLegacy(spilledString.getLeft()) + .append(spilledString.getComponents()) + .appendLegacy(spilledString.getRight()); } BaseComponent[] components = builder.create(); Util.debugLog("Sending debug: " + ComponentSerializer.toString(components)); @@ -110,19 +138,18 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ if (json == null) { return new QuickComponentImpl(errorComponent); } - ComponentBuilder builder = new ComponentBuilder(""); + BungeeComponentBuilder builder = new BungeeComponentBuilder(); builder.event(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new ComponentBuilder(json).create())); TextSplitter.SpilledString spilledString = TextSplitter.deBakeItem(message); if (spilledString == null) { builder.appendLegacy(message); } else { - builder.appendLegacy(spilledString.getLeft()); - net.md_5.bungee.api.ChatColor color = builder.getCurrentComponent().getColorRaw(); - builder.append(spilledString.getComponents()).color(color); - builder.reset().appendLegacy(spilledString.getRight()).color(color); + builder.appendLegacy(spilledString.getLeft()) + .append(spilledString.getComponents()) + .appendLegacy(spilledString.getRight()); } - builder.appendLegacy(" ").appendLegacy(plugin.text().of(player, "menu.preview").forLocale()); + builder.append(" ").appendLegacy(plugin.text().of(player, "menu.preview").forLocale()); if (QuickShop.getPermissionManager().hasPermission(player, "quickshop.preview")) { builder.event(new ClickEvent( ClickEvent.Action.RUN_COMMAND, @@ -137,6 +164,69 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ } } + public static class BungeeComponentBuilder { + private final ComponentBuilder builder; + + public BungeeComponentBuilder() { + builder = new ComponentBuilder(""); + builder.removeComponent(0); + } + + public BungeeComponentBuilder append(BaseComponent component) { + if (builder.getCursor() == -1) { + builder.append(component, ComponentBuilder.FormatRetention.NONE); + } else { + builder.append(component); + } + return this; + } + + public BungeeComponentBuilder append(BaseComponent[] components) { + if (builder.getCursor() == -1) { + builder.append(components, ComponentBuilder.FormatRetention.NONE); + } else { + builder.append(components); + } + return this; + } + + public BungeeComponentBuilder append(String text) { + if (builder.getCursor() == -1) { + builder.append(text, ComponentBuilder.FormatRetention.NONE); + } else { + builder.append(text); + } + return this; + } + + public BungeeComponentBuilder appendLegacy(String text) { + return append(fromLegacyText(text)); + } + + public BungeeComponentBuilder event(ClickEvent clickEvent) { + builder.event(clickEvent); + return this; + } + + public BungeeComponentBuilder event(HoverEvent hoverEvent) { + builder.event(hoverEvent); + return this; + } + + public BungeeComponentBuilder reset() { + builder.reset(); + return this; + } + + public BaseComponent[] create() { + return builder.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()); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java index f36556d2bf..333ae8f096 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java @@ -36,6 +36,8 @@ import java.util.*; import java.util.stream.Collectors; +import static org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat.toLegacyText; + @AllArgsConstructor public class SubCommand_Find implements CommandHandler { @@ -127,8 +129,8 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not Location location = shop.getLocation(); // "nearby-shop-entry": "&a- Info:{0} &aPrice:&b{1} &ax:&b{2} &ay:&b{3} &az:&b{4} &adistance: &b{5} &ablock(s)" stringBuilder.append(plugin.text().of(sender, "nearby-shop-entry", - new TextComponent(shop.getSignText(sender.getLocale()).get(1).getComponents()).toLegacyText(), - new TextComponent(shop.getSignText(sender.getLocale()).get(3).getComponents()).toLegacyText(), + new TextComponent(toLegacyText(shop.getSignText(sender.getLocale()).get(1).getComponents())), + new TextComponent(toLegacyText(shop.getSignText(sender.getLocale()).get(3).getComponents())), String.valueOf(location.getBlockX()), String.valueOf(location.getBlockY()), String.valueOf(location.getBlockZ()), diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 83bb41e480..5254e17b7e 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -24,10 +24,7 @@ import io.papermc.lib.PaperLib; import lombok.EqualsAndHashCode; import me.lucko.helper.serialize.BlockPosition; -import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.DyeColor; import org.bukkit.Location; import org.bukkit.Material; @@ -53,6 +50,7 @@ import org.maxgamer.quickshop.api.chat.ComponentPackage; import org.maxgamer.quickshop.api.event.*; import org.maxgamer.quickshop.api.shop.*; +import org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat; import org.maxgamer.quickshop.util.MsgUtil; import org.maxgamer.quickshop.util.Util; import org.maxgamer.quickshop.util.logging.container.ShopRemoveLog; @@ -60,6 +58,9 @@ import java.util.*; import java.util.logging.Level; +import static org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat.fromLegacyText; +import static org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat.toLegacyText; + /** * ChestShop core */ @@ -696,7 +697,7 @@ public List getSignText(@NotNull String locale) { List lines = new ArrayList<>(); //Line 1 String statusStringKey = inventoryAvailable() ? "signs.status-available" : "signs.status-unavailable"; - lines.add(new ComponentPackage(TextComponent.fromLegacyText(plugin.text().of("signs.header", this.ownerName(false), plugin.text().of(statusStringKey).forLocale(locale)).forLocale(locale)))); + lines.add(new ComponentPackage(fromLegacyText(plugin.text().of("signs.header", this.ownerName(false), plugin.text().of(statusStringKey).forLocale(locale)).forLocale(locale)))); //Line 2 String tradingStringKey; @@ -735,34 +736,32 @@ public List getSignText(@NotNull String locale) { } // TODO No-longer use SHOP_SIGN_PREFIX since we use modern storage method. Pending for deletion. - lines.add(new ComponentPackage(new ComponentBuilder("").appendLegacy(SHOP_SIGN_PREFIX).reset().color(ChatColor.RESET).appendLegacy(line2).create())); + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(SHOP_SIGN_PREFIX).appendLegacy(line2).create())); //line 3 if (plugin.getConfig().getBoolean("shop.force-use-item-original-name") || !this.getItem().hasItemMeta() || !this.getItem().getItemMeta().hasDisplayName()) { - BaseComponent[] left = TextComponent.fromLegacyText(plugin.text().of("signs.item-left").forLocale()); - BaseComponent[] right = TextComponent.fromLegacyText(plugin.text().of("signs.item-right").forLocale()); + String left = plugin.text().of("signs.item-left").forLocale(); + String right = plugin.text().of("signs.item-right").forLocale(); if (plugin.getNbtapi() == null) { // NBTAPI not installed - lines.add(new ComponentPackage(new ComponentBuilder("") - .color(ChatColor.RESET) - .append(left) - .append(TextComponent.fromLegacyText(Util.getItemStackName(getItem()))) - .append(right) + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder() + .appendLegacy(left) + .appendLegacy(Util.getItemStackName(getItem())) + .appendLegacy(right) .create())); } else { // NBTAPI installed String itemName = Util.getItemCustomName(getItem()); - BaseComponent[] itemComponents = itemName == null ? Util.getTranslateComponentForItem(getItem()) : TextComponent.fromLegacyText(itemName); - lines.add(new ComponentPackage(new ComponentBuilder("") - .color(ChatColor.RESET) - .append(left) + BaseComponent[] itemComponents = itemName == null ? Util.getTranslateComponentForItem(getItem()) : fromLegacyText(itemName); + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder() + .appendLegacy(left) .append(itemComponents) - .append(right) + .appendLegacy(right) .create())); } } else { - lines.add(new ComponentPackage(new ComponentBuilder("").color(ChatColor.RESET).appendLegacy(plugin.text().of("signs.item-left").forLocale()) - .append(TextComponent.fromLegacyText(Util.getItemStackName(getItem()))) + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(plugin.text().of("signs.item-left").forLocale()) + .appendLegacy(Util.getItemStackName(getItem())) .appendLegacy(plugin.text().of("signs.item-right").forLocale()).create())); } @@ -775,7 +774,7 @@ public List getSignText(@NotNull String locale) { } else { line4 = plugin.text().of("signs.price", plugin.getShopManager().format(this.getPrice(), this)).forLocale(); } - lines.add(new ComponentPackage(new ComponentBuilder("").color(ChatColor.RESET).appendLegacy(line4).create())); + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(line4).create())); return lines; } @@ -798,7 +797,7 @@ public void setSignText(@NotNull List lines) { if (tileSign != null) { tileSign.setString("Text" + (i + 1), Util.componentsToJson(lines.get(i).getComponents())); } else { - sign.setLine(i, new TextComponent(lines.get(i).getComponents()).toLegacyText()); + sign.setLine(i, toLegacyText(lines.get(i).getComponents())); } } if (plugin.getGameVersion().isSignTextDyeSupport()) { diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index d3a5ba3f21..51d2cc6cd1 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -26,7 +26,6 @@ import lombok.Builder; import lombok.Data; import lombok.Getter; -import net.md_5.bungee.api.chat.ComponentBuilder; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -50,6 +49,7 @@ import org.maxgamer.quickshop.api.event.ShopControlPanelOpenEvent; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.chat.QuickComponentImpl; +import org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat; import org.maxgamer.quickshop.localization.game.game.GameLanguage; import org.maxgamer.quickshop.localization.game.game.MojangGameLanguageImpl; import org.maxgamer.quickshop.util.logging.container.PluginGlobalAlertLog; @@ -228,7 +228,7 @@ public static String getTranslateText(ItemStack stack) { } public static String convertItemStackToTranslateText(Material mat) { - return TextSplitter.bakeComponent(new ComponentBuilder("").append(Util.getTranslateComponentForMaterial(mat)).create()); + return TextSplitter.bakeComponent(new BungeeQuickChat.BungeeComponentBuilder().append(Util.getTranslateComponentForMaterial(mat)).create()); } @Unstable @@ -739,7 +739,7 @@ public static void sendDirectMessage(@Nullable CommandSender sender, @Nullable S if (spilledString == null) { plugin.getQuickChat().send(sender, msg); } else { - ComponentBuilder builder = new ComponentBuilder(""); + BungeeQuickChat.BungeeComponentBuilder builder = new BungeeQuickChat.BungeeComponentBuilder(); builder.appendLegacy(spilledString.getLeft()); builder.append(spilledString.getComponents()); builder.appendLegacy(spilledString.getRight()); diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index bc6cb81e84..96484f95f0 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -26,9 +26,7 @@ import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; -import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TranslatableComponent; import net.md_5.bungee.chat.ComponentSerializer; import org.apache.commons.lang3.StringUtils; @@ -77,6 +75,9 @@ import java.util.logging.Level; import java.util.stream.Collectors; +import static org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat.fromLegacyText; +import static org.maxgamer.quickshop.chat.platform.minedown.BungeeQuickChat.toLegacyText; + public class Util { private static final EnumSet BLACKLIST = EnumSet.noneOf(Material.class); private static final EnumMap> RESTRICTED_PRICES = new EnumMap<>(Material.class); @@ -416,13 +417,13 @@ public static boolean useEnchantmentForEnchantedBook() { @NotNull public static BaseComponent[] getTranslateComponentForItem(ItemStack stack) { String result = ReflectFactory.getMaterialMinecraftNamespacedKey(stack.getType()); - return result == null ? TextComponent.fromLegacyText(getItemStackName(stack)) : new BaseComponent[]{new TranslatableComponent(result)}; + return result == null ? fromLegacyText(getItemStackName(stack)) : new BaseComponent[]{new TranslatableComponent(result)}; } @NotNull public static BaseComponent[] getTranslateComponentForMaterial(Material material) { String result = ReflectFactory.getMaterialMinecraftNamespacedKey(material); - return result == null ? TextComponent.fromLegacyText(MsgUtil.getItemi18n(material.name())) : new BaseComponent[]{new TranslatableComponent(result)}; + return result == null ? fromLegacyText(MsgUtil.getItemi18n(material.name())) : new BaseComponent[]{new TranslatableComponent(result)}; } @Nullable @@ -974,29 +975,7 @@ public static String parseColours(@Nullable String text) { } MineDownParser parser = MINEDOWN.get().parser(); parser.reset(); - StringBuilder builder = new StringBuilder(); - BaseComponent[] components = parser.enable(MineDownParser.Option.LEGACY_COLORS).backwardsCompatibility(true).parse(text).create(); - BaseComponent lastComponent = null; - for (BaseComponent component : components) { - ChatColor color = component.getColorRaw(); - String legacyText = component.toLegacyText(); - if (color == null && legacyText.startsWith("§f")) { - //Remove redundant §f added by toLegacyText - legacyText = legacyText.substring(2); - } - if (lastComponent != null && ( - lastComponent.isBold() != component.isBold() || - lastComponent.isItalic() != component.isItalic() || - lastComponent.isObfuscated() != component.isObfuscated() || - lastComponent.isStrikethrough() != component.isStrikethrough() || - lastComponent.isUnderlined() != lastComponent.isUnderlined() - )) { - builder.append("§r"); - } - builder.append(legacyText); - lastComponent = component; - } - return builder.toString(); + return toLegacyText(parser.enable(MineDownParser.Option.LEGACY_COLORS).backwardsCompatibility(true).parse(text).create()); } /** From 2f0ebc920a9b222c6778ffa77ea883269e244fdc Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 14 Dec 2021 00:58:28 +0800 Subject: [PATCH 116/725] Add comment for code and fix pending comment bug --- .../util/config/ConfigCommentUpdater.java | 92 ++++++++++++++++--- 1 file changed, 78 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java index 671a701353..fc5bf514d9 100644 --- a/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java +++ b/src/main/java/org/maxgamer/quickshop/util/config/ConfigCommentUpdater.java @@ -53,10 +53,13 @@ public ConfigCommentUpdater(QuickShop plugin, InputStream builtInConfig, File ex public void updateComment() { boolean hasBackup = false; boolean hasWrite = false; + final Set EMPTY_SET = Collections.emptySet(); + //Make a backup first Path backupFile = externalConfig.toPath().getParent().resolve("config-" + UUID.randomUUID() + "-bak.yml"); try { Files.copy(externalConfig.toPath(), backupFile, StandardCopyOption.REPLACE_EXISTING); hasBackup = true; + //Read the built-in files BufferedReader reader = new BufferedReader(new InputStreamReader(builtInConfig, StandardCharsets.UTF_8)); List builtInContent = new ArrayList<>(); while (true) { @@ -66,59 +69,91 @@ public void updateComment() { } builtInContent.add(result); } - + //Start reading built-in config file comment PathMarker pathMarker = new PathMarker(); - Map> key2NonKeyContentMap = new LinkedHashMap<>(); + Map> key2CommentsMap = new LinkedHashMap<>(); Set pendingComment = new LinkedHashSet<>(); for (String s : builtInContent) { + //Trimmed for easy identify String trimmedStr = s.trim(); + //Just keep the only one empty line for per comment if (trimmedStr.isEmpty()) { pendingComment.add(""); continue; } + //Detecting comment if (trimmedStr.startsWith("#")) { + //Add comment pendingComment.add(s); } else - //First node is header, so just use current + //Detecting key and parsing to path if (pathMarker.parseRawInput(s)) { String pathNow = pathMarker.getPath(); - key2NonKeyContentMap.merge(pathNow, new LinkedHashSet<>(pendingComment), (oldList, newList) -> { + //Merge or add comment in map + key2CommentsMap.merge(pathNow, new LinkedHashSet<>(pendingComment), (oldList, newList) -> { oldList.addAll(newList); return oldList; }); + //Also clean it pendingComment.clear(); } } + //Add footer comment if (!pendingComment.isEmpty()) { - key2NonKeyContentMap.put(FOOTER, pendingComment); + key2CommentsMap.put(FOOTER, pendingComment); + pendingComment.clear(); } + //Reading file need to be updated List externalContent = Files.readAllLines(externalConfig.toPath()); List output = new ArrayList<>(externalContent.size()); + //Offset for adding comment int offset = 0; for (int i = 0; i < externalContent.size(); i++) { String s = externalContent.get(i); + //Parsing comment for file need to be updated if (s.isEmpty() || s.trim().startsWith("#")) { pendingComment.add(s); offset--; continue; } + //Add content for keys or configuration value output.add(s); + //Got a valid key if (pathMarker.parseRawInput(s)) { String pathNow = pathMarker.getPath(); - Set comments = key2NonKeyContentMap.getOrDefault(pathNow, Collections.emptySet()); + //Get the comments in build-in path with the same node (empty if not existed) + Set comments = key2CommentsMap.getOrDefault(pathNow, EMPTY_SET); + //Merge that pendingComment.addAll(comments); for (String comment : pendingComment) { + //Add comment just in the key was inserted + //Base on offset: + // Index Value + // 0 foo: value + // ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ + //==================== + // Index Value + // 0 # comment + // 1 foo: value output.add(i + offset, comment); offset++; } + //clear after added pendingComment.clear(); } } - output.addAll(key2NonKeyContentMap.getOrDefault(FOOTER, Collections.emptySet())); + //Add footer comment + Set footerComments = key2CommentsMap.getOrDefault(FOOTER, EMPTY_SET); + pendingComment.addAll(footerComments); + output.addAll(footerComments); + pendingComment.clear(); + + //Write updated file hasWrite = true; Files.write(externalConfig.toPath(), output, StandardCharsets.UTF_8); + //Delete backup backupFile.toFile().delete(); } catch (Throwable e) { if (hasBackup && hasWrite) { @@ -138,11 +173,17 @@ private static class PathMarker { private final List path = new ArrayList<>(Collections.singletonList(HEADER)); private int pathDepth = 0; - public void addNode(String s) { - path.add(s); + /** + * Add node for path + * + * @param nodeStr nodeStr to add + */ + public void addNode(String nodeStr) { + path.add(nodeStr); } - private int countSpace(String s) { + + private int countPrefixSpace(String s) { int i = 0; for (char c : s.toCharArray()) { if (c == ' ') { @@ -154,12 +195,18 @@ private int countSpace(String s) { return i; } + /** + * Parse the raw yaml line input + * + * @param str the raw yaml line input + * @return if a path parsed + */ public boolean parseRawInput(String str) { String trimmedStr = str.trim(); if (trimmedStr.startsWith("#") || !(trimmedStr.contains(": ") || trimmedStr.endsWith(":"))) { return false; } - int pathDepthNow = countSpace(str); + int pathDepthNow = countPrefixSpace(str); String nodeStr = trimmedStr.split(":", 2)[0]; if (!nodeStr.isEmpty()) { if (pathDepthNow > pathDepth) { @@ -179,18 +226,30 @@ public boolean parseRawInput(String str) { } } - public void replaceNode(String s) { + /** + * Replace current node + * + * @param nodeStr node to replace + */ + public void replaceNode(String nodeStr) { if (!path.isEmpty()) { - path.set(path.size() - 1, s); + path.set(path.size() - 1, nodeStr); } else { - path.add(s); + // "" node + path.add(nodeStr); } } + /** + * Reset current path + */ public void reset() { path.clear(); } + /** + * Remove current node + */ public void removeNode() { if (!path.isEmpty()) { path.remove(path.size() - 1); @@ -198,6 +257,11 @@ public void removeNode() { } + /** + * Get current path (Like foo.bar) + * + * @return Current path + */ public String getPath() { StringJoiner stringJoiner = new StringJoiner("."); for (String s : path) { From f1e4cdaef361a13bfce46f72a57e18369d1b58cd Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 14 Dec 2021 10:44:23 +0800 Subject: [PATCH 117/725] Fix unlimited and free shop counting issue --- .../org/maxgamer/quickshop/listener/PlayerListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index 509f324a6f..793c7485fe 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -293,9 +293,9 @@ else if (e.useInteractedBlock() == Event.Result.ALLOW private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inventory playerInventory) { if (shop.isFreeShop()) { // Free shop - return Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); + return shop.isUnlimited() ? Util.countSpace(playerInventory, shop.getItem()) : Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); } - int itemAmount = Math.min(shop.getRemainingStock(), (int) Math.floor(traderBalance / price)); + int itemAmount = Math.min(Util.countSpace(playerInventory, shop.getItem()), (int) Math.floor(traderBalance / price)); if (!shop.isUnlimited()) { itemAmount = Math.min(itemAmount, shop.getRemainingStock()); } @@ -307,7 +307,7 @@ private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inven private int getPlayerCanSell(Shop shop, double ownerBalance, double price, Inventory playerInventory) { if (shop.isFreeShop()) { - return Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); + return shop.isUnlimited() ? Util.countItems(playerInventory, shop.getItem()) : Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); } int items = Util.countItems(playerInventory, shop.getItem()); From 8c4844804b0bf89bfd0deb071cb766f2433cac22 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 14 Dec 2021 10:44:55 +0800 Subject: [PATCH 118/725] Fix coloring issue again --- .../platform/minedown/BungeeQuickChat.java | 63 +++++++++++++++---- .../text/LanguageFilesManager.java | 6 -- .../localization/text/SimpleTextManager.java | 4 +- .../quickshop/shop/ContainerShop.java | 16 ++--- .../org/maxgamer/quickshop/util/MsgUtil.java | 5 +- .../org/maxgamer/quickshop/util/Util.java | 2 + 6 files changed, 62 insertions(+), 34 deletions(-) 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 cfa2952904..b5d1b16841 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 @@ -40,6 +40,7 @@ import org.maxgamer.quickshop.util.Util; import java.lang.reflect.InvocationTargetException; +import java.util.UUID; import java.util.logging.Level; /** @@ -52,7 +53,7 @@ public class BungeeQuickChat implements QuickChat { private final QuickShop plugin; public static BaseComponent[] fromLegacyText(String text) { - return TextComponent.fromLegacyText(text, null); + return TextComponent.fromLegacyText(text, net.md_5.bungee.api.ChatColor.RESET); } @Override @@ -117,9 +118,7 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ Util.debugLog("Spilled string is null"); builder.appendLegacy(text); } else { - builder.appendLegacy(spilledString.getLeft()) - .append(spilledString.getComponents()) - .appendLegacy(spilledString.getRight()); + builder.appendLegacyAndItem(spilledString.getLeft(), spilledString.getComponents(), spilledString.getRight()); } BaseComponent[] components = builder.create(); Util.debugLog("Sending debug: " + ComponentSerializer.toString(components)); @@ -144,12 +143,12 @@ public void sendItemHologramChat(@NotNull Player player, @NotNull String text, @ if (spilledString == null) { builder.appendLegacy(message); } else { - builder.appendLegacy(spilledString.getLeft()) - .append(spilledString.getComponents()) - .appendLegacy(spilledString.getRight()); + builder.appendLegacyAndItem(spilledString.getLeft() + , spilledString.getComponents() + , spilledString.getRight()); } - builder.append(" ").appendLegacy(plugin.text().of(player, "menu.preview").forLocale()); + builder.appendLegacy(" ", plugin.text().of(player, "menu.preview").forLocale()); if (QuickShop.getPermissionManager().hasPermission(player, "quickshop.preview")) { builder.event(new ClickEvent( ClickEvent.Action.RUN_COMMAND, @@ -181,11 +180,10 @@ public BungeeComponentBuilder append(BaseComponent component) { return this; } + public BungeeComponentBuilder append(BaseComponent[] components) { - if (builder.getCursor() == -1) { - builder.append(components, ComponentBuilder.FormatRetention.NONE); - } else { - builder.append(components); + for (BaseComponent component : components) { + append(component); } return this; } @@ -199,8 +197,47 @@ public BungeeComponentBuilder append(String text) { return this; } + public BungeeComponentBuilder appendLegacy(String... text) { + if (text == null || text.length == 0) { + return this; + } + StringBuilder stringBuilder = new StringBuilder(text[0]); + for (int i = 1; i < text.length; i++) { + stringBuilder.append(text[i]); + } + builder.append(fromLegacyText(stringBuilder.toString()), ComponentBuilder.FormatRetention.EVENTS); + return this; + } + + public BungeeComponentBuilder appendLegacyAndItem(String left, BaseComponent[] itemsComponent, String right) { + ; + String uuidStr = UUID.randomUUID().toString(); + BaseComponent[] components = fromLegacyText(left + uuidStr + right); + boolean centerFound = false; + for (BaseComponent component : components) { + //Find center value + if (!centerFound && component.toPlainText().contains(uuidStr)) { + centerFound = true; + String[] text = ((TextComponent) component).getText().split(uuidStr, 2); + TextComponent leftComponent = new TextComponent(text[0]); + leftComponent.copyFormatting(component); + TextComponent rightComponent = new TextComponent(text[1]); + rightComponent.copyFormatting(component); + for (BaseComponent baseComponent : itemsComponent) { + leftComponent.addExtra(baseComponent); + } + builder.append(leftComponent, ComponentBuilder.FormatRetention.EVENTS); + builder.append(rightComponent, ComponentBuilder.FormatRetention.EVENTS); + } else { + builder.append(component); + } + } + return this; + } + public BungeeComponentBuilder appendLegacy(String text) { - return append(fromLegacyText(text)); + builder.append(fromLegacyText(text), ComponentBuilder.FormatRetention.EVENTS); + return this; } public BungeeComponentBuilder event(ClickEvent clickEvent) { diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java index 47724d1073..448f2cdf43 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/LanguageFilesManager.java @@ -22,7 +22,6 @@ import com.dumptruckman.bukkit.configuration.json.JsonConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.maxgamer.quickshop.util.Util; import java.util.Collections; import java.util.HashMap; @@ -53,9 +52,6 @@ public void reset() { * @param bundled The values from bundled file */ public void deploy(@NotNull String distributionPath, @NotNull String locale, @NotNull JsonConfiguration distribution, @NotNull JsonConfiguration bundled) { - //Parsed color - Util.parseColours(bundled); - Util.parseColours(distribution); this.bundledFile2ContentMapping.put(distributionPath, bundled); this.locale2ContentMapping.computeIfAbsent(distributionPath, e -> new HashMap<>()); this.locale2ContentMapping.get(distributionPath).put(locale, distribution); @@ -68,8 +64,6 @@ public void deploy(@NotNull String distributionPath, @NotNull String locale, @No * @param bundled The values from bundled file */ public void deployBundled(@NotNull String distributionPath, @NotNull JsonConfiguration bundled) { - //Parsed color - Util.parseColours(bundled); this.bundledFile2ContentMapping.put(distributionPath, bundled); } diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index 8891ddfac0..e3240b6d66 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -37,6 +37,7 @@ import org.maxgamer.quickshop.api.localization.text.postprocessor.PostProcessor; import org.maxgamer.quickshop.localization.text.distributions.Distribution; import org.maxgamer.quickshop.localization.text.distributions.crowdin.CrowdinOTA; +import org.maxgamer.quickshop.localization.text.postprocessing.impl.ColorProcessor; import org.maxgamer.quickshop.localization.text.postprocessing.impl.FillerProcessor; import org.maxgamer.quickshop.localization.text.postprocessing.impl.PlaceHolderApiProcessor; import org.maxgamer.quickshop.util.MsgUtil; @@ -273,10 +274,9 @@ public void load() { })); // Register post processor + postProcessors.add(new ColorProcessor()); postProcessors.add(new FillerProcessor()); postProcessors.add(new PlaceHolderApiProcessor()); - //We done this when deploys language - //postProcessors.add(new ColorProcessor()); } private String findRelativeLanguages(String langCode) { diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 5254e17b7e..ab9011354b 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -736,7 +736,7 @@ public List getSignText(@NotNull String locale) { } // TODO No-longer use SHOP_SIGN_PREFIX since we use modern storage method. Pending for deletion. - lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(SHOP_SIGN_PREFIX).appendLegacy(line2).create())); + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(SHOP_SIGN_PREFIX, line2).create())); //line 3 if (plugin.getConfig().getBoolean("shop.force-use-item-original-name") || !this.getItem().hasItemMeta() || !this.getItem().getItemMeta().hasDisplayName()) { @@ -745,24 +745,20 @@ public List getSignText(@NotNull String locale) { if (plugin.getNbtapi() == null) { // NBTAPI not installed lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder() - .appendLegacy(left) - .appendLegacy(Util.getItemStackName(getItem())) - .appendLegacy(right) + .appendLegacy(left, Util.getItemStackName(getItem()), right) .create())); } else { // NBTAPI installed String itemName = Util.getItemCustomName(getItem()); BaseComponent[] itemComponents = itemName == null ? Util.getTranslateComponentForItem(getItem()) : fromLegacyText(itemName); lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder() - .appendLegacy(left) - .append(itemComponents) - .appendLegacy(right) + .appendLegacyAndItem(left, + itemComponents, right) .create())); } } else { - lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(plugin.text().of("signs.item-left").forLocale()) - .appendLegacy(Util.getItemStackName(getItem())) - .appendLegacy(plugin.text().of("signs.item-right").forLocale()).create())); + lines.add(new ComponentPackage(new BungeeQuickChat.BungeeComponentBuilder().appendLegacy(plugin.text().of("signs.item-left").forLocale() + , Util.getItemStackName(getItem()), plugin.text().of("signs.item-right").forLocale()).create())); } //line 4 diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index 51d2cc6cd1..7526ff1f7f 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -740,9 +740,8 @@ public static void sendDirectMessage(@Nullable CommandSender sender, @Nullable S plugin.getQuickChat().send(sender, msg); } else { BungeeQuickChat.BungeeComponentBuilder builder = new BungeeQuickChat.BungeeComponentBuilder(); - builder.appendLegacy(spilledString.getLeft()); - builder.append(spilledString.getComponents()); - builder.appendLegacy(spilledString.getRight()); + builder.appendLegacyAndItem(spilledString.getLeft() + , spilledString.getComponents(), spilledString.getRight()); plugin.getQuickChat().send(sender, new QuickComponentImpl(builder.create())); } } catch (Throwable throwable) { diff --git a/src/main/java/org/maxgamer/quickshop/util/Util.java b/src/main/java/org/maxgamer/quickshop/util/Util.java index 96484f95f0..d3b770d93f 100644 --- a/src/main/java/org/maxgamer/quickshop/util/Util.java +++ b/src/main/java/org/maxgamer/quickshop/util/Util.java @@ -975,6 +975,8 @@ public static String parseColours(@Nullable String text) { } MineDownParser parser = MINEDOWN.get().parser(); parser.reset(); + //A hack for saving reset character + text = text.replace("&r", "&l&r").replace("§r", "§l§r"); return toLegacyText(parser.enable(MineDownParser.Option.LEGACY_COLORS).backwardsCompatibility(true).parse(text).create()); } From e4cfa829bc3ff6a114f00b19df793031107daaa4 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 14 Dec 2021 10:50:14 +0800 Subject: [PATCH 119/725] Fix sign-dye-color is missing in config.yml --- src/main/java/org/maxgamer/quickshop/QuickShop.java | 7 +++++++ src/main/resources/config.yml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index edf1090cf3..bb5d6f38a6 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -1990,6 +1990,13 @@ private void updateConfig(int selectedVersion) throws IOException { getConfig().set("integration.worldguard.respect-global-region", false); getConfig().set("config-version", ++selectedVersion); } + if (selectedVersion == 149) { + //Fix sign-dye-color setting is missing + if (!getConfig().isSet("shop.sign-dye-color")) { + getConfig().set("shop.sign-dye-color", ""); + } + getConfig().set("config-version", ++selectedVersion); + } if (getConfig().getInt("matcher.work-type") != 0 && GameVersion.get(ReflectFactory.getServerVersion()).name().contains("1_16")) { getLogger().warning("You are not using QS Matcher, it may meeting item comparing issue mentioned there: https://hub.spigotmc.org/jira/browse/SPIGOT-5063"); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index fbda3c51ab..22a410c7ce 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -225,8 +225,8 @@ shop: sign-glowing: false #Sign use dye color https://hub.spigotmc.org/javadocs/spigot/org/bukkit/DyeColor.html - sign-dye-color: null #sign-dye-color: WHITE + sign-dye-color: "" #Should we pay/take money to/from unlimited shops owners? pay-unlimited-shop-owners: false From c87a9860e6e76ef8e210c369eca56eceb530445a Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 14 Dec 2021 12:48:55 +0800 Subject: [PATCH 120/725] Fix broken find command --- .../quickshop/command/subcommand/SubCommand_Find.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java index 333ae8f096..461958e7ae 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Find.java @@ -21,7 +21,6 @@ import io.papermc.lib.PaperLib; import lombok.AllArgsConstructor; -import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; @@ -129,8 +128,8 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not Location location = shop.getLocation(); // "nearby-shop-entry": "&a- Info:{0} &aPrice:&b{1} &ax:&b{2} &ay:&b{3} &az:&b{4} &adistance: &b{5} &ablock(s)" stringBuilder.append(plugin.text().of(sender, "nearby-shop-entry", - new TextComponent(toLegacyText(shop.getSignText(sender.getLocale()).get(1).getComponents())), - new TextComponent(toLegacyText(shop.getSignText(sender.getLocale()).get(3).getComponents())), + toLegacyText(shop.getSignText(sender.getLocale()).get(1).getComponents()), + toLegacyText(shop.getSignText(sender.getLocale()).get(3).getComponents()), String.valueOf(location.getBlockX()), String.valueOf(location.getBlockY()), String.valueOf(location.getBlockZ()), From afe8dbe323e86fb290fb01df48758e5c00158df9 Mon Sep 17 00:00:00 2001 From: sandtechnology <20417547+sandtechnology@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:07:38 +0800 Subject: [PATCH 121/725] New Crowdin updates (#32) * Update source file messages.json * New translations messages.json (Chinese Simplified) * New translations messages.json (Swedish) * New translations messages.json (Polish) * New translations messages.json (Norwegian) * New translations messages.json (German) * New translations messages.json (German) --- crowdin/lang/de-DE/messages.json | 14 +++++++------- crowdin/lang/no-NO/messages.json | 10 +++++----- crowdin/lang/pl-PL/messages.json | 6 +++--- crowdin/lang/sv-SE/messages.json | 4 ++-- crowdin/lang/zh-CN/messages.json | 4 ++-- src/main/resources/lang/messages.json | 4 ++-- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/crowdin/lang/de-DE/messages.json b/crowdin/lang/de-DE/messages.json index 0a3c4588d4..f81b9672a5 100644 --- a/crowdin/lang/de-DE/messages.json +++ b/crowdin/lang/de-DE/messages.json @@ -6,7 +6,7 @@ "translation-contributors": "Mitwirkende: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken und Andre_601", "translation-country": "Sprache: Deutsch (de_DE)", "language-version": "63", - "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": "&cKonnte keinen Block zum erstellen eines Shops finden. Stelle sicher dass du einen ansiehst.", "not-looking-at-shop": "&cKonnte keinen QuickShop finden. Du musst auf einen schauen.", "no-anythings-in-your-hand": "&cEs befindet sich nichts in deiner Hand.", "no-permission": "&cDu hast keine Berechtigung um das zu tun.", @@ -110,8 +110,8 @@ }, "bypassing-lock": "&cUmgehe eine QuickShop Sicherung!", "that-is-locked": "&cDieser Shop ist geschützt.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", + "how-many-buy": "&aSchreib im Chat, wie viele du gerne &bKAUFEN&a willst. Du kannst &e{0}&a kaufen. Schreibe &b{1}&a um alle zu kaufen.", + "how-many-sell": "&aSchreib im Chat, wie viele du gerne &dVERKAUFEN&a willst. Du kannst &e{0}&a verkaufen. Schreibe &b{1}&a um alle zu verkaufen.", "not-allowed-to-create": "&cDu kannst hier keinen Shop erstellen.", "blacklisted-item": "&cDu kannst dieses Item nicht verkaufen, da es auf der schwarzen Liste steht", "how-much-to-trade-for": "&aGib im Chat ein, für wieviel du {1}x &e{0}&a handeln willst.", @@ -167,7 +167,7 @@ "about": "&eZeigt QuickShop Informationen", "help": "&eZeigt QuickShop-Hilfe", "item": "&eÄndert das Shopitem eines Shops", - "size": "&eÄndert die Mengenanzahl eines Shops", + "size": "&eÄndert die Anzahl an Items pro Menge eines Shops", "supercreate": "&eErstellen eines Shops, während alle Schutzprüfungen umgangen werden", "language": "&eÄndert die derzeitig verwendete Sprache", "removeall": "&eEntferne ALLE Shops eines bestimmten Spielers", @@ -220,7 +220,7 @@ "empty-hover": "&eKlicke hier um den Shop zu leeren.", "remove": "&c&l[Shop entfernen]", "remove-hover": "&eKlicke um diesen Shop zu entfernen.", - "stack": "&aMengeneinheit: &b{0} &e[&d&lÄndern&e]", + "stack": "&aItems pro Menge: &b{0} &e[&d&lÄndern&e]", "stack-hover": "&eKlicke um die Anzahl an Items pro Mengeneinheit zu ändern. Setze es zu 1 für normales Verhalten.", "item": "&aShopitem: {0} &e[&d&lÄndern&e]", "item-hover": "&eKlicke, um das Shopitem zu ändern", @@ -307,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cDu kannst mit diesem Shop nicht handeln, da er eingefroren ist.", "shop-freezed-at-location": "&eDein Shop {0} bei {1} wurde eingefroren!", "denied-put-in-item": "&cDu kannst dieses Item nicht in deinen Shop setzen!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", + "how-many-buy-stack": "&aSchreib im Chat, wie viele Mengen du gerne &bKAUFEN&a willst. Es sind &e{0}&a Items pro Menge und du kannst &e{1}&a Mengen kaufen. Schreibe &b{2}&a um alle zu kaufen.", + "how-many-sell-stack": "&aSchreib im Chat, wie viele Mengen du gerne &dVERKAUFEN&a willst. Es sind &e{0}&a Items pro Menge und du kannst &e{1}&a Mengen verkaufen. Schreibe &b{2}&a um alle zu verkaufen.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", diff --git a/crowdin/lang/no-NO/messages.json b/crowdin/lang/no-NO/messages.json index ced5203e9c..64b6fcbfa8 100644 --- a/crowdin/lang/no-NO/messages.json +++ b/crowdin/lang/no-NO/messages.json @@ -6,7 +6,7 @@ "translation-contributors": "Bidragsytere: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken and Andre_601", "translation-country": "Språksone: Norsk (no_NO)", "language-version": "63", - "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": "&cKunne ikke finne en blokk for å opprette butikk. Du må se på en gyldig blokk.", "not-looking-at-shop": "&cKunne ikke finne en QuickShop. Du må se på en butikk.", "no-anythings-in-your-hand": "&cDet er ingenting i hånden din.", "no-permission": "&cDu har ikke tillatelse til å gjøre det.", @@ -110,8 +110,8 @@ }, "bypassing-lock": "&cIgnorerer en QuickShop lås!", "that-is-locked": "&cDenne butikken er låst.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", + "how-many-buy": "&aSkriv i chat hvor mange du ønsker å &bKJØPE&a. Du kan kjøpe maks &e{0}&a. Skriv &b{1}&a om du vil kjøpe alle.", + "how-many-sell": "&aSkriv i chat hvor mange du ønsker å &dSELGE&a. Du kan selge &e{0}&a. Skriv &b{1}&a for å selge alle.", "not-allowed-to-create": "&cDu kan ikke opprette en butikk her.", "blacklisted-item": "&cDu kan ikke selge denne gjenstanden fordi den er på svartelisten", "how-much-to-trade-for": "&aSkriv i chat hvor mye du ønsker å selge &e{1}x {0}&a for.", @@ -307,8 +307,8 @@ "shop-cannot-trade-when-freezing": "&cDu kan ikke handle med denne butikken fordi den er frosset.", "shop-freezed-at-location": "&eDin butikk {0} på {1} ble frosset!", "denied-put-in-item": "&cDu kan ikke legge denne varen i butikken din!", - "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", + "how-many-buy-stack": "&eSkriv i chat hvor mange pakker du ønsker å &bKJØPE&a. Det er &e{0}&a varer i hver pakke og du kan kjøpe totalt &e{1}&a pakker. Skriv &b{2}&a om du vil kjøpe alle.", + "how-many-sell-stack": "&eSkriv i chat hvor mange pakker du ønsker å &bSELGE&a. Det er &e{0}&a varer i hver pakke og du kan selge &e{1}&a pakker. Skriv &b{2}&a om du vil selge alle.", "language": { "name": "&eNavn: &6{0}", "code": "&eKode: &6{0}", diff --git a/crowdin/lang/pl-PL/messages.json b/crowdin/lang/pl-PL/messages.json index 4a537f61d7..25697bca88 100644 --- a/crowdin/lang/pl-PL/messages.json +++ b/crowdin/lang/pl-PL/messages.json @@ -6,7 +6,7 @@ "translation-contributors": "Współtwórcy: Timtower, Netherfoam, KaiNoMood, Mgazul, JackTheChicken i Andre_601", "translation-country": "Język: Polski (pl_PL)", "language-version": "63", - "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": "&cNie można znaleźć bloku do tworzenia sklepu. Musisz patrzeć się na jeden z nich.", "not-looking-at-shop": "&cNie można znaleźć QuickShop. Musisz na niego patrzeć.", "no-anythings-in-your-hand": "&cW twojej ręce nic nie ma.", "no-permission": "&cNie masz uprawnień, aby to zrobić.", @@ -110,8 +110,8 @@ }, "bypassing-lock": "&cOmijanie blokady QuickShop!", "that-is-locked": "&cTen sklep jest zablokowany.", - "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", + "how-many-buy": "&aWpisz ilość jaką chcesz &bKUPIĆ&a na czacie. Możesz kupić &e{0}&a. Wpisz &b{1}&a, jeśli chcesz kupić wszystko.", + "how-many-sell": "&aWpisz ilość jaką chcesz &dSPRZEDAĆ&a na czacie. Możesz sprzedać &e{0}&a. Wpisz &b{1}&a, jeśli chcesz sprzedać wszystko.", "not-allowed-to-create": "&cTu nie zrobisz sklepu.", "blacklisted-item": "&cNie możesz sprzedać tego przedmiotu, ponieważ znajduje się na czarnej liście", "how-much-to-trade-for": "&aWpisz na czacie cenę za &e{1}x {0}&a.", diff --git a/crowdin/lang/sv-SE/messages.json b/crowdin/lang/sv-SE/messages.json index 8be0d755a5..b732f7729c 100644 --- a/crowdin/lang/sv-SE/messages.json +++ b/crowdin/lang/sv-SE/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cIgnorerar ett butikslås!", "that-is-locked": "&cDenna butik är låst.", "how-many-buy": "&aAnge i chatten, hur många du vill &bKÖPA&a. Du kan köpa &e{0}&a. Ange &b{1}&a för att köpa alla.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aAnge i chatten, hur många du vill &dSÄLJA&a. Du har &{0}& tillgängliga. Ange &{1}&a i chatten, för att sälja alla.", "not-allowed-to-create": "&cDu får inte skapa en butik här.", "blacklisted-item": "&cDu kan inte sälja detta föremål eftersom det finns på svartlistan", "how-much-to-trade-for": "&aAnge i chatten, hur mycket du vill sälja &e{1}x {0}&a för.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eDin butik {0} vid {1} blev frusen!", "denied-put-in-item": "&cDu kan inte lägga in detta objekt i din butik!", "how-many-buy-stack": "&eAnge i chatten, hur många paket du vill &bKÖPA&a. Det finns &e{0}&a föremål i varje paket och du kan köpa &e{1}&a paket. Ange &b{2}&a i chatten för att köpa alla.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aAnge i chatten, hur många föremål du vill &dSÄLJA&a per paket. Det finns &e{0}&a föremål per paket och du har &e{1}&a paket tillgängliga. Ange &b{2}&a i chatten för att sälja alla.", "language": { "name": "&eNamn: &6{0}", "code": "&eKod: &6{0}", diff --git a/crowdin/lang/zh-CN/messages.json b/crowdin/lang/zh-CN/messages.json index 27d95112de..05f383c6e3 100644 --- a/crowdin/lang/zh-CN/messages.json +++ b/crowdin/lang/zh-CN/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&c你绕过了QuickShop的锁!", "that-is-locked": "&c这个商店已上锁。", "how-many-buy": "&a在聊天中输入您想要&b购买&a的数量。您可以购买&e{0}&a个,输入&b{1}&a以购买全部。", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", + "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所需的价格。", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&e你在 {1} 的商店 {0} 被冻结了!", "denied-put-in-item": "&c您不能将此物品放入您的商店!", "how-many-buy-stack": "&a聊天栏中输入你想&b买&a的份数. 每份中有 &e{0}&a 个该物品, 你可以买 &e{1}&a 份. 输入 &b{2}&a 以买下所有该物品.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&a在聊天栏中输入你想 &d卖&a 的份数. 每份中有 &e{0}&a 个该物品, 你目前可卖出 &e{1}&a 份这样的物品,输入 &b{2}&a 以卖出所有此项物品。", "language": { "name": "&e名称: &6{0}", "code": "&e代码: &6{0}", diff --git a/src/main/resources/lang/messages.json b/src/main/resources/lang/messages.json index 355f5c6138..6944ca2125 100644 --- a/src/main/resources/lang/messages.json +++ b/src/main/resources/lang/messages.json @@ -111,7 +111,7 @@ "bypassing-lock": "&cBypassing a QuickShop lock!", "that-is-locked": "&cThis shop is locked.", "how-many-buy": "&aEnter in chat, how many you wish to &bBUY&a. You can buy &e{0}&a. Enter &b{1}&a to buy them all.", - "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You have &e{0}&a available. Enter &b{1}&a in chat, to sell all.", + "how-many-sell": "&aEnter in chat, how much you wish to &dSELL&a. You can sell &e{0}&a. Enter &b{1}&a in chat, to sell all.", "not-allowed-to-create": "&cYou may not create a shop here.", "blacklisted-item": "&cYou cannot sell this item because it is on the blacklist", "how-much-to-trade-for": "&aEnter in chat, how much you wish to trade &e{1}x {0}&a for.", @@ -308,7 +308,7 @@ "shop-freezed-at-location": "&eYour shop {0} at {1} got frozen!", "denied-put-in-item": "&cYou cannot put this item into your shop!", "how-many-buy-stack": "&eEnter in chat, how many bulks you wish to &bBUY&a. There are &e{0}&a items in each bulk and you can buy &e{1}&a bulks. Enter &b{2}&a in chat to buy all.", - "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you have &e{1}&a bulks available. Enter &b{2}&a in chat to sell all.", + "how-many-sell-stack": "&aEnter in chat, how many bulk you wish to &dSELL&a. There are &e{0}&a items per bulk and you can sell &e{1}&a bulks. Enter &b{2}&a in chat to sell all.", "language": { "name": "&eName: &6{0}", "code": "&eCode: &6{0}", From f95c92be111cf38ee5082eeb5d2f35795aa54f3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:07:56 +0800 Subject: [PATCH 122/725] Bump SongodaCore from 2.6.3 to 2.6.6 (#33) Bumps SongodaCore from 2.6.3 to 2.6.6. --- updated-dependencies: - dependency-name: com.songoda:SongodaCore dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9d6cf03326..7783f9f563 100644 --- a/pom.xml +++ b/pom.xml @@ -786,7 +786,7 @@ com.songoda SongodaCore - 2.6.3 + 2.6.6 provided From 7e0ce2effdbd0fa1e126758f7621415eae228446 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:08:09 +0800 Subject: [PATCH 123/725] Bump PlotSquared-Core from 6.1.4 to 6.2.0 (#34) Bumps [PlotSquared-Core](https://github.com/IntellectualSites/PlotSquared) from 6.1.4 to 6.2.0. - [Release notes](https://github.com/IntellectualSites/PlotSquared/releases) - [Commits](https://github.com/IntellectualSites/PlotSquared/compare/6.1.4...6.2.0) --- updated-dependencies: - dependency-name: com.plotsquared:PlotSquared-Core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7783f9f563..05208f054e 100644 --- a/pom.xml +++ b/pom.xml @@ -710,7 +710,7 @@ com.plotsquared PlotSquared-Core - 6.1.4 + 6.2.0 provided From 8c552729844774f221b85f6ef46887b947ae2a05 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 14 Dec 2021 13:17:06 +0800 Subject: [PATCH 124/725] Fix debug command not respect local config.yml --- .../maxgamer/quickshop/command/subcommand/SubCommand_Debug.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java index df6ca2b494..65dc317565 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Debug.java @@ -120,6 +120,7 @@ public void switchDebug(@NotNull CommandSender sender) { final boolean debug = plugin.getConfig().getBoolean("dev-mode"); if (debug) { + plugin.reloadConfiguration(); plugin.getConfig().set("dev-mode", false); plugin.saveConfiguration(); plugin.reload(); @@ -127,6 +128,7 @@ public void switchDebug(@NotNull CommandSender sender) { return; } + plugin.reloadConfiguration(); plugin.getConfig().set("dev-mode", true); plugin.saveConfiguration(); plugin.reload(); From dbfd82369609ba6130559a1bf119a6108ada6c17 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Fri, 17 Dec 2021 15:02:46 +0800 Subject: [PATCH 125/725] Handle NBTApi broken issue --- .../org/maxgamer/quickshop/QuickShop.java | 6 ++++- .../quickshop/shop/ContainerShop.java | 23 +++++++++++++------ .../matcher/item/BukkitItemMatcherImpl.java | 19 +++++++++++---- .../item/QuickShopItemMatcherImpl.java | 20 +++++++++++----- 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/QuickShop.java b/src/main/java/org/maxgamer/quickshop/QuickShop.java index bb5d6f38a6..7101ebece5 100644 --- a/src/main/java/org/maxgamer/quickshop/QuickShop.java +++ b/src/main/java/org/maxgamer/quickshop/QuickShop.java @@ -257,10 +257,14 @@ public class QuickShop extends JavaPlugin implements QuickShopAPI { private ShopPurger shopPurger; @Getter @Nullable - private NBTAPI nbtapi = null; + private volatile NBTAPI nbtapi = null; private int loggingLocation = 0; + public void disableNBTAPI() { + nbtapi = null; + } + /** * Use for mock bukkit */ diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index ab9011354b..83453e3194 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -21,6 +21,7 @@ import com.lishid.openinv.OpenInv; import de.tr7zw.nbtapi.NBTTileEntity; +import de.tr7zw.nbtapi.NbtApiException; import io.papermc.lib.PaperLib; import lombok.EqualsAndHashCode; import me.lucko.helper.serialize.BlockPosition; @@ -785,14 +786,22 @@ public void setSignText(@NotNull List lines) { Util.ensureThread(false); List signs = this.getSigns(); for (Sign sign : signs) { - NBTTileEntity tileSign = null; if (this.plugin.getNbtapi() != null) { - tileSign = new NBTTileEntity(sign); - } - for (int i = 0; i < lines.size(); i++) { - if (tileSign != null) { - tileSign.setString("Text" + (i + 1), Util.componentsToJson(lines.get(i).getComponents())); - } else { + NBTTileEntity tileSign = new NBTTileEntity(sign); + for (int i = 0; i < lines.size(); i++) { + try { + tileSign.setString("Text" + (i + 1), Util.componentsToJson(lines.get(i).getComponents())); + } catch (NbtApiException e) { + plugin.getLogger().log(Level.WARNING, "NBTAPI is broken, disabling...(You can safely ignore this)", e); + plugin.disableNBTAPI(); + Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); + //Reset it since we disable nbt api, text need to change + setSignText(); + return; + } + } + } else { + for (int i = 0; i < lines.size(); i++) { sign.setLine(i, toLegacyText(lines.get(i).getComponents())); } } diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java index 91e62789c4..3c7c7caa14 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java @@ -20,6 +20,7 @@ package org.maxgamer.quickshop.util.matcher.item; import de.tr7zw.nbtapi.NBTItem; +import de.tr7zw.nbtapi.NbtApiException; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.bukkit.inventory.ItemStack; @@ -28,6 +29,10 @@ import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.api.shop.ItemMatcher; +import org.maxgamer.quickshop.util.Util; + +import java.util.Arrays; +import java.util.logging.Level; /** * A simple impl for ItemMatcher @@ -85,10 +90,16 @@ public boolean matches(@Nullable ItemStack original, @Nullable ItemStack tester) if (plugin.getNbtapi() != null) { NBTItem nbtItemOriginal = new NBTItem(original); NBTItem nbtItemTester = new NBTItem(tester); - String tagOriginal = nbtItemOriginal.getString("shopItemId"); - String tagTester = nbtItemTester.getString("shopItemId"); - if (StringUtils.isNotEmpty(tagOriginal) && StringUtils.isNotEmpty(tagTester) && tagOriginal.equals(tagTester)) { - return true; + try { + String tagOriginal = nbtItemOriginal.getString("shopItemId"); + String tagTester = nbtItemTester.getString("shopItemId"); + if (StringUtils.isNotEmpty(tagOriginal) && StringUtils.isNotEmpty(tagTester) && tagOriginal.equals(tagTester)) { + return true; + } + } catch (NbtApiException e) { + plugin.disableNBTAPI(); + plugin.getLogger().log(Level.WARNING, "NBTAPI is broken, disabling...(You can safely ignore this)", e); + Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); } } return tester.isSimilar(original); diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java index 470f249835..54227f4e48 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java @@ -20,6 +20,7 @@ package org.maxgamer.quickshop.util.matcher.item; import de.tr7zw.nbtapi.NBTItem; +import de.tr7zw.nbtapi.NbtApiException; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.bukkit.attribute.Attribute; @@ -41,6 +42,7 @@ import org.maxgamer.quickshop.util.reload.Reloadable; import java.util.*; +import java.util.logging.Level; @AllArgsConstructor public class QuickShopItemMatcherImpl implements ItemMatcher, Reloadable { @@ -146,12 +148,18 @@ public boolean matches(@Nullable ItemStack requireStack, @Nullable ItemStack giv givenStack = givenStack.clone(); givenStack.setAmount(1); if (plugin.getNbtapi() != null) { - NBTItem nbtItemOriginal = new NBTItem(requireStack); - NBTItem nbtItemTester = new NBTItem(givenStack); - String tagOriginal = nbtItemOriginal.getString("shopItemId"); - String tagTester = nbtItemTester.getString("shopItemId"); - if (StringUtils.isNotEmpty(tagOriginal) && StringUtils.isNotEmpty(tagTester) && tagOriginal.equals(tagTester)) { - return true; + try { + NBTItem nbtItemOriginal = new NBTItem(requireStack); + NBTItem nbtItemTester = new NBTItem(givenStack); + String tagOriginal = nbtItemOriginal.getString("shopItemId"); + String tagTester = nbtItemTester.getString("shopItemId"); + if (StringUtils.isNotEmpty(tagOriginal) && StringUtils.isNotEmpty(tagTester) && tagOriginal.equals(tagTester)) { + return true; + } + } catch (NbtApiException e) { + plugin.disableNBTAPI(); + plugin.getLogger().log(Level.WARNING, "NBTAPI is broken, disabling...(You can safely ignore this)", e); + Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); } } if (workType == 1) { From 667a0330b40a811bc6341608eefba5cf40582718 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Fri, 17 Dec 2021 15:07:22 +0800 Subject: [PATCH 126/725] Fix misleading message --- src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java | 2 +- .../quickshop/util/matcher/item/BukkitItemMatcherImpl.java | 2 +- .../quickshop/util/matcher/item/QuickShopItemMatcherImpl.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 83453e3194..9bfb605537 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -792,7 +792,7 @@ public void setSignText(@NotNull List lines) { try { tileSign.setString("Text" + (i + 1), Util.componentsToJson(lines.get(i).getComponents())); } catch (NbtApiException e) { - plugin.getLogger().log(Level.WARNING, "NBTAPI is broken, disabling...(You can safely ignore this)", e); + plugin.getLogger().log(Level.WARNING, "NBTAPI support is broken, dsiable and fallback... (You can safely ignore this)", e); plugin.disableNBTAPI(); Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); //Reset it since we disable nbt api, text need to change diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java index 3c7c7caa14..99db2b747c 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java @@ -98,7 +98,7 @@ public boolean matches(@Nullable ItemStack original, @Nullable ItemStack tester) } } catch (NbtApiException e) { plugin.disableNBTAPI(); - plugin.getLogger().log(Level.WARNING, "NBTAPI is broken, disabling...(You can safely ignore this)", e); + plugin.getLogger().log(Level.WARNING, "NBTAPI support is broken, dsiable and fallback... (You can safely ignore this)", e); Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); } } diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java index 54227f4e48..c46178ca9f 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java @@ -158,7 +158,7 @@ public boolean matches(@Nullable ItemStack requireStack, @Nullable ItemStack giv } } catch (NbtApiException e) { plugin.disableNBTAPI(); - plugin.getLogger().log(Level.WARNING, "NBTAPI is broken, disabling...(You can safely ignore this)", e); + plugin.getLogger().log(Level.WARNING, "NBTAPI support is broken, dsiable and fallback... (You can safely ignore this)", e); Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); } } From e375b3b55bd51b577dd8fa74adcd53270c740932 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Fri, 17 Dec 2021 18:28:38 +0800 Subject: [PATCH 127/725] Fix world-guard integration not checking applicableRegionSet --- .../worldguard/WorldGuardIntegration.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java b/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java index 1161abcb2c..ccb6939f58 100644 --- a/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java +++ b/src/main/java/org/maxgamer/quickshop/integration/worldguard/WorldGuardIntegration.java @@ -137,23 +137,25 @@ public boolean canCreateShopHere(@NotNull Player player, @NotNull Location locat } RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery query = container.createQuery(); - ApplicableRegionSet applicableRegionSet=query.getApplicableRegions(wgLoc); + ApplicableRegionSet applicableRegionSet = query.getApplicableRegions(wgLoc); //Regions not included global one - if (applicableRegionSet.getRegions().isEmpty()&&!respectGlobalRegion) { - return !whiteList; - }else { - //So check it manually - RegionManager worldManger = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(location.getWorld())); - if (worldManger != null&&!worldManger.hasRegion("__global__")) { - //If not have, just check whitelist + if (applicableRegionSet.getRegions().isEmpty()) { + if (!respectGlobalRegion) { return !whiteList; + } else { + //So check it manually + RegionManager worldManger = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(location.getWorld())); + if (worldManger != null && !worldManger.hasRegion("__global__")) { + //If not have, just check whitelist + return !whiteList; + } } } //Passed, but flag calculation will include the global region for (WorldGuardFlags flag : createFlags) { switch (flag) { case BUILD: - if (!applicableRegionSet.testState(localPlayer,Flags.BUILD)) { + if (!applicableRegionSet.testState(localPlayer, Flags.BUILD)) { return false; } break; @@ -208,16 +210,18 @@ public boolean canTradeShopHere(@NotNull Player player, @NotNull Location locati } RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionQuery query = container.createQuery(); - ApplicableRegionSet applicableRegionSet=query.getApplicableRegions(wgLoc); + ApplicableRegionSet applicableRegionSet = query.getApplicableRegions(wgLoc); //Regions not included global one - if (applicableRegionSet.getRegions().isEmpty()&&!respectGlobalRegion) { - return !whiteList; - }else { - //So check it manually - RegionManager worldManger = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(location.getWorld())); - if (worldManger != null&&!worldManger.hasRegion("__global__")) { - //If not have, just check whitelist + if (applicableRegionSet.getRegions().isEmpty()) { + if (!respectGlobalRegion) { return !whiteList; + } else { + //So check it manually + RegionManager worldManger = WorldGuard.getInstance().getPlatform().getRegionContainer().get(BukkitAdapter.adapt(location.getWorld())); + if (worldManger != null && !worldManger.hasRegion("__global__")) { + //If not have, just check whitelist + return !whiteList; + } } } //Passed, but flag calculation will include the global region From eea9ed230d1a31272de2966a8eb89d6b195e2f94 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Fri, 17 Dec 2021 18:30:14 +0800 Subject: [PATCH 128/725] Bump version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05208f054e..88bc9d3ca6 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ QuickShop - 5.1.0.2 + 5.1.0.3 org.maxgamer.quickshop Ghost-chu UTF-8 From 82fdd406d8057e1e1c9dc868bf4f41521b2e51ee Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Fri, 17 Dec 2021 18:47:04 +0800 Subject: [PATCH 129/725] Remove the usage of NbtApiException --- src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java | 3 +-- .../quickshop/util/matcher/item/BukkitItemMatcherImpl.java | 3 +-- .../quickshop/util/matcher/item/QuickShopItemMatcherImpl.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 9bfb605537..aadfff0742 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -21,7 +21,6 @@ import com.lishid.openinv.OpenInv; import de.tr7zw.nbtapi.NBTTileEntity; -import de.tr7zw.nbtapi.NbtApiException; import io.papermc.lib.PaperLib; import lombok.EqualsAndHashCode; import me.lucko.helper.serialize.BlockPosition; @@ -791,7 +790,7 @@ public void setSignText(@NotNull List lines) { for (int i = 0; i < lines.size(); i++) { try { tileSign.setString("Text" + (i + 1), Util.componentsToJson(lines.get(i).getComponents())); - } catch (NbtApiException e) { + } catch (Exception e) { plugin.getLogger().log(Level.WARNING, "NBTAPI support is broken, dsiable and fallback... (You can safely ignore this)", e); plugin.disableNBTAPI(); Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java index 99db2b747c..f9cb51a56f 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/BukkitItemMatcherImpl.java @@ -20,7 +20,6 @@ package org.maxgamer.quickshop.util.matcher.item; import de.tr7zw.nbtapi.NBTItem; -import de.tr7zw.nbtapi.NbtApiException; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.bukkit.inventory.ItemStack; @@ -96,7 +95,7 @@ public boolean matches(@Nullable ItemStack original, @Nullable ItemStack tester) if (StringUtils.isNotEmpty(tagOriginal) && StringUtils.isNotEmpty(tagTester) && tagOriginal.equals(tagTester)) { return true; } - } catch (NbtApiException e) { + } catch (Exception e) { plugin.disableNBTAPI(); plugin.getLogger().log(Level.WARNING, "NBTAPI support is broken, dsiable and fallback... (You can safely ignore this)", e); Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); diff --git a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java index c46178ca9f..f8f691896e 100644 --- a/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java +++ b/src/main/java/org/maxgamer/quickshop/util/matcher/item/QuickShopItemMatcherImpl.java @@ -20,7 +20,6 @@ package org.maxgamer.quickshop.util.matcher.item; import de.tr7zw.nbtapi.NBTItem; -import de.tr7zw.nbtapi.NbtApiException; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.bukkit.attribute.Attribute; @@ -156,7 +155,7 @@ public boolean matches(@Nullable ItemStack requireStack, @Nullable ItemStack giv if (StringUtils.isNotEmpty(tagOriginal) && StringUtils.isNotEmpty(tagTester) && tagOriginal.equals(tagTester)) { return true; } - } catch (NbtApiException e) { + } catch (Exception e) { plugin.disableNBTAPI(); plugin.getLogger().log(Level.WARNING, "NBTAPI support is broken, dsiable and fallback... (You can safely ignore this)", e); Util.debugLog("NBTAPI is broken, error: " + e.getMessage() + "\n stacktrace: \n" + Arrays.toString(e.getStackTrace())); From b946a296cad5ebaf5f9b78ce9fce3335dbe82758 Mon Sep 17 00:00:00 2001 From: Ghost_chu <30802565+Ghost-chu@users.noreply.github.com> Date: Sat, 18 Dec 2021 17:15:22 +0800 Subject: [PATCH 130/725] Stop to use Ghost_chu's FOSSA services Stop to use Ghost_chu's FOSSA services --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e83f6c54ca..b31e443f69 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ To compile the QuickShop and debug it by yourself, please follow these steps: ## License -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FGhost-chu%2FQuickShop-Reremake.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FGhost-chu%2FQuickShop-Reremake?ref=badge_large) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FPotatoCraft-Studio%2FQuickShop-Reremake.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2FPotatoCraft-Studio%2FQuickShop-Reremake?ref=badge_large) ## Developer API From e3d21a12c5383aa035591199178b542fc15fbb24 Mon Sep 17 00:00:00 2001 From: Ghost_chu <30802565+Ghost-chu@users.noreply.github.com> Date: Sat, 18 Dec 2021 17:20:36 +0800 Subject: [PATCH 131/725] Update FOSSA service badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b31e443f69..a8768a5ba5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ![BuildStatus](https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake/21/badge/icon) ![TestsPassed](https://img.shields.io/jenkins/tests?compact_message&jobUrl=https://ci.codemc.io/job/Ghost-chu/job/QuickShop-Reremake) ![Contributors](https://img.shields.io/github/contributors/Ghost-chu/QuickShop-Reremake) -[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FPotatoCraft-Studio%2FQuickShop-Reremake.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FGhost-chu%2FQuickShop-Reremake?ref=badge_shield) +[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FPotatoCraft-Studio%2FQuickShop-Reremake.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FPotatoCraft-Studio%2FQuickShop-Reremake?ref=badge_shield) --- ![Java](https://img.shields.io/badge/java-version%208%2B%20(currently%20is%208--16)-orange) From 0eb5e86cbc7b8a7b64e00d22a5c0b4d1a8142813 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 18 Dec 2021 19:08:21 +0800 Subject: [PATCH 132/725] Fix the mistaken importing causes InaccessibleObjectException when changing staffs --- .../org/maxgamer/quickshop/listener/InternalListener.java | 2 +- .../util/logging/container/ShopModeratorChangedLog.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java b/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java index ce2b39a425..d3edbd7239 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/InternalListener.java @@ -84,7 +84,7 @@ public void shopDelete(ShopDeleteEvent event) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void shopModeratorChanges(ShopModeratorChangedEvent event) { if (loggingAction) { - plugin.logEvent(new ShopModeratorChangedEvent(event.getShop(), event.getModerator())); + plugin.logEvent(new ShopModeratorChangedLog(event.getShop().saveToInfoStorage(), event.getModerator())); } } diff --git a/src/main/java/org/maxgamer/quickshop/util/logging/container/ShopModeratorChangedLog.java b/src/main/java/org/maxgamer/quickshop/util/logging/container/ShopModeratorChangedLog.java index 22705a8270..0d8fdb81f0 100644 --- a/src/main/java/org/maxgamer/quickshop/util/logging/container/ShopModeratorChangedLog.java +++ b/src/main/java/org/maxgamer/quickshop/util/logging/container/ShopModeratorChangedLog.java @@ -22,12 +22,12 @@ import lombok.AllArgsConstructor; import lombok.Data; import org.maxgamer.quickshop.api.shop.ShopInfoStorage; -import org.maxgamer.quickshop.shop.SimpleShopModerator; +import org.maxgamer.quickshop.api.shop.ShopModerator; @AllArgsConstructor @Data public class ShopModeratorChangedLog { private static int v = 1; private ShopInfoStorage shop; - private SimpleShopModerator moderator; + private ShopModerator moderator; } From 33d1c546c1a4d172e314abd2b13573af9308bb9a Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 19 Dec 2021 19:19:29 +0800 Subject: [PATCH 133/725] Fix display disappeared when enabled display-auto-despawn --- .../maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java index 49bb497958..c12488ee37 100644 --- a/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java +++ b/src/main/java/org/maxgamer/quickshop/watcher/DisplayAutoDespawnWatcher.java @@ -42,7 +42,7 @@ public class DisplayAutoDespawnWatcher extends BukkitRunnable implements Reloada public DisplayAutoDespawnWatcher(@NotNull QuickShop plugin) { this.plugin = plugin; plugin.getReloadManager().register(this); - + init(); } private void init() { From ac8ff04ca0fd983db6c5caea8c3461b238e12f7a Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 21 Dec 2021 03:34:22 +0000 Subject: [PATCH 134/725] Fix Issue #42 - Be mindful of non-symmetric matching functions (#43) --- .../quickshop/shop/ContainerShop.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index aadfff0742..bf0ef6493e 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -321,7 +321,7 @@ public void buy(@NotNull UUID buyer, @NotNull Inventory buyerInventory, if (stack == null || stack.getType() == Material.AIR) { continue; // No item } - if (matches(stack)) { + if (matches(stack, true)) { int stackSize = Math.min(amount, stack.getAmount()); stack.setAmount(stack.getAmount() - stackSize); amount -= stackSize; @@ -346,7 +346,7 @@ public void buy(@NotNull UUID buyer, @NotNull Inventory buyerInventory, Inventory chestInv = this.getInventory(); for (int i = 0; amount > 0 && i < contents.length; i++) { ItemStack item = contents[i]; - if (item != null && this.matches(item)) { + if (item != null && this.matches(item, true)) { // Copy it, we don't want to interfere item = item.clone(); // Amount = total, item.getAmount() = how many items in the @@ -510,6 +510,17 @@ public boolean isAttached(@NotNull Block b) { */ @Override public boolean matches(@Nullable ItemStack item) { + return this.matches(item, false); + } + + /** + * Returns true if the ItemStack matches what this shop is selling/buying + * + * @param item The ItemStack + * @param buying Some matching functions are not symmetric, this decides the order it will check + * @return True if the ItemStack is the same (Excludes amounts) + */ + public boolean matches(@Nullable ItemStack item, boolean buying) { if (item == null) { return false; } @@ -517,7 +528,8 @@ public boolean matches(@Nullable ItemStack item) { guest.setAmount(1); ItemStack owner = this.item.clone(); owner.setAmount(1); - return plugin.getItemMatcher().matches(guest, owner); + return buying ? plugin.getItemMatcher().matches(guest, owner) : + plugin.getItemMatcher().matches(owner, guest); } @Override @@ -646,7 +658,7 @@ public void sell(@NotNull UUID seller, @NotNull Inventory sellerInventory, for (int i = 0; amount > 0 && i < chestContents.length; i++) { // Can't clone it here, it could be null ItemStack item = chestContents[i]; - if (item != null && item.getType() != Material.AIR && this.matches(item)) { + if (item != null && item.getType() != Material.AIR && this.matches(item, false)) { // Copy it, we don't want to interfere item = item.clone(); // Amount = total, item.getAmount() = how many items in the From b5239cbddc5c3eb367c3ba4248d3cba2b79937ef Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 21 Dec 2021 11:46:22 +0800 Subject: [PATCH 135/725] Handle empty case and lazy load unlimited-shop-owner --- .../quickshop/shop/SimpleShopManager.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java index 6dfec7d876..412a678d1a 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java +++ b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java @@ -119,11 +119,17 @@ private void init() { // disable tax account cacheTaxAccount = null; } - String uAccount = plugin.getConfig().getString("unlimited-shop-owner-change-account", "quickshop"); - if (Util.isUUID(uAccount)) { - cacheUnlimitedShopAccount = new Trader(uAccount, Bukkit.getOfflinePlayer(UUID.fromString(uAccount))); - } else { - cacheUnlimitedShopAccount = new Trader(uAccount, Bukkit.getOfflinePlayer(uAccount)); + if (plugin.getConfig().getBoolean("unlimited-shop-owner-change")) { + String uAccount = plugin.getConfig().getString("unlimited-shop-owner-change-account", ""); + if (uAccount.isEmpty()) { + uAccount = "quickshop"; + plugin.getLogger().log(Level.WARNING, "unlimited-shop-owner-change-account is empty, default to \"quickshop\""); + } + if (Util.isUUID(uAccount)) { + cacheUnlimitedShopAccount = new Trader(uAccount, Bukkit.getOfflinePlayer(UUID.fromString(uAccount))); + } else { + cacheUnlimitedShopAccount = new Trader(uAccount, Bukkit.getOfflinePlayer(uAccount)); + } } this.priceLimiter = new SimplePriceLimiter( plugin.getConfig().getDouble("shop.minimum-price"), From de7e61245dc1a77ac774d03340a62064ecd22e64 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Wed, 22 Dec 2021 23:52:43 +0800 Subject: [PATCH 136/725] Handle fake player case in TextManager --- .../quickshop/localization/text/SimpleTextManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java index e3240b6d66..6ab2d3df4e 100644 --- a/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java +++ b/src/main/java/org/maxgamer/quickshop/localization/text/SimpleTextManager.java @@ -280,7 +280,8 @@ public void load() { } private String findRelativeLanguages(String langCode) { - if (langCode.isEmpty()) { + //langCode may null when some plugins providing fake player + if (langCode == null || langCode.isEmpty()) { return "en_us"; } String result = languagesCache.getIfPresent(langCode); From 3160eb14d06ed63cfeec756a3060e9bab6804399 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Thu, 23 Dec 2021 13:06:46 +0800 Subject: [PATCH 137/725] Fix wrong sender limit in transfer command --- .../command/subcommand/SubCommand_Transfer.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) 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 9e8f622366..3f47607a00 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 @@ -20,21 +20,19 @@ package org.maxgamer.quickshop.command.subcommand; import org.bukkit.OfflinePlayer; -import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; -import org.maxgamer.quickshop.util.MsgUtil; import org.maxgamer.quickshop.util.Util; import java.util.Collections; import java.util.List; import java.util.UUID; -public class SubCommand_Transfer implements CommandHandler { +public class SubCommand_Transfer implements CommandHandler { private final QuickShop plugin; @@ -44,13 +42,8 @@ public SubCommand_Transfer(QuickShop plugin) { @Override - public void onCommand(@NotNull ConsoleCommandSender sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { + public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { if (cmdArg.length == 1) { - if (!(sender instanceof Player)) { - MsgUtil.sendDirectMessage(sender, "This command can't be run by the console!"); - return; - } - //noinspection deprecation final OfflinePlayer targetPlayer = plugin.getServer().getOfflinePlayer(cmdArg[0]); String targetPlayerName = targetPlayer.getName(); if (targetPlayerName == null) { @@ -93,7 +86,7 @@ public void onCommand(@NotNull ConsoleCommandSender sender, @NotNull String comm } @Override - public @Nullable List onTabComplete(@NotNull ConsoleCommandSender sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { + public @Nullable List onTabComplete(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { return cmdArg.length <= 2 ? Util.getPlayerList() : Collections.emptyList(); } } From 35cce104e6cc5a0c0486c2949fe1c82d0f8eedaf Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sat, 25 Dec 2021 01:53:15 +0800 Subject: [PATCH 138/725] Fix misleading debug logs and variable names --- .../api/compatibility/CompatibilityModule.java | 6 +++--- .../compatibility/NCPCompatibilityModule.java | 16 ++++++++-------- .../SpartanCompatibilityModule.java | 12 ++++++------ 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/api/compatibility/CompatibilityModule.java b/src/main/java/org/maxgamer/quickshop/api/compatibility/CompatibilityModule.java index f48b40c7a7..86795d0b93 100644 --- a/src/main/java/org/maxgamer/quickshop/api/compatibility/CompatibilityModule.java +++ b/src/main/java/org/maxgamer/quickshop/api/compatibility/CompatibilityModule.java @@ -41,8 +41,8 @@ public interface CompatibilityModule { /** * Calls CompatibilityModule to toggle the detection status for player between on and off * - * @param player The player - * @param checking On or Off + * @param player The player + * @param status On or Off */ - void toggle(@NotNull Player player, boolean checking); + void toggle(@NotNull Player player, boolean status); } diff --git a/src/main/java/org/maxgamer/quickshop/util/compatibility/NCPCompatibilityModule.java b/src/main/java/org/maxgamer/quickshop/util/compatibility/NCPCompatibilityModule.java index d4ab8395c5..3a9273ef20 100644 --- a/src/main/java/org/maxgamer/quickshop/util/compatibility/NCPCompatibilityModule.java +++ b/src/main/java/org/maxgamer/quickshop/util/compatibility/NCPCompatibilityModule.java @@ -47,21 +47,21 @@ public NCPCompatibilityModule(QuickShop plugin) { /** * Calls CompatibilityModule to toggle the detection status for playerb between on and off * - * @param player The player - * @param checking On or Off + * @param player The player + * @param status On or Off */ @Override - public void toggle(@NotNull Player player, boolean checking) { - if (checking) { + public void toggle(@NotNull Player player, boolean status) { + if (status) { + Util.debugLog( + "Calling NoCheatPlus continue follow " + player.getName() + " cheats detection."); + NCPExemptionManager.unexempt(player); + } else { Util.debugLog( "Calling NoCheatPlus ignore " + player.getName() + " cheats detection until we finished permission checks."); - NCPExemptionManager.unexempt(player); - } else { - Util.debugLog( - "Calling NoCheatPlus continue follow " + player.getName() + " cheats detection."); NCPExemptionManager.exemptPermanently(player); } } diff --git a/src/main/java/org/maxgamer/quickshop/util/compatibility/SpartanCompatibilityModule.java b/src/main/java/org/maxgamer/quickshop/util/compatibility/SpartanCompatibilityModule.java index a4c7603011..efdea4cb82 100644 --- a/src/main/java/org/maxgamer/quickshop/util/compatibility/SpartanCompatibilityModule.java +++ b/src/main/java/org/maxgamer/quickshop/util/compatibility/SpartanCompatibilityModule.java @@ -40,19 +40,19 @@ public SpartanCompatibilityModule(QuickShop plugin) { } @Override - public void toggle(@NotNull Player player, boolean checking) { - if (checking) { + public void toggle(@NotNull Player player, boolean status) { + if (status) { Util.debugLog( - "Calling Spartan ignore " - + player.getName() - + " cheats detection until we finished permission checks."); + "Calling Spartan continue follow " + player.getName() + " cheats detection."); for (Enums.HackType value : Enums.HackType.values()) { API.startCheck(player, value); } } else { Util.debugLog( - "Calling Spartan continue follow " + player.getName() + " cheats detection."); + "Calling Spartan ignore " + + player.getName() + + " cheats detection until we finished permission checks."); for (Enums.HackType value : Enums.HackType.values()) { API.stopCheck(player, value); } From 331a38ebf1e36ad19c34df06f478bcbf26e0dc2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 26 Dec 2021 10:51:10 +0800 Subject: [PATCH 139/725] Bump PlotSquared-Core from 6.2.0 to 6.2.1 (#37) Bumps [PlotSquared-Core](https://github.com/IntellectualSites/PlotSquared) from 6.2.0 to 6.2.1. - [Release notes](https://github.com/IntellectualSites/PlotSquared/releases) - [Commits](https://github.com/IntellectualSites/PlotSquared/compare/6.2.0...6.2.1) --- updated-dependencies: - dependency-name: com.plotsquared:PlotSquared-Core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 88bc9d3ca6..9be726a4e8 100644 --- a/pom.xml +++ b/pom.xml @@ -710,7 +710,7 @@ com.plotsquared PlotSquared-Core - 6.2.0 + 6.2.1 provided From 41b0881d1ca6cb01330f78db8236b8a8d3117cb4 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Sun, 26 Dec 2021 21:36:00 +0800 Subject: [PATCH 140/725] Let disabled command could be hot loaded --- .../org/maxgamer/quickshop/api/command/CommandContainer.java | 4 +++- .../org/maxgamer/quickshop/command/SimpleCommandManager.java | 5 ++--- .../quickshop/command/subcommand/SubCommand_Help.java | 2 +- .../quickshop/command/subcommand/SubCommand_ROOT.java | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java b/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java index 6a654170e0..830585b4a9 100644 --- a/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java +++ b/src/main/java/org/maxgamer/quickshop/api/command/CommandContainer.java @@ -31,6 +31,7 @@ import java.lang.reflect.Method; import java.util.List; import java.util.function.Function; +import java.util.function.Supplier; @Data @Builder @@ -52,7 +53,8 @@ public class CommandContainer { private String description; // Will show in the /qs help private boolean disabled; //Set command is disabled or not. - + @Nullable + private Supplier disabledSupplier; //Set command is disabled or not. @Nullable private String disablePlaceholder; //Set the text shown if command disabled @Nullable diff --git a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java index 9fb2f1fd0e..d1ef7f4e16 100644 --- a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java +++ b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java @@ -293,8 +293,7 @@ public SimpleCommandManager(QuickShop plugin) { .permission("quickshop.create.stacks") .permission("quickshop.create.changeamount") .executor(new SubCommand_Size(plugin)) - .disabled(!plugin.isAllowStack()) - // TODO: Check the sender + .disabledSupplier(plugin::isAllowStack) .disablePlaceholder(plugin.text().of("command.feature-not-enabled").forLocale()) .build()); registerCmd(CommandContainer.builder() @@ -407,7 +406,7 @@ public boolean onCommand( if (!container.getPrefix().equalsIgnoreCase(cmdArg[0])) { continue; } - if (container.isDisabled()) { + if (container.isDisabled() || (container.getDisabledSupplier() != null && container.getDisabledSupplier().get())) { MsgUtil.sendDirectMessage(sender, container.getDisableText(sender)); return true; } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Help.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Help.java index 4a8d9fa709..a07150e058 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Help.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_Help.java @@ -79,7 +79,7 @@ private void sendHelp(@NotNull CommandSender s, @NotNull String commandLabel) { commandDesc = "Error: Subcommand " + container.getPrefix() + " # " + container.getClass().getCanonicalName() + " doesn't register the correct help description."; } } - if (container.isDisabled()) { + if (container.isDisabled() || (container.getDisabledSupplier() != null && container.getDisabledSupplier().get())) { if (QuickShop.getPermissionManager().hasPermission(s, "quickshop.showdisabled")) { plugin.text().of(s, "command.format", commandLabel, container.getPrefix(), container.getDisableText(s)).send(); } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_ROOT.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_ROOT.java index d4125656c8..0e09564c34 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_ROOT.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_ROOT.java @@ -71,7 +71,7 @@ public List onTabComplete(@NotNull CommandSender sender, @NotNull String } } - if (!container.isHidden() && !container.isDisabled()) { + if (!container.isHidden() && !(container.isDisabled() || (container.getDisabledSupplier() != null))) { candidate.add(container.getPrefix()); } } From e56c60a41d48614eab31babe3e9075dfe7f26852 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 14:44:50 +0800 Subject: [PATCH 141/725] Optimize silent command class structure --- .../command/SimpleCommandManager.java | 1 + .../SubCommand_SilentBase.java} | 32 ++++++------ .../silent/SubCommand_SilentBuy.java | 51 +++++++++++++++++++ .../{ => silent}/SubCommand_SilentEmpty.java | 30 +++-------- .../SubCommand_SilentPreview.java | 32 +++--------- .../{ => silent}/SubCommand_SilentRemove.java | 36 +++---------- .../{ => silent}/SubCommand_SilentSell.java | 34 +++---------- .../SubCommand_SilentUnlimited.java | 35 +++---------- 8 files changed, 100 insertions(+), 151 deletions(-) rename src/main/java/org/maxgamer/quickshop/command/subcommand/{SubCommand_SilentBuy.java => silent/SubCommand_SilentBase.java} (67%) create mode 100644 src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBuy.java rename src/main/java/org/maxgamer/quickshop/command/subcommand/{ => silent}/SubCommand_SilentEmpty.java (67%) rename src/main/java/org/maxgamer/quickshop/command/subcommand/{ => silent}/SubCommand_SilentPreview.java (59%) rename src/main/java/org/maxgamer/quickshop/command/subcommand/{ => silent}/SubCommand_SilentRemove.java (59%) rename src/main/java/org/maxgamer/quickshop/command/subcommand/{ => silent}/SubCommand_SilentSell.java (60%) rename src/main/java/org/maxgamer/quickshop/command/subcommand/{ => silent}/SubCommand_SilentUnlimited.java (66%) diff --git a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java index d1ef7f4e16..e819eca0ad 100644 --- a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java +++ b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java @@ -33,6 +33,7 @@ import org.maxgamer.quickshop.api.command.CommandContainer; import org.maxgamer.quickshop.api.command.CommandManager; import org.maxgamer.quickshop.command.subcommand.*; +import org.maxgamer.quickshop.command.subcommand.silent.*; import org.maxgamer.quickshop.util.MsgUtil; import org.maxgamer.quickshop.util.Util; diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBase.java similarity index 67% rename from src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java rename to src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBase.java index fc77131560..9ae2ab5fb9 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentBuy.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBase.java @@ -1,5 +1,5 @@ /* - * This file is a part of project QuickShop, the name is SubCommand_SilentBuy.java + * This file is a part of project QuickShop, the name is SubCommand_SilentBase.java * Copyright (C) PotatoCraft Studio and contributors * * This program is free software: you can redistribute it and/or modify it @@ -17,27 +17,27 @@ * */ -package org.maxgamer.quickshop.command.subcommand; +package org.maxgamer.quickshop.command.subcommand.silent; import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.maxgamer.quickshop.QuickShop; import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; -import org.maxgamer.quickshop.api.shop.ShopType; -import org.maxgamer.quickshop.util.MsgUtil; import org.maxgamer.quickshop.util.Util; +import java.util.Collections; +import java.util.List; import java.util.UUID; @AllArgsConstructor -public class SubCommand_SilentBuy implements CommandHandler { - - private final QuickShop plugin; +public abstract class SubCommand_SilentBase implements CommandHandler { + protected final QuickShop plugin; @Override - public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { + public void onCommand(Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { if (cmdArg.length != 1) { Util.debugLog("Exception on command! Canceling!"); return; @@ -51,17 +51,17 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not } Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); - - if (shop == null || !shop.getModerator().isModerator(sender.getUniqueId())) { + if (shop != null) { + doSilentCommand(sender, shop, cmdArg); + } else { plugin.text().of(sender, "not-looking-at-shop").send(); - return; } - - shop.setShopType(ShopType.BUYING); - shop.update(); - MsgUtil.sendControlPanelInfo(sender, shop); - plugin.text().of(sender, "command.now-buying", Util.getItemStackName(shop.getItem())).send(); } + protected abstract void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg); + @Override + public @Nullable List onTabComplete(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { + return Collections.emptyList(); + } } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBuy.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBuy.java new file mode 100644 index 0000000000..d2c89018e4 --- /dev/null +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentBuy.java @@ -0,0 +1,51 @@ +/* + * This file is a part of project QuickShop, the name is SubCommand_SilentBuy.java + * Copyright (C) PotatoCraft Studio and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.maxgamer.quickshop.command.subcommand.silent; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.maxgamer.quickshop.QuickShop; +import org.maxgamer.quickshop.api.shop.Shop; +import org.maxgamer.quickshop.api.shop.ShopType; +import org.maxgamer.quickshop.util.MsgUtil; +import org.maxgamer.quickshop.util.Util; + + +public class SubCommand_SilentBuy extends SubCommand_SilentBase { + + public SubCommand_SilentBuy(QuickShop plugin) { + super(plugin); + } + + @Override + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { + if (!shop.getModerator().isModerator(sender.getUniqueId())) { + plugin.text().of(sender, "not-looking-at-shop").send(); + return; + } + + shop.setShopType(ShopType.BUYING); + shop.update(); + MsgUtil.sendControlPanelInfo(sender, shop); + plugin.text().of(sender, "command.now-buying", Util.getItemStackName(shop.getItem())).send(); + } + + +} diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentEmpty.java similarity index 67% rename from src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java rename to src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentEmpty.java index 5ef928a5dd..3aca57d5a3 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentEmpty.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentEmpty.java @@ -17,43 +17,26 @@ * */ -package org.maxgamer.quickshop.command.subcommand; +package org.maxgamer.quickshop.command.subcommand.silent; -import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.shop.ContainerShop; import org.maxgamer.quickshop.util.MsgUtil; import org.maxgamer.quickshop.util.Util; -import java.util.UUID; -@AllArgsConstructor -public class SubCommand_SilentEmpty implements CommandHandler { +public class SubCommand_SilentEmpty extends SubCommand_SilentBase { - private final QuickShop plugin; + public SubCommand_SilentEmpty(QuickShop plugin) { + super(plugin); + } @Override - public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length != 1) { - Util.debugLog("Exception on command! Canceling!"); - return; - } - - UUID uuid; - try { - uuid = UUID.fromString(cmdArg[0]); - } catch (IllegalArgumentException e) { - //Not valid, return for doing nothing - return; - } - - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); - + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { if (!(shop instanceof ContainerShop)) { plugin.text().of(sender, "not-looking-at-shop").send(); return; @@ -71,5 +54,4 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not MsgUtil.sendControlPanelInfo(sender, shop); plugin.text().of(sender, "empty-success").send(); } - } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentPreview.java similarity index 59% rename from src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java rename to src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentPreview.java index 91867abfe8..4625cbe965 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentPreview.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentPreview.java @@ -17,49 +17,29 @@ * */ -package org.maxgamer.quickshop.command.subcommand; +package org.maxgamer.quickshop.command.subcommand.silent; -import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.shop.ContainerShop; -import org.maxgamer.quickshop.util.Util; -import java.util.UUID; -@AllArgsConstructor -public class SubCommand_SilentPreview implements CommandHandler { +public class SubCommand_SilentPreview extends SubCommand_SilentBase { - private final QuickShop plugin; + public SubCommand_SilentPreview(QuickShop plugin) { + super(plugin); + } @Override - public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length != 1) { - Util.debugLog("Exception on command! Canceling!"); - return; - } - - UUID uuid; - try { - uuid = UUID.fromString(cmdArg[0]); - } catch (IllegalArgumentException e) { - //Not valid, return for doing nothing - return; - } - - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); - - + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { if (!(shop instanceof ContainerShop)) { // This should never happen plugin.text().of(sender, "not-looking-at-shop").send(); return; } shop.openPreview(sender); - } } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentRemove.java similarity index 59% rename from src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java rename to src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentRemove.java index cdf0d0132f..fa42f45d16 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentRemove.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentRemove.java @@ -17,46 +17,22 @@ * */ -package org.maxgamer.quickshop.command.subcommand; +package org.maxgamer.quickshop.command.subcommand.silent; -import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; -import org.maxgamer.quickshop.util.Util; import org.maxgamer.quickshop.util.logging.container.ShopRemoveLog; -import java.util.UUID; +public class SubCommand_SilentRemove extends SubCommand_SilentBase { -@AllArgsConstructor -public class SubCommand_SilentRemove implements CommandHandler { - - private final QuickShop plugin; + public SubCommand_SilentRemove(QuickShop plugin) { + super(plugin); + } @Override - public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length != 1) { - Util.debugLog("Exception on command! Canceling!"); - return; - } - - UUID uuid; - try { - uuid = UUID.fromString(cmdArg[0]); - } catch (IllegalArgumentException e) { - //Not valid, return for doing nothing - return; - } - - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); - - if (shop == null) { - plugin.text().of(sender, "not-looking-at-shop").send(); - return; - } - + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { if (!shop.getModerator().isModerator(sender.getUniqueId()) && !QuickShop.getPermissionManager().hasPermission(sender, "quickshop.other.destroy")) { plugin.text().of(sender, "no-permission").send(); diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentSell.java similarity index 60% rename from src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java rename to src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentSell.java index d6835bc658..1015ce9682 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentSell.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentSell.java @@ -17,43 +17,24 @@ * */ -package org.maxgamer.quickshop.command.subcommand; +package org.maxgamer.quickshop.command.subcommand.silent; -import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.api.shop.ShopType; import org.maxgamer.quickshop.util.MsgUtil; -import org.maxgamer.quickshop.util.Util; -import java.util.UUID; +public class SubCommand_SilentSell extends SubCommand_SilentBase { -@AllArgsConstructor -public class SubCommand_SilentSell implements CommandHandler { - - private final QuickShop plugin; + public SubCommand_SilentSell(QuickShop plugin) { + super(plugin); + } @Override - public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length != 1) { - Util.debugLog("Exception on command! Canceling!"); - return; - } - - UUID uuid; - try { - uuid = UUID.fromString(cmdArg[0]); - } catch (IllegalArgumentException e) { - //Not valid, return for doing nothing - return; - } - - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); - - if (shop == null || !shop.getModerator().isModerator(sender.getUniqueId())) { + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { + if (!shop.getModerator().isModerator(sender.getUniqueId())) { plugin.text().of(sender, "not-looking-at-shop").send(); return; } @@ -63,5 +44,6 @@ public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @Not MsgUtil.sendControlPanelInfo(sender, shop); plugin.text().of(sender, "command.now-selling", MsgUtil.getTranslateText(shop.getItem())).send(); + } } diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentUnlimited.java similarity index 66% rename from src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java rename to src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentUnlimited.java index 1d20ae087a..4caa4cf013 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_SilentUnlimited.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentUnlimited.java @@ -17,46 +17,23 @@ * */ -package org.maxgamer.quickshop.command.subcommand; +package org.maxgamer.quickshop.command.subcommand.silent; -import lombok.AllArgsConstructor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.maxgamer.quickshop.QuickShop; -import org.maxgamer.quickshop.api.command.CommandHandler; import org.maxgamer.quickshop.api.shop.Shop; import org.maxgamer.quickshop.shop.SimpleShopManager; import org.maxgamer.quickshop.util.MsgUtil; -import org.maxgamer.quickshop.util.Util; -import java.util.UUID; +public class SubCommand_SilentUnlimited extends SubCommand_SilentBase { -@AllArgsConstructor -public class SubCommand_SilentUnlimited implements CommandHandler { - private final QuickShop plugin; + public SubCommand_SilentUnlimited(QuickShop plugin) { + super(plugin); + } @Override - public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { - if (cmdArg.length != 1) { - Util.debugLog("Exception on command! Canceling!"); - return; - } - - UUID uuid; - try { - uuid = UUID.fromString(cmdArg[0]); - } catch (IllegalArgumentException e) { - //Not valid, return for doing nothing - return; - } - - Shop shop = plugin.getShopManager().getShopFromRuntimeRandomUniqueId(uuid); - - if (shop == null) { - plugin.text().of(sender, "not-looking-at-shop").send(); - return; - } - + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { shop.setUnlimited(!shop.isUnlimited()); shop.update(); MsgUtil.sendControlPanelInfo(sender, shop); From f91675ccd84f0e84860bee1a0b4454ee9b53c85a Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 15:04:08 +0800 Subject: [PATCH 142/725] Add a new command for always counting in unlimited shops --- .../org/maxgamer/quickshop/api/shop/Shop.java | 15 +++++ .../command/SimpleCommandManager.java | 13 ++++- .../subcommand/SubCommand_AlwaysCounting.java | 58 +++++++++++++++++++ .../SubCommand_SilentAlwaysCounting.java | 46 +++++++++++++++ .../quickshop/listener/PlayerListener.java | 10 ++-- .../quickshop/shop/ContainerShop.java | 25 ++++++-- .../maxgamer/quickshop/shop/SimpleInfo.java | 3 + .../quickshop/shop/SimpleShopManager.java | 6 +- .../org/maxgamer/quickshop/util/MsgUtil.java | 11 ++++ src/main/resources/lang/messages.json | 6 ++ 10 files changed, 178 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java create mode 100644 src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java diff --git a/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java b/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java index 3b7f387764..a6ea9a37d8 100644 --- a/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java +++ b/src/main/java/org/maxgamer/quickshop/api/shop/Shop.java @@ -613,4 +613,19 @@ default boolean isShopSign(@NotNull Sign sign) { * @return Free Shop */ boolean isFreeShop(); + + /** + * If this shop is always counting space or stocks, even is unlimited + */ + default boolean isAlwaysCountingContainer() { + return false; + } + + /** + * Set if this shop is always a limited shop, even is unlimited + * + * @param value is always counting space or stocks + */ + default void setAlwaysCountingContainer(boolean value) { + } } diff --git a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java index e819eca0ad..7d55a79fcc 100644 --- a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java +++ b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java @@ -78,10 +78,17 @@ public SimpleCommandManager(QuickShop plugin) { .build()); registerCmd( CommandContainer.builder() - .prefix("slientunlimited") + .prefix("alwayscounting") .hidden(true) - .permission("quickshop.unlimited") - .executor(new SubCommand_SilentUnlimited(plugin)) + .permission("quickshop.alwayscounting") + .executor(new SubCommand_AlwaysCounting(plugin)) + .build()); + registerCmd( + CommandContainer.builder() + .prefix("slientalwayscounting") + .hidden(true) + .permission("quickshop.alwayscounting") + .executor(new SubCommand_SilentAlwaysCounting(plugin)) .build()); registerCmd( CommandContainer.builder() diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java new file mode 100644 index 0000000000..38bff82df5 --- /dev/null +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java @@ -0,0 +1,58 @@ +/* + * This file is a part of project QuickShop, the name is SubCommand_Unlimited.java + * Copyright (C) PotatoCraft Studio and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.maxgamer.quickshop.command.subcommand; + +import lombok.AllArgsConstructor; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.util.BlockIterator; +import org.jetbrains.annotations.NotNull; +import org.maxgamer.quickshop.QuickShop; +import org.maxgamer.quickshop.api.command.CommandHandler; +import org.maxgamer.quickshop.api.shop.Shop; + +@AllArgsConstructor +public class SubCommand_AlwaysCounting implements CommandHandler { + + private final QuickShop plugin; + + @Override + public void onCommand(@NotNull Player sender, @NotNull String commandLabel, @NotNull String[] cmdArg) { + BlockIterator bIt = new BlockIterator(sender, 10); + + while (bIt.hasNext()) { + final Block b = bIt.next(); + final Shop shop = plugin.getShopManager().getShop(b.getLocation()); + if (shop == null) { + continue; + } + shop.setAlwaysCountingContainer(!shop.isAlwaysCountingContainer()); + shop.update(); + if (shop.isAlwaysCountingContainer()) { + plugin.text().of(sender, "command.toggle-always-counting.counting").send(); + } else { + plugin.text().of(sender, "command.toggle-always-counting.not-counting").send(); + } + return; + } + plugin.text().of(sender, "not-looking-at-shop").send(); + } + +} diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java new file mode 100644 index 0000000000..288db08292 --- /dev/null +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java @@ -0,0 +1,46 @@ +/* + * This file is a part of project QuickShop, the name is SubCommand_SilentUnlimited.java + * Copyright (C) PotatoCraft Studio and contributors + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package org.maxgamer.quickshop.command.subcommand.silent; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.maxgamer.quickshop.QuickShop; +import org.maxgamer.quickshop.api.shop.Shop; +import org.maxgamer.quickshop.util.MsgUtil; + +public class SubCommand_SilentAlwaysCounting extends SubCommand_SilentBase { + + public SubCommand_SilentAlwaysCounting(QuickShop plugin) { + super(plugin); + } + + @Override + protected void doSilentCommand(Player sender, @NotNull Shop shop, @NotNull String[] cmdArg) { + shop.setAlwaysCountingContainer(!shop.isAlwaysCountingContainer()); + shop.update(); + MsgUtil.sendControlPanelInfo(sender, shop); + if (shop.isAlwaysCountingContainer()) { + plugin.text().of(sender, "command.toggle-always-counting.counting").send(); + } else { + plugin.text().of(sender, "command.toggle-always-counting.not-counting").send(); + } + } + +} diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index 793c7485fe..6f8cd984a2 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -292,11 +292,12 @@ else if (e.useInteractedBlock() == Event.Result.ALLOW } private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inventory playerInventory) { + boolean isShopUnlimited = shop.isUnlimited() && !shop.isAlwaysCountingContainer(); if (shop.isFreeShop()) { // Free shop - return shop.isUnlimited() ? Util.countSpace(playerInventory, shop.getItem()) : Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); + return isShopUnlimited ? Util.countSpace(playerInventory, shop.getItem()) : Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); } int itemAmount = Math.min(Util.countSpace(playerInventory, shop.getItem()), (int) Math.floor(traderBalance / price)); - if (!shop.isUnlimited()) { + if (!isShopUnlimited) { itemAmount = Math.min(itemAmount, shop.getRemainingStock()); } if (itemAmount < 0) { @@ -306,13 +307,14 @@ private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inven } private int getPlayerCanSell(Shop shop, double ownerBalance, double price, Inventory playerInventory) { + boolean isShopUnlimited = shop.isUnlimited() && !shop.isAlwaysCountingContainer(); if (shop.isFreeShop()) { - return shop.isUnlimited() ? Util.countItems(playerInventory, shop.getItem()) : Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); + return isShopUnlimited ? Util.countItems(playerInventory, shop.getItem()) : Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); } int items = Util.countItems(playerInventory, shop.getItem()); final int ownerCanAfford = (int) (ownerBalance / price); - if (!shop.isUnlimited()) { + if (!isShopUnlimited) { // Amount check player amount and shop empty slot items = Math.min(items, shop.getRemainingSpace()); // Amount check player selling item total cost and the shop owner's balance diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index bf0ef6493e..5d009e8d91 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -80,6 +80,7 @@ public class ContainerShop implements Shop { private double price; private ShopType shopType; private boolean unlimited; + private boolean isAlwaysCountingContainer; @NotNull private ItemStack item; @Nullable @@ -108,7 +109,7 @@ public class ContainerShop implements Shop { private boolean disableDisplay; private UUID taxAccount; - @SuppressWarnings("CopyConstructorMissesField") + private ContainerShop(@NotNull ContainerShop s) { Util.ensureThread(false); this.shopType = s.shopType; @@ -127,6 +128,7 @@ private ContainerShop(@NotNull ContainerShop s) { this.currency = s.currency; this.disableDisplay = s.disableDisplay; this.taxAccount = s.taxAccount; + this.isAlwaysCountingContainer = s.isAlwaysCountingContainer; initDisplayItem(); } @@ -184,6 +186,7 @@ public ContainerShop( initDisplayItem(); this.dirty = false; updateShopData(); + isAlwaysCountingContainer = getExtra(plugin).getBoolean("is-always-counting-container", false); } private void updateShopData() { @@ -193,7 +196,6 @@ private void updateShopData() { section.set("currency", null); Util.debugLog("Shop " + this + " currency data upgrade successful."); } - setExtra(plugin, section); setDirty(); this.update(); } @@ -315,7 +317,7 @@ public void buy(@NotNull UUID buyer, @NotNull Inventory buyerInventory, return; } ItemStack[] contents = buyerInventory.getContents(); - if (this.isUnlimited()) { + if (this.isUnlimited() && !isAlwaysCountingContainer) { for (int i = 0; amount > 0 && i < contents.length; i++) { ItemStack stack = contents[i]; if (stack == null || stack.getType() == Material.AIR) { @@ -595,6 +597,18 @@ public boolean isFreeShop() { return this.price == 0.0d; } + @Override + public boolean isAlwaysCountingContainer() { + return isAlwaysCountingContainer; + } + + public void setAlwaysCountingContainer(boolean value) { + isAlwaysCountingContainer = value; + getExtra(plugin).set("is-always-counting-container", value); + setDirty(); + update(); + } + @Override public @NotNull String ownerName() { return ownerName(false); @@ -645,7 +659,7 @@ public void sell(@NotNull UUID seller, @NotNull Inventory sellerInventory, // Items to drop on floor ArrayList floor = new ArrayList<>(5); int itemMaxStackSize = Util.getItemMaxStackSize(this.item.getType()); - if (this.isUnlimited()) { + if (this.isUnlimited() && !isAlwaysCountingContainer()) { ItemStack item = this.item.clone(); while (amount > 0) { int stackSize = Math.min(amount, itemMaxStackSize); @@ -691,7 +705,7 @@ public void sell(@NotNull UUID seller, @NotNull Inventory sellerInventory, } public boolean inventoryAvailable() { - if (isUnlimited()) { + if (isUnlimited() && !isAlwaysCountingContainer()) { return true; } if (isSelling()) { @@ -1527,6 +1541,7 @@ public void checkContainer() { */ @Override public void setExtra(@NotNull Plugin plugin, @NotNull ConfigurationSection data) { + extra.set(plugin.getName(), data); setDirty(); update(); } diff --git a/src/main/java/org/maxgamer/quickshop/shop/SimpleInfo.java b/src/main/java/org/maxgamer/quickshop/shop/SimpleInfo.java index 167d3410b5..b370062810 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/SimpleInfo.java +++ b/src/main/java/org/maxgamer/quickshop/shop/SimpleInfo.java @@ -132,6 +132,9 @@ public boolean hasChanged(@NotNull Shop shop) { if (this.shop.isUnlimited() != shop.isUnlimited()) { return true; } + if (this.shop.isAlwaysCountingContainer() != shop.isAlwaysCountingContainer()) { + return true; + } if (this.shop.getShopType() != shop.getShopType()) { return true; } diff --git a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java index 412a678d1a..bf4af2964c 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java +++ b/src/main/java/org/maxgamer/quickshop/shop/SimpleShopManager.java @@ -1342,7 +1342,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) ownerCanAfford = Integer.MAX_VALUE; } - if (!shop.isUnlimited()) { + if (shop.isAlwaysCountingContainer() || !shop.isUnlimited()) { amount = Math.min(shopHaveSpaces, invHaveItems); amount = Math.min(amount, ownerCanAfford); } else { @@ -1398,7 +1398,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) if (message.equalsIgnoreCase(plugin.getConfig().getString("shop.word-for-trade-all-items", "all"))) { int shopHaveItems = shop.getRemainingStock(); int invHaveSpaces = Util.countSpace(p.getInventory(), shop.getItem()); - if (!shop.isUnlimited()) { + if (shop.isAlwaysCountingContainer() || !shop.isUnlimited()) { amount = Math.min(shopHaveItems, invHaveSpaces); } else { // should check not having items but having empty slots, cause player is trying to buy @@ -1412,7 +1412,7 @@ private void actionTrade(@NotNull Player p, Info info, @NotNull String message) amount = Math.min(amount, (int) Math.floor(balance / price)); if (amount < 1) { // typed 'all' but the auto set amount is 0 // when typed 'all' but player can't buy any items - if (!shop.isUnlimited() && shopHaveItems < 1) { + if ((shop.isAlwaysCountingContainer() || !shop.isUnlimited()) && shopHaveItems < 1) { // but also the shop's stock is 0 plugin.text().of(p, "shop-stock-too-low", Integer.toString(shop.getRemainingStock()), diff --git a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java index 7526ff1f7f..0a8d5b163a 100644 --- a/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java +++ b/src/main/java/org/maxgamer/quickshop/util/MsgUtil.java @@ -498,6 +498,17 @@ public static void sendControlPanelInfo(@NotNull CommandSender sender, @NotNull shop.getRuntimeRandomUniqueId().toString()); chatSheetPrinter.printExecutableCmdLine(text, hoverText, clickCommand); } + // Always Counting + if (QuickShop.getPermissionManager().hasPermission(sender, "quickshop.alwayscounting")) { + String text = + plugin.text().of(sender, "controlpanel.alwayscounting", bool2String(shop.isAlwaysCountingContainer())).forLocale(); + String hoverText = plugin.text().of(sender, "controlpanel.alwayscounting-hover").forLocale(); + String clickCommand = + MsgUtil.fillArgs( + "/qs silentalwayscounting {0}", + shop.getRuntimeRandomUniqueId().toString()); + chatSheetPrinter.printExecutableCmdLine(text, hoverText, clickCommand); + } // Buying/Selling Mode if (QuickShop.getPermissionManager().hasPermission(sender, "quickshop.create.buy") && QuickShop.getPermissionManager().hasPermission(sender, "quickshop.create.sell")) { diff --git a/src/main/resources/lang/messages.json b/src/main/resources/lang/messages.json index 6944ca2125..0ac0f6752f 100644 --- a/src/main/resources/lang/messages.json +++ b/src/main/resources/lang/messages.json @@ -122,6 +122,10 @@ "unlimited": "&aShop is now unlimited", "limited": "&aShop is now limited" }, + "toggle-always-counting": { + "counting": "&aShop is now always counting container even is unlimited", + "not-counting": "&aShop is now respect if shop is unlimited" + }, "transfer-success": "&aTransferred &e{0} &ashop(s) to &e{1}", "transfer-success-other": "&aTransferred &e{0} {1}&a's shop(s) to &e{2}", "some-shops-removed": "&e{0} &ashop(s) removed", @@ -203,6 +207,8 @@ "freeze": "Trading disabled" }, "controlpanel": { + "alwayscounting": "&aAlways counting: {0} &e[&d&lChange&e]", + "alwayscounting-hover": "&eClick to toggle if the shop is always counting container.", "setowner": "&aOwner: &b{0} &e[&d&lChange&e]", "infomation": "&aShop Control panel:", "setowner-hover": "&eClick to switch owner.", From 19b57bb89f856016a336bcbed61ef5c4614823e9 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 17:03:52 +0800 Subject: [PATCH 143/725] Fix color formatting with item hover issue --- .../quickshop/chat/platform/minedown/BungeeQuickChat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b5d1b16841..471a04de42 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 @@ -229,7 +229,7 @@ public BungeeComponentBuilder appendLegacyAndItem(String left, BaseComponent[] i builder.append(leftComponent, ComponentBuilder.FormatRetention.EVENTS); builder.append(rightComponent, ComponentBuilder.FormatRetention.EVENTS); } else { - builder.append(component); + builder.append(component, ComponentBuilder.FormatRetention.EVENTS); } } return this; From fd3ddabc597908c677f69e0889dd1900dab9e1f3 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 17:13:17 +0800 Subject: [PATCH 144/725] Fix alwayscounting command and function bugs --- .../org/maxgamer/quickshop/command/SimpleCommandManager.java | 4 ++-- src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java | 4 ++-- src/main/resources/plugin.yml | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java index 7d55a79fcc..dbfa8ed340 100644 --- a/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java +++ b/src/main/java/org/maxgamer/quickshop/command/SimpleCommandManager.java @@ -79,13 +79,13 @@ public SimpleCommandManager(QuickShop plugin) { registerCmd( CommandContainer.builder() .prefix("alwayscounting") - .hidden(true) + .hidden(false) .permission("quickshop.alwayscounting") .executor(new SubCommand_AlwaysCounting(plugin)) .build()); registerCmd( CommandContainer.builder() - .prefix("slientalwayscounting") + .prefix("silentalwayscounting") .hidden(true) .permission("quickshop.alwayscounting") .executor(new SubCommand_SilentAlwaysCounting(plugin)) diff --git a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java index 5d009e8d91..044efd0bca 100644 --- a/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java +++ b/src/main/java/org/maxgamer/quickshop/shop/ContainerShop.java @@ -1098,7 +1098,7 @@ public void setPrice(double price) { @Override public int getRemainingSpace() { Util.ensureThread(false); - if (this.unlimited) { + if (this.unlimited && !isAlwaysCountingContainer()) { return -1; } int space = Util.countSpace(this.getInventory(), this.getItem()); @@ -1114,7 +1114,7 @@ public int getRemainingSpace() { @Override public int getRemainingStock() { Util.ensureThread(false); - if (this.unlimited) { + if (this.unlimited && !isAlwaysCountingContainer()) { return -1; } int stock = Util.countItems(this.getInventory(), this.getItem()); diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b5c1e6a80e..0feb7f534d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -152,6 +152,9 @@ permissions: quickshop.unlimited: description: Allows a staff member to use /qs unlimited to make a shop infinite. default: op + quickshop.alwayscounting: + description: Allows a staff member to use /qs alwayscounting to make a shop always counting container. + default: op quickshop.bypass.: description: Allows a player to sell blacklisted . default: op From 23cb9c3ec045d2b858ebaa4e1433a6cc13c1f627 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 18:24:31 +0800 Subject: [PATCH 145/725] Fix licence header --- .../quickshop/command/subcommand/SubCommand_AlwaysCounting.java | 2 +- .../subcommand/silent/SubCommand_SilentAlwaysCounting.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java index 38bff82df5..402e1ec089 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/SubCommand_AlwaysCounting.java @@ -1,5 +1,5 @@ /* - * This file is a part of project QuickShop, the name is SubCommand_Unlimited.java + * This file is a part of project QuickShop, the name is SubCommand_AlwaysCounting.java * Copyright (C) PotatoCraft Studio and contributors * * This program is free software: you can redistribute it and/or modify it diff --git a/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java index 288db08292..4a02d6b79a 100644 --- a/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java +++ b/src/main/java/org/maxgamer/quickshop/command/subcommand/silent/SubCommand_SilentAlwaysCounting.java @@ -1,5 +1,5 @@ /* - * This file is a part of project QuickShop, the name is SubCommand_SilentUnlimited.java + * This file is a part of project QuickShop, the name is SubCommand_SilentAlwaysCounting.java * Copyright (C) PotatoCraft Studio and contributors * * This program is free software: you can redistribute it and/or modify it From 328f8d9f24ebf798a5bd334e8d43e923fd8b62de Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 18:26:11 +0800 Subject: [PATCH 146/725] Fix misleading variable names isShopUnlimited->isContainerCountingNeeded --- .../maxgamer/quickshop/listener/PlayerListener.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java index 6f8cd984a2..5a5c358aa6 100644 --- a/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java +++ b/src/main/java/org/maxgamer/quickshop/listener/PlayerListener.java @@ -292,12 +292,12 @@ else if (e.useInteractedBlock() == Event.Result.ALLOW } private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inventory playerInventory) { - boolean isShopUnlimited = shop.isUnlimited() && !shop.isAlwaysCountingContainer(); + boolean isContainerCountingNeeded = shop.isUnlimited() && !shop.isAlwaysCountingContainer(); if (shop.isFreeShop()) { // Free shop - return isShopUnlimited ? Util.countSpace(playerInventory, shop.getItem()) : Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); + return isContainerCountingNeeded ? Util.countSpace(playerInventory, shop.getItem()) : Math.min(shop.getRemainingStock(), Util.countSpace(playerInventory, shop.getItem())); } int itemAmount = Math.min(Util.countSpace(playerInventory, shop.getItem()), (int) Math.floor(traderBalance / price)); - if (!isShopUnlimited) { + if (!isContainerCountingNeeded) { itemAmount = Math.min(itemAmount, shop.getRemainingStock()); } if (itemAmount < 0) { @@ -307,14 +307,14 @@ private int getPlayerCanBuy(Shop shop, double traderBalance, double price, Inven } private int getPlayerCanSell(Shop shop, double ownerBalance, double price, Inventory playerInventory) { - boolean isShopUnlimited = shop.isUnlimited() && !shop.isAlwaysCountingContainer(); + boolean isContainerCountingNeeded = shop.isUnlimited() && !shop.isAlwaysCountingContainer(); if (shop.isFreeShop()) { - return isShopUnlimited ? Util.countItems(playerInventory, shop.getItem()) : Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); + return isContainerCountingNeeded ? Util.countItems(playerInventory, shop.getItem()) : Math.min(shop.getRemainingSpace(), Util.countItems(playerInventory, shop.getItem())); } int items = Util.countItems(playerInventory, shop.getItem()); final int ownerCanAfford = (int) (ownerBalance / price); - if (!isShopUnlimited) { + if (!isContainerCountingNeeded) { // Amount check player amount and shop empty slot items = Math.min(items, shop.getRemainingSpace()); // Amount check player selling item total cost and the shop owner's balance From 2733b73dc3edaf9b59ba3c80fa91f13123850db7 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Mon, 27 Dec 2021 18:31:52 +0800 Subject: [PATCH 147/725] Workaround for certificate expired IridiumDevelopment maven repo --- lib/IridiumSkyblock-3.2.2.jar | Bin 0 -> 3512476 bytes pom.xml | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 lib/IridiumSkyblock-3.2.2.jar diff --git a/lib/IridiumSkyblock-3.2.2.jar b/lib/IridiumSkyblock-3.2.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..c2d90fdc5a834ebfb87a025c867c55bf6c36b327 GIT binary patch literal 3512476 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

ijzyTH0*OZ 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⁣@X0krt_$=dc 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 z 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�^=XHwm<&yC1l`iVrJ*)@mEOy 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]jW|zWw4*dfYh1iPH|B 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