From fea8e0395255b36e2aea2b398d7a381273b49b4d Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 29 Nov 2023 18:32:27 +0100 Subject: [PATCH 01/23] Upgrade to snapshot --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index b1990d4dc..e7a0266d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ -version=2.7.1 +version=2.7.2-SNAPSHOT org.gradle.jvmargs=-Xmx4G \ No newline at end of file From a0dcf362370c1457869bcb5ca84bfa436ca04bae Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 29 Nov 2023 18:36:45 +0100 Subject: [PATCH 02/23] Replace #408 --- .../api/inventory/AbstractInventory.java | 5 ++++- .../api/inventory/InventoryManager.java | 6 +++--- .../negativity/common/ConnectionManager.java | 20 ++++++++++++++++++- .../hook/players/GlobalPlayerInventory.java | 5 +++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/common/src/com/elikill58/negativity/api/inventory/AbstractInventory.java b/common/src/com/elikill58/negativity/api/inventory/AbstractInventory.java index f6e4c206b..6cd75680d 100644 --- a/common/src/com/elikill58/negativity/api/inventory/AbstractInventory.java +++ b/common/src/com/elikill58/negativity/api/inventory/AbstractInventory.java @@ -10,7 +10,10 @@ public abstract class AbstractInventory { - public static final List> INVENTORIES = new ArrayList<>(); + private static final List> INVENTORIES = new ArrayList<>(); + public static List> getInventories() { + return INVENTORIES; + } private final NegativityInventory type; private final Class holderExample; diff --git a/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java b/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java index 45b929dd7..8ce32332f 100644 --- a/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java +++ b/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java @@ -71,7 +71,7 @@ public InventoryManager() { new WarnProcessorManagerInventory(); new SeeWarnInventory(); new SeeProofInventory(); - AbstractInventory.INVENTORIES.forEach(AbstractInventory::load); + AbstractInventory.getInventories().forEach(AbstractInventory::load); } @SuppressWarnings({ "rawtypes" }) @@ -81,7 +81,7 @@ public void onInventoryClick(InventoryClickEvent e) { if(!(holder instanceof NegativityHolder)) return; NegativityHolder nh = ((NegativityHolder) holder).getBasicHolder(); - for(AbstractInventory inv : AbstractInventory.INVENTORIES) { + for(AbstractInventory inv : AbstractInventory.getInventories()) { if(inv.isInstance(nh)) { e.setCancelled(true); Player p = e.getPlayer(); @@ -97,7 +97,7 @@ public void onInventoryClick(InventoryClickEvent e) { } public static Optional> getInventory(NegativityInventory type) { - for(AbstractInventory inv : AbstractInventory.INVENTORIES) + for(AbstractInventory inv : AbstractInventory.getInventories()) if(inv.getType().equals(type)) return Optional.of(inv); return Optional.empty(); diff --git a/common/src/com/elikill58/negativity/common/ConnectionManager.java b/common/src/com/elikill58/negativity/common/ConnectionManager.java index 1788425e5..c7a2dff28 100644 --- a/common/src/com/elikill58/negativity/common/ConnectionManager.java +++ b/common/src/com/elikill58/negativity/common/ConnectionManager.java @@ -10,13 +10,18 @@ import com.elikill58.negativity.api.entity.Player; import com.elikill58.negativity.api.events.EventListener; import com.elikill58.negativity.api.events.Listeners; +import com.elikill58.negativity.api.events.inventory.InventoryCloseEvent; import com.elikill58.negativity.api.events.player.LoginEvent; import com.elikill58.negativity.api.events.player.PlayerChatEvent; import com.elikill58.negativity.api.events.player.LoginEvent.Result; +import com.elikill58.negativity.api.inventory.InventoryManager; +import com.elikill58.negativity.api.inventory.InventoryType; +import com.elikill58.negativity.api.inventory.AbstractInventory.NegativityInventory; import com.elikill58.negativity.api.events.player.PlayerConnectEvent; import com.elikill58.negativity.api.events.player.PlayerLeaveEvent; import com.elikill58.negativity.api.events.player.PlayerTeleportEvent; import com.elikill58.negativity.common.commands.ReportCommand; +import com.elikill58.negativity.common.inventories.hook.players.GlobalPlayerInventory; import com.elikill58.negativity.universal.Adapter; import com.elikill58.negativity.universal.Messages; import com.elikill58.negativity.universal.SanctionnerType; @@ -136,11 +141,24 @@ public void onTeleport(PlayerTeleportEvent e) { @EventListener public void onLeft(PlayerLeaveEvent e) { - WebhookManager.getWebhooks().forEach(w -> w.clean(e.getPlayer())); + Player p = e.getPlayer(); + WebhookManager.getWebhooks().forEach(w -> w.clean(p)); + GlobalPlayerInventory.PLAYER_SEE_PLAYER_INV.remove(p.getUniqueId()); } @EventListener public void onMessage(PlayerChatEvent e) { Stats.updateMessage(NegativityPlayer.getNegativityPlayer(e.getPlayer()), e.getMessage()); } + + @EventListener + public void onInventoryClose(InventoryCloseEvent e) { + Player p = e.getPlayer(); + if(e.getInventory().getType().equals(InventoryType.PLAYER)) { + Player cible = GlobalPlayerInventory.PLAYER_SEE_PLAYER_INV.get(p.getUniqueId()); + if(cible == null) + return; + InventoryManager.open(NegativityInventory.GLOBAL_PLAYER, p, cible); + } + } } diff --git a/common/src/com/elikill58/negativity/common/inventories/hook/players/GlobalPlayerInventory.java b/common/src/com/elikill58/negativity/common/inventories/hook/players/GlobalPlayerInventory.java index 741832ef7..819e9b686 100644 --- a/common/src/com/elikill58/negativity/common/inventories/hook/players/GlobalPlayerInventory.java +++ b/common/src/com/elikill58/negativity/common/inventories/hook/players/GlobalPlayerInventory.java @@ -4,7 +4,9 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.UUID; import com.elikill58.negativity.api.NegativityPlayer; import com.elikill58.negativity.api.colors.ChatColor; @@ -30,6 +32,8 @@ public class GlobalPlayerInventory extends AbstractInventory { + public static final HashMap PLAYER_SEE_PLAYER_INV = new HashMap<>(); + public GlobalPlayerInventory() { super(NegativityInventory.GLOBAL_PLAYER, CheckMenuHolder.class); } @@ -150,6 +154,7 @@ public void manageInventory(InventoryClickEvent e, Material m, Player p, CheckMe p.closeInventory(); } else if(m.equals(Materials.SPIDER_EYE)){ p.openInventory(cible.getInventory()); + PLAYER_SEE_PLAYER_INV.put(p.getUniqueId(), cible); } else if(m.equals(Materials.TNT)) { InventoryManager.open(NegativityInventory.ACTIVED_CHEAT, p, cible); } else if(m.equals(Materials.PACKED_ICE)) { From 6d1e516279f38355fb9f8ee26791e80a87a8d049 Mon Sep 17 00:00:00 2001 From: NicoZ0404 <92587877+NicoZ0404@users.noreply.github.com> Date: Wed, 29 Nov 2023 18:40:51 +0100 Subject: [PATCH 03/23] Spell check and grammar improvements (#366) Everything was changed to German and i made some minor inprovments in spelling and the Grammar --- .../assets/negativity/CheatHover_de_DE.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/resources/assets/negativity/CheatHover_de_DE.properties b/common/resources/assets/negativity/CheatHover_de_DE.properties index 97719b973..2b9b0a727 100644 --- a/common/resources/assets/negativity/CheatHover_de_DE.properties +++ b/common/resources/assets/negativity/CheatHover_de_DE.properties @@ -1,12 +1,12 @@ hover.forcefield.line_sight=%name% getroffen, ohne ihn zu sehen hover.forcefield.rotate=%degrees%° gedreht -hover.forcefield.fake_players=%nb% Fakespieler geschlagen in %time%ms +hover.forcefield.fake_players=%nb% Fake Spieler geschlagen in %time%ms hover.jesus.main=%distance% Blöcke bewegt in Wasser hover.antipotion.packet=Zuviele Pakete: %flying%\n(Normales Maximum mit niedrigen Ping: 20) hover.fasteat.packet=Zuviele Pakete: %flying%\n(Normales Maximum mit niedrigen Ping: 20) hover.fastplace.main=2 Blöcke platziert in: %time%ms\nEchte Spieler schaffen es in 150ms hover.speed.distance_ground=Abstand Letzte\Neue Position: %distance%\n(Mit gleichem Y und Spieler am Boden) -hover.speed.distance_jumping=Abstand Letzte\Neue Position: %distance%\n(Bei gleichem Y und springendem Spielerg) +hover.speed.distance_jumping=Abstand Letzte\Neue Position: %distance%\n(Bei gleichem Y und springendem Spieler) hover.autoclick.main=%click% Klicks hover.fly.boat=Auf Boat hover.fly.air_below=%nb% Luftblöcke unterhalb @@ -18,13 +18,13 @@ hover.antiknockback.main=Abstand nach schaden: %distance% hover.fastbow.main=Zeit zwischen letzten Schuss: %time%ms hover.fastbow.packet=Zuviele Pakete: %flying%\n(Normales Maximum mit niedrigen Ping: 20) hover.scaffold.main=Item in der Hand: %item%\n%block% Blöcke platziert -hover.step.main=%block% Blöcke nach oben Bewgt +hover.step.main=%block% Blöcke nach oben Bewegt hover.noslowdown.main=Abstand: %distance% hover.fastladder.main=%nb% Leitern unter ihm hover.autosteal.main=Zeit zwischen 2 Klicks: %time%ms hover.nuker.breaked_in=2 Blöcke zerstört in %time%ms hover.chat.main=Beleidigung: %msg% -hover.chat.spam=Gespammt %msg% %nb% times +hover.chat.spam=Gespammt %msg% %nb% mal hover.inventorymove.main=Auf %name% hover.faststairs.main=%distance% Blöcke auf Treppen bewegt -hover.xray.main=%name% baut %nb% mal ab \ No newline at end of file +hover.xray.main=%name% baut %nb% mal ab From 199c51156a7224063576f9792a9501ec4a04e7bb Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 29 Nov 2023 21:43:49 +0100 Subject: [PATCH 04/23] Fix #386 --- .../negativity/bungee/BungeeListeners.java | 2 +- ...58.negativity.universal.detections.Special | 1 + .../resources/modules/special/vpn-checker.yml | 18 +++++ .../negativity/common/special/VpnChecker.java | 67 +++++++++++++++++++ .../detections/keys/SpecialKeys.java | 1 + .../universal/utils/UniversalUtils.java | 2 +- 6 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 common/resources/modules/special/vpn-checker.yml create mode 100644 common/src/com/elikill58/negativity/common/special/VpnChecker.java diff --git a/bungee/src/com/elikill58/negativity/bungee/BungeeListeners.java b/bungee/src/com/elikill58/negativity/bungee/BungeeListeners.java index 89aebda49..0291b9de1 100644 --- a/bungee/src/com/elikill58/negativity/bungee/BungeeListeners.java +++ b/bungee/src/com/elikill58/negativity/bungee/BungeeListeners.java @@ -97,7 +97,7 @@ public void onPreLogin(net.md_5.bungee.api.event.LoginEvent e) { private String getReason(net.md_5.bungee.api.event.LoginEvent e) { BaseComponent[] comp = e.getCancelReasonComponents(); - if (comp == null || comp.length == 0) + if (comp == null || comp.length == 0 || comp[0] == null) return ""; return comp[0].toPlainText(); } diff --git a/common/resources/META-INF/services/com.elikill58.negativity.universal.detections.Special b/common/resources/META-INF/services/com.elikill58.negativity.universal.detections.Special index b836b019d..cd7b23ad7 100644 --- a/common/resources/META-INF/services/com.elikill58.negativity.universal.detections.Special +++ b/common/resources/META-INF/services/com.elikill58.negativity.universal.detections.Special @@ -4,4 +4,5 @@ com.elikill58.negativity.common.special.MaxPlayerPerIP com.elikill58.negativity.common.special.McLeaks com.elikill58.negativity.common.special.ServerCrasher com.elikill58.negativity.common.special.ToolboxChecker +com.elikill58.negativity.common.special.VpnChecker com.elikill58.negativity.common.special.WorldDownloader diff --git a/common/resources/modules/special/vpn-checker.yml b/common/resources/modules/special/vpn-checker.yml new file mode 100644 index 000000000..16c00b77a --- /dev/null +++ b/common/resources/modules/special/vpn-checker.yml @@ -0,0 +1,18 @@ +# Special detection + +# Limit player for each IP (dynamically) +active: true + +# The display name +name: "VPN Checker" + +message-reason: "Using VPN/Proxy is NOT allowed." +proxy: + kick: true + ban: false +vpn: + # Set empty for definitive ban + # Else, set the time in seconds + time: "3600" + kick: true + ban: false \ No newline at end of file diff --git a/common/src/com/elikill58/negativity/common/special/VpnChecker.java b/common/src/com/elikill58/negativity/common/special/VpnChecker.java new file mode 100644 index 000000000..226669708 --- /dev/null +++ b/common/src/com/elikill58/negativity/common/special/VpnChecker.java @@ -0,0 +1,67 @@ +package com.elikill58.negativity.common.special; + +import java.util.concurrent.CompletableFuture; + +import com.elikill58.negativity.api.entity.Player; +import com.elikill58.negativity.api.events.EventListener; +import com.elikill58.negativity.api.events.Listeners; +import com.elikill58.negativity.api.events.player.LoginEvent; +import com.elikill58.negativity.api.events.player.LoginEvent.Result; +import com.elikill58.negativity.api.item.Materials; +import com.elikill58.negativity.api.json.JSONObject; +import com.elikill58.negativity.api.json.parser.JSONParser; +import com.elikill58.negativity.api.json.parser.ParseException; +import com.elikill58.negativity.universal.Adapter; +import com.elikill58.negativity.universal.SanctionnerType; +import com.elikill58.negativity.universal.ban.Ban; +import com.elikill58.negativity.universal.ban.BanManager; +import com.elikill58.negativity.universal.detections.Special; +import com.elikill58.negativity.universal.detections.keys.SpecialKeys; +import com.elikill58.negativity.universal.logger.Debug; +import com.elikill58.negativity.universal.utils.UniversalUtils; + +public class VpnChecker extends Special implements Listeners { + + public VpnChecker() { + super(SpecialKeys.VPN_CHECKER, Materials.EYE_OF_ENDER); + } + + @EventListener + public void onLogin(LoginEvent e) { + if (!e.getLoginResult().equals(Result.ALLOWED) || !isActive()) // already kicked + return; + String ip = e.getAddress().getHostAddress(); + CompletableFuture.runAsync(() -> { + UniversalUtils.getContentFromURL("https://api.negativity.fr/ip/" + ip).ifPresent(result -> { + try { + JSONObject data = (JSONObject) new JSONParser().parse(result); + boolean proxy = UniversalUtils.getBoolean(data.get("proxy").toString()); + boolean vpn = UniversalUtils.getBoolean(data.get("vpn").toString()); + Adapter.getAdapter().debug(Debug.FEATURE, "IP data for " + ip + ": " + result +" > " + data.get("proxy").toString() + " : " + data.get("vpn").toString() + " >> " + proxy + " / " + vpn); + boolean shouldKick = false, shouldBan = false; + if (vpn) { + shouldKick = getConfig().getBoolean("vpn.kick", true); + shouldBan = getConfig().getBoolean("vpn.ban", false); + } + if (proxy) { + shouldKick = getConfig().getBoolean("proxy.kick", true) || shouldKick; + shouldBan = getConfig().getBoolean("proxy.ban", false) || shouldBan; + } + String reason = getConfig().getString("message-reason"); + if (shouldBan) { + String banTime = getConfig().getString("vpn.time"); + BanManager.executeBan(Ban.active(e.getUUID(), reason, "Negativity", SanctionnerType.CONSOLE, banTime == "" ? -1 : Integer.parseInt(banTime) * 1000, "VPN/Proxy", ip)); + } else if (shouldKick) { + e.setKickMessage(reason); + e.setLoginResult(Result.KICK_OTHER); + Player cible = Adapter.getAdapter().getPlayer(e.getUUID()); + if (cible != null) + cible.kick(reason); + } + } catch (ParseException e1) { + e1.printStackTrace(); + } + }); + }); + } +} diff --git a/common/src/com/elikill58/negativity/universal/detections/keys/SpecialKeys.java b/common/src/com/elikill58/negativity/universal/detections/keys/SpecialKeys.java index 1ee178adc..d948d595e 100644 --- a/common/src/com/elikill58/negativity/universal/detections/keys/SpecialKeys.java +++ b/common/src/com/elikill58/negativity/universal/detections/keys/SpecialKeys.java @@ -12,6 +12,7 @@ public enum SpecialKeys implements IDetectionKey { MC_LEAKS("MCLEAKS"), SERVER_CRASHER("SERVER-CRASHER"), TOOLBOX_CHECKER("TOOLBOX-CHECKER"), + VPN_CHECKER("VPN-CHECKER"), WORLD_DOWNLOADER("WORLD-DOWNLOADER"); diff --git a/common/src/com/elikill58/negativity/universal/utils/UniversalUtils.java b/common/src/com/elikill58/negativity/universal/utils/UniversalUtils.java index d5d7240bf..602c635a9 100644 --- a/common/src/com/elikill58/negativity/universal/utils/UniversalUtils.java +++ b/common/src/com/elikill58/negativity/universal/utils/UniversalUtils.java @@ -180,7 +180,7 @@ public static boolean isUUID(String s) { } public static boolean getBoolean(String s) { - return s.equalsIgnoreCase("true"); + return s.equalsIgnoreCase("true") || s.equals("1"); } public static Optional getContentFromURL(String url){ From 5a1c0790a228d5ee4b296d5a3ff62067a4826bbf Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 29 Nov 2023 21:55:25 +0100 Subject: [PATCH 05/23] Fix #418 --- common/resources/modules/chat.yml | 4 ++- .../negativity/common/protocols/Chat.java | 34 +++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/common/resources/modules/chat.yml b/common/resources/modules/chat.yml index c4d243e39..32d826c24 100644 --- a/common/resources/modules/chat.yml +++ b/common/resources/modules/chat.yml @@ -48,7 +48,9 @@ checks: insult: active: true lang: en + commands: true # Caps on message caps: active: true - percent: 80 \ No newline at end of file + percent: 80 + commands: true \ No newline at end of file diff --git a/common/src/com/elikill58/negativity/common/protocols/Chat.java b/common/src/com/elikill58/negativity/common/protocols/Chat.java index c9be07531..4e314e9eb 100644 --- a/common/src/com/elikill58/negativity/common/protocols/Chat.java +++ b/common/src/com/elikill58/negativity/common/protocols/Chat.java @@ -11,7 +11,11 @@ import com.elikill58.negativity.api.NegativityPlayer; import com.elikill58.negativity.api.entity.Player; +import com.elikill58.negativity.api.events.CancellableEvent; +import com.elikill58.negativity.api.events.EventListener; +import com.elikill58.negativity.api.events.Listeners; import com.elikill58.negativity.api.events.player.PlayerChatEvent; +import com.elikill58.negativity.api.events.player.PlayerCommandPreProcessEvent; import com.elikill58.negativity.api.item.Materials; import com.elikill58.negativity.api.protocols.Check; import com.elikill58.negativity.common.protocols.data.ChatData; @@ -23,7 +27,7 @@ import com.elikill58.negativity.universal.report.ReportType; import com.elikill58.negativity.universal.utils.UniversalUtils; -public class Chat extends Cheat { +public class Chat extends Cheat implements Listeners { private final List insults = new ArrayList<>(); @@ -85,8 +89,26 @@ public void onChatSpam(PlayerChatEvent e, NegativityPlayer np, ChatData data) { @Check(name = "insult", description = "Manage insult") public void onChatInsult(PlayerChatEvent e) { + checkInsult(e.getPlayer(), e, e.getMessage()); + } + + @Check(name = "caps", description = "Too many caps on same message") + public void onChatCaps(PlayerChatEvent e) { + checkCaps(e.getPlayer(), e, e.getMessage()); + } + + @EventListener + public void onCmd(PlayerCommandPreProcessEvent e) { Player p = e.getPlayer(); - String msg = e.getMessage(); + if(getConfig().getBoolean("checks.insult.commands", true) && !e.isCancelled() && checkActive("insult")) { + checkInsult(p, e, String.join(" ", e.getArgument())); + } + if(getConfig().getBoolean("checks.caps.commands", true) && !e.isCancelled() && checkActive("caps")) { + checkCaps(p, e, String.join(" ", e.getArgument())); + } + } + + private void checkInsult(Player p, CancellableEvent e, String msg) { final StringJoiner foundInsults = new StringJoiner(", "); for (String s : msg.toLowerCase(Locale.ENGLISH).split(" ")) { if (insults.contains(s)) @@ -100,11 +122,9 @@ public void onChatInsult(PlayerChatEvent e) { e.setCancelled(true); } } - - @Check(name = "caps", description = "Too many caps on same message") - public void onChatCaps(PlayerChatEvent e, NegativityPlayer np) { + + private void checkCaps(Player p, CancellableEvent e, String msg) { double upperCase = 0; - String msg = e.getMessage(); if(msg.length() < 5) return; // too low message for (int i = 0; i < msg.length(); i++) @@ -113,7 +133,7 @@ public void onChatCaps(PlayerChatEvent e, NegativityPlayer np) { double percent = upperCase / msg.length() * 100.0D; Adapter.getAdapter().debug(Debug.CHECK, "Message: " + msg + ", upper: " + upperCase + ", percent: " + percent); if(percent >= getConfig().getDouble("checks.caps.percent", 70)) { - if(Negativity.alertMod(ReportType.WARNING, e.getPlayer(), this, (int) percent, "caps", "Message: " + msg + ", percent: " + percent, new CheatHover.Literal("Caps message: " + msg + " (" + String.format("%.2f", percent) + "% caps)"), (long) (upperCase - 5)) && isSetBack()) { + if(Negativity.alertMod(ReportType.WARNING, p, this, (int) percent, "caps", "Message: " + msg + ", percent: " + percent, new CheatHover.Literal("Caps message: " + msg + " (" + String.format("%.2f", percent) + "% caps)"), (long) (upperCase - 5)) && isSetBack()) { e.setCancelled(true); } } From ab020f486886965b8de89d1687d9012f2dab4b96 Mon Sep 17 00:00:00 2001 From: Dave Date: Sun, 24 Dec 2023 01:05:18 +0700 Subject: [PATCH 06/23] Some untranslated strings (#422) --- .../negativity/CheatHover_id_ID.properties | 60 +-- .../NegativityProxy_id_ID.properties | 54 +-- .../negativity/Negativity_id_ID.properties | 368 +++++++++--------- 3 files changed, 241 insertions(+), 241 deletions(-) diff --git a/common/resources/assets/negativity/CheatHover_id_ID.properties b/common/resources/assets/negativity/CheatHover_id_ID.properties index 01a84fac0..ec673008a 100644 --- a/common/resources/assets/negativity/CheatHover_id_ID.properties +++ b/common/resources/assets/negativity/CheatHover_id_ID.properties @@ -1,30 +1,30 @@ -hover.forcefield.line_sight=Memukul %name% tanpa melihat -hover.forcefield.rotate=Berputar %degrees%° -hover.forcefield.fake_players=%nb% pemain palsu menyentuh dalam %time%ms -hover.jesus.main=Berpindah %distance% blok di dalam air -hover.antipotion.packet=Terlalu banyak paket: %flying%\n(Maximum normal dengan ping rendah: 20) -hover.fasteat.packet=Too many packets: %flying%\n(Maximum normal dengan ping rendah: 20) -hover.fastplace.main=2 blok placed in: %time%ms\nPemain asli melakukannya dalam 150ms -hover.speed.distance_ground=Jarak Ahkir/Baru posisi: %distance%\n(Dengan Y sama dan pemain melompat) -hover.speed.distance_jumping=Jarak Ahkir/Baru posisi: %distance%\n(Dengan Y sama dan pemain melompat) -hover.autoclick.main=%click% klik -hover.fly.boat=Dalam kapal -hover.fly.air_below=%nb% blok udara di bawah -hover.fly.boat_air_below=Di kapal, %nb% blok udara di bawah -hover.reach.distance=Jarak dengan %name%: %distance% blok -hover.regen.main=Waktu di antara dua: %time%ms -hover.regen.packet=Terlalu banyak paket: %flying%\n(Maximum normal dengan ping rendah: 20) -hover.antiknockback.main=Jarak setelah memukul: %distance% -hover.fastbow.main=Waktu antara tembakan terahkir: %time%ms -hover.fastbow.packet=Terlalu banyak paket: %flying%\n(Maximum normal dengan ping rendah: 20) -hover.scaffold.main=Benda di tangan: %item%\n%block% blok ditempatkan -hover.step.main=Memindahkan %block% blok ke atas -hover.noslowdown.main=Jarak: %distance% -hover.fastladder.main=%nb% tangga di bawah mereka -hover.autosteal.main=Waktu antara 2 klik: %time%ms -hover.nuker.breaked_in=2 blok di hancurkan dalam %time%ms -hover.chat.main=Penghinaan: %msg% -hover.chat.spam=Spam %msg% %nb% kali -hover.inventorymove.main=Di %name% -hover.faststairs.main=Berpindah %distance% blok melalui tangga -hover.xray.main=%name% menambang %nb% kali +hover.forcefield.line_sight=Memukul %name% tanpa melihat +hover.forcefield.rotate=Berputar %degrees%° +hover.forcefield.fake_players=%nb% pemain palsu menyentuh dalam %time%ms +hover.jesus.main=Berpindah %distance% blok di dalam air +hover.antipotion.packet=Terlalu banyak paket: %flying%\n(Maksimum normal dengan ping rendah: 20) +hover.fasteat.packet=Teralu banyak paket: %flying%\n(Maksimum normal dengan ping rendah: 20) +hover.fastplace.main=2 blok diletakan dalam: %time%ms\nPemain asli melakukannya dalam 150ms +hover.speed.distance_ground=Jarak Ahkir/Baru posisi: %distance%\n(Dengan Y sama dan pemain melompat) +hover.speed.distance_jumping=Jarak Ahkir/Baru posisi: %distance%\n(Dengan Y sama dan pemain melompat) +hover.autoclick.main=%click% klik +hover.fly.boat=Dalam kapal +hover.fly.air_below=%nb% blok udara di bawah +hover.fly.boat_air_below=Di kapal, %nb% blok udara di bawah +hover.reach.distance=Jarak dengan %name%: %distance% blok +hover.regen.main=Waktu di antara dua: %time%ms +hover.regen.packet=Terlalu banyak paket: %flying%\n(Maksimum normal dengan ping rendah: 20) +hover.antiknockback.main=Jarak setelah memukul: %distance% +hover.fastbow.main=Waktu antara tembakan terahkir: %time%ms +hover.fastbow.packet=Terlalu banyak paket: %flying%\n(Maksimum normal dengan ping rendah: 20) +hover.scaffold.main=Benda di tangan: %item%\n%block% blok ditempatkan +hover.step.main=Memindahkan %block% blok ke atas +hover.noslowdown.main=Jarak: %distance% +hover.fastladder.main=%nb% tangga di bawah mereka +hover.autosteal.main=Waktu antara 2 klik: %time%ms +hover.nuker.breaked_in=2 blok di hancurkan dalam %time%ms +hover.chat.main=Penghinaan: %msg% +hover.chat.spam=Spam %msg% %nb% kali +hover.inventorymove.main=Di %name% +hover.faststairs.main=Berpindah %distance% blok melalui tangga +hover.xray.main=%name% menambang %nb% kali \ No newline at end of file diff --git a/common/resources/assets/negativity/NegativityProxy_id_ID.properties b/common/resources/assets/negativity/NegativityProxy_id_ID.properties index b613f2a14..483dc0cc4 100644 --- a/common/resources/assets/negativity/NegativityProxy_id_ID.properties +++ b/common/resources/assets/negativity/NegativityProxy_id_ID.properties @@ -1,28 +1,28 @@ -lang.name=Bahasa Indonesia - -invalid_player=%arg% bukan pemain! -not_forget_player=Jangan melupakan pemain! -not_permission=&cAnda tidak memiliki akses untuk melakukan itu. -only_player=&cHanya pemain dapat menggunakan perintah ini -well_suspect=%players% telah tersangka! -none=tidak ada -console=Administrator - -alert=&a[&2Negativity&a] &c%name%&7 menggunakan &c%cheat% &7(&2Reliabilitas: %reliability%%&7! -alert_multiple=&a[&2Negativity&a] &c%name%&7 menggunakan &c%cheat% %nb% kali &7(&2Reliabilitas: %reliability%%&7)! -alert_hover=&6Reliabilitas: %reliability%\nPing: %ping%\n&7Server: %server_name% -alert_tp_info=&7Klik untuk teleportasi ke &o%playername% -report=&a[&2Negativity&a] &c%name% &7telah dilapor oleh &c%report% &7untuk &c%reason% -report_hover=&7Klik untuk teleportasi ke &c%playername% - -ban.kick_time=&cBan untuk %reason% hingga %time% oleh %by%. -ban.kick_def=&cBan selamanya untuk %reason% oleh %by%. - -negativity.reload_done=&a[&2Negativity&a] Plugin dimuat ulang. - -messages_update.backup_failed=&cGagal untuk menyadangkan pesan: %error% -messages_update.update_done=&ePesan telah diperbarui dan dimuat ulang -messages_update.new.message=&6A new version of Negativity is available: &e%version%&6. &7Download it here. -messages_update.new.hover=&7Click to open spigotmc - +lang.name=Bahasa Indonesia + +invalid_player=%arg% bukan pemain! +not_forget_player=Jangan melupakan pemain! +not_permission=&cAnda tidak memiliki akses untuk melakukan itu. +only_player=&cHanya pemain dapat menggunakan perintah ini +well_suspect=%players% telah tersangka! +none=tidak ada +console=Administrator + +alert=&a[&2Negativity&a] &c%name%&7 menggunakan &c%cheat% &7(&2Reliabilitas: %reliability%%&7! +alert_multiple=&a[&2Negativity&a] &c%name%&7 menggunakan &c%cheat% %nb% kali &7(&2Reliabilitas: %reliability%%&7)! +alert_hover=&6Reliabilitas: %reliability%\nPing: %ping%\n&7Server: %server_name% +alert_tp_info=&7Klik untuk teleportasi ke &o%playername% +report=&a[&2Negativity&a] &c%name% &7telah dilapor oleh &c%report% &7untuk &c%reason% +report_hover=&7Klik untuk teleportasi ke &c%playername% + +ban.kick_time=&cBan untuk %reason% hingga %time% oleh %by%. +ban.kick_def=&cBan selamanya untuk %reason% oleh %by%. + +negativity.reload_done=&a[&2Negativity&a] Plugin dimuat ulang. + +messages_update.backup_failed=&cGagal untuk menyadangkan pesan: %error% +messages_update.update_done=&ePesan telah diperbarui dan dimuat ulang +messages_update.new.message=&6Versi baru Negativity tersedia: &e%version%&6. &7Unduh di sini. +messages_update.new.hover=&7Klik untuk membuka SpigotMC + kick.kicked=Anda telah ditendang oleh %name% untuk %reason% \ No newline at end of file diff --git a/common/resources/assets/negativity/Negativity_id_ID.properties b/common/resources/assets/negativity/Negativity_id_ID.properties index 50501c1c8..bbcd8eeab 100644 --- a/common/resources/assets/negativity/Negativity_id_ID.properties +++ b/common/resources/assets/negativity/Negativity_id_ID.properties @@ -1,184 +1,184 @@ -prefix=&a[&2Negativity&a] - -report_wait=Mohon, menunggu satu detik antara 2 laporan - -invalid_player=%arg% bukan pemain! -not_forget_player=Jangan lupakan pemain! -not_permission=&cAnda tidak memiliki akses untuk melakukan itu. -only_player=&cHanya pemain dapat menggunakan perintah ini -none=Tidak ada -console=Administrator -fake_entities=Pemain palsu - -lang.name=Indonesia -lang.invalid_lang=%arg% bukan bahasa sah! -lang.help=&e/nlang &r: Ganti bahasamu -lang.current=Bahasa saat ini adalah %lang% -lang.edit=Ubah bahasa bawaan -lang.language_set=%prefix% &7Pesan dari Negativity sekarang dalam bahasa Indonesia -lang.translation_disabled=%prefix% &cTranslasi per pemain dinonaktifkan - -ban.kick_time=&cBan untuk %reason% sampai %time% oleh %by%. -ban.kick_def=&cBan selamanya untuk %reason% oleh %by%. -ban.help=&e/nban &r: Ban pemain spesifik -ban.well_ban=%prefix%&c %name% diban untuk %reason%. -ban.fail_ban=%prefix%&c Gagal untuk ban %name% : %reason%. -ban.not_active=%prefix% &cAnda tidak mengaktifkan fitur ban. -ban.list.none=%prefix% &aBan aktif apapun. -ban.list.header=&7&m-------&r &aBan aktif&7(&6%mulai% &7ke &6%ahkir% &7di &6%maksimum%&7) &m------- -ban.list.line=%number%) %name% &7oleh &a%by% &7untuk &c%reason% - -unban.well_unban=%prefix%&c Ban untuk %name% telah dibatalkan. -unban.fail_unban=%prefix%&c Gagal untuk membatalkan ban %name% : %reason%. -unban.not_banned=&c%name% tidak di ban. -unban.not_exact=%arg% bukan nama pemain spesifik. -unban.help=&e/nunban &r: Unban pemain spesifik - -kick.help=&e/nkick &r: Tendang pemain spesifik -kick.well_kick=%prefix%&c %name% ditendang untuk %reason%. -kick.kicked=Anda telah ditendang oleh %name% untuk %reason% -kick.neg_kick=%prefix%&c Anda telah ditendang dari server untuk curang (%cheat%) -report.help=&e/nreport &r: Melapor pemain dengan alasan -report.well_report=&a%name% berhasil dilaporkan ! -report.report_message=%prefix% &c%name% &7telah dilapor oleh &c%report% &7untuk &c%reason% -report.report_message_hover=&7Buka &c%name%&7 menu cek - -warn.help=&e/nwarn &r:Warn the specified player -warn.done=%prefix% &c%name% have been warned for %reason%. -warn.failed=%prefix% &cFailed to warn %name%: %reason%. -warn.warned=&7&m----&4 WARNED &7&m----\n&cWarn by: &l%warned_by%\n&cReason: &l%reason% - -negativity.alert=%prefix% &c%name%&7 menggunakan &c%cheat% &7(&2Reliabilitas: %reliability%%&7)! -negativity.alert_multiple=%prefix% &c%name%&7 menggunakan &c%cheat% %nb% kali &7(&2Reliabilitas: %reliability%%&7)! -negativity.alert_hover=&6Reliabilitas: %reliability%%\nPing: %ping% -negativity.cleared=Semua peringatan untuk %name% telah diatur ulang. -negativity.see_alert=%prefix% Anda akan melihat peringatan lagi. -negativity.see_no_longer_alert=%prefix% Anda tidak lagi melihat peringatan. -negativity.reload_done=%prefix% Termuat ulang. -negativity.verif.invalid_cheat=%arg% bukan curang yang ada! -negativity.verif.start=%prefix% &7Memulai analisis %name% untuk %cheat% selama %time% detik -negativity.verif.start_all=%prefix% Memulai analisis penuh untuk pemain %name% selama %time% detik -negativity.verif.start_none=%prefix% &cTidak dapat memulai analisis karena tidak ada curang ada diberikan -negativity.verif.help=&e/negativity verif [curang...] &r: Memulai verifikasi (semua jika tidak diberikan) -negativity.help.header=&7&m-------- &a[&2Negativity &6%page%&a/&6%max% &a] &7&m-------- -negativity.help=&e/negativity &r: Memunculkan menu informasi pemain -negativity.alert.help=&e/negativity alert &r: Beralih menerima peringatan (hanya untuk Anda) -negativity.reload.help=&e/negativity reload &r: Memuat ulang configurasi -negativity.mod.help=&e/negativity mod &r: Membuka menu moderasi, alias dari /mod dan /nmod -negativity.clear.help=&e/negativity clear &r: Clears the specified player's cheat warnings -negativity.admin.help=&e/negativity admin &r: Membuka menu admin -negativity.webhook.help=&e/negativity webhook &r: Ping semua webhook yang telah dikonfigurasi untuk menguji jika mereka telah diatur dengan benar -negativity.debug.help=&e/negativity debug [pemain] &r: Membantu memecahkan masalah dengan yang melewati/deteksi salah -negativity.chat.clear.help=&e/nclearchat &r: Menghapus obrolan untuk semua pemain online. -negativity.chat.cleared=%prefix% &aAnda telah menghapus obrolan &6%amount% &aplayer(s) -negativity.chat.cleared_broadcast=%prefix% &6%name% &ahapus obrolan. -negativity.chat.lock.help=&e/nlockchat &r: Kunci/Membuka kunci obrolan -negativity.chat.locked=%prefix% &cObrolan telah dikunci oleh &6%name%&c. -negativity.chat.unlocked=%prefix% &cObrolan tidak lagi terkunci oleh &6%name%&c. -negativity.chat.cant=%prefix% &cObrolan sedang terkunci. - -messages_update.backup_failed=&cGagal untuk menyadangkan pesan: %error% -messages_update.update_done=&ePesan telah diperbarui and diatur ulang -messages_update.new.message=&6A new version of Negativity is available: &e%version%&6. &7Download it here. -messages_update.new.hover=&7Click to open spigotmc - -inventory.page=Page %id% -inventory.close=Tutup -inventory.back=Kembali -inventory.skull.name=%name% -inventory.skull.lore=&6UUID: %uuid%\n&aVersion: %version%\n&aPlatform: %platform%\n\n&7Launcher: %launcher%\n&7Forge: %forge% -inventory.skull_offline.name=%name% -inventory.skull_offline.lore=&6UUID: %uuid%\n&cOffline -inventory.bans.manage=Mengelola configurasi ban -inventory.bans.select=Terpilih: %name% -inventory.bans.state.name=Ban -inventory.bans.state.lore=&aKeadaan: %enabled%\n&7Otomatis: %auto%\n&7Reliabilitas: &6%reliability_amount%\n&7Peringatan: &6%alert_amount%\n\n&7Prosesor: &6%processor% -inventory.bans.on.name=Ban -inventory.bans.on.lore=&aFitur ban Negativity telah diaktifkan. -inventory.bans.off.name=Ban -inventory.bans.off.lore=&cFitur ban Negativity telah dinonaktifkan. -inventory.bans.processor.name=Prosesor -inventory.bans.processor.lore=&7Pilih antara prosesor yang tersedia -inventory.bans.command.ban.name=Perintah ban -inventory.bans.command.ban.lore=&7Mengaktifkan/menonaktifkan perintah ban\n\n&cMemerlukan server dimuat ulang -inventory.bans.command.unban.name=Perintah unban -inventory.bans.command.unban.lore=&7Mengaktifkan/menonaktifkan perintah unban\n\n&cMemerlukan server dimuat ulang -inventory.bans.alerts.name=Peringatan: %amount% -inventory.bans.alerts.lore=&7Peringatan dibutuhkan untuk ban otomatis.\n\n&aKlik kanan: -1\n&cKlick kiri: +1 -inventory.bans.reliability.name=Reliabilitas: %amount% -inventory.bans.reliability.lore=&7Reliabilitas diperlukan untuk ban.\n\n&aKlik kanan: -1\n&cKlik kiri: +1 -inventory.bans.auto.on.name=Ban otomatis -inventory.bans.auto.on.lore=&aBan otomatis telah diaktifkan -inventory.bans.auto.off.name=Ban otomatis -inventory.bans.auto.off.lore=&cBan otomatis telah dinonaktifkan -inventory.reset_alert=Hapus peringatan -inventory.main.freeze=%prefix% Anda sedang dibekukan oleh %name% -inventory.main.unfreeze=%prefix% Anda tidak lagi dibekukan oleh %name% -inventory.main.actual_click=Klik sebenarnya : %clicks% -inventory.main.clicks.name=&6Click informations -inventory.main.clicks.lore=&6Last second : %last_clicks%\n&6Max clicks : %max_clicks% -inventory.main.ping=Ping oleh %name%: %ping% -inventory.main.see_inv=Melihat inventaris %name% -inventory.main.teleportation_to=Teleportasi ke %name% -inventory.main.freezing=Bekukan %name% -inventory.main.unfreezing=Mencairkan %name% -inventory.main.active_detection=Lihat deteksi aktif untuk %name% -inventory.main.active_report=Lihat laporan untuk %name% -inventory.main.active_warn=See warns of %name% -inventory.main.see_alerts=Lihat semua peringatan untuk %name% -inventory.main.see_proofs=See proofs of %name% -inventory.main.mcleaks_indicator.positive=&cMenggunakan MCLeaks -inventory.main.mcleaks_indicator.negative=&aTidak menggunakan MCLeaks -inventory.main.mcleaks_indicator.description=&7MCLeaks memberikan akun premium gratis -inventory.detection.name_inv=Deteksi aktif -inventory.detection.no_active=Tidak ada deteksi aktif untuk %name% -inventory.alerts.item_name=Peringatan untuk %exact_name% : %warn% -inventory.alerts.inv_name=Peringatan -inventory.alerts.shower.manage=Ketika peringatan ditunjukan -inventory.alerts.shower.instant=Tampilkan secara instan -inventory.alerts.shower.time=Tampilkan setiap X detik -inventory.alerts.shower.amount=Tampilkan setiap X peringatan -inventory.mod.night_vision=Penglihatan malam -inventory.mod.invisible=Jadi tidak terlihat -inventory.mod.random_tp=Teleportasi acak -inventory.mod.random_tp_no_target=Hanya Anda pemain yang online. -inventory.mod.clear_inv=Bersihkan inventarismu -inventory.mod.inv_cleared=Inventaris dibersihkan! -inventory.mod.vision_removed=Penglihatan malam dinonaktifkan -inventory.mod.vision_added=Penglihatan malam diaktifkan -inventory.mod.now_invisible=Sekarang, Anda tidak terlihat -inventory.mod.no_longer_invisible=Sekarang, semua dapat melihat Anda -inventory.mod.you_are_freeze=Anda dibekukan. Anda tidak meninggalkan inventaris. -inventory.mod.cheat_manage=Manajer curang -inventory.mod.healed=Tersembuhkan -inventory.mod.heal=Sembuhkan -inventory.mod.fly_changed=Keadaan terbang berubah: %state% -inventory.mod.fly=Terbang: %state% -inventory.mod.special_manage=Mengelola deteksi spesial -inventory.manager.enabled=&aNyala -inventory.manager.disabled=&cMati -inventory.manager.setBack.name=Membalikan: &l%state% -inventory.manager.setBack.lore=&7Membatalkan tindakan terahkir saat curang terdeteksi -inventory.manager.allowKick=Tendang pemain curang: &l%allow% -inventory.manager.setActive=Curang aktif: &l%active% -inventory.manager.verif=Cek di verifikasi: &l%verif% -inventory.warns.manage=Manage warns config -inventory.warns.select=Selected: %name% -inventory.warns.clear.name=Clear warns of %name% -inventory.warns.clear.lore=&7Click to clear all warns -inventory.warns.state.name=Warns -inventory.warns.state.lore=&aState: %enabled%\n\n&7Processor: &6%processor% -inventory.warns.on.name=Warns -inventory.warns.on.lore=&aWarn feature by Negativity is enabled. -inventory.warns.off.name=Warns -inventory.warns.off.lore=&cWarn feature by Negativity is disabled. -inventory.warns.processor.name=Processor -inventory.warns.processor.lore=&7Choose between all processors available -inventory.warns.command.warn.name=Warn command -inventory.warns.command.warn.lore=&7Enable/Disable warn command\n\n&cRequire a server restart -inventory.warns.show.active.name=&6Warn #%id% -inventory.warns.show.active.lore=&7Reason: &6%reason%\n&7Warn by: &6%warned_by%\n&7Date: &6%execution%\n\n&7Click to revoke -inventory.warns.show.revoked.name=&6Warn #%id% &7(Revoked) -inventory.warns.show.revoked.lore=&7Reason: &6%reason%\n&7Warn by: &6%warned_by%\n&7Date: &6%execution%\n\n&aRevoked by: %revoked_by%\n&aRevoked date: %revoked_date% -inventory.proof.item.name=&6%amount%x %cheat% (%reliability%%) &9- &7%date% -inventory.proof.item.lore=&7Ping: %ping%ms\n&7Type: %report_type%\n&7Check: %check_name%\n\n&7Player version: %player_version% \ No newline at end of file +prefix=&a[&2Negativity&a] + +report_wait=Mohon menunggu satu detik antara 2 laporan + +invalid_player=%arg% bukan pemain! +not_forget_player=Jangan lupakan pemain! +not_permission=&cAnda tidak memiliki akses untuk melakukan itu. +only_player=&cHanya pemain dapat menggunakan perintah ini +none=Tidak ada +console=Administrator +fake_entities=Pemain palsu + +lang.name=Indonesia +lang.invalid_lang=%arg% bukan bahasa sah! +lang.help=&e/nlang &r: Ganti bahasamu +lang.current=Bahasa saat ini adalah %lang% +lang.edit=Ubah bahasa bawaan +lang.language_set=%prefix% &7Pesan dari Negativity sekarang dalam bahasa Indonesia +lang.translation_disabled=%prefix% &cTranslasi per pemain dinonaktifkan + +ban.kick_time=&cBan untuk %reason% sampai %time% oleh %by%. +ban.kick_def=&cBan selamanya untuk %reason% oleh %by%. +ban.help=&e/nban &r: Ban pemain spesifik +ban.well_ban=%prefix%&c %name% diban untuk %reason%. +ban.fail_ban=%prefix%&c Gagal untuk ban %name%: %reason%. +ban.not_active=%prefix% &cAnda tidak mengaktifkan fitur ban. +ban.list.none=%prefix% &aBan aktif apapun. +ban.list.header=&7&m-------&r &aBan aktif&7(&6%mulai% &7ke &6%ahkir% &7di &6%maksimum%&7) &m------- +ban.list.line=%number%) %name% &7oleh &a%by% &7untuk &c%reason% + +unban.well_unban=%prefix%&c Ban untuk %name% telah dibatalkan. +unban.fail_unban=%prefix%&c Gagal untuk membatalkan ban %name%: %reason%. +unban.not_banned=&c%name% tidak di ban. +unban.not_exact=%arg% bukan nama pemain spesifik. +unban.help=&e/nunban &r: Unban pemain spesifik + +kick.help=&e/nkick &r: Tendang pemain spesifik +kick.well_kick=%prefix%&c %name% ditendang untuk %reason%. +kick.kicked=Anda telah ditendang oleh %name% untuk %reason% +kick.neg_kick=%prefix%&c Anda telah ditendang dari server untuk curang (%cheat%) +report.help=&e/nreport &r: Melapor pemain dengan alasan +report.well_report=&a%name% berhasil dilaporkan ! +report.report_message=%prefix% &c%name% &7telah dilapor oleh &c%report% &7untuk &c%reason% +report.report_message_hover=&7Buka &c%name%&7 menu cek + +warn.help=&e/nwarn &r:Warn the specified player +warn.done=%prefix% &c%name% have been warned for %reason%. +warn.failed=%prefix% &cFailed to warn %name%: %reason%. +warn.warned=&7&m----&4 WARNED &7&m----\n&cWarn by: &l%warned_by%\n&cReason: &l%reason% + +negativity.alert=%prefix% &c%name%&7 menggunakan &c%cheat% &7(&2Reliabilitas: %reliability%%&7)! +negativity.alert_multiple=%prefix% &c%name%&7 menggunakan &c%cheat% %nb% kali &7(&2Reliabilitas: %reliability%%&7)! +negativity.alert_hover=&6Reliabilitas: %reliability%%\nPing: %ping% +negativity.cleared=Semua peringatan untuk %name% telah diatur ulang. +negativity.see_alert=%prefix% Anda akan melihat peringatan lagi. +negativity.see_no_longer_alert=%prefix% Anda tidak lagi melihat peringatan. +negativity.reload_done=%prefix% Termuat ulang. +negativity.verif.invalid_cheat=%arg% bukan curang yang ada! +negativity.verif.start=%prefix% &7Memulai analisis %name% untuk %cheat% selama %time% detik +negativity.verif.start_all=%prefix% Memulai analisis penuh untuk pemain %name% selama %time% detik +negativity.verif.start_none=%prefix% &cTidak dapat memulai analisis karena tidak ada curang ada diberikan +negativity.verif.help=&e/negativity verif [curang...] &r: Memulai verifikasi (semua jika tidak diberikan) +negativity.help.header=&7&m-------- &a[&2Negativity &6%page%&a/&6%max% &a] &7&m-------- +negativity.help=&e/negativity &r: Memunculkan menu informasi pemain +negativity.alert.help=&e/negativity alert &r: Beralih menerima peringatan (hanya untuk Anda) +negativity.reload.help=&e/negativity reload &r: Memuat ulang configurasi +negativity.mod.help=&e/negativity mod &r: Membuka menu moderasi, alias dari /mod dan /nmod +negativity.clear.help=&e/negativity clear &r: Clears the specified player's cheat warnings +negativity.admin.help=&e/negativity admin &r: Membuka menu admin +negativity.webhook.help=&e/negativity webhook &r: Ping semua webhook yang telah dikonfigurasi untuk menguji jika mereka telah diatur dengan benar +negativity.debug.help=&e/negativity debug [pemain] &r: Membantu memecahkan masalah dengan yang melewati/deteksi salah +negativity.chat.clear.help=&e/nclearchat &r: Menghapus obrolan untuk semua pemain online. +negativity.chat.cleared=%prefix% &aAnda telah menghapus obrolan &6%amount% &aplayer(s) +negativity.chat.cleared_broadcast=%prefix% &6%name% &ahapus obrolan. +negativity.chat.lock.help=&e/nlockchat &r: Kunci/Membuka kunci obrolan +negativity.chat.locked=%prefix% &cObrolan telah dikunci oleh &6%name%&c. +negativity.chat.unlocked=%prefix% &cObrolan tidak lagi terkunci oleh &6%name%&c. +negativity.chat.cant=%prefix% &cObrolan sedang terkunci. + +messages_update.backup_failed=&cGagal untuk menyadangkan pesan: %error% +messages_update.update_done=&ePesan telah diperbarui and diatur ulang +messages_update.new.message=&6A new version of Negativity is available: &e%version%&6. &7Download it here. +messages_update.new.hover=&7Click to open spigotmc + +inventory.page=Page %id% +inventory.close=Tutup +inventory.back=Kembali +inventory.skull.name=%name% +inventory.skull.lore=&6UUID: %uuid%\n&aVersi: %version%\n&aPlatform: %platform%\n\n&7Peluncur: %launcher%\n&7Forge: %forge% +inventory.skull_offline.name=%name% +inventory.skull_offline.lore=&6UUID: %uuid%\n&cLuring +inventory.bans.manage=Mengelola konfigurasi ban +inventory.bans.select=Terpilih: %name% +inventory.bans.state.name=Ban +inventory.bans.state.lore=&aKeadaan: %enabled%\n&7Otomatis: %auto%\n&7Reliabilitas: &6%reliability_amount%\n&7Peringatan: &6%alert_amount%\n\n&7Prosesor: &6%processor% +inventory.bans.on.name=Ban +inventory.bans.on.lore=&aFitur ban Negativity telah diaktifkan. +inventory.bans.off.name=Ban +inventory.bans.off.lore=&cFitur ban Negativity telah dinonaktifkan. +inventory.bans.processor.name=Prosesor +inventory.bans.processor.lore=&7Pilih antara prosesor yang tersedia +inventory.bans.command.ban.name=Perintah ban +inventory.bans.command.ban.lore=&7Mengaktifkan/menonaktifkan perintah ban\n\n&cMemerlukan server dimuat ulang +inventory.bans.command.unban.name=Perintah unban +inventory.bans.command.unban.lore=&7Mengaktifkan/menonaktifkan perintah unban\n\n&cMemerlukan server dimuat ulang +inventory.bans.alerts.name=Peringatan: %amount% +inventory.bans.alerts.lore=&7Peringatan dibutuhkan untuk ban otomatis.\n\n&aKlik kanan: -1\n&cKlick kiri: +1 +inventory.bans.reliability.name=Reliabilitas: %amount% +inventory.bans.reliability.lore=&7Reliabilitas diperlukan untuk ban.\n\n&aKlik kanan: -1\n&cKlik kiri: +1 +inventory.bans.auto.on.name=Ban otomatis +inventory.bans.auto.on.lore=&aBan otomatis telah diaktifkan +inventory.bans.auto.off.name=Ban otomatis +inventory.bans.auto.off.lore=&cBan otomatis telah dinonaktifkan +inventory.reset_alert=Hapus peringatan +inventory.main.freeze=%prefix% Anda sedang dibekukan oleh %name% +inventory.main.unfreeze=%prefix% Anda tidak lagi dibekukan oleh %name% +inventory.main.actual_click=Klik sebenarnya: %clicks% +inventory.main.clicks.name=&6Informasi klik +inventory.main.clicks.lore=&6Detik terahkir: %last_clicks%\n&6Klik maksimum: %max_clicks% +inventory.main.ping=Ping oleh %name%: %ping% +inventory.main.see_inv=Melihat inventaris %name% +inventory.main.teleportation_to=Teleportasi ke %name% +inventory.main.freezing=Bekukan %name% +inventory.main.unfreezing=Mencairkan %name% +inventory.main.active_detection=Lihat deteksi aktif untuk %name% +inventory.main.active_report=Lihat laporan untuk %name% +inventory.main.active_warn=See warns of %name% +inventory.main.see_alerts=Lihat semua peringatan untuk %name% +inventory.main.see_proofs=See proofs of %name% +inventory.main.mcleaks_indicator.positive=&cMenggunakan MCLeaks +inventory.main.mcleaks_indicator.negative=&aTidak menggunakan MCLeaks +inventory.main.mcleaks_indicator.description=&7MCLeaks memberikan akun premium gratis +inventory.detection.name_inv=Deteksi aktif +inventory.detection.no_active=Tidak ada deteksi aktif untuk %name% +inventory.alerts.item_name=Peringatan untuk %exact_name%: %warn% +inventory.alerts.inv_name=Peringatan +inventory.alerts.shower.manage=Ketika peringatan ditunjukan +inventory.alerts.shower.instant=Tampilkan secara instan +inventory.alerts.shower.time=Tampilkan setiap X detik +inventory.alerts.shower.amount=Tampilkan setiap X peringatan +inventory.mod.night_vision=Penglihatan malam +inventory.mod.invisible=Jadi tidak terlihat +inventory.mod.random_tp=Teleportasi acak +inventory.mod.random_tp_no_target=Hanya Anda pemain yang online. +inventory.mod.clear_inv=Bersihkan inventarismu +inventory.mod.inv_cleared=Inventaris dibersihkan! +inventory.mod.vision_removed=Penglihatan malam dinonaktifkan +inventory.mod.vision_added=Penglihatan malam diaktifkan +inventory.mod.now_invisible=Sekarang, Anda tidak terlihat +inventory.mod.no_longer_invisible=Sekarang, semua dapat melihat Anda +inventory.mod.you_are_freeze=Anda dibekukan. Anda tidak meninggalkan inventaris. +inventory.mod.cheat_manage=Manajer curang +inventory.mod.healed=Tersembuhkan +inventory.mod.heal=Sembuhkan +inventory.mod.fly_changed=Keadaan terbang berubah: %state% +inventory.mod.fly=Terbang: %state% +inventory.mod.special_manage=Mengelola deteksi spesial +inventory.manager.enabled=&aNyala +inventory.manager.disabled=&cMati +inventory.manager.setBack.name=Membalikan: &l%state% +inventory.manager.setBack.lore=&7Membatalkan tindakan terahkir saat curang terdeteksi +inventory.manager.allowKick=Tendang pemain curang: &l%allow% +inventory.manager.setActive=Curang aktif: &l%active% +inventory.manager.verif=Cek saat verifikasi: &l%verif% +inventory.warns.manage=Manage warns config +inventory.warns.select=Selected: %name% +inventory.warns.clear.name=Clear warns of %name% +inventory.warns.clear.lore=&7Klik untuk membersihkan semua peringatan +inventory.warns.state.name=Peringatan +inventory.warns.state.lore=&aKeadaan:: %enabled%\n\n&7Prosesor: &6%processor% +inventory.warns.on.name=Peringatan +inventory.warns.on.lore=&aFitur peringatan Negativity diaktifkan. +inventory.warns.off.name=Peringatan +inventory.warns.off.lore=&cFitur peringatan Negativity dinonaktifkan. +inventory.warns.processor.name=Prosesor +inventory.warns.processor.lore=&7Pilih antara semua prosesor yang tersedia +inventory.warns.command.warn.name=Perintah peringatan +inventory.warns.command.warn.lore=&7Aktifkan/Nonaktifkan perintah peringatan\n\n&cMemerlukan muat ulang server +inventory.warns.show.active.name=&6Peringatan #%id% +inventory.warns.show.active.lore=&7Alasan: &6%reason%\n&7Peringatan oleh: &6%warned_by%\n&7Date: &6%execution%\n\n&7Klik untuk cabut +inventory.warns.show.revoked.name=&6Peringatan #%id% &7(Dicabut) +inventory.warns.show.revoked.lore=&7Alasan: &6%reason%\n&7Peringatan oleh: &6%warned_by%\n&7Tanggal: &6%execution%\n\n&aDicabut oleh: %revoked_by%\n&aTanggal dicabut: %revoked_date% +inventory.proof.item.name=&6%amount%x %cheat% (%reliability%%) &9- &7%date% +inventory.proof.item.lore=&7Ping: %ping%ms\n&7Jenis: %report_type%\n&7Cek: %check_name%\n\n&7Versi pemain: %player_version% \ No newline at end of file From 73a7960ef6f98a2023768652b72bb6c6a33ba6b1 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Sat, 23 Dec 2023 20:56:54 +0100 Subject: [PATCH 07/23] Add 1.20.4 support --- .../negativity/api/packets/PacketType.java | 5 ++ .../packets/nms/versions/Version1_20_4.java | 69 +++++++++++++++++++ .../negativity/universal/Version.java | 4 +- .../spigot/nms/SpigotVersionAdapter.java | 3 + .../negativity/spigot/nms/Spigot_1_20_R3.java | 15 ++++ .../spigot/nms/Spigot_UnknowVersion.java | 3 +- 6 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_4.java create mode 100644 spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java diff --git a/common/src/com/elikill58/negativity/api/packets/PacketType.java b/common/src/com/elikill58/negativity/api/packets/PacketType.java index 7469c4a67..536ff1852 100644 --- a/common/src/com/elikill58/negativity/api/packets/PacketType.java +++ b/common/src/com/elikill58/negativity/api/packets/PacketType.java @@ -211,6 +211,7 @@ enum Client implements PacketType { SET_JIGSAW, SETTINGS(NPacketPlayInSettings::new), SPECTATE, + SLOT_STATE_CHANGE, STEER_VEHICLE(NPacketPlayInSteerVehicle::new), STRUCT, TAB_COMPLETE, @@ -345,10 +346,12 @@ enum Server implements PacketType { REL_ENTITY_MOVE(NPacketPlayOutRelEntityMove::new), REL_ENTITY_MOVE_LOOK(NPacketPlayOutRelEntityMoveLook::new), REMOVE_ENTITY_EFFECT, + RESOURCE_PACK_POP, RESOURCE_PACK_SEND, RESPAWN, SCOREBOARD_DISPLAY_OBJECTIVE, SCOREBOARD_OBJECTIVE, + SCOREBOARD_RESET, SCOREBOARD_SCORE, SCOREBOARD_TEAM, SERVER_DATA, @@ -381,6 +384,8 @@ enum Server implements PacketType { SYSTEM_CHAT, TAB_COMPLETE, TAGS, + TICKING_STATE, + TICKING_STEP, TILE_ENTITY_DATA, TITLE, PING(NPacketPlayOutPing::new), diff --git a/common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_4.java b/common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_4.java new file mode 100644 index 000000000..fb21ca719 --- /dev/null +++ b/common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_4.java @@ -0,0 +1,69 @@ +package com.elikill58.negativity.api.packets.nms.versions; + +import java.util.Arrays; + +import com.elikill58.negativity.api.entity.EntityType; +import com.elikill58.negativity.api.packets.PacketType.Client; +import com.elikill58.negativity.api.packets.PacketType.Server; +import com.elikill58.negativity.api.packets.nms.NamedVersion; + +public class Version1_20_4 extends NamedVersion { + + public Version1_20_4() { + super("1.20.4"); + // packets ID seems not same as 1.20 + int i = 0; + for (Client type : Arrays.asList(Client.TELEPORT_ACCEPT, Client.TILE_NBT_QUERY, Client.DIFFICULTY_CHANGE, Client.CHAT_ACK, Client.CHAT_COMMAND, Client.CHAT, + Client.CHAT_SESSION_UPDATE, Client.CHUNK_BATCH_RECEIVED, Client.CLIENT_COMMAND, Client.SETTINGS, Client.TAB_COMPLETE, Client.CONFIGURATION_ACKNOWLEDGED, Client.ENCHANT_ITEM, + Client.WINDOW_CLICK, Client.CLOSE_WINDOW, Client.SLOT_STATE_CHANGE, Client.CUSTOM_PAYLOAD, Client.BEDIT, Client.ENTITY_NBT_QUERY, Client.USE_ENTITY, Client.JIGSAW_GENERATE, + Client.KEEP_ALIVE, Client.DIFFICULTY_LOCK, Client.POSITION, Client.POSITION_LOOK, Client.LOOK, Client.GROUND, Client.VEHICLE_MOVE, Client.BOAT_MOVE, Client.PICK_ITEM, + Client.PING, Client.AUTO_RECIPE, Client.ABILITIES, Client.BLOCK_DIG, Client.ENTITY_ACTION, Client.STEER_VEHICLE, Client.PONG, Client.RECIPE_SETTINGS, Client.RECIPE_DISPLAYED, + Client.ITEM_NAME, Client.RESOURCE_PACK_STATUS, Client.ADVANCEMENTS, Client.TR_SEL, Client.BEACON, Client.HELD_ITEM_SLOT, Client.SET_COMMAND_BLOCK, + Client.SET_COMMAND_MINECART, Client.SET_CREATIVE_SLOT, Client.SET_JIGSAW, Client.STRUCT, Client.UPDATE_SIGN, Client.ARM_ANIMATION, Client.SPECTATE, Client.BLOCK_PLACE, + Client.USE_ITEM)) { + playIn.put(i++, type); + } + i = 0; + for (Server type : Arrays.asList(Server.BUNDLE, Server.SPAWN_ENTITY, Server.SPAWN_ENTITY_EXPERIENCE_ORB, Server.ANIMATION, Server.STATISTIC, Server.BLOCK_CHANGED_ACK, + Server.BLOCK_BREAK_ANIMATION, Server.TILE_ENTITY_DATA, Server.BLOCK_ACTION, Server.BLOCK_CHANGE, Server.BOSS, Server.SERVER_DIFFICULTY, Server.CHUNK_BATCH_FINISHED, + Server.CHUNK_BATCH_STARTED, Server.CHUNK_BIOMES, Server.CLEAR_TITLE, Server.TAB_COMPLETE, Server.COMMANDS, Server.CLOSE_WINDOW, Server.WINDOW_ITEMS, Server.WINDOW_DATA, + Server.SET_SLOT, Server.SET_COOLDOWN, Server.CHAT_CUSTOM_COMPLETION, Server.CUSTOM_PAYLOAD, Server.DAMAGE_EVENT, Server.CHAT_DELETE, Server.KICK_DISCONNECT, + Server.CHAT_DISGUISED, Server.ENTITY_STATUS, Server.EXPLOSION, Server.UNLOAD_CHUNK, Server.GAME_STATE_CHANGE, Server.OPEN_WINDOW_HORSE, Server.HIT_ANIMATION, + Server.INITIALIZE_BORDER, Server.KEEP_ALIVE, Server.LEVEL_CHUNK_LIGHT, Server.WORLD_EVENT, Server.WORLD_PARTICLES, Server.LIGHT_UPDATE, Server.LOGIN, Server.MAP, + Server.OPEN_WINDOW_MERCHANT, Server.REL_ENTITY_MOVE, Server.REL_ENTITY_MOVE_LOOK, Server.REL_ENTITY_LOOK, Server.VEHICLE_MOVE, Server.OPEN_BOOK, Server.OPEN_WINDOW, + Server.OPEN_SIGN_EDITOR, Server.PING, Server.PONG, Server.AUTO_RECIPE, Server.ABILITIES, Server.CHAT, Server.COMBAT_END_EVENT, Server.COMBAT_ENTER_EVENT, + Server.COMBAT_KILL_EVENT, Server.PLAYER_INFO_REMOVE, Server.PLAYER_INFO_UPDATE, Server.LOOK_AT, Server.POSITION, Server.RECIPES, Server.ENTITY_DESTROY, + Server.REMOVE_ENTITY_EFFECT, Server.SCOREBOARD_RESET, Server.RESOURCE_PACK_POP, Server.RESOURCE_PACK_SEND, Server.RESPAWN, Server.ENTITY_HEAD_ROTATION, + Server.MULTI_BLOCK_CHANGE, Server.SELECT_ADVANCEMENT_TAB, Server.SERVER_DATA, Server.SET_ACTION_BAR_TEXT, Server.SET_BORDER_CENTER, Server.SET_BORDER_LERP_SIZE, + Server.SET_BORDER_SIZE, Server.SET_BORDER_WARNING_DELAY, Server.SET_BORDER_WARNING_DISTANCE, Server.CAMERA, Server.HELD_ITEM_SLOT, Server.VIEW_CENTRE, Server.VIEW_DISTANCE, + Server.SPAWN_POSITION, Server.SCOREBOARD_DISPLAY_OBJECTIVE, Server.ENTITY_METADATA, Server.ATTACH_ENTITY, Server.ENTITY_VELOCITY, Server.ENTITY_EQUIPMENT, Server.EXPERIENCE, + Server.UPDATE_HEALTH, Server.SCOREBOARD_OBJECTIVE, Server.MOUNT, Server.SCOREBOARD_TEAM, Server.SCOREBOARD_SCORE, Server.SIMULATION_DISTANCE, Server.SET_SUBTITLE_TEXT, + Server.UPDATE_TIME, Server.SET_TITLE_TEXT, Server.SET_TITLE_ANIMATION, Server.ENTITY_SOUND, Server.NAMED_SOUND_EFFECT, Server.START_CONFIGURATION, Server.STOP_SOUND, + Server.SYSTEM_CHAT, Server.PLAYER_LIST_HEADER_FOOTER, Server.NBT_QUERY, Server.COLLECT, Server.ENTITY_TELEPORT, Server.TICKING_STATE, Server.TICKING_STEP, + Server.ADVANCEMENTS, Server.UPDATE_ATTRIBUTES, Server.ENTITY_EFFECT, Server.RECIPE_UPDATE, Server.TAGS)) { + playOut.put(i++, type); + } + i = 0; + for (EntityType types : Arrays.asList(EntityType.ALLAY, EntityType.AREA_EFFECT_CLOUD, EntityType.ARMOR_STAND, EntityType.ARROW, EntityType.AXOLOTL, EntityType.BAT, EntityType.BEE, + EntityType.BLAZE, EntityType.BOAT, EntityType.CHEST_BOAT, EntityType.CAT, EntityType.CAVE_SPIDER, EntityType.CHICKEN, EntityType.COD, EntityType.COW, EntityType.CREEPER, + EntityType.DOLPHIN, EntityType.DONKEY, EntityType.DRAGON_FIREBALL, EntityType.DROWNED, EntityType.ELDER_GUARDIAN, EntityType.ENDER_CRYSTAL, EntityType.ENDER_DRAGON, + EntityType.ENDERMAN, EntityType.ENDERMITE, EntityType.EVOKER, EntityType.EVOKER_FANGS, EntityType.EXPERIENCE_ORB, EntityType.EYE_OF_ENDER, EntityType.FALLING_BLOCK, + EntityType.FIREWORK, EntityType.FOX, EntityType.FROG, EntityType.GHAST, EntityType.GIANT, EntityType.GLOW_ITEM_FRAME, EntityType.GLOW_SQUID, EntityType.GOAT, + EntityType.GUARDIAN, EntityType.HOGLIN, EntityType.HORSE, EntityType.HUSK, EntityType.ILLUSIONER, EntityType.IRON_GOLEM, EntityType.DROPPED_ITEM, EntityType.ITEM_FRAME, + EntityType.FIREBALL, EntityType.LEASH_KNOT, EntityType.LIGHTNING, EntityType.LLAMA, EntityType.LLAMA_SPIT, EntityType.MAGMA_CUBE, EntityType.MARKER, EntityType.MINECART, + EntityType.MINECART_CHEST, EntityType.MINECART_COMMAND_BLOCK, EntityType.MINECART_FURNACE, EntityType.MINECART_HOPPER, EntityType.MINECART_MOB_SPAWNER, + EntityType.MINECART_TNT, EntityType.MULE, EntityType.MOOSHROOM, EntityType.OCELOT, EntityType.PAINTING, EntityType.PANDA, EntityType.PARROT, EntityType.PHANTOM, + EntityType.PIG, EntityType.PIGLIN, EntityType.PIGLIN_BRUTE, EntityType.PILLAGER, EntityType.POLAR_BEAR, EntityType.PRIMED_TNT, EntityType.PUFFER_FISH, EntityType.RABBIT, + EntityType.RAVAGER, EntityType.SALMON, EntityType.SHEEP, EntityType.SHULKER, EntityType.SHULKER_BULLET, EntityType.SILVERFISH, EntityType.SKELETON, EntityType.SKELETON_HORSE, + EntityType.SLIME, EntityType.SMALL_FIREBALL, EntityType.SNOW_GOLEM, EntityType.SNOW_BALL, EntityType.SPECTRAL_ARROW, EntityType.SPIDER, EntityType.SQUID, EntityType.STRAY, + EntityType.STRIDER, EntityType.TADPOLE, EntityType.EGG, EntityType.ENDER_PEARL, EntityType.EXP_BOTTLE, EntityType.SPLASH_POTION, EntityType.TRIDENT, EntityType.LLAMA_TRADER, + EntityType.TROPICAL_FISH, EntityType.TURTLE, EntityType.VEX, EntityType.VILLAGER, EntityType.VINDICATOR, EntityType.WANDERING_TRADER, EntityType.WARDEN, EntityType.WITCH, + EntityType.WITHER, EntityType.WITHER_SKELETON, EntityType.WITHER_SKULL, EntityType.WOLF, EntityType.ZOGLIN, EntityType.ZOMBIE, EntityType.ZOMBIE_VILLAGER, + EntityType.PIG_ZOMBIE, EntityType.PLAYER, EntityType.FISHING_HOOK)) { + entityTypes.put(i++, types); + } + loadPostFlattening("/versions/v1_19_3/"); + + log(); + } +} diff --git a/common/src/com/elikill58/negativity/universal/Version.java b/common/src/com/elikill58/negativity/universal/Version.java index 4184d652b..782474ec4 100644 --- a/common/src/com/elikill58/negativity/universal/Version.java +++ b/common/src/com/elikill58/negativity/universal/Version.java @@ -21,6 +21,7 @@ import com.elikill58.negativity.api.packets.nms.versions.Version1_19_4; import com.elikill58.negativity.api.packets.nms.versions.Version1_20; import com.elikill58.negativity.api.packets.nms.versions.Version1_20_2; +import com.elikill58.negativity.api.packets.nms.versions.Version1_20_4; import com.elikill58.negativity.api.packets.nms.versions.Version1_8; import com.elikill58.negativity.api.packets.nms.versions.Version1_9; import com.elikill58.negativity.api.packets.nms.versions.VersionUnknown; @@ -46,7 +47,8 @@ public enum Version { V1_19_3("1.19.3", 19.3, Version1_19_3::new, 761), V1_19_4("1.19.4", 19.4, Version1_19_4::new, 762), V1_20("1.20", 20, Version1_20::new, 763), - V1_20_2("1.20.2", 20.2, Version1_20_2::new, 764, 999), + V1_20_2("1.20.2", 20.2, Version1_20_2::new, 764), + V1_20_4("1.20.4", 20.4, Version1_20_4::new, 765, 999), HIGHER("higher", 42, VersionUnknown::new, 1000); private final double power; diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java index 621b3cba0..5fafa551c 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java @@ -45,6 +45,7 @@ public SpigotVersionAdapter(int protocolVersion) { Class mcServer = PacketUtils.getNmsClass("MinecraftServer", "server."); recentTpsField = mcServer.getDeclaredField("recentTps"); tpsField = mcServer.getDeclaredField(getTpsFieldName()); + tpsField.setAccessible(true); getPlayerHandle = PacketUtils.getObcClass("entity.CraftPlayer").getDeclaredMethod("getHandle"); @@ -317,6 +318,8 @@ public static SpigotVersionAdapter getVersionAdapter() { return instance = new Spigot_1_20_R1(); case "v1_20_R2": return instance = new Spigot_1_20_R2(); + case "v1_20_R3": + return instance = new Spigot_1_20_R3(); default: return instance = new Spigot_UnknowVersion(VERSION); } diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java new file mode 100644 index 000000000..bf128e158 --- /dev/null +++ b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java @@ -0,0 +1,15 @@ +package com.elikill58.negativity.spigot.nms; + +import com.elikill58.negativity.spigot.utils.PacketUtils; + +public class Spigot_1_20_R3 extends SpigotVersionAdapter { + + public Spigot_1_20_R3() { + super(PacketUtils.getProtocolVersion()); + } + + @Override + public String getTpsFieldName() { + return "ac"; + } +} diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_UnknowVersion.java b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_UnknowVersion.java index ffa8c8e85..c86783b23 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_UnknowVersion.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_UnknowVersion.java @@ -1,6 +1,7 @@ package com.elikill58.negativity.spigot.nms; import com.elikill58.negativity.spigot.SpigotNegativity; +import com.elikill58.negativity.spigot.utils.PacketUtils; public class Spigot_UnknowVersion extends SpigotVersionAdapter { @@ -12,7 +13,7 @@ public class Spigot_UnknowVersion extends SpigotVersionAdapter { } public Spigot_UnknowVersion(String version) { - super(0); + super(PacketUtils.getProtocolVersion()); SpigotNegativity.getInstance().getLogger().warning("Failed to find version adapter for " + version + "."); } From 3c77f2f602fb56bf069ad2b6fbbf1ff1b1c10ab6 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 27 Dec 2023 18:31:55 +0100 Subject: [PATCH 08/23] Save VPN subnets --- .../negativity/common/special/VpnChecker.java | 114 ++++++++++++++---- .../universal/utils/IpAddressMatcher.java | 113 +++++++++++++++++ 2 files changed, 202 insertions(+), 25 deletions(-) create mode 100644 common/src/com/elikill58/negativity/universal/utils/IpAddressMatcher.java diff --git a/common/src/com/elikill58/negativity/common/special/VpnChecker.java b/common/src/com/elikill58/negativity/common/special/VpnChecker.java index 226669708..68ca4c720 100644 --- a/common/src/com/elikill58/negativity/common/special/VpnChecker.java +++ b/common/src/com/elikill58/negativity/common/special/VpnChecker.java @@ -1,5 +1,7 @@ package com.elikill58.negativity.common.special; +import java.util.HashMap; +import java.util.Map.Entry; import java.util.concurrent.CompletableFuture; import com.elikill58.negativity.api.entity.Player; @@ -17,11 +19,13 @@ import com.elikill58.negativity.universal.ban.BanManager; import com.elikill58.negativity.universal.detections.Special; import com.elikill58.negativity.universal.detections.keys.SpecialKeys; -import com.elikill58.negativity.universal.logger.Debug; +import com.elikill58.negativity.universal.utils.IpAddressMatcher; import com.elikill58.negativity.universal.utils.UniversalUtils; public class VpnChecker extends Special implements Listeners { + private final HashMap subnets = new HashMap<>(); + public VpnChecker() { super(SpecialKeys.VPN_CHECKER, Materials.EYE_OF_ENDER); } @@ -30,38 +34,98 @@ public VpnChecker() { public void onLogin(LoginEvent e) { if (!e.getLoginResult().equals(Result.ALLOWED) || !isActive()) // already kicked return; + if (e.getAddress() == null || e.getAddress().getHostAddress() == null) // no IP to use + return; String ip = e.getAddress().getHostAddress(); + for (Entry entries : new HashMap<>(subnets).entrySet()) { + if (entries.getKey().matches(ip)) { + manageVpn(e, ip, entries.getValue()); + return; + } + } CompletableFuture.runAsync(() -> { UniversalUtils.getContentFromURL("https://api.negativity.fr/ip/" + ip).ifPresent(result -> { try { - JSONObject data = (JSONObject) new JSONParser().parse(result); - boolean proxy = UniversalUtils.getBoolean(data.get("proxy").toString()); - boolean vpn = UniversalUtils.getBoolean(data.get("vpn").toString()); - Adapter.getAdapter().debug(Debug.FEATURE, "IP data for " + ip + ": " + result +" > " + data.get("proxy").toString() + " : " + data.get("vpn").toString() + " >> " + proxy + " / " + vpn); - boolean shouldKick = false, shouldBan = false; - if (vpn) { - shouldKick = getConfig().getBoolean("vpn.kick", true); - shouldBan = getConfig().getBoolean("vpn.ban", false); - } - if (proxy) { - shouldKick = getConfig().getBoolean("proxy.kick", true) || shouldKick; - shouldBan = getConfig().getBoolean("proxy.ban", false) || shouldBan; - } - String reason = getConfig().getString("message-reason"); - if (shouldBan) { - String banTime = getConfig().getString("vpn.time"); - BanManager.executeBan(Ban.active(e.getUUID(), reason, "Negativity", SanctionnerType.CONSOLE, banTime == "" ? -1 : Integer.parseInt(banTime) * 1000, "VPN/Proxy", ip)); - } else if (shouldKick) { - e.setKickMessage(reason); - e.setLoginResult(Result.KICK_OTHER); - Player cible = Adapter.getAdapter().getPlayer(e.getUUID()); - if (cible != null) - cible.kick(reason); - } + VpnResult vpn = new VpnResult((JSONObject) new JSONParser().parse(result)); + subnets.put(vpn.getMatcher(), vpn); + manageVpn(e, ip, vpn); } catch (ParseException e1) { e1.printStackTrace(); } }); }); } + + private void manageVpn(LoginEvent e, String ip, VpnResult result) { + boolean shouldKick = false, shouldBan = false; + if (result.isVPN()) { + shouldKick = getConfig().getBoolean("vpn.kick", true); + shouldBan = getConfig().getBoolean("vpn.ban", false); + } + if (result.isProxy()) { + shouldKick = getConfig().getBoolean("proxy.kick", true) || shouldKick; + shouldBan = getConfig().getBoolean("proxy.ban", false) || shouldBan; + } + String reason = getConfig().getString("message-reason"); + if (shouldBan) { + String banTime = getConfig().getString("vpn.time"); + BanManager.executeBan(Ban.active(e.getUUID(), reason, "Negativity", SanctionnerType.CONSOLE, banTime == "" ? -1 : Integer.parseInt(banTime) * 1000, "VPN/Proxy", ip)); + } else if (shouldKick) { + e.setKickMessage(reason); + e.setLoginResult(Result.KICK_OTHER); + Player cible = Adapter.getAdapter().getPlayer(e.getUUID()); + if (cible != null) + cible.kick(reason); + } + } + + public class VpnResult { + + private final boolean proxy, vpn, hosting; + private final String ip, code, name; + + public VpnResult(JSONObject data) { + this.proxy = UniversalUtils.getBoolean(data.get("proxy").toString()); + this.hosting = UniversalUtils.getBoolean(data.get("hosting").toString()); + this.vpn = UniversalUtils.getBoolean(data.get("vpn").toString()); + + this.ip = data.get("ip").toString(); + this.code = data.get("code").toString(); + this.name = data.get("name").toString(); + } + + /** + * WARN: This is not safe yet and can have false flag (mostly some known as + * false but really are. Opposite never happen. + * + * @return true if it's hosting + */ + public boolean isHosting() { + return hosting; + } + + public boolean isProxy() { + return proxy; + } + + public boolean isVPN() { + return vpn; + } + + public String getIp() { + return ip; + } + + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + public IpAddressMatcher getMatcher() { + return new IpAddressMatcher(ip); + } + } } diff --git a/common/src/com/elikill58/negativity/universal/utils/IpAddressMatcher.java b/common/src/com/elikill58/negativity/universal/utils/IpAddressMatcher.java new file mode 100644 index 000000000..9df410a79 --- /dev/null +++ b/common/src/com/elikill58/negativity/universal/utils/IpAddressMatcher.java @@ -0,0 +1,113 @@ +package com.elikill58.negativity.universal.utils; + +/* + * Copyright 2002-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * Matches a request based on IP Address or subnet mask matching against the + * remote address. + *

