From 5bf158c1d44eeec272e6113382080e751fe82f47 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sat, 1 Mar 2025 13:59:46 -0500 Subject: [PATCH 01/25] Fix negative playtime stat breaking /baltop (#6074) Unclear how this happens, possibly a division error? Fixes #6043 --- .../com/earth2me/essentials/commands/Commandbalancetop.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalancetop.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalancetop.java index 6ded4a197aa..baba65c5722 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalancetop.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbalancetop.java @@ -128,12 +128,12 @@ public void run() { playtime = user.getBase().getStatistic(PLAY_ONE_TICK); } // Play time in seconds - final long playTimeSecs = playtime / 20; + final long playTimeSecs = Math.max(playtime / 20, 0); // Checking if player meets the requirements of minimum balance and minimum playtime to be listed in baltop list if ((ess.getSettings().showZeroBaltop() || balance.compareTo(BigDecimal.ZERO) > 0) && balance.compareTo(ess.getSettings().getBaltopMinBalance()) >= 0 && - playTimeSecs > ess.getSettings().getBaltopMinPlaytime()) { + playTimeSecs >= ess.getSettings().getBaltopMinPlaytime()) { newCache.getLines().add(AdventureUtil.miniToLegacy(tlLiteral("balanceTopLine", pos, entry.getValue().getDisplayName(), AdventureUtil.parsed(NumberUtil.displayCurrency(balance, ess))))); } pos++; From 90d766df2b7df6231e952a1af0cee34dbf3cbb1f Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 3 Mar 2025 14:03:41 -0500 Subject: [PATCH 02/25] Add non-reflection provider for syncCommands On 1.21.4+ Player#updateCommands has the same logic as CraftServer#updateCommands, so we can just use that. --- .../com/earth2me/essentials/Essentials.java | 3 +- .../providers/ModernSyncCommandsProvider.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index a81daa59794..39c7a596612 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -86,6 +86,7 @@ import net.ess3.provider.providers.ModernPlayerLocaleProvider; import net.ess3.provider.providers.ModernPotionMetaProvider; import net.ess3.provider.providers.ModernSignDataProvider; +import net.ess3.provider.providers.ModernSyncCommandsProvider; import net.ess3.provider.providers.PaperBiomeKeyProvider; import net.ess3.provider.providers.PaperContainerProvider; import net.ess3.provider.providers.PaperKnownCommandsProvider; @@ -393,7 +394,7 @@ public void onEnable() { providerFactory.registerProvider(BukkitMaterialTagProvider.class, PaperMaterialTagProvider.class); // Sync Commands Provider - providerFactory.registerProvider(ReflSyncCommandsProvider.class); + providerFactory.registerProvider(ReflSyncCommandsProvider.class, ModernSyncCommandsProvider.class); // Persistent Data Provider providerFactory.registerProvider(ReflPersistentDataProvider.class, ModernPersistentDataProvider.class); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java new file mode 100644 index 00000000000..d30f13075e1 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java @@ -0,0 +1,28 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.SyncCommandsProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +@ProviderData(description = "1.21.4+ Sync Commands Provider", weight = 1) +public class ModernSyncCommandsProvider implements SyncCommandsProvider { + @Override + public void syncCommands() { + for (final Player player : Bukkit.getOnlinePlayers()) { + player.updateCommands(); + } + } + + @ProviderTest + public static boolean test() { + try { + // There isn't a real good way to test this, but we can check if the Creaking class exists. + Class.forName("org.bukkit.entity.Creaking"); + return true; + } catch (final Throwable ignored) { + return false; + } + } +} From 80bdc5269f36ff7e31289b8f1191ebe871ded6e0 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 3 Mar 2025 11:49:46 -0500 Subject: [PATCH 03/25] Fix wrong SpawnerBlockProvider on 1.21+ 1.21 Adds a new org.bukkit.spawner.Spawner class as a superclass of CreatureSpawner which now contains the setMaxSpawnDelay method. Change our test to look for the method on any superclasses too. --- .../net/ess3/provider/providers/BukkitSpawnerBlockProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java index 43494b2d132..043d286ab4a 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java @@ -20,7 +20,7 @@ public void setMinSpawnDelay(final CreatureSpawner spawner, final int delay) { @ProviderTest public static boolean test() { try { - CreatureSpawner.class.getDeclaredMethod("setMaxSpawnDelay", int.class); + CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); return true; } catch (final NoSuchMethodException ignored) { return false; From 43d1e37b8f1229c8e7d07f3f35c6bad6d891ff0a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 9 Mar 2025 12:13:50 -0400 Subject: [PATCH 04/25] Fix flight ability preservation between worlds (#6079) Fixes #6041 --- .../essentials/EssentialsPlayerListener.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 753b3b9a0fc..8b6b2d51f16 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -595,8 +595,12 @@ public void onPlayerTeleport(final PlayerTeleportEvent event) { if (tickCountProvider != null && ess.getSettings().isWorldChangePreserveFlying() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_17_R01)) { if (user.isAuthorized("essentials.fly")) { //noinspection DataFlowIssue - not real - if (event.getFrom().getWorld() != event.getTo().getWorld() && player.isFlying()) { - user.setFlightTick(tickCountProvider.getTickCount()); + if (event.getFrom().getWorld() != event.getTo().getWorld() && player.getAllowFlight()) { + // If the player is not flying but has the ability to fly, we set the sign of the tick count to -1 + // Later on in the PlayerChangedWorldEvent, we will set the player's flying state to true if the tick count is positive. + // If the tick count is negative, we simply just set the player's flight ability to true. + final int tick = player.isFlying() ? tickCountProvider.getTickCount() : -tickCountProvider.getTickCount(); + user.setFlightTick(tick); } } } @@ -778,9 +782,12 @@ public void onPlayerChangedWorldFlyReset(final PlayerChangedWorldEvent event) { } final TickCountProvider tickCountProvider = ess.provider(TickCountProvider.class); - if (tickCountProvider != null && user.getFlightTick() == tickCountProvider.getTickCount() && user.isAuthorized("essentials.fly")) { + final int flightTick = user.getFlightTick(); + if (tickCountProvider != null && Math.abs(flightTick) == tickCountProvider.getTickCount() && user.isAuthorized("essentials.fly")) { user.getBase().setAllowFlight(true); - user.getBase().setFlying(true); + if (flightTick > 0) { + user.getBase().setFlying(true); + } } user.setFlightTick(-1); } From eab220183eb0fa7a292d1986d7b0faa752998d2b Mon Sep 17 00:00:00 2001 From: Flask Bot <67512990+Flask-Bot@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:26:17 +0000 Subject: [PATCH 05/25] New Crowdin updates (#6068) Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com> --- .../src/main/resources/messages_es.properties | 2 + .../src/main/resources/messages_he.properties | 22 + .../src/main/resources/messages_hu.properties | 565 ++++++++++++++++-- .../src/main/resources/messages_uk.properties | 49 +- .../src/main/resources/messages_zh.properties | 2 +- .../main/resources/messages_zh_TW.properties | 34 +- 6 files changed, 616 insertions(+), 58 deletions(-) diff --git a/Essentials/src/main/resources/messages_es.properties b/Essentials/src/main/resources/messages_es.properties index a05d69a4978..7663f9f343e 100644 --- a/Essentials/src/main/resources/messages_es.properties +++ b/Essentials/src/main/resources/messages_es.properties @@ -69,6 +69,7 @@ banIpJoin=Your IP address is banned from this server. Reason\: {0} banJoin=Estás baneado de este servidor. Motivo\: {0} banipCommandDescription=Banea una dirección IP. banipCommandUsage=/ [motivo] +banipCommandUsage1=/ [razón] banipCommandUsage1Description=Banea la dirección IP especificada con una razón opcional bed=cama bedMissing=Tu cama no esta, se encuentra obstruída o no esta segura @@ -1290,6 +1291,7 @@ unbanCommandDescription=Desbanea el jugador especificado. unbanCommandUsage1Description=Desbanea un jugador específico unbanipCommandDescription=Desbanea la dirección IP especificada. unbanipCommandUsage=/ +unbanipCommandUsage1=/ unbanipCommandUsage1Description=Desbanea una dirección IP especifica unignorePlayer=Ya no ignoras al jugador {0}. unknownItemId=ID de ítem desconocido\: {0}. diff --git a/Essentials/src/main/resources/messages_he.properties b/Essentials/src/main/resources/messages_he.properties index d9d93a99123..6327dd97ac9 100644 --- a/Essentials/src/main/resources/messages_he.properties +++ b/Essentials/src/main/resources/messages_he.properties @@ -374,6 +374,7 @@ feedCommandUsage1Description=מאכיל את עצמך או שחקן אחר, אם feedOther=\nמילאת את הרעב של {0}.\n fileRenameError=\nשינוי שם של הקובץ {0} נכשל\!\n fireballCommandUsage=\\ [fireball|small|large|arrow|skull|egg|snowball|expbottle|dragon|splashpotion|lingeringpotion|trident] [speed] +fireballCommandUsage1=/ fireballCommandUsage1Description=זורק כדור אש רגיל מהמיקום שלך fireballCommandUsage2=\\ [speed] fireworkColor=\nהנתונים של הזיקוק שהוכנו שגויים, עליך לבחור צבע קודם.\n @@ -389,6 +390,7 @@ fixedHomes=בתים שגויים נמחקו. fixingHomes=מוחק בתים שגויים... flyCommandDescription=המריא, ותמריא\! flyCommandUsage=\\ [player] [on|off] +flyCommandUsage1=/ [שחקן] flyCommandUsage1Description=מצב תעופה עבור עצמך או עבור שחקן אחר, אם צוין flying=עף / לעוף flyMode=\nמצב תעופה הוגדר {0} ל {1}.\n @@ -402,20 +404,25 @@ gamemodeCommandDescription=שנה את מצב המשחק של השחקן. gamemodeCommandUsage=\\ [player] gamemodeCommandUsage1Description=מגדיר את מצב המשחק שלך או של שחקן אחר אם צוין gcCommandDescription=מדווח על מידע על זיכרון, זמן פעולה וטיק משחק. +gcCommandUsage=/ gcfree= זיכרון פנוי\: {0} MB. gcmax= זיכרון מקסימלי\: {0} MB. gctotal= זיכרון מוקצה\: {0} MB. gcWorld={0} "{1}"\: חלקים {2}, ישויות {3}, צ''אנקים{4}. getposCommandDescription=השג את הקודינטות שלך או של שחקן מסוים. +getposCommandUsage=/ [שחקן] +getposCommandUsage1=/ [שחקן] getposCommandUsage1Description=משיג את הקודינטות שלך או של שחקן אחר אם צוין giveCommandDescription=מביא לשחקן פריט מסוים. giveCommandUsage=\\ [amount [itemmeta...]] giveCommandUsage1Description=מביא לשחקן שצוין 64 (או הכמות שצויינה) מהפריט שצוין giveCommandUsage2=\\ godCommandDescription=מפעיל את הכוחות האגדיים שלך. +godCommandUsage1=/ [שחקן] godDisabledFor=בוטלc& ל6& {0} c& godEnabledFor=הופעלa& ל6& {0} c& godMode=מצב אל6& {0} c&. +grindstoneCommandUsage=/ groupDoesNotExist=אין אף שחקן מחובר שנמצא בקבוצה הזו\! 4& groupNumber={0} עכשיו בשרת, לרשימה המלאה\: /{1} {2} hatArmor=אתה לא יכול להשתמש בפריט הזה בתור כובע\! @@ -536,7 +543,9 @@ jailWorldNotExist=הכלא הזה לא קיים. jumpEasterDisable=מצב המכשף המעופף בוטל. jumpEasterEnable=מצב המכשף המעופף הופעל. jailsCommandDescription=מונה את כל בתי הכלא. +jailsCommandUsage=/ jumpCommandDescription=קופץ לבלוק הקרוב ביותר בקו הראייה. +jumpCommandUsage=/ jumpError=\nזה יכאב למוח של המחשב שלך.\n kickCommandDescription=מעיף את השחקן הניתן ללא סיבה. kickCommandUsage1Description=מרחיק את השחקן הניתן עם סיבה אפשרית @@ -545,6 +554,7 @@ kickedAll=\nכל שחקני השרת נותקוr.\n kickExempt=אתה לא יכול לעשות kick לשחקן הזה. kickallCommandDescription=מעיף את כל השחקנים מהשרת מלבד מבצע הפקודה. kickallCommandUsage=\\ [reason] +kickallCommandUsage1=/ [סיבה] kickallCommandUsage1Description=מעיף את כל השחקנים עם סיבה אפשרית kill=הרג killCommandDescription=הורג שחקן שניתן. @@ -568,19 +578,24 @@ kitReset= מאפשר את זמני ההמתנה לקיט {0} kitresetCommandDescription=מאפס את זמני ההמתנה לקיט שניתן. kitresetCommandUsage=/ [player] kits=\nערכות\: {0}\n +kittycannonCommandUsage=/ kitTimed=\nתוכל להשתמש בערכה זאת רק בעוד {0}.\n lightningCommandUsage=\\ [player] [power] lightningCommandUsage2=\\ lightningSmited=\nברק נורה\!\n lightningUse=\nפוגע עם ברק ב {0}\n +linkCommandUsage=/ +linkCommandUsage1=/ listAfkTag=[רחוק מהמקלדת] listAmount=\nיש כרגע {0} מתוך מקסימום שחקנים של {1} שחקנים מחוברים.\n listCommandUsage=\\ [group] listHiddenTag=\n[מוסתר]\n loadWarpError=\nשגיאה בניסיון לטעון שיגור {0}.\n +loomCommandUsage=/ mailCleared=\nדואר נוקה\!\n mailCommandUsage1=\\ read [page] mailCommandUsage2=\\ clear [number] +mailCommandUsage4=/ clearall mailMessage={0} mailSent=\nדואר נשלח\!\n markMailAsRead=\nבשביל לסמן את כל הדואר כנקרא , רשום /mail clear.\n @@ -589,6 +604,7 @@ maxHomes=\nאינך יכול להגיד יותר מ {0} אינך יכול לשלוח את שחקן זה לכלא\!\n meCommandUsage=\\ meSender=אני +meRecipient=אני minute=דקה minutes=דקות mobsAvailable=מובים\: {0} @@ -601,6 +617,7 @@ mutedPlayer=Player {0} הושתק. muteExempt=אתה לא יכול להשתיק שחקן זה. muteNotify={0} השתיק את {1}. nearCommandUsage=\\ [playername] [radius] +nearCommandUsage1=/ nearCommandUsage2=\\ nearCommandUsage4=\\ nickChanged=כינוי שונה. @@ -645,6 +662,7 @@ onlySunStorm=\n/מזג אוויר תומך רק שמש/סופה.\n orderBalances=\nמסדר נתוני כסף של {0} שחקנים, אנא המתן...\n oversizedTempban=\nאינך יכול לאסור שחקן זה לזמן זה.\n payCommandUsage=\\ +payconfirmtoggleCommandUsage=/ pendingTeleportCancelled=\nבקשה ממתינה בוטלה.\n playerBanIpAddress=\nהשחקן {0} אסר את כתובת האייפי הבאה {1} ל\: {2}.\n playerBanned=\nהשחקן {0} אסר {1} ל\: {2}.\n @@ -652,8 +670,11 @@ playerJailed=\nהשחקן {0} נכנס לכלא.\n playerMuted=\nכעת אתה מושתק\!\n playerNeverOnServer=\nהשחקן {0} אף פעם לא התחבר לשרת זה.\n playerNotFound=שחקן לא נמצא. +playtimeCommandUsage1=/ +playtimeCommandUsage1Description=מציג את הזמן ששיחקת במשחק pong=פונג\! potionCommandUsage=\\ power\: duration\:> +potionCommandUsage1=/ clear potionCommandUsage2=\\ apply potionCommandUsage3=\\ effect\: power\: duration\: posX=X\: {0} (+מזרח<-> -מערב) @@ -668,6 +689,7 @@ powertoolCommandUsage2=\\ d\: powertoolCommandUsage3=\\ r\: powertoolCommandUsage4=\\ powertoolCommandUsage5=\\ a\: +powertooltoggleCommandUsage=/ ptimeCommandUsage=\\ [list|reset|day|night|dawn|17\:30|4pm|4000ticks] [player|*] ptimeCommandUsage1=\\ list [player|*] ptimeCommandUsage2=\\