+ * Both IPv6 and IPv4 addresses are supported, but a matcher which is configured + * with an IPv4 address will never match a request which returns an IPv6 + * address, and vice-versa. + * + * @author Luke Taylor + * @since 3.0.2 + * + * Slightly modified by omidzk to have zero dependency to any frameworks + * other than the JRE. + */ +public final class IpAddressMatcher { + + private final int nMaskBits; + private final InetAddress requiredAddress; + + /** + * Takes a specific IP address or a range specified using the IP/Netmask (e.g. + * 192.168.1.0/24 or 202.24.0.0/14). + * + * @param ipAddress the address or range of addresses from which the request + * must come. + */ + public IpAddressMatcher(String ipAddress) { + if (ipAddress.indexOf('/') > 0) { + String[] addressAndMask = ipAddress.split("/"); + ipAddress = addressAndMask[0]; + nMaskBits = Integer.parseInt(addressAndMask[1]); + } else { + nMaskBits = -1; + } + requiredAddress = parseAddress(ipAddress); + assert (requiredAddress.getAddress().length * 8 >= nMaskBits) : String.format("IP address %s is too short for bitmask of length %d", ipAddress, nMaskBits); + } + + public IpAddressMatcher(String ipAddress, int nMaskBits) { + this.nMaskBits = nMaskBits; + this.requiredAddress = parseAddress(ipAddress); + assert (requiredAddress.getAddress().length * 8 >= nMaskBits) : String.format("IP address %s is too short for bitmask of length %d", ipAddress, nMaskBits); + } + + public static boolean match(String ip, String subnet) { + return new IpAddressMatcher(subnet).matches(ip); + } + + public static boolean match(String ip, String subnetIp, int subnetMask) { + return new IpAddressMatcher(subnetIp, subnetMask).matches(ip); + } + + public boolean matches(String address) { + InetAddress remoteAddress = parseAddress(address); + + if (!requiredAddress.getClass().equals(remoteAddress.getClass())) { + return false; + } + + if (nMaskBits < 0) { + return remoteAddress.equals(requiredAddress); + } + + byte[] remAddr = remoteAddress.getAddress(); + byte[] reqAddr = requiredAddress.getAddress(); + + int nMaskFullBytes = nMaskBits / 8; + byte finalByte = (byte) (0xFF00 >> (nMaskBits & 0x07)); + + // System.out.println("Mask is " + new sun.misc.HexDumpEncoder().encode(mask)); + + for (int i = 0; i < nMaskFullBytes; i++) { + if (remAddr[i] != reqAddr[i]) { + return false; + } + } + + if (finalByte != 0) { + return (remAddr[nMaskFullBytes] & finalByte) == (reqAddr[nMaskFullBytes] & finalByte); + } + + return true; + } + + private InetAddress parseAddress(String address) { + try { + return InetAddress.getByName(address); + } catch (UnknownHostException e) { + throw new IllegalArgumentException("Failed to parse address" + address, e); + } + } +} \ No newline at end of file From af369ba237465350287b3a5af1aee29d124f20f2 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 3 Jan 2024 22:30:09 +0100 Subject: [PATCH 09/23] Update loom --- fabric/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index a944d49b6..9bae96632 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'fabric-loom' version '1.0.11' + id 'fabric-loom' version '1.4' id 'com.github.johnrengelman.shadow' } From 42cc1f1b47069aa601858e4b9ff316eb7f7295c0 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 3 Jan 2024 22:32:19 +0100 Subject: [PATCH 10/23] Update workflows --- .github/workflows/build-sponge7.yml | 7 ++++--- .github/workflows/build.yml | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-sponge7.yml b/.github/workflows/build-sponge7.yml index 35b18994d..3ee11e8b7 100644 --- a/.github/workflows/build-sponge7.yml +++ b/.github/workflows/build-sponge7.yml @@ -7,9 +7,9 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'temurin' java-version: '17' @@ -18,6 +18,7 @@ jobs: - name: Build with Gradle run: ./gradlew :sponge7:shadowJar --configure-on-demand - name: Upload Artifact to GitHub Action - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: path: sponge7/build/libs/*.jar + name: Negativity-Sponge7 \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9de1f027c..06755d4e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Java uses: actions/setup-java@v3 with: From 8c983a895ec832b4b2ef26932d63e3152855c16c Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Thu, 11 Jan 2024 22:28:24 +0100 Subject: [PATCH 11/23] Fix step FP with partial empty block --- .../src/com/elikill58/negativity/common/protocols/Step.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/src/com/elikill58/negativity/common/protocols/Step.java b/common/src/com/elikill58/negativity/common/protocols/Step.java index d33704365..a08677e3c 100644 --- a/common/src/com/elikill58/negativity/common/protocols/Step.java +++ b/common/src/com/elikill58/negativity/common/protocols/Step.java @@ -5,6 +5,7 @@ import com.elikill58.negativity.api.entity.Player; import com.elikill58.negativity.api.events.Listeners; import com.elikill58.negativity.api.events.player.PlayerMoveEvent; +import com.elikill58.negativity.api.item.Material; import com.elikill58.negativity.api.item.Materials; import com.elikill58.negativity.api.location.Location; import com.elikill58.negativity.api.potion.PotionEffectType; @@ -63,8 +64,9 @@ public void onPlayerMoveDifBoost(PlayerMoveEvent e, NegativityPlayer np) { return; // will go down Location from = e.getFrom(), to = e.getTo(); Location down = to.clone().sub(0, 1, 0); - String downId = down.getBlock().getType().getId(); - if (downId.contains("SHULKER")) + Material downType = down.getBlock().getType(); + String downId = downType.getId(); + if (downId.contains("SHULKER") || downType.isTransparent()) return; double dif = to.getY() - from.getY(); double amplifier = (p.hasPotionEffect(PotionEffectType.JUMP) ? p.getPotionEffect(PotionEffectType.JUMP).get().getAmplifier() : 0); From a0b1e9b68f9e9352e93b6649d898280996da8b0d Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 6 Mar 2024 22:09:31 +0100 Subject: [PATCH 12/23] Fix building --- fabric/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 9bae96632..3ae7fa13a 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'fabric-loom' version '1.4' + id 'fabric-loom' version '1.0.9' id 'com.github.johnrengelman.shadow' } From 8e468496f69acc6edf64af1e003979b53144d623 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Sat, 27 Apr 2024 16:01:23 +0200 Subject: [PATCH 13/23] Add missing annotations --- .../elikill58/negativity/api/entity/AbstractPlayer.java | 3 ++- .../src/com/elikill58/negativity/api/entity/Player.java | 8 +------- .../negativity/api/inventory/InventoryManager.java | 1 - .../src/com/elikill58/negativity/api/json/JSONArray.java | 1 - .../src/com/elikill58/negativity/api/json/JSONObject.java | 1 - .../src/com/elikill58/negativity/api/json/JSONValue.java | 1 - .../negativity/api/json/parser/ContainerFactory.java | 1 - .../elikill58/negativity/api/json/parser/JSONParser.java | 1 - .../negativity/api/packets/packet/NPacketUnset.java | 3 ++- .../negativity/api/ray/block/BlockRayBuilder.java | 1 + .../negativity/api/ray/entity/EntityRayBuilder.java | 1 + .../negativity/spigot/nms/SpigotVersionAdapter.java | 1 + .../sponge/impl/entity/SpongeEntityManager.java | 1 - 13 files changed, 8 insertions(+), 16 deletions(-) diff --git a/common/src/com/elikill58/negativity/api/entity/AbstractPlayer.java b/common/src/com/elikill58/negativity/api/entity/AbstractPlayer.java index 6b2b2fff4..287dd6e72 100644 --- a/common/src/com/elikill58/negativity/api/entity/AbstractPlayer.java +++ b/common/src/com/elikill58/negativity/api/entity/AbstractPlayer.java @@ -59,7 +59,8 @@ public void setProtocolVersion(int protocolVersion) { public Location getLocation() { return location; } - + + @Override public void setLocation(Location location) { this.location = location; } diff --git a/common/src/com/elikill58/negativity/api/entity/Player.java b/common/src/com/elikill58/negativity/api/entity/Player.java index 5cd9b7612..4086a83ef 100644 --- a/common/src/com/elikill58/negativity/api/entity/Player.java +++ b/common/src/com/elikill58/negativity/api/entity/Player.java @@ -34,13 +34,6 @@ public interface Player extends OfflinePlayer { @Nullable String getIP(); - /** - * Know if the player is dead - * - * @return true if the player is dead - */ - boolean isDead(); - /** * Know if the player is sleeping * @@ -225,6 +218,7 @@ default void setSleeping(boolean b) { * * @return the world where the player is */ + @Override CompensatedWorld getWorld(); /** diff --git a/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java b/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java index 8ce32332f..04222c97d 100644 --- a/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java +++ b/common/src/com/elikill58/negativity/api/inventory/InventoryManager.java @@ -74,7 +74,6 @@ public InventoryManager() { AbstractInventory.getInventories().forEach(AbstractInventory::load); } - @SuppressWarnings({ "rawtypes" }) @EventListener public void onInventoryClick(InventoryClickEvent e) { PlatformHolder holder = e.getClickedInventory().getHolder(); diff --git a/common/src/com/elikill58/negativity/api/json/JSONArray.java b/common/src/com/elikill58/negativity/api/json/JSONArray.java index bc0574ef1..caaa35a68 100644 --- a/common/src/com/elikill58/negativity/api/json/JSONArray.java +++ b/common/src/com/elikill58/negativity/api/json/JSONArray.java @@ -16,7 +16,6 @@ * * @author FangYidong */ -@SuppressWarnings({ "rawtypes"}) public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware { private static final long serialVersionUID = 3957988303675231981L; diff --git a/common/src/com/elikill58/negativity/api/json/JSONObject.java b/common/src/com/elikill58/negativity/api/json/JSONObject.java index 88d772e38..5799a8f7d 100644 --- a/common/src/com/elikill58/negativity/api/json/JSONObject.java +++ b/common/src/com/elikill58/negativity/api/json/JSONObject.java @@ -16,7 +16,6 @@ * * @author FangYidong */ -@SuppressWarnings({"rawtypes"}) public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{ private static final long serialVersionUID = -503443796854799292L; diff --git a/common/src/com/elikill58/negativity/api/json/JSONValue.java b/common/src/com/elikill58/negativity/api/json/JSONValue.java index 3f6f958c4..5d3300f2e 100644 --- a/common/src/com/elikill58/negativity/api/json/JSONValue.java +++ b/common/src/com/elikill58/negativity/api/json/JSONValue.java @@ -18,7 +18,6 @@ /** * @author FangYidong */ -@SuppressWarnings("rawtypes") public class JSONValue { /** * Parse JSON text into java object from the input source. Please use diff --git a/common/src/com/elikill58/negativity/api/json/parser/ContainerFactory.java b/common/src/com/elikill58/negativity/api/json/parser/ContainerFactory.java index 92f7c9a57..f7597c05f 100644 --- a/common/src/com/elikill58/negativity/api/json/parser/ContainerFactory.java +++ b/common/src/com/elikill58/negativity/api/json/parser/ContainerFactory.java @@ -10,7 +10,6 @@ * * @author FangYidong */ -@SuppressWarnings("rawtypes") public interface ContainerFactory { /** * @return A Map instance to store JSON object, or null if you want to use org.json.JSONObject. diff --git a/common/src/com/elikill58/negativity/api/json/parser/JSONParser.java b/common/src/com/elikill58/negativity/api/json/parser/JSONParser.java index 5ebb683ff..2254f4c88 100644 --- a/common/src/com/elikill58/negativity/api/json/parser/JSONParser.java +++ b/common/src/com/elikill58/negativity/api/json/parser/JSONParser.java @@ -19,7 +19,6 @@ * * @author FangYidong */ -@SuppressWarnings({"rawtypes"}) public class JSONParser { public static final int S_INIT=0; public static final int S_IN_FINISHED_VALUE=1;//string,number,boolean,null,object,array diff --git a/common/src/com/elikill58/negativity/api/packets/packet/NPacketUnset.java b/common/src/com/elikill58/negativity/api/packets/packet/NPacketUnset.java index 9c6599f5f..a913fd042 100644 --- a/common/src/com/elikill58/negativity/api/packets/packet/NPacketUnset.java +++ b/common/src/com/elikill58/negativity/api/packets/packet/NPacketUnset.java @@ -12,7 +12,8 @@ default void read(PacketSerializer serializer, Version version) { } void setPacketName(String name); - + + @Override String getPacketName(); void setPacketTypeCible(PacketType type); diff --git a/common/src/com/elikill58/negativity/api/ray/block/BlockRayBuilder.java b/common/src/com/elikill58/negativity/api/ray/block/BlockRayBuilder.java index 707bd51a4..3895c3748 100644 --- a/common/src/com/elikill58/negativity/api/ray/block/BlockRayBuilder.java +++ b/common/src/com/elikill58/negativity/api/ray/block/BlockRayBuilder.java @@ -111,6 +111,7 @@ public BlockRayBuilder neededPositions(List vec) { * * @return the block ray */ + @Override public BlockRay build() { if(search == null || !search.isValid(this)) throw new IllegalArgumentException("Please check what you set as param before running ray."); diff --git a/common/src/com/elikill58/negativity/api/ray/entity/EntityRayBuilder.java b/common/src/com/elikill58/negativity/api/ray/entity/EntityRayBuilder.java index da302d23b..f71c1b35b 100644 --- a/common/src/com/elikill58/negativity/api/ray/entity/EntityRayBuilder.java +++ b/common/src/com/elikill58/negativity/api/ray/entity/EntityRayBuilder.java @@ -96,6 +96,7 @@ public EntityRayBuilder searched(Entity searched) { * * @return the block ray */ + @Override public EntityRay build() { return new EntityRay(w, position, vector, maxDistance, onlyPlayer, bypassEntities, searched); } diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java index 5fafa551c..446b9a0e6 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java @@ -194,6 +194,7 @@ public Channel getChannel(Player p) { } } + @Override public AbstractChannel getPlayerChannel(Player p) { return new NettyChannel(getChannel(p)); } diff --git a/sponge/src/com/elikill58/negativity/sponge/impl/entity/SpongeEntityManager.java b/sponge/src/com/elikill58/negativity/sponge/impl/entity/SpongeEntityManager.java index 3eac4c969..4320ae868 100644 --- a/sponge/src/com/elikill58/negativity/sponge/impl/entity/SpongeEntityManager.java +++ b/sponge/src/com/elikill58/negativity/sponge/impl/entity/SpongeEntityManager.java @@ -34,7 +34,6 @@ else if(e instanceof Potion) return new SpongeEntity<>(e); } - @SuppressWarnings({ "rawtypes" }) public static @Nullable CommandSender getExecutor(@Nullable Audience src) { if(src == null) return null; From c55cb153ad04fa0f3e7b9304b55dd9238f2f33c4 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Sat, 27 Apr 2024 21:03:08 +0200 Subject: [PATCH 14/23] Added 1.20.5 support --- .../negativity/api/packets/PacketType.java | 18 ++++ .../packets/nms/versions/Version1_20_5.java | 100 ++++++++++++++++++ .../negativity/universal/Version.java | 4 +- 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_5.java diff --git a/common/src/com/elikill58/negativity/api/packets/PacketType.java b/common/src/com/elikill58/negativity/api/packets/PacketType.java index 536ff1852..43209c762 100644 --- a/common/src/com/elikill58/negativity/api/packets/PacketType.java +++ b/common/src/com/elikill58/negativity/api/packets/PacketType.java @@ -179,13 +179,25 @@ enum Client implements PacketType { CHAT(NPacketPlayInChat::new), CHAT_ACK, CHAT_COMMAND, + /** + * Since MC 1.20.5 + */ + CHAT_COMMAND_SIGNED, CHAT_PREVIEW, CHAT_SESSION_UPDATE, CHUNK_BATCH_RECEIVED, CLIENT_COMMAND, CLOSE_WINDOW, CONFIGURATION_ACKNOWLEDGED, + /** + * Since MC 1.20.5 + */ + COOKIE_RESPONSE, CUSTOM_PAYLOAD(NPacketPlayInCustomPayload::new), + /** + * Since MC 1.20.5 + */ + DEBUG_SAMPLE_SUBSCRIPTION, DIFFICULTY_CHANGE, DIFFICULTY_LOCK, ENCHANT_ITEM, @@ -295,12 +307,15 @@ enum Server implements PacketType { COMBAT_ENTER_EVENT, COMBAT_KILL_EVENT, COMMANDS, + COOKIE_STORE, + COOKIE_REQUEST, CHUNK_BATCH_FINISHED, CHUNK_BATCH_STARTED, CHUNK_BIOMES, CUSTOM_PAYLOAD(NPacketPlayOutCustomPayload::new), CUSTOM_SOUND_EFFECT, DAMAGE_EVENT, + DEBUG_SAMPLE, ENTITY, ENTITY_DESTROY(NPacketPlayOutEntityDestroy::new), ENTITY_EFFECT(NPacketPlayOutEntityEffect::new), @@ -316,6 +331,7 @@ enum Server implements PacketType { GAME_STATE_CHANGE, HELD_ITEM_SLOT, HIT_ANIMATION, + HURT_ANIMATION, INITIALIZE_BORDER, KEEP_ALIVE(NPacketPlayOutKeepAlive::new), KICK_DISCONNECT, @@ -340,6 +356,7 @@ enum Server implements PacketType { PLAYER_INFO_UPDATE, PLAYER_LIST_HEADER_FOOTER, POSITION(NPacketPlayOutPosition::new), + PROJECTILE_POWER, RECIPES, RECIPE_UPDATE, REL_ENTITY_LOOK(NPacketPlayOutRelEntityLook::new), @@ -388,6 +405,7 @@ enum Server implements PacketType { TICKING_STEP, TILE_ENTITY_DATA, TITLE, + TRANSFERT, PING(NPacketPlayOutPing::new), PONG, UNLOAD_CHUNK(NPacketPlayOutUnloadChunk::new), diff --git a/common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_5.java b/common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_5.java new file mode 100644 index 000000000..34a8eabcc --- /dev/null +++ b/common/src/com/elikill58/negativity/api/packets/nms/versions/Version1_20_5.java @@ -0,0 +1,100 @@ +package com.elikill58.negativity.api.packets.nms.versions; + +import java.util.Arrays; + +import com.elikill58.negativity.api.entity.EntityType; +import com.elikill58.negativity.api.packets.PacketType.Client; +import com.elikill58.negativity.api.packets.PacketType.Server; +import com.elikill58.negativity.api.packets.nms.NamedVersion; + +public class Version1_20_5 extends NamedVersion { + + public Version1_20_5() { + super("1.20.5"); + // packets ID seems not same as 1.20 + int i = 0; + for (Client type : Arrays.asList(Client.TELEPORT_ACCEPT, Client.TILE_NBT_QUERY, Client.DIFFICULTY_CHANGE, + Client.CHAT_ACK, Client.CHAT_COMMAND, Client.CHAT_COMMAND_SIGNED, Client.CHAT, + Client.CHAT_SESSION_UPDATE, Client.CHUNK_BATCH_RECEIVED, Client.CLIENT_COMMAND, Client.SETTINGS, + Client.TAB_COMPLETE, Client.CONFIGURATION_ACKNOWLEDGED, Client.ENCHANT_ITEM, Client.WINDOW_CLICK, + Client.CLOSE_WINDOW, Client.SLOT_STATE_CHANGE, Client.COOKIE_RESPONSE, Client.CUSTOM_PAYLOAD, + Client.DEBUG_SAMPLE_SUBSCRIPTION, Client.BEDIT, Client.ENTITY_NBT_QUERY, Client.USE_ENTITY, + Client.JIGSAW_GENERATE, Client.KEEP_ALIVE, Client.DIFFICULTY_LOCK, Client.POSITION, + Client.POSITION_LOOK, Client.LOOK, Client.GROUND, Client.VEHICLE_MOVE, Client.BOAT_MOVE, + Client.PICK_ITEM, Client.PING, Client.AUTO_RECIPE, Client.ABILITIES, Client.BLOCK_DIG, + Client.ENTITY_ACTION, Client.STEER_VEHICLE, Client.PONG, Client.RECIPE_SETTINGS, + Client.RECIPE_DISPLAYED, Client.ITEM_NAME, Client.RESOURCE_PACK_STATUS, Client.ADVANCEMENTS, + Client.TR_SEL, Client.BEACON, Client.HELD_ITEM_SLOT, Client.SET_COMMAND_BLOCK, + Client.SET_COMMAND_MINECART, Client.SET_CREATIVE_SLOT, Client.SET_JIGSAW, Client.STRUCT, + Client.UPDATE_SIGN, Client.ARM_ANIMATION, Client.SPECTATE, Client.USE_ITEM, Client.BLOCK_PLACE)) { + playIn.put(i++, type); + } + i = 0; + for (Server type : Arrays.asList(Server.BUNDLE, Server.SPAWN_ENTITY, Server.SPAWN_ENTITY_EXPERIENCE_ORB, + Server.ANIMATION, Server.STATISTIC, Server.BLOCK_CHANGED_ACK, Server.BLOCK_BREAK_ANIMATION, + Server.TILE_ENTITY_DATA, Server.BLOCK_ACTION, Server.BLOCK_CHANGE, Server.BOSS, + Server.SERVER_DIFFICULTY, Server.CHUNK_BATCH_FINISHED, Server.CHUNK_BATCH_STARTED, Server.CHUNK_BIOMES, + Server.CLEAR_TITLE, Server.TAB_COMPLETE, Server.COMMANDS, Server.CLOSE_WINDOW, Server.WINDOW_ITEMS, + Server.WINDOW_DATA, Server.SET_SLOT, Server.COOKIE_REQUEST, Server.SET_COOLDOWN, + Server.CHAT_CUSTOM_COMPLETION, Server.CUSTOM_PAYLOAD, Server.DAMAGE_EVENT, Server.DEBUG_SAMPLE, + Server.CHAT_DELETE, Server.KICK_DISCONNECT, Server.CHAT_DISGUISED, Server.ENTITY_STATUS, + Server.EXPLOSION, Server.UNLOAD_CHUNK, Server.GAME_STATE_CHANGE, Server.OPEN_WINDOW_HORSE, + Server.HURT_ANIMATION, Server.INITIALIZE_BORDER, Server.KEEP_ALIVE, Server.LEVEL_CHUNK_LIGHT, + Server.WORLD_EVENT, Server.WORLD_PARTICLES, Server.LIGHT_UPDATE, Server.LOGIN, Server.MAP, + Server.OPEN_WINDOW_MERCHANT, Server.REL_ENTITY_MOVE, Server.REL_ENTITY_MOVE_LOOK, + Server.REL_ENTITY_LOOK, Server.VEHICLE_MOVE, Server.OPEN_BOOK, Server.OPEN_WINDOW, + Server.OPEN_SIGN_EDITOR, Server.PING, Server.PONG, Server.AUTO_RECIPE, Server.ABILITIES, Server.CHAT, + Server.COMBAT_END_EVENT, Server.COMBAT_ENTER_EVENT, Server.COMBAT_KILL_EVENT, Server.PLAYER_INFO_REMOVE, + Server.PLAYER_INFO_UPDATE, Server.LOOK_AT, Server.POSITION, Server.RECIPES, Server.ENTITY_DESTROY, + Server.REMOVE_ENTITY_EFFECT, Server.SCOREBOARD_RESET, Server.RESOURCE_PACK_POP, + Server.RESOURCE_PACK_SEND, Server.RESPAWN, Server.ENTITY_HEAD_ROTATION, Server.MULTI_BLOCK_CHANGE, + Server.SELECT_ADVANCEMENT_TAB, Server.SERVER_DATA, Server.SET_ACTION_BAR_TEXT, Server.SET_BORDER_CENTER, + Server.SET_BORDER_LERP_SIZE, Server.SET_BORDER_SIZE, Server.SET_BORDER_WARNING_DELAY, + Server.SET_BORDER_WARNING_DISTANCE, Server.CAMERA, Server.HELD_ITEM_SLOT, Server.VIEW_CENTRE, + Server.VIEW_DISTANCE, Server.SPAWN_POSITION, Server.SCOREBOARD_DISPLAY_OBJECTIVE, + Server.ENTITY_METADATA, Server.ATTACH_ENTITY, Server.ENTITY_VELOCITY, Server.ENTITY_EQUIPMENT, + Server.EXPERIENCE, Server.UPDATE_HEALTH, Server.SCOREBOARD_OBJECTIVE, Server.MOUNT, + Server.SCOREBOARD_TEAM, Server.SCOREBOARD_SCORE, Server.SIMULATION_DISTANCE, Server.SET_SUBTITLE_TEXT, + Server.UPDATE_TIME, Server.SET_TITLE_TEXT, Server.SET_TITLE_ANIMATION, Server.ENTITY_SOUND, + Server.NAMED_SOUND_EFFECT, Server.START_CONFIGURATION, Server.STOP_SOUND, Server.COOKIE_STORE, + Server.SYSTEM_CHAT, Server.PLAYER_LIST_HEADER_FOOTER, Server.NBT_QUERY, Server.COLLECT, + Server.ENTITY_TELEPORT, Server.TICKING_STATE, Server.TICKING_STEP, Server.TRANSFERT, + Server.ADVANCEMENTS, Server.UPDATE_ATTRIBUTES, Server.ENTITY_EFFECT, Server.RECIPE_UPDATE, Server.TAGS, + Server.PROJECTILE_POWER)) { + playOut.put(i++, type); + } + i = 0; + for (EntityType types : Arrays.asList(EntityType.ALLAY, EntityType.AREA_EFFECT_CLOUD, EntityType.ARMOR_STAND, + EntityType.ARROW, EntityType.AXOLOTL, EntityType.BAT, EntityType.BEE, EntityType.BLAZE, EntityType.BOAT, + EntityType.CHEST_BOAT, EntityType.CAT, EntityType.CAVE_SPIDER, EntityType.CHICKEN, EntityType.COD, + EntityType.COW, EntityType.CREEPER, EntityType.DOLPHIN, EntityType.DONKEY, EntityType.DRAGON_FIREBALL, + EntityType.DROWNED, EntityType.ELDER_GUARDIAN, EntityType.ENDER_CRYSTAL, EntityType.ENDER_DRAGON, + EntityType.ENDERMAN, EntityType.ENDERMITE, EntityType.EVOKER, EntityType.EVOKER_FANGS, + EntityType.EXPERIENCE_ORB, EntityType.EYE_OF_ENDER, EntityType.FALLING_BLOCK, EntityType.FIREWORK, + EntityType.FOX, EntityType.FROG, EntityType.GHAST, EntityType.GIANT, EntityType.GLOW_ITEM_FRAME, + EntityType.GLOW_SQUID, EntityType.GOAT, EntityType.GUARDIAN, EntityType.HOGLIN, EntityType.HORSE, + EntityType.HUSK, EntityType.ILLUSIONER, EntityType.IRON_GOLEM, EntityType.DROPPED_ITEM, + EntityType.ITEM_FRAME, EntityType.FIREBALL, EntityType.LEASH_KNOT, EntityType.LIGHTNING, + EntityType.LLAMA, EntityType.LLAMA_SPIT, EntityType.MAGMA_CUBE, EntityType.MARKER, EntityType.MINECART, + EntityType.MINECART_CHEST, EntityType.MINECART_COMMAND_BLOCK, EntityType.MINECART_FURNACE, + EntityType.MINECART_HOPPER, EntityType.MINECART_MOB_SPAWNER, EntityType.MINECART_TNT, EntityType.MULE, + EntityType.MOOSHROOM, EntityType.OCELOT, EntityType.PAINTING, EntityType.PANDA, EntityType.PARROT, + EntityType.PHANTOM, EntityType.PIG, EntityType.PIGLIN, EntityType.PIGLIN_BRUTE, EntityType.PILLAGER, + EntityType.POLAR_BEAR, EntityType.PRIMED_TNT, EntityType.PUFFER_FISH, EntityType.RABBIT, + EntityType.RAVAGER, EntityType.SALMON, EntityType.SHEEP, EntityType.SHULKER, EntityType.SHULKER_BULLET, + EntityType.SILVERFISH, EntityType.SKELETON, EntityType.SKELETON_HORSE, EntityType.SLIME, + EntityType.SMALL_FIREBALL, EntityType.SNOW_GOLEM, EntityType.SNOW_BALL, EntityType.SPECTRAL_ARROW, + EntityType.SPIDER, EntityType.SQUID, EntityType.STRAY, EntityType.STRIDER, EntityType.TADPOLE, + EntityType.EGG, EntityType.ENDER_PEARL, EntityType.EXP_BOTTLE, EntityType.SPLASH_POTION, + EntityType.TRIDENT, EntityType.LLAMA_TRADER, EntityType.TROPICAL_FISH, EntityType.TURTLE, + EntityType.VEX, EntityType.VILLAGER, EntityType.VINDICATOR, EntityType.WANDERING_TRADER, + EntityType.WARDEN, EntityType.WITCH, EntityType.WITHER, EntityType.WITHER_SKELETON, + EntityType.WITHER_SKULL, EntityType.WOLF, EntityType.ZOGLIN, EntityType.ZOMBIE, + EntityType.ZOMBIE_VILLAGER, EntityType.PIG_ZOMBIE, EntityType.PLAYER, EntityType.FISHING_HOOK)) { + entityTypes.put(i++, types); + } + loadPostFlattening("/versions/v1_19_3/"); + + log(); + } +} diff --git a/common/src/com/elikill58/negativity/universal/Version.java b/common/src/com/elikill58/negativity/universal/Version.java index 782474ec4..200e8a4a8 100644 --- a/common/src/com/elikill58/negativity/universal/Version.java +++ b/common/src/com/elikill58/negativity/universal/Version.java @@ -22,6 +22,7 @@ import com.elikill58.negativity.api.packets.nms.versions.Version1_20; import com.elikill58.negativity.api.packets.nms.versions.Version1_20_2; import com.elikill58.negativity.api.packets.nms.versions.Version1_20_4; +import com.elikill58.negativity.api.packets.nms.versions.Version1_20_5; import com.elikill58.negativity.api.packets.nms.versions.Version1_8; import com.elikill58.negativity.api.packets.nms.versions.Version1_9; import com.elikill58.negativity.api.packets.nms.versions.VersionUnknown; @@ -48,7 +49,8 @@ public enum Version { V1_19_4("1.19.4", 19.4, Version1_19_4::new, 762), V1_20("1.20", 20, Version1_20::new, 763), V1_20_2("1.20.2", 20.2, Version1_20_2::new, 764), - V1_20_4("1.20.4", 20.4, Version1_20_4::new, 765, 999), + V1_20_4("1.20.4", 20.4, Version1_20_4::new, 765), + V1_20_5("1.20.5", 20.5, Version1_20_5::new, 766, 999), HIGHER("higher", 42, VersionUnknown::new, 1000); private final double power; From 360dcb48fd5e5361fa04edf0674c060c2f25b35f Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Sat, 27 Apr 2024 21:04:58 +0200 Subject: [PATCH 15/23] Fix GroundSpoof issue --- .../com/elikill58/negativity/common/protocols/GroundSpoof.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/com/elikill58/negativity/common/protocols/GroundSpoof.java b/common/src/com/elikill58/negativity/common/protocols/GroundSpoof.java index 266ca4743..06d2a5616 100644 --- a/common/src/com/elikill58/negativity/common/protocols/GroundSpoof.java +++ b/common/src/com/elikill58/negativity/common/protocols/GroundSpoof.java @@ -44,7 +44,7 @@ public void onGroundSpoof(PlayerMoveEvent e, NegativityPlayer np, GroundSpoofDat return; } double diffY = e.getTo().getY() - e.getFrom().getY(); - if (diffY <= p.getWalkSpeed()) + if (diffY <= p.getWalkSpeed() || diffY == 0.1647732818260721) // specific value for MC 1.20.5 return; if (data.wasAlert) Negativity.alertMod(ReportType.WARNING, p, this, getReliability(p), "check-blocks-under", From 29a6553e36bc8995da36dea5c0027f04e93e6c8b Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Sat, 27 Apr 2024 21:27:24 +0200 Subject: [PATCH 16/23] Fix ping for 1.70+ --- .../spigot/nms/SpigotVersionAdapter.java | 6 ++++-- .../negativity/spigot/nms/Spigot_1_20_R4.java | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java index 446b9a0e6..bb1fc7fab 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java @@ -129,8 +129,8 @@ public List getOnlinePlayers() { public int getPlayerPing(Player player) { try { - if (version.isNewerOrEquals(Version.V1_20_2)) { - return pingField.getInt(getPlayerConnection(player)); + if (version.isNewerOrEquals(Version.V1_17)) { + return (int) player.getClass().getDeclaredMethod("getPing").invoke(player); } else { return pingField.getInt(getPlayerHandle.invoke(player)); } @@ -321,6 +321,8 @@ public static SpigotVersionAdapter getVersionAdapter() { return instance = new Spigot_1_20_R2(); case "v1_20_R3": return instance = new Spigot_1_20_R3(); + case "v1_20_R4": + return instance = new Spigot_1_20_R4(); default: return instance = new Spigot_UnknowVersion(VERSION); } diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java new file mode 100644 index 000000000..255d64273 --- /dev/null +++ b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java @@ -0,0 +1,15 @@ +package com.elikill58.negativity.spigot.nms; + +import com.elikill58.negativity.spigot.utils.PacketUtils; + +public class Spigot_1_20_R4 extends SpigotVersionAdapter { + + public Spigot_1_20_R4() { + super(PacketUtils.getProtocolVersion()); + } + + @Override + public String getTpsFieldName() { + return "ab"; + } +} From 2299798c1392030452ed1d4970a3fe3d517fef6b Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Sun, 28 Apr 2024 20:17:34 +0200 Subject: [PATCH 17/23] Fix Folia support --- .../spigot/nms/SpigotVersionAdapter.java | 26 +++++++------------ .../negativity/spigot/nms/Spigot_1_20_R3.java | 3 ++- .../negativity/spigot/nms/Spigot_1_20_R4.java | 3 ++- .../negativity/spigot/utils/PacketUtils.java | 5 +++- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java index bb1fc7fab..118e1e29f 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java @@ -33,7 +33,7 @@ public abstract class SpigotVersionAdapter extends VersionAdapter { protected Method getPlayerHandle, getEntityLookup, getBukkitEntity; - protected Field recentTpsField, pingField, tpsField, playerConnectionField; + protected Field recentTpsField, tpsField, playerConnectionField; protected Field minX, minY, minZ, maxX, maxY, maxZ, entityLookup; protected Object dedicatedServer; @@ -49,23 +49,15 @@ public SpigotVersionAdapter(int protocolVersion) { getPlayerHandle = PacketUtils.getObcClass("entity.CraftPlayer").getDeclaredMethod("getHandle"); - Class entityPlayerClass = PacketUtils.getNmsClass("EntityPlayer", "server.level."); - if (version.isNewerOrEquals(Version.V1_20_2)) { - Class ServerCommonPacketListenerImplClass = PacketUtils.getNmsClass("ServerCommonPacketListenerImpl", "server.network."); - pingField = ServerCommonPacketListenerImplClass.getDeclaredField("i"); - pingField.setAccessible(true); - playerConnectionField = entityPlayerClass.getDeclaredField("c"); - } else if (version.isNewerOrEquals(Version.V1_20)) { - pingField = entityPlayerClass.getDeclaredField("f"); - playerConnectionField = entityPlayerClass.getDeclaredField("c"); + Class entityPlayerClass = PacketUtils.getNmsClass(SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "ServerPlayer" : "EntityPlayer", "server.level."); + if (version.isNewerOrEquals(Version.V1_20)) { + playerConnectionField = entityPlayerClass.getDeclaredField(SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "connection" : "c"); } else if (version.isNewerOrEquals(Version.V1_17)) { - pingField = entityPlayerClass.getDeclaredField("e"); playerConnectionField = entityPlayerClass.getDeclaredField("b"); } else { - pingField = entityPlayerClass.getDeclaredField("ping"); playerConnectionField = entityPlayerClass.getDeclaredField("playerConnection"); } - Class bbClass = PacketUtils.getNmsClass("AxisAlignedBB", "world.phys."); + Class bbClass = PacketUtils.getNmsClass(SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "AABB" : "AxisAlignedBB", "world.phys."); if (version.isNewerOrEquals(Version.V1_13) && hasMinField(bbClass)) { minX = bbClass.getDeclaredField("minX"); @@ -87,7 +79,7 @@ public SpigotVersionAdapter(int protocolVersion) { this.getBukkitEntity = PacketUtils.getNmsClass("Entity", "world.entity.").getDeclaredMethod("getBukkitEntity"); if (version.isNewerOrEquals(Version.V1_17)) { - Class worldServer = PacketUtils.getNmsClass("WorldServer", "server.level."); + Class worldServer = PacketUtils.getNmsClass(SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "ServerLevel" : "WorldServer", "server.level."); try { getEntityLookup = worldServer.getDeclaredMethod("getEntityLookup"); @@ -132,7 +124,7 @@ public int getPlayerPing(Player player) { if (version.isNewerOrEquals(Version.V1_17)) { return (int) player.getClass().getDeclaredMethod("getPing").invoke(player); } else { - return pingField.getInt(getPlayerHandle.invoke(player)); + return PacketUtils.getNmsClass("EntityPlayer", "server.level.").getDeclaredField("ping").getInt(getPlayerHandle.invoke(player)); } } catch (Exception e) { e.printStackTrace(); @@ -168,7 +160,7 @@ public Object getPlayerConnection(Player p) { public Object getNetworkManager(Player p) { try { Object playerConnection = getPlayerConnection(p); - return new PacketContent(playerConnection).getSpecificModifier(PacketUtils.getNmsClass("NetworkManager", "network.")).readSafely(0); + return new PacketContent(playerConnection).getSpecificModifier(PacketUtils.getNmsClass(SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "Connection" : "NetworkManager", "network.")).readSafely(0); } catch (Exception e) { e.printStackTrace(); return null; @@ -220,7 +212,7 @@ public List getFuturChannel() { public BoundingBox getBoundingBox(Entity et) { try { Object ep = PacketUtils.getNMSEntity(et); - Object bb = ReflectionUtils.getFirstWith(ep, PacketUtils.getNmsClass("Entity", "world.entity."), PacketUtils.getNmsClass("AxisAlignedBB", "world.phys.")); + Object bb = ReflectionUtils.getFirstWith(ep, PacketUtils.getNmsClass("Entity", "world.entity."), PacketUtils.getNmsClass(SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "AABB" : "AxisAlignedBB", "world.phys.")); double minX = this.minX.getDouble(bb); double minY = this.minY.getDouble(bb); diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java index bf128e158..93fbd8016 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R3.java @@ -1,5 +1,6 @@ package com.elikill58.negativity.spigot.nms; +import com.elikill58.negativity.spigot.SubPlatform; import com.elikill58.negativity.spigot.utils.PacketUtils; public class Spigot_1_20_R3 extends SpigotVersionAdapter { @@ -10,6 +11,6 @@ public Spigot_1_20_R3() { @Override public String getTpsFieldName() { - return "ac"; + return SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "tickTimesNanos" : "ac"; } } diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java index 255d64273..7ead5fe43 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_20_R4.java @@ -1,5 +1,6 @@ package com.elikill58.negativity.spigot.nms; +import com.elikill58.negativity.spigot.SubPlatform; import com.elikill58.negativity.spigot.utils.PacketUtils; public class Spigot_1_20_R4 extends SpigotVersionAdapter { @@ -10,6 +11,6 @@ public Spigot_1_20_R4() { @Override public String getTpsFieldName() { - return "ab"; + return SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "tickTimesNanos" : "ab"; } } diff --git a/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java b/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java index b789970c9..a93bcab46 100644 --- a/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java +++ b/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java @@ -175,8 +175,11 @@ public static Object getWorldServer(World w) { public static int getProtocolVersion() { try { Class sharedConstants = PacketUtils.getNmsClass("SharedConstants", ""); + try { // try get value directly + return (int) sharedConstants.getDeclaredField("RELEASE_NETWORK_PROTOCOL_VERSION").get(null); + } catch (Exception e) { e.printStackTrace(); } return (int) sharedConstants.getDeclaredMethod("c").invoke(null); - } catch (Exception e) {} // ignore because it's just an old version + } catch (Exception e) { e.printStackTrace(); } // ignore because it's just an old version try { Class serverClazz = getNmsClass("MinecraftServer", "server."); Object server = serverClazz.getDeclaredMethod("getServer").invoke(null); From 43ccc574a3f5f21582ac81d32f8805e095e4fab1 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 4 Jun 2024 23:33:29 +0200 Subject: [PATCH 18/23] Upgrade Minestom to MC 1.20.5 --- build.gradle | 2 +- bungee/build.gradle | 2 +- common/build.gradle | 2 +- common/integrations/viaversion/build.gradle | 2 +- fabric/build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- minestom/build.gradle | 20 ++- .../negativity/minestom/MinestomAdapter.java | 15 +-- .../minestom/MinestomNegativity.java | 3 +- .../minestom/MinestomScheduler.java | 8 +- .../minestom/impl/entity/MinestomArrow.java | 2 +- .../impl/entity/MinestomOfflinePlayer.java | 4 +- .../minestom/impl/entity/MinestomPlayer.java | 12 +- .../impl/inventory/MinestomInventory.java | 1 + .../minestom/listeners/PacketListeners.java | 3 +- .../minestom/nms/MinestomPlayPackets.java | 118 ++++++++++-------- spigot/build.gradle | 2 +- sponge/build.gradle | 2 +- sponge7/build.gradle | 2 +- velocity/build.gradle | 4 +- 20 files changed, 112 insertions(+), 96 deletions(-) diff --git a/build.gradle b/build.gradle index 6c58a893c..2b836562d 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id 'java-library' - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'io.github.goooler.shadow' version '8.1.7' } shadowJar { diff --git a/bungee/build.gradle b/bungee/build.gradle index 777bb0868..ea2828cc8 100644 --- a/bungee/build.gradle +++ b/bungee/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } evaluationDependsOn(':common') // Projects are evaluated by alphabetical order, but common should be evaluated before bungee diff --git a/common/build.gradle b/common/build.gradle index 500b06a08..5d1fe273f 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } sourceSets { diff --git a/common/integrations/viaversion/build.gradle b/common/integrations/viaversion/build.gradle index 432fa407d..cffdf6738 100644 --- a/common/integrations/viaversion/build.gradle +++ b/common/integrations/viaversion/build.gradle @@ -13,6 +13,6 @@ repositories { } dependencies { - compileOnly 'com.viaversion:viaversion-api:4.7.0' + compileOnly 'com.viaversion:viaversion-api:4.10.2' api(project(':common')) } diff --git a/fabric/build.gradle b/fabric/build.gradle index 3ae7fa13a..1b6b8cacf 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { id 'fabric-loom' version '1.0.9' - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } evaluationDependsOn(':common') diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 070cb702f..17655d0ef 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/minestom/build.gradle b/minestom/build.gradle index 946198332..61faad2a0 100644 --- a/minestom/build.gradle +++ b/minestom/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } evaluationDependsOn(':common') @@ -13,18 +13,17 @@ sourceSets { } } -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.toolchain.languageVersion = JavaLanguageVersion.of(21) dependencies { api project(':common') - compileOnly 'com.github.Minestom:Minestom:954e8b3915' - compileOnly 'io.netty:netty-all:4.1.85.Final' + compileOnly 'com.github.Minestom:Minestom:19bb74e942' + // https://mvnrepository.com/artifact/dev.hollowcube/minestom-ce-extensions + compileOnly 'dev.hollowcube:minestom-ce-extensions:1.2.0' + + compileOnly 'io.netty:netty-all:4.1.110.Final' } -compileJava.javaCompiler.set( - javaToolchains.compilerFor { languageVersion = JavaLanguageVersion.of(17) } -) - processResources { inputs.property "version", project.version @@ -34,13 +33,12 @@ processResources { } tasks.withType(JavaCompile).configureEach { - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + it.options.release = 21 } shadowJar { archiveBaseName.set('NegativityMinestom') - archiveAppendix.set('1.19.3') + archiveAppendix.set('1.20.4') archiveClassifier.set(null) mergeServiceFiles() diff --git a/minestom/src/com/elikill58/negativity/minestom/MinestomAdapter.java b/minestom/src/com/elikill58/negativity/minestom/MinestomAdapter.java index 24e06e3b6..6fcdff610 100644 --- a/minestom/src/com/elikill58/negativity/minestom/MinestomAdapter.java +++ b/minestom/src/com/elikill58/negativity/minestom/MinestomAdapter.java @@ -41,6 +41,7 @@ import com.elikill58.negativity.universal.translation.TranslationProviderFactory; import com.elikill58.negativity.universal.utils.UniversalUtils; +import net.hollowcube.minestom.extensions.ExtensionBootstrap; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -138,7 +139,7 @@ public List getOnlinePlayersUUID() { @Override public double[] getTPS() { - return new double[] {MinecraftServer.TICK_PER_SECOND}; + return new double[] { 20 }; } @Override @@ -193,12 +194,12 @@ public Inventory createInventory(String inventoryName, int size, NegativityHolde @Override public @Nullable Player getPlayer(String name) { - return MinestomEntityManager.getPlayer(MinecraftServer.getConnectionManager().getPlayer(name)); + return MinestomEntityManager.getPlayer(MinecraftServer.getConnectionManager().getOnlinePlayerByUsername(name)); } @Override public @Nullable Player getPlayer(UUID uuid) { - return MinestomEntityManager.getPlayer(MinecraftServer.getConnectionManager().getPlayer(uuid)); + return MinestomEntityManager.getPlayer(MinecraftServer.getConnectionManager().getOnlinePlayerByUuid(uuid)); } @Override @@ -215,12 +216,12 @@ public Inventory createInventory(String inventoryName, int size, NegativityHolde @Override public boolean hasPlugin(String name) { - return MinecraftServer.getExtensionManager().hasExtension(name); + return ExtensionBootstrap.getExtensionManager().hasExtension(name); } @Override public ExternalPlugin getPlugin(String name) { - Extension e = MinecraftServer.getExtensionManager().getExtension(name); + Extension e = ExtensionBootstrap.getExtensionManager().getExtension(name); return e == null ? null : new MinestomExternalPlugin(e); } @@ -264,12 +265,12 @@ public VersionAdapter getVersionAdapter() { @Override public List getAllPlugins() { - return MinecraftServer.getExtensionManager().getExtensions().stream().map(Extension::getOrigin).map(DiscoveredExtension::getName).collect(Collectors.toList()); + return ExtensionBootstrap.getExtensionManager().getExtensions().stream().map(Extension::getOrigin).map(DiscoveredExtension::getName).collect(Collectors.toList()); } @Override public World getServerWorld(Player p) { - Instance i = MinecraftServer.getConnectionManager().getPlayer(p.getUniqueId()).getInstance(); + Instance i = MinecraftServer.getConnectionManager().getOnlinePlayerByUuid(p.getUniqueId()).getInstance(); return World.getWorld(i.getUniqueId().toString(), (a) -> new MinestomWorld(i)); } } diff --git a/minestom/src/com/elikill58/negativity/minestom/MinestomNegativity.java b/minestom/src/com/elikill58/negativity/minestom/MinestomNegativity.java index aef4d8e3e..f59e05009 100644 --- a/minestom/src/com/elikill58/negativity/minestom/MinestomNegativity.java +++ b/minestom/src/com/elikill58/negativity/minestom/MinestomNegativity.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.InputStream; +import java.net.URI; import java.net.URL; import java.nio.file.Files; import java.util.ArrayList; @@ -129,7 +130,7 @@ private void loadNetty() { String url = "https://repo1.maven.org/maven2/io/netty/" + requiredJarNames + "/" + nettyVersion + "/" + fileName; try { - try (InputStream in = new URL(url).openStream()) { + try (InputStream in = new URI(url).toURL().openStream()) { File jarFile = new File(netty, fileName); Files.copy(in, jarFile.toPath()); getLogger().info("[Negativity] Jar " + fileName + " downloaded."); diff --git a/minestom/src/com/elikill58/negativity/minestom/MinestomScheduler.java b/minestom/src/com/elikill58/negativity/minestom/MinestomScheduler.java index 4b4cc04ff..2cd996b22 100644 --- a/minestom/src/com/elikill58/negativity/minestom/MinestomScheduler.java +++ b/minestom/src/com/elikill58/negativity/minestom/MinestomScheduler.java @@ -30,22 +30,22 @@ public void runRepeating(Consumer task, int delayTicks, int inter @Override public ScheduledTask runRepeating(Runnable task, int delayTicks, int intervalTicks) { - return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.tick(delayTicks), TaskSchedule.tick(intervalTicks), ExecutionType.SYNC)); + return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.tick(delayTicks), TaskSchedule.tick(intervalTicks), ExecutionType.TICK_START)); } @Override public ScheduledTask runRepeating(Runnable task, int intervalTicks, @Nullable String name) { - return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.tick(intervalTicks), TaskSchedule.tick(intervalTicks), ExecutionType.SYNC)); + return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.tick(intervalTicks), TaskSchedule.tick(intervalTicks), ExecutionType.TICK_START)); } @Override public ScheduledTask runRepeatingAsync(Runnable task, Duration delay, Duration interval, @Nullable String name) { - return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.duration(delay), TaskSchedule.duration(interval), ExecutionType.ASYNC)); + return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.duration(delay), TaskSchedule.duration(interval), ExecutionType.TICK_END)); } @Override public ScheduledTask runDelayed(Runnable task, int delayTicks) { - return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.tick(delayTicks), TaskSchedule.stop(), ExecutionType.ASYNC)); + return new TaskWrapper(sh.scheduleTask(task, TaskSchedule.tick(delayTicks), TaskSchedule.stop(), ExecutionType.TICK_END)); } private static class TaskWrapper implements ScheduledTask { diff --git a/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomArrow.java b/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomArrow.java index 3500fb2d9..7f06c5cb8 100644 --- a/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomArrow.java +++ b/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomArrow.java @@ -4,7 +4,7 @@ import com.elikill58.negativity.api.entity.Entity; import com.elikill58.negativity.api.entity.EntityType; -import net.minestom.server.entity.metadata.arrow.ArrowMeta; +import net.minestom.server.entity.metadata.projectile.ArrowMeta; public class MinestomArrow extends MinestomEntity implements Arrow { diff --git a/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomOfflinePlayer.java b/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomOfflinePlayer.java index 7d2368cf2..9a576509e 100644 --- a/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomOfflinePlayer.java +++ b/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomOfflinePlayer.java @@ -27,7 +27,7 @@ public UUID getUniqueId() { @Override public boolean isOnline() { - return uuid != null && MinecraftServer.getConnectionManager().getPlayer(uuid) != null; + return uuid != null && MinecraftServer.getConnectionManager().getOnlinePlayerByUuid(uuid) != null; } @Override @@ -43,7 +43,7 @@ public boolean isOp() { @Override public String getName() { ConnectionManager cm = MinecraftServer.getConnectionManager(); - return name == null ? (uuid == null ? "??" : uuid.toString()) : (cm.getPlayer(uuid) == null ? uuid.toString() : cm.getPlayer(uuid).getUsername()); + return name == null ? (uuid == null ? "??" : uuid.toString()) : (cm.getOnlinePlayerByUuid(uuid) == null ? uuid.toString() : cm.getOnlinePlayerByUuid(uuid).getUsername()); } @Override diff --git a/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomPlayer.java b/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomPlayer.java index 5c9b6aa22..e8da08c9b 100644 --- a/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomPlayer.java +++ b/minestom/src/com/elikill58/negativity/minestom/impl/entity/MinestomPlayer.java @@ -93,7 +93,7 @@ public void setHealth(double health) { @Override public float getFallDistance() { - return (float) entity.getGravityAcceleration(); + return (float) entity.getAerodynamics().gravity(); } @Override @@ -108,7 +108,7 @@ public void setGameMode(GameMode gameMode) { @Override public void damage(double amount) { - entity.damage(DamageType.VOID, (float) amount); + entity.damage(DamageType.GENERIC, (float) amount); } @Override @@ -200,19 +200,19 @@ public double getEyeHeight() { @Override public boolean hasPotionEffect(PotionEffectType type) { - return entity.getActiveEffects().stream().filter(p -> p.getPotion().effect().key().asString().equalsIgnoreCase(type.getId())).count() > 0; + return entity.getActiveEffects().stream().filter(p -> p.potion().effect().key().asString().equalsIgnoreCase(type.getId())).count() > 0; } @Override public List getActivePotionEffect() { - return entity.getActiveEffects().stream().map(effect -> new PotionEffect(PotionEffectType.forId(effect.getPotion().effect().key().asString()), effect.getPotion().duration(), effect.getPotion().amplifier())).collect(Collectors.toList()); + return entity.getActiveEffects().stream().map(effect -> new PotionEffect(PotionEffectType.forId(effect.potion().effect().key().asString()), effect.potion().duration(), effect.potion().amplifier())).collect(Collectors.toList()); } @Override public Optional getPotionEffect(PotionEffectType type) { for(TimedPotion effect : entity.getActiveEffects()) { - if(effect.getPotion().effect().key().asString().equalsIgnoreCase(type.getId())) - return Optional.of(new PotionEffect(PotionEffectType.forId(effect.getPotion().effect().key().asString()), effect.getPotion().duration(), effect.getPotion().amplifier())); + if(effect.potion().effect().key().asString().equalsIgnoreCase(type.getId())) + return Optional.of(new PotionEffect(PotionEffectType.forId(effect.potion().effect().key().asString()), effect.potion().duration(), effect.potion().amplifier())); } return Optional.empty(); } diff --git a/minestom/src/com/elikill58/negativity/minestom/impl/inventory/MinestomInventory.java b/minestom/src/com/elikill58/negativity/minestom/impl/inventory/MinestomInventory.java index a5add5941..52e6e1050 100644 --- a/minestom/src/com/elikill58/negativity/minestom/impl/inventory/MinestomInventory.java +++ b/minestom/src/com/elikill58/negativity/minestom/impl/inventory/MinestomInventory.java @@ -74,6 +74,7 @@ public InventoryType getType() { return InventoryType.SMOKER; case STONE_CUTTER: return InventoryType.STONECUTTER; + case CRAFTER_3X3: case WINDOW_3X3: return InventoryType.PLAYER; } diff --git a/minestom/src/com/elikill58/negativity/minestom/listeners/PacketListeners.java b/minestom/src/com/elikill58/negativity/minestom/listeners/PacketListeners.java index 499aa6805..36dfca417 100644 --- a/minestom/src/com/elikill58/negativity/minestom/listeners/PacketListeners.java +++ b/minestom/src/com/elikill58/negativity/minestom/listeners/PacketListeners.java @@ -19,6 +19,7 @@ import net.minestom.server.event.EventNode; import net.minestom.server.event.player.PlayerPacketEvent; import net.minestom.server.event.player.PlayerPacketOutEvent; +import net.minestom.server.network.ConnectionState; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.packet.client.ClientPacket; import net.minestom.server.network.packet.server.ServerPacket; @@ -81,7 +82,7 @@ public void onPacket(PlayerPacketEvent e) { public void onPacket(PlayerPacketOutEvent e) { ServerPacket sp = e.getPacket(); Player p = MinestomEntityManager.getPlayer(e.getEntity()); - NPacket packet = getPacketFromWriter(p, sp, sp.getId(), PacketDirection.SERVER_TO_CLIENT); + NPacket packet = getPacketFromWriter(p, sp, sp.getId(ConnectionState.PLAY), PacketDirection.SERVER_TO_CLIENT); if(packet == null) { return; } diff --git a/minestom/src/com/elikill58/negativity/minestom/nms/MinestomPlayPackets.java b/minestom/src/com/elikill58/negativity/minestom/nms/MinestomPlayPackets.java index b1f040d4d..ab3a7897b 100644 --- a/minestom/src/com/elikill58/negativity/minestom/nms/MinestomPlayPackets.java +++ b/minestom/src/com/elikill58/negativity/minestom/nms/MinestomPlayPackets.java @@ -3,66 +3,80 @@ import java.util.HashMap; import net.minestom.server.network.packet.client.ClientPacket; +import net.minestom.server.network.packet.client.common.ClientKeepAlivePacket; +import net.minestom.server.network.packet.client.common.ClientPingRequestPacket; +import net.minestom.server.network.packet.client.common.ClientPluginMessagePacket; +import net.minestom.server.network.packet.client.common.ClientPongPacket; +import net.minestom.server.network.packet.client.common.ClientResourcePackStatusPacket; +import net.minestom.server.network.packet.client.common.ClientSettingsPacket; import net.minestom.server.network.packet.client.play.*; public class MinestomPlayPackets { private static HashMap, Integer> idPerPacket = new HashMap<>(); - + private static int nextId = 0; + private static int nextId() { + return nextId++; + } + static { // same as https://github.com/Minestom/Minestom/blob/master/src/main/java/net/minestom/server/network/packet/client/ClientPacketsHandler.java - register(0x00, ClientTeleportConfirmPacket.class); - register(0x01, ClientQueryBlockNbtPacket.class); - // 0x02 difficulty packet - register(0x03, ClientChatAckPacket.class); - register(0x04, ClientCommandChatPacket.class); - register(0x05, ClientChatMessagePacket.class); - register(0x06, ClientStatusPacket.class); - register(0x07, ClientSettingsPacket.class); - register(0x08, ClientTabCompletePacket.class); - register(0x09, ClientClickWindowButtonPacket.class); - register(0x0A, ClientClickWindowPacket.class); - register(0x0B, ClientCloseWindowPacket.class); - register(0x0C, ClientPluginMessagePacket.class); - register(0x0D, ClientEditBookPacket.class); - register(0x0E, ClientQueryEntityNbtPacket.class); - register(0x0F, ClientInteractEntityPacket.class); - register(0x10, ClientGenerateStructurePacket.class); - register(0x11, ClientKeepAlivePacket.class); - // 0x12 packet not used server-side - register(0x13, ClientPlayerPositionPacket.class); - register(0x14, ClientPlayerPositionAndRotationPacket.class); - register(0x15, ClientPlayerRotationPacket.class); - register(0x16, ClientPlayerPacket.class); - register(0x17, ClientVehicleMovePacket.class); - register(0x18, ClientSteerBoatPacket.class); - register(0x19, ClientPickItemPacket.class); - register(0x1A, ClientCraftRecipeRequest.class); - register(0x1B, ClientPlayerAbilitiesPacket.class); - register(0x1C, ClientPlayerDiggingPacket.class); - register(0x1D, ClientEntityActionPacket.class); - register(0x1E, ClientSteerVehiclePacket.class); - register(0x1F, ClientPongPacket.class); - register(0x20, ClientChatSessionUpdatePacket.class); - register(0x21, ClientSetRecipeBookStatePacket.class); - register(0x22, ClientSetDisplayedRecipePacket.class); - register(0x23, ClientNameItemPacket.class); - register(0x24, ClientResourcePackStatusPacket.class); - register(0x25, ClientAdvancementTabPacket.class); - register(0x26, ClientSelectTradePacket.class); - register(0x27, ClientSetBeaconEffectPacket.class); - register(0x28, ClientHeldItemChangePacket.class); - register(0x29, ClientUpdateCommandBlockPacket.class); - register(0x2A, ClientUpdateCommandBlockMinecartPacket.class); - register(0x2B, ClientCreativeInventoryActionPacket.class); - // 0x2B Update Jigsaw Block - register(0x2D, ClientUpdateStructureBlockPacket.class); - register(0x2E, ClientUpdateSignPacket.class); - register(0x2F, ClientAnimationPacket.class); - register(0x30, ClientSpectatePacket.class); - register(0x31, ClientPlayerBlockPlacementPacket.class); - register(0x32, ClientUseItemPacket.class); + register(nextId(), ClientTeleportConfirmPacket.class); + register(nextId(), ClientQueryBlockNbtPacket.class); + nextId(); // difficulty packet + register(nextId(), ClientChatAckPacket.class); + register(nextId(), ClientCommandChatPacket.class); + register(nextId(), ClientChatMessagePacket.class); + register(nextId(), ClientChatSessionUpdatePacket.class); + register(nextId(), ClientChunkBatchReceivedPacket.class); + register(nextId(), ClientStatusPacket.class); + register(nextId(), ClientSettingsPacket.class); + register(nextId(), ClientTabCompletePacket.class); + register(nextId(), ClientConfigurationAckPacket.class); + register(nextId(), ClientClickWindowButtonPacket.class); + register(nextId(), ClientClickWindowPacket.class); + register(nextId(), ClientCloseWindowPacket.class); + register(nextId(), ClientWindowSlotStatePacket.class); + register(nextId(), ClientPluginMessagePacket.class); + register(nextId(), ClientEditBookPacket.class); + register(nextId(), ClientQueryEntityNbtPacket.class); + register(nextId(), ClientInteractEntityPacket.class); + register(nextId(), ClientGenerateStructurePacket.class); + register(nextId(), ClientKeepAlivePacket.class); + nextId(); // lock difficulty + register(nextId(), ClientPlayerPositionPacket.class); + register(nextId(), ClientPlayerPositionAndRotationPacket.class); + register(nextId(), ClientPlayerRotationPacket.class); + register(nextId(), ClientPlayerPacket.class); + register(nextId(), ClientVehicleMovePacket.class); + register(nextId(), ClientSteerBoatPacket.class); + register(nextId(), ClientPickItemPacket.class); + register(nextId(), ClientPingRequestPacket.class); + register(nextId(), ClientCraftRecipeRequest.class); + register(nextId(), ClientPlayerAbilitiesPacket.class); + register(nextId(), ClientPlayerDiggingPacket.class); + register(nextId(), ClientEntityActionPacket.class); + register(nextId(), ClientSteerVehiclePacket.class); + register(nextId(), ClientPongPacket.class); + register(nextId(), ClientSetRecipeBookStatePacket.class); + register(nextId(), ClientSetDisplayedRecipePacket.class); + register(nextId(), ClientNameItemPacket.class); + register(nextId(), ClientResourcePackStatusPacket.class); + register(nextId(), ClientAdvancementTabPacket.class); + register(nextId(), ClientSelectTradePacket.class); + register(nextId(), ClientSetBeaconEffectPacket.class); + register(nextId(), ClientHeldItemChangePacket.class); + register(nextId(), ClientUpdateCommandBlockPacket.class); + register(nextId(), ClientUpdateCommandBlockMinecartPacket.class); + register(nextId(), ClientCreativeInventoryActionPacket.class); + nextId(); // Update Jigsaw Block + register(nextId(), ClientUpdateStructureBlockPacket.class); + register(nextId(), ClientUpdateSignPacket.class); + register(nextId(), ClientAnimationPacket.class); + register(nextId(), ClientSpectatePacket.class); + register(nextId(), ClientPlayerBlockPlacementPacket.class); + register(nextId(), ClientUseItemPacket.class); } private static void register(int id, Class clazz) { diff --git a/spigot/build.gradle b/spigot/build.gradle index 6e81c1ee2..292ccd3b8 100644 --- a/spigot/build.gradle +++ b/spigot/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } evaluationDependsOn(':common') diff --git a/sponge/build.gradle b/sponge/build.gradle index 3e4ef60ad..484127388 100644 --- a/sponge/build.gradle +++ b/sponge/build.gradle @@ -4,7 +4,7 @@ import org.spongepowered.plugin.metadata.model.PluginDependency import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' id 'org.spongepowered.gradle.plugin' version '2.0.2' id 'org.spongepowered.gradle.vanilla' version '0.2.1-SNAPSHOT' } diff --git a/sponge7/build.gradle b/sponge7/build.gradle index d96715747..a2a2cf65f 100644 --- a/sponge7/build.gradle +++ b/sponge7/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } evaluationDependsOn(':common') diff --git a/velocity/build.gradle b/velocity/build.gradle index 33bc71f89..c62819bd8 100644 --- a/velocity/build.gradle +++ b/velocity/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.github.johnrengelman.shadow' + id 'io.github.goooler.shadow' } evaluationDependsOn(':common') @@ -22,7 +22,7 @@ repositories { dependencies { api project(':common') - compileOnly 'com.velocitypowered:velocity-api:3.0.0' + compileOnly 'com.velocitypowered:velocity-api:3.1.1' } processResources { From 8106eb83c352c6f7986d605a30e2b1eb2b9017e9 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Wed, 5 Jun 2024 08:51:34 +0200 Subject: [PATCH 19/23] Update some dependencies --- bungee/build.gradle | 9 +++------ common/integrations/advancedban/build.gradle | 2 +- common/integrations/floodgate/build.gradle | 4 ++-- common/integrations/geysermc/build.gradle | 4 ++-- common/integrations/litebans/build.gradle | 2 +- spigot/integrations/essentials/build.gradle | 2 +- spigot/integrations/gadgetsmenu/build.gradle | 2 +- 7 files changed, 11 insertions(+), 14 deletions(-) diff --git a/bungee/build.gradle b/bungee/build.gradle index ea2828cc8..07a16478c 100644 --- a/bungee/build.gradle +++ b/bungee/build.gradle @@ -14,21 +14,18 @@ sourceSets { } repositories { + mavenCentral() maven { name 'sonatype' url 'https://oss.sonatype.org/content/repositories/snapshots/' } - maven { - name 'jitpack' - url 'https://jitpack.io' - } } dependencies { api project(':common') implementation 'org.bstats:bstats-bungeecord-lite:1.7' - compileOnly 'net.md-5:bungeecord-api:1.19-R0.1-SNAPSHOT' - compileOnly 'net.md-5:bungeecord-chat:1.19-R0.1-SNAPSHOT' + compileOnly 'net.md-5:bungeecord-api:1.20-R0.1-SNAPSHOT' + compileOnly 'net.md-5:bungeecord-chat:1.20-R0.1-SNAPSHOT' compileOnly 'com.github.minecrafter:RedisBungee:master' } diff --git a/common/integrations/advancedban/build.gradle b/common/integrations/advancedban/build.gradle index 96330bbc1..3b99fe190 100644 --- a/common/integrations/advancedban/build.gradle +++ b/common/integrations/advancedban/build.gradle @@ -6,7 +6,7 @@ sourceSets { } dependencies { - compileOnly 'com.github.DevLeoko:AdvancedBan:v2.2.1' + compileOnly 'com.github.DevLeoko:AdvancedBan:v2.3.0' api project(':common') //compileOnly(project(':common')) } diff --git a/common/integrations/floodgate/build.gradle b/common/integrations/floodgate/build.gradle index 74bcd4068..757e3fb21 100644 --- a/common/integrations/floodgate/build.gradle +++ b/common/integrations/floodgate/build.gradle @@ -10,11 +10,11 @@ sourceSets { repositories { maven { name 'geyser' - url 'https://repo.opencollab.dev/maven-snapshots/' + url 'https://repo.opencollab.dev/main/' } } dependencies { - compileOnly 'org.geysermc.floodgate:api:2.2.0-SNAPSHOT' + compileOnly 'org.geysermc.floodgate:api:2.2.2-SNAPSHOT' api(project(':common')) } diff --git a/common/integrations/geysermc/build.gradle b/common/integrations/geysermc/build.gradle index da487a12e..8c3f56752 100644 --- a/common/integrations/geysermc/build.gradle +++ b/common/integrations/geysermc/build.gradle @@ -17,8 +17,8 @@ configurations { repositories { maven { - name 'geyser' - url 'https://repo.opencollab.dev/maven-snapshots/' + name 'geyser-main' + url 'https://repo.opencollab.dev/main/' } } diff --git a/common/integrations/litebans/build.gradle b/common/integrations/litebans/build.gradle index 19c47ffce..789753d71 100644 --- a/common/integrations/litebans/build.gradle +++ b/common/integrations/litebans/build.gradle @@ -6,6 +6,6 @@ sourceSets { } dependencies { - compileOnly 'com.gitlab.ruany:LiteBansAPI:0.3.4' + compileOnly 'com.gitlab.ruany:LiteBansAPI:0.5.0' api(project(':common')) } diff --git a/spigot/integrations/essentials/build.gradle b/spigot/integrations/essentials/build.gradle index b176c40bc..70330b709 100644 --- a/spigot/integrations/essentials/build.gradle +++ b/spigot/integrations/essentials/build.gradle @@ -19,7 +19,7 @@ repositories { } dependencies { - compileOnly 'net.ess3:EssentialsX:2.17.2' + compileOnly 'net.ess3:EssentialsX:2.18.2' api(project(':spigot')) compileOnly(project(path: ':spigot', configuration: 'spigot')) } diff --git a/spigot/integrations/gadgetsmenu/build.gradle b/spigot/integrations/gadgetsmenu/build.gradle index 27c789bc2..bb88bb46a 100644 --- a/spigot/integrations/gadgetsmenu/build.gradle +++ b/spigot/integrations/gadgetsmenu/build.gradle @@ -8,7 +8,7 @@ sourceSets { } dependencies { - compileOnly 'com.yapzhenyie:GadgetsMenu:4.3.29' + compileOnly 'com.yapzhenyie:GadgetsMenu:4.13.1' api(project(':spigot')) compileOnly(project(path: ':spigot', configuration: 'spigot')) } From 3f5a5a96ecddae41de50b38cbb4259c840ee043a Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 18 Jun 2024 19:38:56 +0200 Subject: [PATCH 20/23] Fix 1.20.6 --- .../src/com/elikill58/negativity/spigot/utils/PacketUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java b/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java index a93bcab46..2dbed7c90 100644 --- a/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java +++ b/spigot/src/com/elikill58/negativity/spigot/utils/PacketUtils.java @@ -177,7 +177,7 @@ public static int getProtocolVersion() { Class sharedConstants = PacketUtils.getNmsClass("SharedConstants", ""); try { // try get value directly return (int) sharedConstants.getDeclaredField("RELEASE_NETWORK_PROTOCOL_VERSION").get(null); - } catch (Exception e) { e.printStackTrace(); } + } catch (Exception e) {} return (int) sharedConstants.getDeclaredMethod("c").invoke(null); } catch (Exception e) { e.printStackTrace(); } // ignore because it's just an old version try { From 6b7cc112a31a90bc3d1ebe62f6f3132e19a26d5f Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 18 Jun 2024 20:00:46 +0200 Subject: [PATCH 21/23] Fix #426 --- .../spigot/nms/SpigotVersionAdapter.java | 21 ++++++++++++++----- .../negativity/spigot/nms/Spigot_1_21_R1.java | 16 ++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_21_R1.java diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java index 118e1e29f..8bf694744 100644 --- a/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java +++ b/spigot/src/com/elikill58/negativity/spigot/nms/SpigotVersionAdapter.java @@ -102,11 +102,20 @@ private boolean hasMinField(Class bbClass) { public double getAverageTps() { try { - long[] array = (long[]) tpsField.get(dedicatedServer); - long l = 0L; - for (long m : array) - l += m; - return l / array.length; + Object tps = tpsField.get(dedicatedServer); + if(tps instanceof long[]) { + long[] array = (long[]) tps; + long l = 0L; + for (long m : array) + l += m; + return l / array.length; + } else { + double[] array = (double[]) tps; + double l = 0L; + for (double m : array) + l += m; + return l / array.length; + } } catch (Exception e) { e.printStackTrace(); return 0; @@ -315,6 +324,8 @@ public static SpigotVersionAdapter getVersionAdapter() { return instance = new Spigot_1_20_R3(); case "v1_20_R4": return instance = new Spigot_1_20_R4(); + case "v1_21_R1": + return instance = new Spigot_1_21_R1(); default: return instance = new Spigot_UnknowVersion(VERSION); } diff --git a/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_21_R1.java b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_21_R1.java new file mode 100644 index 000000000..3065931d5 --- /dev/null +++ b/spigot/src/com/elikill58/negativity/spigot/nms/Spigot_1_21_R1.java @@ -0,0 +1,16 @@ +package com.elikill58.negativity.spigot.nms; + +import com.elikill58.negativity.spigot.SubPlatform; +import com.elikill58.negativity.spigot.utils.PacketUtils; + +public class Spigot_1_21_R1 extends SpigotVersionAdapter { + + public Spigot_1_21_R1() { + super(PacketUtils.getProtocolVersion()); + } + + @Override + public String getTpsFieldName() { + return SubPlatform.getSubPlatform().equals(SubPlatform.FOLIA) ? "tickTimesNanos" : "ab"; + } +} From 66f06dc1e4efcf28994ef4d8c05e9dae7a6edde9 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 18 Jun 2024 23:22:28 +0200 Subject: [PATCH 22/23] Upgrade loom versions --- fabric/build.gradle | 2 +- fabric/gradle.properties | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 1b6b8cacf..4ef6b11ef 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'fabric-loom' version '1.0.9' + id 'fabric-loom' version '1.7-SNAPSHOT' id 'io.github.goooler.shadow' } diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 95d06ad9e..833339616 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -1,10 +1,8 @@ # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.19.2 -yarn_mappings=1.19.2+build.28 -loader_version=0.14.10 +minecraft_version=1.20.6 +yarn_mappings=1.20.6+build.3 +loader_version=0.15.11 -#Fabric api -fabric_version=0.66.0+1.19.2 - -org.gradle.jvmargs=-Xmx6G +# Fabric API +fabric_version=0.100.2+1.20.6 From 1351de3c7a1903469146f21e92de96f7628a09d0 Mon Sep 17 00:00:00 2001 From: Elikill58 Date: Tue, 18 Jun 2024 23:30:02 +0200 Subject: [PATCH 23/23] Wrong fabric versions for java --- fabric/build.gradle | 2 +- fabric/gradle.properties | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 4ef6b11ef..625fca13a 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.6-SNAPSHOT' id 'io.github.goooler.shadow' } diff --git a/fabric/gradle.properties b/fabric/gradle.properties index 833339616..d0433b55b 100644 --- a/fabric/gradle.properties +++ b/fabric/gradle.properties @@ -1,8 +1,8 @@ # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_version=1.20.6 -yarn_mappings=1.20.6+build.3 +minecraft_version=1.20 +yarn_mappings=1.20+build.1 loader_version=0.15.11 # Fabric API -fabric_version=0.100.2+1.20.6 +fabric_version=0.83.0+1.20