From 0bf2697c255315525576bd3c801591d929cd9d0f Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Fri, 30 Jan 2026 18:28:07 +0100 Subject: [PATCH] feat: Commands --- build.sh | 5 + java/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 46175 bytes java/gradle/wrapper/gradle-wrapper.properties | 2 +- java/gradlew | 9 +- java/gradlew.bat | 3 +- .../patchbukkit/PatchBukkitPluginManager.java | 71 +- .../org/patchbukkit/PatchBukkitServer.java | 64 +- .../patchbukkit/command/CommandFactory.java | 18 + .../command/PatchBukkitCommandMap.java | 128 ++ .../command/PatchBukkitCommandSender.java | 145 ++ .../PatchBukkitConsoleCommandSender.java | 187 ++ .../patchbukkit/entity/PatchBukkitEntity.java | 961 +++++++++- .../entity/PatchBukkitHumanEntity.java | 1306 ++++++++++++- .../entity/PatchBukkitLivingEntity.java | 836 +++++++- .../patchbukkit/entity/PatchBukkitPlayer.java | 1682 ++++++++++++++++- rust/Cargo.lock | 445 +++-- rust/Cargo.toml | 2 +- rust/src/config/spigot.rs | 2 +- rust/src/events/join.rs | 34 +- rust/src/java/jvm/command_executor.rs | 54 + rust/src/java/jvm/commands.rs | 18 +- rust/src/java/jvm/mod.rs | 1 + rust/src/java/jvm/worker.rs | 92 +- rust/src/lib.rs | 8 +- rust/src/plugin/manager.rs | 198 +- 25 files changed, 6011 insertions(+), 260 deletions(-) create mode 100755 build.sh create mode 100644 java/patchbukkit/src/main/java/org/patchbukkit/command/CommandFactory.java create mode 100644 java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandMap.java create mode 100644 java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandSender.java create mode 100644 java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitConsoleCommandSender.java create mode 100644 rust/src/java/jvm/command_executor.rs diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..d72e28d --- /dev/null +++ b/build.sh @@ -0,0 +1,5 @@ +cd java +./gradlew build +cd .. +cd rust +cargo build \ No newline at end of file diff --git a/java/gradle/wrapper/gradle-wrapper.jar b/java/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..61285a659d17295f1de7c53e24fdf13ad755c379 100644 GIT binary patch delta 38035 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 delta 35367 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 bGw(yDn9y5uP{^#BHc#sZ2+}>FxUKvR8%l3M diff --git a/java/gradle/wrapper/gradle-wrapper.properties b/java/gradle/wrapper/gradle-wrapper.properties index e18bc25..37f78a6 100644 --- a/java/gradle/wrapper/gradle-wrapper.properties +++ b/java/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/java/gradlew b/java/gradlew index f3b75f3..adff685 100755 --- a/java/gradlew +++ b/java/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -205,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/java/gradlew.bat b/java/gradlew.bat index 9d21a21..c4bdd3a 100644 --- a/java/gradlew.bat +++ b/java/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java index 02e9878..846770d 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitPluginManager.java @@ -3,8 +3,12 @@ package org.patchbukkit; import io.papermc.paper.plugin.PermissionManager; import io.papermc.paper.plugin.configuration.PluginMeta; import java.io.File; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + import org.bukkit.Server; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; @@ -18,43 +22,39 @@ import org.jspecify.annotations.NonNull; @SuppressWarnings("removal") public class PatchBukkitPluginManager implements PluginManager { - - final PatchBukkitEventManager patchBukkitEventManager; + private final Server server; + private final PatchBukkitEventManager eventManager; + private final Map plugins = new ConcurrentHashMap<>(); + private final Map permissions = new HashMap<>(); public PatchBukkitPluginManager(Server server) { - this.patchBukkitEventManager = new PatchBukkitEventManager(server); + this.server = server; + this.eventManager = new PatchBukkitEventManager(server); } @Override public void registerInterface(@NotNull Class loader) throws IllegalArgumentException {} - @Override + @Override public @Nullable Plugin getPlugin(@NotNull String name) { - throw new UnsupportedOperationException( - "Unimplemented method 'getPlugin'" - ); + return plugins.get(name); } - @Override + @Override public @NotNull Plugin[] getPlugins() { - throw new UnsupportedOperationException( - "Unimplemented method 'getPlugins'" - ); + return plugins.values().toArray(new Plugin[0]); } @Override public boolean isPluginEnabled(@NotNull String name) { - throw new UnsupportedOperationException( - "Unimplemented method 'isPluginEnabled'" - ); + Plugin plugin = getPlugin(name); + return plugin != null && plugin.isEnabled(); } @Override public boolean isPluginEnabled(@Nullable Plugin plugin) { - throw new UnsupportedOperationException( - "Unimplemented method 'isPluginEnabled'" - ); + return plugin != null && plugins.containsValue(plugin) && plugin.isEnabled(); } @Override @@ -95,15 +95,12 @@ public class PatchBukkitPluginManager implements PluginManager { @Override public void callEvent(@NotNull Event event) throws IllegalStateException { - this.patchBukkitEventManager.callEvent(event); + this.eventManager.callEvent(event); } @Override - public void registerEvents( - @NotNull Listener listener, - @NotNull Plugin plugin - ) { - this.patchBukkitEventManager.registerEvents(listener, plugin); + public void registerEvents(@NotNull Listener listener, @NotNull Plugin plugin) { + this.eventManager.registerEvents(listener, plugin); } @Override @@ -114,7 +111,7 @@ public class PatchBukkitPluginManager implements PluginManager { @NotNull EventExecutor executor, @NotNull Plugin plugin ) { - this.patchBukkitEventManager.registerEvent( + this.eventManager.registerEvent( event, listener, priority, @@ -132,7 +129,7 @@ public class PatchBukkitPluginManager implements PluginManager { @NotNull Plugin plugin, boolean ignoreCancelled ) { - this.patchBukkitEventManager.registerEvent( + this.eventManager.registerEvent( event, listener, priority, @@ -144,30 +141,30 @@ public class PatchBukkitPluginManager implements PluginManager { @Override public void enablePlugin(@NotNull Plugin plugin) { - throw new UnsupportedOperationException( - "Unimplemented method 'enablePlugin'" - ); + if (!plugin.isEnabled()) { + try { + plugin.getPluginLoader().enablePlugin(plugin); + } catch (Throwable ex) { + server.getLogger().severe("Error enabling " + plugin.getName() + ": " + ex.getMessage()); + } + } } @Override public void disablePlugin(@NotNull Plugin plugin) { - throw new UnsupportedOperationException( - "Unimplemented method 'disablePlugin'" - ); + if (plugin.isEnabled()) { + plugin.getPluginLoader().disablePlugin(plugin); + } } @Override public @Nullable Permission getPermission(@NotNull String name) { - throw new UnsupportedOperationException( - "Unimplemented method 'getPermission'" - ); + return permissions.get(name); } @Override public void addPermission(@NotNull Permission perm) { - throw new UnsupportedOperationException( - "Unimplemented method 'addPermission'" - ); + permissions.put(perm.getName(), perm); } @Override diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java index 35c2f2d..07988be 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/PatchBukkitServer.java @@ -12,6 +12,7 @@ import java.awt.image.BufferedImage; import java.io.File; import java.net.InetAddress; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -47,6 +48,7 @@ import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.boss.KeyedBossBar; +import org.bukkit.command.Command; import org.bukkit.command.CommandException; import org.bukkit.command.CommandMap; import org.bukkit.command.CommandSender; @@ -83,6 +85,8 @@ import org.bukkit.structure.StructureManager; import org.bukkit.util.CachedServerIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.patchbukkit.command.PatchBukkitCommandMap; +import org.patchbukkit.command.PatchBukkitConsoleCommandSender; @SuppressWarnings("removal") public class PatchBukkitServer implements Server { @@ -90,9 +94,31 @@ public class PatchBukkitServer implements Server { private final String serverName = io.papermc.paper.ServerBuildInfo.buildInfo().brandName(); private final String bukkitVersion = Versioning.getBukkitVersion(); + private final CommandMap commandMap = new PatchBukkitCommandMap(); + + private final Map onlinePlayers = new java.util.concurrent.ConcurrentHashMap<>(); + private final Map onlinePlayersByName = new java.util.concurrent.ConcurrentHashMap<>(); private final Logger logger = Logger.getLogger("Minecraft"); + /** + * Called from Rust when a player joins the Pumpkin server + */ + public void registerPlayer(Player player) { + this.onlinePlayers.put(player.getUniqueId(), player); + this.onlinePlayersByName.put(player.getName().toLowerCase(), player); + } + + /** + * Called from Rust when a player leaves + */ + public void unregisterPlayer(UUID uuid) { + Player p = this.onlinePlayers.remove(uuid); + if (p != null) { + this.onlinePlayersByName.remove(p.getName().toLowerCase()); + } + } + @Override public void sendPluginMessage( @NotNull Plugin source, @@ -157,10 +183,7 @@ public class PatchBukkitServer implements Server { @Override public @NotNull Collection getOnlinePlayers() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getOnlinePlayers'" - ); + return Collections.unmodifiableCollection(onlinePlayers.values()); } @Override @@ -403,18 +426,12 @@ public class PatchBukkitServer implements Server { @Override public @Nullable Player getPlayer(@NotNull String name) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getPlayer'" - ); + return onlinePlayersByName.get(name.toLowerCase()); } @Override public @Nullable Player getPlayerExact(@NotNull String name) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getPlayerExact'" - ); + return onlinePlayersByName.get(name.toLowerCase()); } @Override @@ -425,12 +442,9 @@ public class PatchBukkitServer implements Server { ); } - @Override + @Override public @Nullable Player getPlayer(@NotNull UUID id) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getPlayer'" - ); + return onlinePlayers.get(id); } @Override @@ -634,10 +648,8 @@ public class PatchBukkitServer implements Server { @Override public @Nullable PluginCommand getPluginCommand(@NotNull String name) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getPluginCommand'" - ); + Command cmd = this.commandMap.getCommand(name); + return (cmd instanceof PluginCommand) ? (PluginCommand) cmd : null; } @Override @@ -1002,10 +1014,7 @@ public class PatchBukkitServer implements Server { @Override public @NotNull ConsoleCommandSender getConsoleSender() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getConsoleSender'" - ); + return new PatchBukkitConsoleCommandSender(); } @Override @@ -1412,10 +1421,7 @@ public class PatchBukkitServer implements Server { @Override public @NotNull CommandMap getCommandMap() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException( - "Unimplemented method 'getCommandMap'" - ); + return commandMap; } @Override diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/command/CommandFactory.java b/java/patchbukkit/src/main/java/org/patchbukkit/command/CommandFactory.java new file mode 100644 index 0000000..47bf467 --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/command/CommandFactory.java @@ -0,0 +1,18 @@ +package org.patchbukkit.command; + +import java.lang.reflect.Constructor; +import org.bukkit.command.PluginCommand; +import org.bukkit.plugin.Plugin; + +public class CommandFactory { + public static PluginCommand create(String name, Plugin plugin) { + try { + Constructor constructor = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class); + constructor.setAccessible(true); + return constructor.newInstance(name, plugin); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandMap.java b/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandMap.java new file mode 100644 index 0000000..9007089 --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandMap.java @@ -0,0 +1,128 @@ +package org.patchbukkit.command; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandException; +import org.bukkit.command.CommandMap; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PatchBukkitCommandMap implements CommandMap { + // We use Command as the value to support both PluginCommand and vanilla commands + private final Map knownCommands = new HashMap<>(); + + @Override + public void registerAll(@NotNull String fallbackPrefix, @NotNull List commands) { + for (Command command : commands) { + register(fallbackPrefix, command); + } + } + + @Override + public boolean register(@NotNull String label, @NotNull String fallbackPrefix, @NotNull Command command) { + label = label.toLowerCase().trim(); + fallbackPrefix = fallbackPrefix.toLowerCase().trim(); + + // 1. Register under the direct label if not taken + boolean registeredDirectly = false; + if (!knownCommands.containsKey(label)) { + knownCommands.put(label, command); + registeredDirectly = true; + } + + // 2. Always register under the fallback prefix (pluginname:label) + knownCommands.put(fallbackPrefix + ":" + label, command); + + // 3. Register aliases + for (String alias : command.getAliases()) { + alias = alias.toLowerCase().trim(); + if (!knownCommands.containsKey(alias)) { + knownCommands.put(alias, command); + } + knownCommands.put(fallbackPrefix + ":" + alias, command); + } + + return registeredDirectly; + } + + @Override + public boolean register(@NotNull String fallbackPrefix, @NotNull Command command) { + return register(command.getName(), fallbackPrefix, command); + } + + @Override + public boolean dispatch(@NotNull CommandSender sender, @NotNull String cmdLine) throws CommandException { + // Remove leading slash if present and split arguments + String[] split = (cmdLine.startsWith("/") ? cmdLine.substring(1) : cmdLine).split(" "); + if (split.length == 0) return false; + + String sentLabel = split[0].toLowerCase(); + Command command = knownCommands.get(sentLabel); + + if (command == null) { + return false; // Command not found + } + + try { + // Extract arguments (everything after the label) + String[] args = Arrays.copyOfRange(split, 1, split.length); + // This triggers the PluginCommand.execute() method you implemented earlier + return command.execute(sender, sentLabel, args); + } catch (Exception ex) { + throw new CommandException("Unhandled exception executing '" + cmdLine + "'", ex); + } + } + + @Override + public void clearCommands() { + knownCommands.clear(); + } + + @Override + public @Nullable Command getCommand(@NotNull String name) { + return knownCommands.get(name.toLowerCase()); + } + + @Override + public @NotNull Map getKnownCommands() { + return Collections.unmodifiableMap(knownCommands); + } + + @Override + public @Nullable List tabComplete(@NotNull CommandSender sender, @NotNull String cmdLine) { + return tabComplete(sender, cmdLine, null); + } + + @Override + public @Nullable List tabComplete(@NotNull CommandSender sender, @NotNull String cmdLine, @Nullable Location location) { + String[] split = cmdLine.split(" ", -1); + if (split.length == 0) return new ArrayList<>(); + + String label = split[0].toLowerCase(); + Command command = knownCommands.get(label); + + // If typing the first word, return matching command names + if (split.length == 1) { + List completions = new ArrayList<>(); + for (String key : knownCommands.keySet()) { + if (key.startsWith(label)) completions.add(key); + } + return completions; + } + + // Otherwise, delegate to the specific command's tab completer + if (command != null) { + String[] args = Arrays.copyOfRange(split, 1, split.length); + return command.tabComplete(sender, label, args, location); + } + + return null; + } +} \ No newline at end of file diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandSender.java b/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandSender.java new file mode 100644 index 0000000..4cc9a26 --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitCommandSender.java @@ -0,0 +1,145 @@ +package org.patchbukkit.command; + +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Server; +import org.bukkit.command.CommandSender; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import net.kyori.adventure.text.Component; + +public class PatchBukkitCommandSender implements CommandSender { + + @Override + public boolean isPermissionSet(@NotNull String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPermissionSet'"); + } + + @Override + public boolean isPermissionSet(@NotNull Permission perm) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPermissionSet'"); + } + + @Override + public boolean hasPermission(@NotNull String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPermission'"); + } + + @Override + public boolean hasPermission(@NotNull Permission perm) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPermission'"); + } + + @Override + public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String name, boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String name, boolean value, + int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public void removeAttachment(@NotNull PermissionAttachment attachment) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeAttachment'"); + } + + @Override + public void recalculatePermissions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'recalculatePermissions'"); + } + + @Override + public @NotNull Set getEffectivePermissions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEffectivePermissions'"); + } + + @Override + public boolean isOp() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isOp'"); + } + + @Override + public void setOp(boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setOp'"); + } + + @Override + public void sendMessage(@NotNull String message) { + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@NotNull String... messages) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@Nullable UUID sender, @NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@Nullable UUID sender, @NotNull String... messages) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public @NotNull Server getServer() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getServer'"); + } + + @Override + public @NotNull String getName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getName'"); + } + + @Override + public @NotNull Spigot spigot() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'spigot'"); + } + + @Override + public @NotNull Component name() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'name'"); + } + +} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitConsoleCommandSender.java b/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitConsoleCommandSender.java new file mode 100644 index 0000000..d09808e --- /dev/null +++ b/java/patchbukkit/src/main/java/org/patchbukkit/command/PatchBukkitConsoleCommandSender.java @@ -0,0 +1,187 @@ +package org.patchbukkit.command; + +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Server; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; +import org.checkerframework.checker.units.qual.m; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import net.kyori.adventure.text.Component; + +public class PatchBukkitConsoleCommandSender implements ConsoleCommandSender { + + @Override + public void sendMessage(@NotNull String message) { + System.out.println(message); + } + + @Override + public void sendMessage(@NotNull String... messages) { + System.out.println(messages); + } + + @Override + public void sendMessage(@Nullable UUID sender, @NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@Nullable UUID sender, @NotNull String... messages) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public @NotNull Server getServer() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getServer'"); + } + + @Override + public @NotNull String getName() { + return "CONSOLE"; + } + + @Override + public @NotNull Spigot spigot() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'spigot'"); + } + + @Override + public @NotNull Component name() { + return Component.text("CONSOLE"); + } + + @Override + public boolean isPermissionSet(@NotNull String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPermissionSet'"); + } + + @Override + public boolean isPermissionSet(@NotNull Permission perm) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPermissionSet'"); + } + + @Override + public boolean hasPermission(@NotNull String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPermission'"); + } + + @Override + public boolean hasPermission(@NotNull Permission perm) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPermission'"); + } + + @Override + public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String name, boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String name, boolean value, + int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public void removeAttachment(@NotNull PermissionAttachment attachment) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeAttachment'"); + } + + @Override + public void recalculatePermissions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'recalculatePermissions'"); + } + + @Override + public @NotNull Set getEffectivePermissions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEffectivePermissions'"); + } + + @Override + public boolean isOp() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isOp'"); + } + + @Override + public void setOp(boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setOp'"); + } + + @Override + public boolean isConversing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isConversing'"); + } + + @Override + public void acceptConversationInput(@NotNull String input) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'acceptConversationInput'"); + } + + @Override + public boolean beginConversation(@NotNull Conversation conversation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'beginConversation'"); + } + + @Override + public void abandonConversation(@NotNull Conversation conversation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'abandonConversation'"); + } + + @Override + public void abandonConversation(@NotNull Conversation conversation, @NotNull ConversationAbandonedEvent details) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'abandonConversation'"); + } + + @Override + public void sendRawMessage(@NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendRawMessage'"); + } + + @Override + public void sendRawMessage(@Nullable UUID sender, @NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendRawMessage'"); + } + +} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitEntity.java b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitEntity.java index 38d1bfe..182130a 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitEntity.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitEntity.java @@ -1,21 +1,966 @@ package org.patchbukkit.entity; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import org.bukkit.EntityEffect; +import org.bukkit.Location; +import org.bukkit.Server; +import org.bukkit.Sound; +import org.bukkit.World; +import org.bukkit.block.BlockFace; +import org.bukkit.block.PistonMoveReaction; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntitySnapshot; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Pose; +import org.bukkit.entity.SpawnCategory; +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.plugin.Plugin; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.patchbukkit.PatchBukkitServer; +import io.papermc.paper.datacomponent.DataComponentType; +import io.papermc.paper.datacomponent.DataComponentType.Valued; +import io.papermc.paper.entity.LookAnchor; +import io.papermc.paper.entity.TeleportFlag; +import io.papermc.paper.threadedregions.scheduler.EntityScheduler; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.util.TriState; + public class PatchBukkitEntity implements Entity { - protected final PatchBukkitServer server; - protected Entity entity; - private final EntityType entityType; + protected final UUID uuid; + private final String name; public PatchBukkitEntity( - final PatchBukkitServer server, - final Entity entity + UUID uuid, + String name ) { - this.server = server; - this.entity = entity; - this.entityType = CraftEntityType.minecraftToBukkit(entity.getType()); + this.uuid = uuid; + this.name = name; + } + + @Override + public void setMetadata(@NotNull String metadataKey, @NotNull MetadataValue newMetadataValue) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMetadata'"); + } + + @Override + public @NotNull List getMetadata(@NotNull String metadataKey) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMetadata'"); + } + + @Override + public boolean hasMetadata(@NotNull String metadataKey) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasMetadata'"); + } + + @Override + public void removeMetadata(@NotNull String metadataKey, @NotNull Plugin owningPlugin) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeMetadata'"); + } + + @Override + public void sendMessage(@NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@NotNull String... messages) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@Nullable UUID sender, @NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public void sendMessage(@Nullable UUID sender, @NotNull String... messages) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMessage'"); + } + + @Override + public @NotNull String getName() { + return this.name; + } + + @Override + public @NotNull Component name() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'name'"); + } + + @Override + public boolean isPermissionSet(@NotNull String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPermissionSet'"); + } + + @Override + public boolean isPermissionSet(@NotNull Permission perm) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPermissionSet'"); + } + + @Override + public boolean hasPermission(@NotNull String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPermission'"); + } + + @Override + public boolean hasPermission(@NotNull Permission perm) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPermission'"); + } + + @Override + public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String name, boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String name, boolean value, + int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAttachment'"); + } + + @Override + public void removeAttachment(@NotNull PermissionAttachment attachment) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeAttachment'"); + } + + @Override + public void recalculatePermissions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'recalculatePermissions'"); + } + + @Override + public @NotNull Set getEffectivePermissions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEffectivePermissions'"); + } + + @Override + public boolean isOp() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isOp'"); + } + + @Override + public void setOp(boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setOp'"); + } + + @Override + public @Nullable Component customName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'customName'"); + } + + @Override + public void customName(@Nullable Component customName) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'customName'"); + } + + @Override + public @Nullable String getCustomName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCustomName'"); + } + + @Override + public void setCustomName(@Nullable String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCustomName'"); + } + + @Override + public @NotNull PersistentDataContainer getPersistentDataContainer() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPersistentDataContainer'"); + } + + @Override + public @org.jspecify.annotations.Nullable T getData(Valued type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getData'"); + } + + @Override + public @org.jspecify.annotations.Nullable T getDataOrDefault(Valued type, + @org.jspecify.annotations.Nullable T fallback) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDataOrDefault'"); + } + + @Override + public boolean hasData(DataComponentType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasData'"); + } + + @Override + public @NotNull Location getLocation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLocation'"); + } + + @Override + public @Nullable Location getLocation(@Nullable Location loc) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLocation'"); + } + + @Override + public void setVelocity(@NotNull Vector velocity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setVelocity'"); + } + + @Override + public @NotNull Vector getVelocity() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getVelocity'"); + } + + @Override + public double getHeight() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHeight'"); + } + + @Override + public double getWidth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWidth'"); + } + + @Override + public @NotNull BoundingBox getBoundingBox() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBoundingBox'"); + } + + @Override + public boolean isOnGround() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isOnGround'"); + } + + @Override + public boolean isInWater() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInWater'"); + } + + @Override + public @NotNull World getWorld() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWorld'"); + } + + @Override + public void setRotation(float yaw, float pitch) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRotation'"); + } + + @Override + public boolean teleport(@NotNull Location location, @NotNull TeleportCause cause, + @NotNull TeleportFlag @NotNull... teleportFlags) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teleport'"); + } + + @Override + public void lookAt(double x, double y, double z, @NotNull LookAnchor entityAnchor) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'lookAt'"); + } + + @Override + public boolean teleport(@NotNull Location location) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teleport'"); + } + + @Override + public boolean teleport(@NotNull Location location, @NotNull TeleportCause cause) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teleport'"); + } + + @Override + public boolean teleport(@NotNull Entity destination) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teleport'"); + } + + @Override + public boolean teleport(@NotNull Entity destination, @NotNull TeleportCause cause) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teleport'"); + } + + @Override + public @NotNull CompletableFuture teleportAsync(@NotNull Location loc, @NotNull TeleportCause cause, + @NotNull TeleportFlag @NotNull... teleportFlags) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teleportAsync'"); + } + + @Override + public @NotNull List getNearbyEntities(double x, double y, double z) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getNearbyEntities'"); + } + + @Override + public int getEntityId() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEntityId'"); + } + + @Override + public int getFireTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFireTicks'"); + } + + @Override + public int getMaxFireTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaxFireTicks'"); + } + + @Override + public void setFireTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFireTicks'"); + } + + @Override + public void setVisualFire(boolean fire) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setVisualFire'"); + } + + @Override + public void setVisualFire(@NotNull TriState fire) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setVisualFire'"); + } + + @Override + public boolean isVisualFire() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isVisualFire'"); + } + + @Override + public @NotNull TriState getVisualFire() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getVisualFire'"); + } + + @Override + public int getFreezeTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFreezeTicks'"); + } + + @Override + public int getMaxFreezeTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaxFreezeTicks'"); + } + + @Override + public void setFreezeTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFreezeTicks'"); + } + + @Override + public boolean isFrozen() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isFrozen'"); + } + + @Override + public void setInvisible(boolean invisible) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setInvisible'"); + } + + @Override + public boolean isInvisible() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInvisible'"); + } + + @Override + public void setNoPhysics(boolean noPhysics) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setNoPhysics'"); + } + + @Override + public boolean hasNoPhysics() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasNoPhysics'"); + } + + @Override + public boolean isFreezeTickingLocked() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isFreezeTickingLocked'"); + } + + @Override + public void lockFreezeTicks(boolean locked) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'lockFreezeTicks'"); + } + + @Override + public void remove() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'remove'"); + } + + @Override + public boolean isDead() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isDead'"); + } + + @Override + public boolean isValid() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isValid'"); + } + + @Override + public @NotNull Server getServer() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getServer'"); + } + + @Override + public boolean isPersistent() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPersistent'"); + } + + @Override + public void setPersistent(boolean persistent) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPersistent'"); + } + + @Override + public @Nullable Entity getPassenger() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPassenger'"); + } + + @Override + public boolean setPassenger(@NotNull Entity passenger) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPassenger'"); + } + + @Override + public @NotNull List getPassengers() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPassengers'"); + } + + @Override + public boolean addPassenger(@NotNull Entity passenger) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addPassenger'"); + } + + @Override + public boolean removePassenger(@NotNull Entity passenger) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removePassenger'"); + } + + @Override + public boolean isEmpty() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isEmpty'"); + } + + @Override + public boolean eject() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'eject'"); + } + + @Override + public @NotNull ItemStack getPickItemStack() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPickItemStack'"); + } + + @Override + public float getFallDistance() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDistance'"); + } + + @Override + public void setFallDistance(float distance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFallDistance'"); + } + + @Override + public void setLastDamageCause(@Nullable EntityDamageEvent event) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLastDamageCause'"); + } + + @Override + public @Nullable EntityDamageEvent getLastDamageCause() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastDamageCause'"); + } + + @Override + public @NotNull UUID getUniqueId() { + return this.uuid; + } + + @Override + public int getTicksLived() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTicksLived'"); + } + + @Override + public void setTicksLived(int value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setTicksLived'"); + } + + @Override + public void playEffect(@NotNull EntityEffect effect) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playEffect'"); + } + + @Override + public @NotNull EntityType getType() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getType'"); + } + + @Override + public @NotNull Sound getSwimSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSwimSound'"); + } + + @Override + public @NotNull Sound getSwimSplashSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSwimSplashSound'"); + } + + @Override + public @NotNull Sound getSwimHighSpeedSplashSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSwimHighSpeedSplashSound'"); + } + + @Override + public boolean isInsideVehicle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInsideVehicle'"); + } + + @Override + public boolean leaveVehicle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'leaveVehicle'"); + } + + @Override + public @Nullable Entity getVehicle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getVehicle'"); + } + + @Override + public void setCustomNameVisible(boolean flag) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCustomNameVisible'"); + } + + @Override + public boolean isCustomNameVisible() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isCustomNameVisible'"); + } + + @Override + public void setVisibleByDefault(boolean visible) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setVisibleByDefault'"); + } + + @Override + public boolean isVisibleByDefault() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isVisibleByDefault'"); + } + + @Override + public @NotNull Set getTrackedBy() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTrackedBy'"); + } + + @Override + public boolean isTrackedBy(@NotNull Player player) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isTrackedBy'"); + } + + @Override + public void setGlowing(boolean flag) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setGlowing'"); + } + + @Override + public boolean isGlowing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isGlowing'"); + } + + @Override + public void setInvulnerable(boolean flag) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setInvulnerable'"); + } + + @Override + public boolean isInvulnerable() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInvulnerable'"); + } + + @Override + public boolean isSilent() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSilent'"); + } + + @Override + public void setSilent(boolean flag) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSilent'"); + } + + @Override + public boolean hasGravity() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasGravity'"); + } + + @Override + public void setGravity(boolean gravity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setGravity'"); + } + + @Override + public int getPortalCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPortalCooldown'"); + } + + @Override + public void setPortalCooldown(int cooldown) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPortalCooldown'"); + } + + @Override + public @NotNull Set getScoreboardTags() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getScoreboardTags'"); + } + + @Override + public boolean addScoreboardTag(@NotNull String tag) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addScoreboardTag'"); + } + + @Override + public boolean removeScoreboardTag(@NotNull String tag) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeScoreboardTag'"); + } + + @Override + public @NotNull PistonMoveReaction getPistonMoveReaction() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPistonMoveReaction'"); + } + + @Override + public @NotNull BlockFace getFacing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFacing'"); + } + + @Override + public @NotNull Pose getPose() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPose'"); + } + + @Override + public boolean isSneaking() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSneaking'"); + } + + @Override + public void setSneaking(boolean sneak) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSneaking'"); + } + + @Override + public void setPose(@NotNull Pose pose, boolean fixed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPose'"); + } + + @Override + public boolean hasFixedPose() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasFixedPose'"); + } + + @Override + public @NotNull SpawnCategory getSpawnCategory() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSpawnCategory'"); + } + + @Override + public boolean isInWorld() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInWorld'"); + } + + @Override + public @Nullable String getAsString() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAsString'"); + } + + @Override + public @Nullable EntitySnapshot createSnapshot() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'createSnapshot'"); + } + + @Override + public @NotNull Entity copy() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'copy'"); + } + + @Override + public @NotNull Entity copy(@NotNull Location to) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'copy'"); + } + + @Override + public @NotNull Spigot spigot() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'spigot'"); + } + + @Override + public @NotNull Component teamDisplayName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'teamDisplayName'"); + } + + @Override + public @Nullable Location getOrigin() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getOrigin'"); + } + + @Override + public boolean fromMobSpawner() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'fromMobSpawner'"); + } + + @Override + public @NotNull SpawnReason getEntitySpawnReason() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEntitySpawnReason'"); + } + + @Override + public boolean isUnderWater() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isUnderWater'"); + } + + @Override + public boolean isInRain() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInRain'"); + } + + @Override + public boolean isInLava() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInLava'"); + } + + @Override + public boolean isTicking() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isTicking'"); + } + + @Override + public @NotNull Set getTrackedPlayers() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTrackedPlayers'"); + } + + @Override + public boolean spawnAt(@NotNull Location location, @NotNull SpawnReason reason) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'spawnAt'"); + } + + @Override + public boolean isInPowderedSnow() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isInPowderedSnow'"); + } + + @Override + public double getX() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getX'"); + } + + @Override + public double getY() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getY'"); + } + + @Override + public double getZ() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getZ'"); + } + + @Override + public float getPitch() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPitch'"); + } + + @Override + public float getYaw() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getYaw'"); + } + + @Override + public boolean collidesAt(@NotNull Location location) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'collidesAt'"); + } + + @Override + public boolean wouldCollideUsing(@NotNull BoundingBox boundingBox) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'wouldCollideUsing'"); + } + + @Override + public @NotNull EntityScheduler getScheduler() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getScheduler'"); + } + + @Override + public @NotNull String getScoreboardEntryName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getScoreboardEntryName'"); + } + + @Override + public void broadcastHurtAnimation(@NotNull Collection players) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'broadcastHurtAnimation'"); } } diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitHumanEntity.java b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitHumanEntity.java index 07649e0..c9ffcdc 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitHumanEntity.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitHumanEntity.java @@ -1,7 +1,1311 @@ package org.patchbukkit.entity; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; + +import org.bukkit.Color; +import org.bukkit.FluidCollisionMode; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Sound; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; +import org.bukkit.damage.DamageSource; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityCategory; +import org.bukkit.entity.Firework; +import org.bukkit.entity.FishHook; import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.memory.MemoryKey; +import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.event.inventory.InventoryCloseEvent.Reason; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.InventoryView.Property; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.MainHand; +import org.bukkit.inventory.Merchant; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; +import org.checkerframework.checker.index.qual.NonNegative; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; +import org.patchbukkit.PatchBukkitServer; + +import com.destroystokyo.paper.block.TargetBlockInfo; +import com.destroystokyo.paper.block.TargetBlockInfo.FluidMode; +import com.destroystokyo.paper.entity.TargetEntityInfo; + +import io.papermc.paper.world.damagesource.CombatTracker; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.util.TriState; public class PatchBukkitHumanEntity extends PatchBukkitLivingEntity - implements HumanEntity {} + implements HumanEntity { + + public PatchBukkitHumanEntity(UUID uuid, + String name) { + super(uuid, name); + } + + @Override + public double getEyeHeight() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEyeHeight'"); + } + + @Override + public double getEyeHeight(boolean ignorePose) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEyeHeight'"); + } + + @Override + public @NotNull Location getEyeLocation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEyeLocation'"); + } + + @Override + public @NotNull List getLineOfSight(@Nullable Set transparent, int maxDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLineOfSight'"); + } + + @Override + public @NotNull Block getTargetBlock(@Nullable Set transparent, int maxDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlock'"); + } + + @Override + public @Nullable Block getTargetBlock(int maxDistance, @NotNull FluidMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlock'"); + } + + @Override + public @Nullable BlockFace getTargetBlockFace(int maxDistance, @NotNull FluidMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockFace'"); + } + + @Override + public @Nullable BlockFace getTargetBlockFace(int maxDistance, @NotNull FluidCollisionMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockFace'"); + } + + @Override + public @Nullable TargetBlockInfo getTargetBlockInfo(int maxDistance, @NotNull FluidMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockInfo'"); + } + + @Override + public @Nullable Entity getTargetEntity(int maxDistance, boolean ignoreBlocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetEntity'"); + } + + @Override + public @Nullable TargetEntityInfo getTargetEntityInfo(int maxDistance, boolean ignoreBlocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetEntityInfo'"); + } + + @Override + public @Nullable RayTraceResult rayTraceEntities(int maxDistance, boolean ignoreBlocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'rayTraceEntities'"); + } + + @Override + public @NotNull List getLastTwoTargetBlocks(@Nullable Set transparent, int maxDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastTwoTargetBlocks'"); + } + + @Override + public @Nullable Block getTargetBlockExact(int maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockExact'"); + } + + @Override + public @Nullable RayTraceResult rayTraceBlocks(double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'rayTraceBlocks'"); + } + + @Override + public int getRemainingAir() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getRemainingAir'"); + } + + @Override + public void setRemainingAir(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRemainingAir'"); + } + + @Override + public int getMaximumAir() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaximumAir'"); + } + + @Override + public void setMaximumAir(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMaximumAir'"); + } + + @Override + public @Nullable ItemStack getItemInUse() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getItemInUse'"); + } + + @Override + public int getItemInUseTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getItemInUseTicks'"); + } + + @Override + public void setItemInUseTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setItemInUseTicks'"); + } + + @Override + public @NonNegative int getArrowCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getArrowCooldown'"); + } + + @Override + public void setArrowCooldown(@NonNegative int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setArrowCooldown'"); + } + + @Override + public @NonNegative int getArrowsInBody() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getArrowsInBody'"); + } + + @Override + public void setArrowsInBody(@NonNegative int count, boolean fireEvent) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setArrowsInBody'"); + } + + @Override + public @NonNegative int getBeeStingerCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBeeStingerCooldown'"); + } + + @Override + public void setBeeStingerCooldown(@NonNegative int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setBeeStingerCooldown'"); + } + + @Override + public @NonNegative int getBeeStingersInBody() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBeeStingersInBody'"); + } + + @Override + public void setBeeStingersInBody(@NonNegative int count) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setBeeStingersInBody'"); + } + + @Override + public int getMaximumNoDamageTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaximumNoDamageTicks'"); + } + + @Override + public void setMaximumNoDamageTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMaximumNoDamageTicks'"); + } + + @Override + public double getLastDamage() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastDamage'"); + } + + @Override + public void setLastDamage(double damage) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLastDamage'"); + } + + @Override + public int getNoDamageTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getNoDamageTicks'"); + } + + @Override + public void setNoDamageTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setNoDamageTicks'"); + } + + @Override + public int getNoActionTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getNoActionTicks'"); + } + + @Override + public void setNoActionTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setNoActionTicks'"); + } + + @Override + public @Nullable Player getKiller() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getKiller'"); + } + + @Override + public void setKiller(@Nullable Player killer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setKiller'"); + } + + @Override + public boolean addPotionEffect(@NotNull PotionEffect effect, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addPotionEffect'"); + } + + @Override + public boolean addPotionEffects(@NotNull Collection effects) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addPotionEffects'"); + } + + @Override + public boolean hasPotionEffect(@NotNull PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPotionEffect'"); + } + + @Override + public @Nullable PotionEffect getPotionEffect(@NotNull PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPotionEffect'"); + } + + @Override + public void removePotionEffect(@NotNull PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removePotionEffect'"); + } + + @Override + public @NotNull Collection getActivePotionEffects() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActivePotionEffects'"); + } + + @Override + public boolean clearActivePotionEffects() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'clearActivePotionEffects'"); + } + + @Override + public boolean hasLineOfSight(@NotNull Entity other) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasLineOfSight'"); + } + + @Override + public boolean hasLineOfSight(@NotNull Location location) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasLineOfSight'"); + } + + @Override + public boolean getRemoveWhenFarAway() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getRemoveWhenFarAway'"); + } + + @Override + public void setRemoveWhenFarAway(boolean remove) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRemoveWhenFarAway'"); + } + + @Override + public void setCanPickupItems(boolean pickup) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCanPickupItems'"); + } + + @Override + public boolean getCanPickupItems() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCanPickupItems'"); + } + + @Override + public boolean isLeashed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isLeashed'"); + } + + @Override + public @NotNull Entity getLeashHolder() throws IllegalStateException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLeashHolder'"); + } + + @Override + public boolean setLeashHolder(@Nullable Entity holder) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLeashHolder'"); + } + + @Override + public boolean isGliding() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isGliding'"); + } + + @Override + public void setGliding(boolean gliding) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setGliding'"); + } + + @Override + public boolean isSwimming() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSwimming'"); + } + + @Override + public void setSwimming(boolean swimming) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSwimming'"); + } + + @Override + public boolean isRiptiding() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isRiptiding'"); + } + + @Override + public void setRiptiding(boolean riptiding) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRiptiding'"); + } + + @Override + public boolean isSleeping() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSleeping'"); + } + + @Override + public boolean isClimbing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isClimbing'"); + } + + @Override + public void setAI(boolean ai) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAI'"); + } + + @Override + public boolean hasAI() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasAI'"); + } + + @Override + public void attack(@NotNull Entity target) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'attack'"); + } + + @Override + public void swingMainHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'swingMainHand'"); + } + + @Override + public void swingOffHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'swingOffHand'"); + } + + @Override + public void playHurtAnimation(float yaw) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playHurtAnimation'"); + } + + @Override + public void setCollidable(boolean collidable) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCollidable'"); + } + + @Override + public boolean isCollidable() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isCollidable'"); + } + + @Override + public @NotNull Set getCollidableExemptions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCollidableExemptions'"); + } + + @Override + public @Nullable T getMemory(@NotNull MemoryKey memoryKey) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMemory'"); + } + + @Override + public void setMemory(@NotNull MemoryKey memoryKey, @Nullable T memoryValue) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMemory'"); + } + + @Override + public @Nullable Sound getHurtSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHurtSound'"); + } + + @Override + public @Nullable Sound getDeathSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDeathSound'"); + } + + @Override + public @NotNull Sound getFallDamageSound(int fallHeight) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDamageSound'"); + } + + @Override + public @NotNull Sound getFallDamageSoundSmall() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDamageSoundSmall'"); + } + + @Override + public @NotNull Sound getFallDamageSoundBig() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDamageSoundBig'"); + } + + @Override + public @NotNull Sound getDrinkingSound(@NotNull ItemStack itemStack) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDrinkingSound'"); + } + + @Override + public @NotNull Sound getEatingSound(@NotNull ItemStack itemStack) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEatingSound'"); + } + + @Override + public boolean canBreatheUnderwater() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'canBreatheUnderwater'"); + } + + @Override + public @NotNull EntityCategory getCategory() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCategory'"); + } + + @Override + public float getSidewaysMovement() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSidewaysMovement'"); + } + + @Override + public float getUpwardsMovement() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getUpwardsMovement'"); + } + + @Override + public float getForwardsMovement() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getForwardsMovement'"); + } + + @Override + public void startUsingItem(@NotNull EquipmentSlot hand) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'startUsingItem'"); + } + + @Override + public void completeUsingActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'completeUsingActiveItem'"); + } + + @Override + public @NotNull ItemStack getActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItem'"); + } + + @Override + public void clearActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'clearActiveItem'"); + } + + @Override + public int getActiveItemRemainingTime() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItemRemainingTime'"); + } + + @Override + public void setActiveItemRemainingTime(@Range(from = 0, to = 2147483647) int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setActiveItemRemainingTime'"); + } + + @Override + public boolean hasActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasActiveItem'"); + } + + @Override + public int getActiveItemUsedTime() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItemUsedTime'"); + } + + @Override + public @NotNull EquipmentSlot getActiveItemHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItemHand'"); + } + + @Override + public boolean isJumping() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isJumping'"); + } + + @Override + public void setJumping(boolean jumping) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setJumping'"); + } + + @Override + public void playPickupItemAnimation(@NotNull Item item, int quantity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playPickupItemAnimation'"); + } + + @Override + public float getHurtDirection() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHurtDirection'"); + } + + @Override + public void knockback(double strength, double directionX, double directionZ) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'knockback'"); + } + + @Override + public void broadcastSlotBreak(@NotNull EquipmentSlot slot) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'broadcastSlotBreak'"); + } + + @Override + public void broadcastSlotBreak(@NotNull EquipmentSlot slot, @NotNull Collection players) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'broadcastSlotBreak'"); + } + + @Override + public @NotNull ItemStack damageItemStack(@NotNull ItemStack stack, int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damageItemStack'"); + } + + @Override + public void damageItemStack(@NotNull EquipmentSlot slot, int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damageItemStack'"); + } + + @Override + public float getBodyYaw() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBodyYaw'"); + } + + @Override + public void setBodyYaw(float bodyYaw) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setBodyYaw'"); + } + + @Override + public boolean canUseEquipmentSlot(@NotNull EquipmentSlot slot) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'canUseEquipmentSlot'"); + } + + @Override + public @NotNull CombatTracker getCombatTracker() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCombatTracker'"); + } + + @Override + public void setWaypointStyle(@Nullable Key key) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWaypointStyle'"); + } + + @Override + public void setWaypointColor(@Nullable Color color) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWaypointColor'"); + } + + @Override + public @NotNull Key getWaypointStyle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWaypointStyle'"); + } + + @Override + public @Nullable Color getWaypointColor() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWaypointColor'"); + } + + @Override + public @Nullable AttributeInstance getAttribute(@NotNull Attribute attribute) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAttribute'"); + } + + @Override + public void registerAttribute(@NotNull Attribute attribute) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'registerAttribute'"); + } + + @Override + public void damage(double amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damage'"); + } + + @Override + public void damage(double amount, @Nullable Entity source) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damage'"); + } + + @Override + public void damage(double amount, @NotNull DamageSource damageSource) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damage'"); + } + + @Override + public double getHealth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHealth'"); + } + + @Override + public void setHealth(double health) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHealth'"); + } + + @Override + public void heal(double amount, @NotNull RegainReason reason) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'heal'"); + } + + @Override + public double getAbsorptionAmount() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAbsorptionAmount'"); + } + + @Override + public void setAbsorptionAmount(double amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAbsorptionAmount'"); + } + + @Override + public double getMaxHealth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaxHealth'"); + } + + @Override + public void setMaxHealth(double health) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMaxHealth'"); + } + + @Override + public void resetMaxHealth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetMaxHealth'"); + } + + @Override + public @NotNull T launchProjectile(@NotNull Class projectile, + @Nullable Vector velocity, @Nullable Consumer function) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'launchProjectile'"); + } + + @Override + public TriState getFrictionState() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFrictionState'"); + } + + @Override + public void setFrictionState(TriState state) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFrictionState'"); + } + + @Override + public EntityEquipment getEquipment() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEquipment'"); + } + + @Override + public PlayerInventory getInventory() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getInventory'"); + } + + @Override + public Inventory getEnderChest() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEnderChest'"); + } + + @Override + public MainHand getMainHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMainHand'"); + } + + @Override + public boolean setWindowProperty(Property prop, int value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWindowProperty'"); + } + + @Override + public int getEnchantmentSeed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEnchantmentSeed'"); + } + + @Override + public void setEnchantmentSeed(int seed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setEnchantmentSeed'"); + } + + @Override + public InventoryView getOpenInventory() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getOpenInventory'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openInventory(Inventory inventory) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openInventory'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openWorkbench( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openWorkbench'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openEnchanting( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openEnchanting'"); + } + + @Override + public void openInventory(InventoryView inventory) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openInventory'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openMerchant(Merchant merchant, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openMerchant'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openAnvil( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openAnvil'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openCartographyTable( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openCartographyTable'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openGrindstone( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openGrindstone'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openLoom( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openLoom'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openSmithingTable( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openSmithingTable'"); + } + + @Override + public @org.jspecify.annotations.Nullable InventoryView openStonecutter( + @org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openStonecutter'"); + } + + @Override + public void closeInventory(Reason reason) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'closeInventory'"); + } + + @Override + public ItemStack getItemInHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getItemInHand'"); + } + + @Override + public void setItemInHand(@org.jspecify.annotations.Nullable ItemStack item) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setItemInHand'"); + } + + @Override + public ItemStack getItemOnCursor() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getItemOnCursor'"); + } + + @Override + public void setItemOnCursor(@org.jspecify.annotations.Nullable ItemStack item) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setItemOnCursor'"); + } + + @Override + public boolean hasCooldown(Material material) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasCooldown'"); + } + + @Override + public int getCooldown(Material material) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCooldown'"); + } + + @Override + public void setHurtDirection(float hurtDirection) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHurtDirection'"); + } + + @Override + public boolean isDeeplySleeping() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isDeeplySleeping'"); + } + + @Override + public boolean hasCooldown(ItemStack item) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasCooldown'"); + } + + @Override + public int getCooldown(ItemStack item) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCooldown'"); + } + + @Override + public void setCooldown(ItemStack item, int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCooldown'"); + } + + @Override + public int getCooldown(Key key) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCooldown'"); + } + + @Override + public void setCooldown(Key key, int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCooldown'"); + } + + @Override + public int getSleepTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSleepTicks'"); + } + + @Override + public @org.jspecify.annotations.Nullable Location getPotentialRespawnLocation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPotentialRespawnLocation'"); + } + + @Override + public @org.jspecify.annotations.Nullable FishHook getFishHook() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFishHook'"); + } + + @Override + public boolean sleep(Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sleep'"); + } + + @Override + public void wakeup(boolean setSpawnLocation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'wakeup'"); + } + + @Override + public void startRiptideAttack(int duration, float attackStrength, + @org.jspecify.annotations.Nullable ItemStack attackItem) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'startRiptideAttack'"); + } + + @Override + public Location getBedLocation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBedLocation'"); + } + + @Override + public GameMode getGameMode() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getGameMode'"); + } + + @Override + public void setGameMode(GameMode mode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setGameMode'"); + } + + @Override + public boolean isBlocking() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isBlocking'"); + } + + @Override + public boolean isHandRaised() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isHandRaised'"); + } + + @Override + public int getExpToLevel() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getExpToLevel'"); + } + + @Override + public @org.jspecify.annotations.Nullable Entity releaseLeftShoulderEntity() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'releaseLeftShoulderEntity'"); + } + + @Override + public @org.jspecify.annotations.Nullable Entity releaseRightShoulderEntity() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'releaseRightShoulderEntity'"); + } + + @Override + public float getAttackCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAttackCooldown'"); + } + + @Override + public int discoverRecipes(Collection recipes) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'discoverRecipes'"); + } + + @Override + public int undiscoverRecipes(Collection recipes) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'undiscoverRecipes'"); + } + + @Override + public boolean hasDiscoveredRecipe(NamespacedKey recipe) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasDiscoveredRecipe'"); + } + + @Override + public Set getDiscoveredRecipes() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDiscoveredRecipes'"); + } + + @Override + public @org.jspecify.annotations.Nullable Entity getShoulderEntityLeft() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getShoulderEntityLeft'"); + } + + @Override + public void setShoulderEntityLeft(@org.jspecify.annotations.Nullable Entity entity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setShoulderEntityLeft'"); + } + + @Override + public @org.jspecify.annotations.Nullable Entity getShoulderEntityRight() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getShoulderEntityRight'"); + } + + @Override + public void setShoulderEntityRight(@org.jspecify.annotations.Nullable Entity entity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setShoulderEntityRight'"); + } + + @Override + public void openSign(Sign sign, Side side) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openSign'"); + } + + @Override + public boolean dropItem(boolean dropAll) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'dropItem'"); + } + + @Override + public @org.jspecify.annotations.Nullable Item dropItem(int slot, int amount, boolean throwRandomly, + @org.jspecify.annotations.Nullable Consumer entityOperation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'dropItem'"); + } + + @Override + public @org.jspecify.annotations.Nullable Item dropItem(EquipmentSlot slot, int amount, boolean throwRandomly, + @org.jspecify.annotations.Nullable Consumer entityOperation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'dropItem'"); + } + + @Override + public @org.jspecify.annotations.Nullable Item dropItem(ItemStack itemStack, boolean throwRandomly, + @org.jspecify.annotations.Nullable Consumer entityOperation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'dropItem'"); + } + + @Override + public float getExhaustion() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getExhaustion'"); + } + + @Override + public void setExhaustion(float value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setExhaustion'"); + } + + @Override + public float getSaturation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSaturation'"); + } + + @Override + public void setSaturation(float value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSaturation'"); + } + + @Override + public int getFoodLevel() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFoodLevel'"); + } + + @Override + public void setFoodLevel(int value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFoodLevel'"); + } + + @Override + public int getSaturatedRegenRate() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSaturatedRegenRate'"); + } + + @Override + public void setSaturatedRegenRate(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSaturatedRegenRate'"); + } + + @Override + public int getUnsaturatedRegenRate() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getUnsaturatedRegenRate'"); + } + + @Override + public void setUnsaturatedRegenRate(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setUnsaturatedRegenRate'"); + } + + @Override + public int getStarvationRate() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getStarvationRate'"); + } + + @Override + public void setStarvationRate(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setStarvationRate'"); + } + + @Override + public @org.jspecify.annotations.Nullable Location getLastDeathLocation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastDeathLocation'"); + } + + @Override + public void setLastDeathLocation(@org.jspecify.annotations.Nullable Location location) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLastDeathLocation'"); + } + + @Override + public @org.jspecify.annotations.Nullable Firework fireworkBoost(ItemStack fireworkItemStack) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'fireworkBoost'"); + }} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitLivingEntity.java b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitLivingEntity.java index 59558d8..0d32f99 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitLivingEntity.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitLivingEntity.java @@ -1,7 +1,841 @@ package org.patchbukkit.entity; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; + +import org.bukkit.Color; +import org.bukkit.FluidCollisionMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.damage.DamageSource; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityCategory; +import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.memory.MemoryKey; +import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; +import org.bukkit.inventory.EntityEquipment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; +import org.checkerframework.checker.index.qual.NonNegative; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; +import org.patchbukkit.PatchBukkitServer; + +import com.destroystokyo.paper.block.TargetBlockInfo; +import com.destroystokyo.paper.block.TargetBlockInfo.FluidMode; +import com.destroystokyo.paper.entity.TargetEntityInfo; + +import io.papermc.paper.world.damagesource.CombatTracker; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.util.TriState; public class PatchBukkitLivingEntity extends PatchBukkitEntity - implements LivingEntity {} + implements LivingEntity { + + public PatchBukkitLivingEntity(UUID uuid, + String name) { + super(uuid, name); + } + @Override + public @Nullable AttributeInstance getAttribute(@NotNull Attribute attribute) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAttribute'"); + } + + @Override + public void registerAttribute(@NotNull Attribute attribute) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'registerAttribute'"); + } + + @Override + public void damage(double amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damage'"); + } + + @Override + public void damage(double amount, @Nullable Entity source) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damage'"); + } + + @Override + public void damage(double amount, @NotNull DamageSource damageSource) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damage'"); + } + + @Override + public double getHealth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHealth'"); + } + + @Override + public void setHealth(double health) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHealth'"); + } + + @Override + public void heal(double amount, @NotNull RegainReason reason) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'heal'"); + } + + @Override + public double getAbsorptionAmount() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAbsorptionAmount'"); + } + + @Override + public void setAbsorptionAmount(double amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAbsorptionAmount'"); + } + + @Override + public double getMaxHealth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaxHealth'"); + } + + @Override + public void setMaxHealth(double health) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMaxHealth'"); + } + + @Override + public void resetMaxHealth() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetMaxHealth'"); + } + + @Override + public @NotNull T launchProjectile(@NotNull Class projectile, + @Nullable Vector velocity, @Nullable Consumer function) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'launchProjectile'"); + } + + @Override + public TriState getFrictionState() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFrictionState'"); + } + + @Override + public void setFrictionState(TriState state) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFrictionState'"); + } + + @Override + public double getEyeHeight() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEyeHeight'"); + } + + @Override + public double getEyeHeight(boolean ignorePose) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEyeHeight'"); + } + + @Override + public @NotNull Location getEyeLocation() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEyeLocation'"); + } + + @Override + public @NotNull List getLineOfSight(@Nullable Set transparent, int maxDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLineOfSight'"); + } + + @Override + public @NotNull Block getTargetBlock(@Nullable Set transparent, int maxDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlock'"); + } + + @Override + public @Nullable Block getTargetBlock(int maxDistance, @NotNull FluidMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlock'"); + } + + @Override + public @Nullable BlockFace getTargetBlockFace(int maxDistance, @NotNull FluidMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockFace'"); + } + + @Override + public @Nullable BlockFace getTargetBlockFace(int maxDistance, @NotNull FluidCollisionMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockFace'"); + } + + @Override + public @Nullable TargetBlockInfo getTargetBlockInfo(int maxDistance, @NotNull FluidMode fluidMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockInfo'"); + } + + @Override + public @Nullable Entity getTargetEntity(int maxDistance, boolean ignoreBlocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetEntity'"); + } + + @Override + public @Nullable TargetEntityInfo getTargetEntityInfo(int maxDistance, boolean ignoreBlocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetEntityInfo'"); + } + + @Override + public @Nullable RayTraceResult rayTraceEntities(int maxDistance, boolean ignoreBlocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'rayTraceEntities'"); + } + + @Override + public @NotNull List getLastTwoTargetBlocks(@Nullable Set transparent, int maxDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastTwoTargetBlocks'"); + } + + @Override + public @Nullable Block getTargetBlockExact(int maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTargetBlockExact'"); + } + + @Override + public @Nullable RayTraceResult rayTraceBlocks(double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'rayTraceBlocks'"); + } + + @Override + public int getRemainingAir() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getRemainingAir'"); + } + + @Override + public void setRemainingAir(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRemainingAir'"); + } + + @Override + public int getMaximumAir() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaximumAir'"); + } + + @Override + public void setMaximumAir(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMaximumAir'"); + } + + @Override + public @Nullable ItemStack getItemInUse() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getItemInUse'"); + } + + @Override + public int getItemInUseTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getItemInUseTicks'"); + } + + @Override + public void setItemInUseTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setItemInUseTicks'"); + } + + @Override + public @NonNegative int getArrowCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getArrowCooldown'"); + } + + @Override + public void setArrowCooldown(@NonNegative int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setArrowCooldown'"); + } + + @Override + public @NonNegative int getArrowsInBody() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getArrowsInBody'"); + } + + @Override + public void setArrowsInBody(@NonNegative int count, boolean fireEvent) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setArrowsInBody'"); + } + + @Override + public @NonNegative int getBeeStingerCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBeeStingerCooldown'"); + } + + @Override + public void setBeeStingerCooldown(@NonNegative int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setBeeStingerCooldown'"); + } + + @Override + public @NonNegative int getBeeStingersInBody() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBeeStingersInBody'"); + } + + @Override + public void setBeeStingersInBody(@NonNegative int count) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setBeeStingersInBody'"); + } + + @Override + public int getMaximumNoDamageTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMaximumNoDamageTicks'"); + } + + @Override + public void setMaximumNoDamageTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMaximumNoDamageTicks'"); + } + + @Override + public double getLastDamage() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastDamage'"); + } + + @Override + public void setLastDamage(double damage) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLastDamage'"); + } + + @Override + public int getNoDamageTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getNoDamageTicks'"); + } + + @Override + public void setNoDamageTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setNoDamageTicks'"); + } + + @Override + public int getNoActionTicks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getNoActionTicks'"); + } + + @Override + public void setNoActionTicks(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setNoActionTicks'"); + } + + @Override + public @Nullable Player getKiller() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getKiller'"); + } + + @Override + public void setKiller(@Nullable Player killer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setKiller'"); + } + + @Override + public boolean addPotionEffect(@NotNull PotionEffect effect, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addPotionEffect'"); + } + + @Override + public boolean addPotionEffects(@NotNull Collection effects) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addPotionEffects'"); + } + + @Override + public boolean hasPotionEffect(@NotNull PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPotionEffect'"); + } + + @Override + public @Nullable PotionEffect getPotionEffect(@NotNull PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPotionEffect'"); + } + + @Override + public void removePotionEffect(@NotNull PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removePotionEffect'"); + } + + @Override + public @NotNull Collection getActivePotionEffects() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActivePotionEffects'"); + } + + @Override + public boolean clearActivePotionEffects() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'clearActivePotionEffects'"); + } + + @Override + public boolean hasLineOfSight(@NotNull Entity other) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasLineOfSight'"); + } + + @Override + public boolean hasLineOfSight(@NotNull Location location) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasLineOfSight'"); + } + + @Override + public boolean getRemoveWhenFarAway() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getRemoveWhenFarAway'"); + } + + @Override + public void setRemoveWhenFarAway(boolean remove) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRemoveWhenFarAway'"); + } + + @Override + public @Nullable EntityEquipment getEquipment() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEquipment'"); + } + + @Override + public void setCanPickupItems(boolean pickup) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCanPickupItems'"); + } + + @Override + public boolean getCanPickupItems() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCanPickupItems'"); + } + + @Override + public boolean isLeashed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isLeashed'"); + } + + @Override + public @NotNull Entity getLeashHolder() throws IllegalStateException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLeashHolder'"); + } + + @Override + public boolean setLeashHolder(@Nullable Entity holder) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLeashHolder'"); + } + + @Override + public boolean isGliding() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isGliding'"); + } + + @Override + public void setGliding(boolean gliding) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setGliding'"); + } + + @Override + public boolean isSwimming() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSwimming'"); + } + + @Override + public void setSwimming(boolean swimming) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSwimming'"); + } + + @Override + public boolean isRiptiding() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isRiptiding'"); + } + + @Override + public void setRiptiding(boolean riptiding) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRiptiding'"); + } + + @Override + public boolean isSleeping() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSleeping'"); + } + + @Override + public boolean isClimbing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isClimbing'"); + } + + @Override + public void setAI(boolean ai) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAI'"); + } + + @Override + public boolean hasAI() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasAI'"); + } + + @Override + public void attack(@NotNull Entity target) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'attack'"); + } + + @Override + public void swingMainHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'swingMainHand'"); + } + + @Override + public void swingOffHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'swingOffHand'"); + } + + @Override + public void playHurtAnimation(float yaw) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playHurtAnimation'"); + } + + @Override + public void setCollidable(boolean collidable) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCollidable'"); + } + + @Override + public boolean isCollidable() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isCollidable'"); + } + + @Override + public @NotNull Set getCollidableExemptions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCollidableExemptions'"); + } + + @Override + public @Nullable T getMemory(@NotNull MemoryKey memoryKey) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getMemory'"); + } + + @Override + public void setMemory(@NotNull MemoryKey memoryKey, @Nullable T memoryValue) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setMemory'"); + } + + @Override + public @Nullable Sound getHurtSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHurtSound'"); + } + + @Override + public @Nullable Sound getDeathSound() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDeathSound'"); + } + + @Override + public @NotNull Sound getFallDamageSound(int fallHeight) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDamageSound'"); + } + + @Override + public @NotNull Sound getFallDamageSoundSmall() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDamageSoundSmall'"); + } + + @Override + public @NotNull Sound getFallDamageSoundBig() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFallDamageSoundBig'"); + } + + @Override + public @NotNull Sound getDrinkingSound(@NotNull ItemStack itemStack) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDrinkingSound'"); + } + + @Override + public @NotNull Sound getEatingSound(@NotNull ItemStack itemStack) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEatingSound'"); + } + + @Override + public boolean canBreatheUnderwater() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'canBreatheUnderwater'"); + } + + @Override + public @NotNull EntityCategory getCategory() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCategory'"); + } + + @Override + public float getSidewaysMovement() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSidewaysMovement'"); + } + + @Override + public float getUpwardsMovement() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getUpwardsMovement'"); + } + + @Override + public float getForwardsMovement() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getForwardsMovement'"); + } + + @Override + public void startUsingItem(@NotNull EquipmentSlot hand) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'startUsingItem'"); + } + + @Override + public void completeUsingActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'completeUsingActiveItem'"); + } + + @Override + public @NotNull ItemStack getActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItem'"); + } + + @Override + public void clearActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'clearActiveItem'"); + } + + @Override + public int getActiveItemRemainingTime() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItemRemainingTime'"); + } + + @Override + public void setActiveItemRemainingTime(@Range(from = 0, to = 2147483647) int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setActiveItemRemainingTime'"); + } + + @Override + public boolean hasActiveItem() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasActiveItem'"); + } + + @Override + public int getActiveItemUsedTime() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItemUsedTime'"); + } + + @Override + public @NotNull EquipmentSlot getActiveItemHand() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getActiveItemHand'"); + } + + @Override + public boolean isJumping() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isJumping'"); + } + + @Override + public void setJumping(boolean jumping) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setJumping'"); + } + + @Override + public void playPickupItemAnimation(@NotNull Item item, int quantity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playPickupItemAnimation'"); + } + + @Override + public float getHurtDirection() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHurtDirection'"); + } + + @Override + public void setHurtDirection(float hurtDirection) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHurtDirection'"); + } + + @Override + public void knockback(double strength, double directionX, double directionZ) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'knockback'"); + } + + @Override + public void broadcastSlotBreak(@NotNull EquipmentSlot slot) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'broadcastSlotBreak'"); + } + + @Override + public void broadcastSlotBreak(@NotNull EquipmentSlot slot, @NotNull Collection players) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'broadcastSlotBreak'"); + } + + @Override + public @NotNull ItemStack damageItemStack(@NotNull ItemStack stack, int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damageItemStack'"); + } + + @Override + public void damageItemStack(@NotNull EquipmentSlot slot, int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'damageItemStack'"); + } + + @Override + public float getBodyYaw() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getBodyYaw'"); + } + + @Override + public void setBodyYaw(float bodyYaw) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setBodyYaw'"); + } + + @Override + public boolean canUseEquipmentSlot(@NotNull EquipmentSlot slot) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'canUseEquipmentSlot'"); + } + + @Override + public @NotNull CombatTracker getCombatTracker() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCombatTracker'"); + } + + @Override + public void setWaypointStyle(@Nullable Key key) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWaypointStyle'"); + } + + @Override + public void setWaypointColor(@Nullable Color color) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWaypointColor'"); + } + + @Override + public @NotNull Key getWaypointStyle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWaypointStyle'"); + } + + @Override + public @Nullable Color getWaypointColor() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWaypointColor'"); + }} diff --git a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitPlayer.java b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitPlayer.java index ce7a5a0..8581156 100644 --- a/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitPlayer.java +++ b/java/patchbukkit/src/main/java/org/patchbukkit/entity/PatchBukkitPlayer.java @@ -1,7 +1,1687 @@ package org.patchbukkit.entity; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.time.Duration; +import java.time.Instant; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import org.bukkit.BanEntry; +import org.bukkit.Chunk; +import org.bukkit.DyeColor; +import org.bukkit.Effect; +import org.bukkit.EntityEffect; +import org.bukkit.GameMode; +import org.bukkit.Input; +import org.bukkit.Instrument; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Note; +import org.bukkit.Particle; +import org.bukkit.ServerLinks; +import org.bukkit.Sound; +import org.bukkit.SoundCategory; +import org.bukkit.Statistic; +import org.bukkit.WeatherType; +import org.bukkit.WorldBorder; +import org.bukkit.advancement.Advancement; +import org.bukkit.advancement.AdvancementProgress; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.TileState; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.sign.Side; +import org.bukkit.conversations.Conversation; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.entity.EnderPearl; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerKickEvent.Cause; +import org.bukkit.event.player.PlayerResourcePackStatusEvent.Status; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.map.MapView; +import org.bukkit.plugin.Plugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scoreboard.Scoreboard; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Range; +import org.jetbrains.annotations.Unmodifiable; +import org.jetbrains.annotations.UnmodifiableView; +import org.patchbukkit.PatchBukkitServer; + +import com.destroystokyo.paper.ClientOption; +import com.destroystokyo.paper.Title; +import com.destroystokyo.paper.profile.PlayerProfile; + +import io.papermc.paper.connection.PlayerGameConnection; +import io.papermc.paper.entity.LookAnchor; +import io.papermc.paper.entity.PlayerGiveResult; +import io.papermc.paper.math.Position; +import net.kyori.adventure.bossbar.BossBar; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.util.TriState; +import net.md_5.bungee.api.chat.BaseComponent; public class PatchBukkitPlayer extends PatchBukkitHumanEntity - implements Player {} + implements Player { + + public PatchBukkitPlayer(UUID uuid, String name) { + super(uuid, name); + } + + @Override + public Player.Spigot spigot() { + throw new UnsupportedOperationException("Unimplemented method 'spigot'"); + } + + @Override + public boolean isConversing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isConversing'"); + } + + @Override + public void acceptConversationInput(@NotNull String input) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'acceptConversationInput'"); + } + + @Override + public boolean beginConversation(@NotNull Conversation conversation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'beginConversation'"); + } + + @Override + public void abandonConversation(@NotNull Conversation conversation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'abandonConversation'"); + } + + @Override + public void abandonConversation(@NotNull Conversation conversation, @NotNull ConversationAbandonedEvent details) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'abandonConversation'"); + } + + @Override + public void sendRawMessage(@Nullable UUID sender, @NotNull String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendRawMessage'"); + } + + @Override + public boolean isOnline() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isOnline'"); + } + + @Override + public boolean isConnected() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isConnected'"); + } + + @Override + public boolean isBanned() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isBanned'"); + } + + @Override + public > @org.jspecify.annotations.Nullable E ban( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Date expires, + @org.jspecify.annotations.Nullable String source) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'ban'"); + } + + @Override + public > @org.jspecify.annotations.Nullable E ban( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Instant expires, + @org.jspecify.annotations.Nullable String source) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'ban'"); + } + + @Override + public > @org.jspecify.annotations.Nullable E ban( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Duration duration, + @org.jspecify.annotations.Nullable String source) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'ban'"); + } + + @Override + public boolean isWhitelisted() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isWhitelisted'"); + } + + @Override + public void setWhitelisted(boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWhitelisted'"); + } + + @Override + public @org.jspecify.annotations.Nullable Player getPlayer() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayer'"); + } + + @Override + public long getFirstPlayed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFirstPlayed'"); + } + + @Override + public long getLastPlayed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastPlayed'"); + } + + @Override + public boolean hasPlayedBefore() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasPlayedBefore'"); + } + + @Override + public long getLastLogin() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastLogin'"); + } + + @Override + public long getLastSeen() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLastSeen'"); + } + + @Override + public @org.jspecify.annotations.Nullable Location getRespawnLocation(boolean loadLocationAndValidate) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getRespawnLocation'"); + } + + @Override + public void incrementStatistic(Statistic statistic) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'incrementStatistic'"); + } + + @Override + public void decrementStatistic(Statistic statistic) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'decrementStatistic'"); + } + + @Override + public void incrementStatistic(Statistic statistic, int amount) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'incrementStatistic'"); + } + + @Override + public void decrementStatistic(Statistic statistic, int amount) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'decrementStatistic'"); + } + + @Override + public void setStatistic(Statistic statistic, int newValue) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setStatistic'"); + } + + @Override + public int getStatistic(Statistic statistic) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getStatistic'"); + } + + @Override + public void incrementStatistic(Statistic statistic, Material material) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'incrementStatistic'"); + } + + @Override + public void decrementStatistic(Statistic statistic, Material material) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'decrementStatistic'"); + } + + @Override + public int getStatistic(Statistic statistic, Material material) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getStatistic'"); + } + + @Override + public void incrementStatistic(Statistic statistic, Material material, int amount) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'incrementStatistic'"); + } + + @Override + public void decrementStatistic(Statistic statistic, Material material, int amount) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'decrementStatistic'"); + } + + @Override + public void setStatistic(Statistic statistic, Material material, int newValue) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setStatistic'"); + } + + @Override + public void incrementStatistic(Statistic statistic, EntityType entityType) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'incrementStatistic'"); + } + + @Override + public void decrementStatistic(Statistic statistic, EntityType entityType) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'decrementStatistic'"); + } + + @Override + public int getStatistic(Statistic statistic, EntityType entityType) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getStatistic'"); + } + + @Override + public void incrementStatistic(Statistic statistic, EntityType entityType, int amount) + throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'incrementStatistic'"); + } + + @Override + public void decrementStatistic(Statistic statistic, EntityType entityType, int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'decrementStatistic'"); + } + + @Override + public void setStatistic(Statistic statistic, EntityType entityType, int newValue) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setStatistic'"); + } + + @Override + public @NotNull Map serialize() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'serialize'"); + } + + @Override + public void sendPluginMessage(@NotNull Plugin source, @NotNull String channel, byte @NotNull [] message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendPluginMessage'"); + } + + @Override + public @NotNull Set getListeningPluginChannels() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getListeningPluginChannels'"); + } + + @Override + public int getProtocolVersion() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getProtocolVersion'"); + } + + @Override + public @org.jspecify.annotations.Nullable InetSocketAddress getVirtualHost() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getVirtualHost'"); + } + + @Override + public @UnmodifiableView Iterable activeBossBars() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'activeBossBars'"); + } + + @Override + public Component displayName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'displayName'"); + } + + @Override + public void displayName(@org.jspecify.annotations.Nullable Component displayName) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'displayName'"); + } + + @Override + public String getDisplayName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDisplayName'"); + } + + @Override + public void setDisplayName(@org.jspecify.annotations.Nullable String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setDisplayName'"); + } + + @Override + public void playerListName(@org.jspecify.annotations.Nullable Component name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playerListName'"); + } + + @Override + public Component playerListName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playerListName'"); + } + + @Override + public @org.jspecify.annotations.Nullable Component playerListHeader() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playerListHeader'"); + } + + @Override + public @org.jspecify.annotations.Nullable Component playerListFooter() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playerListFooter'"); + } + + @Override + public String getPlayerListName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerListName'"); + } + + @Override + public void setPlayerListName(@org.jspecify.annotations.Nullable String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListName'"); + } + + @Override + public int getPlayerListOrder() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerListOrder'"); + } + + @Override + public void setPlayerListOrder(int order) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListOrder'"); + } + + @Override + public @org.jspecify.annotations.Nullable String getPlayerListHeader() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerListHeader'"); + } + + @Override + public @org.jspecify.annotations.Nullable String getPlayerListFooter() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerListFooter'"); + } + + @Override + public void setPlayerListHeader(@org.jspecify.annotations.Nullable String header) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListHeader'"); + } + + @Override + public void setPlayerListFooter(@org.jspecify.annotations.Nullable String footer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListFooter'"); + } + + @Override + public void setPlayerListHeaderFooter(@org.jspecify.annotations.Nullable String header, + @org.jspecify.annotations.Nullable String footer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListHeaderFooter'"); + } + + @Override + public void setCompassTarget(Location loc) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCompassTarget'"); + } + + @Override + public Location getCompassTarget() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCompassTarget'"); + } + + @Override + public @org.jspecify.annotations.Nullable InetSocketAddress getAddress() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAddress'"); + } + + @Override + public @org.jspecify.annotations.Nullable InetSocketAddress getHAProxyAddress() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHAProxyAddress'"); + } + + @Override + public boolean isTransferred() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isTransferred'"); + } + + @Override + public CompletableFuture retrieveCookie(NamespacedKey key) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'retrieveCookie'"); + } + + @Override + public void storeCookie(NamespacedKey key, byte[] value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'storeCookie'"); + } + + @Override + public void transfer(String host, int port) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'transfer'"); + } + + @Override + public void sendRawMessage(String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendRawMessage'"); + } + + @Override + public void kickPlayer(@org.jspecify.annotations.Nullable String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'kickPlayer'"); + } + + @Override + public void kick(@org.jspecify.annotations.Nullable Component message, Cause cause) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'kick'"); + } + + @Override + public > @org.jspecify.annotations.Nullable E ban( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Date expires, + @org.jspecify.annotations.Nullable String source, boolean kickPlayer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'ban'"); + } + + @Override + public > @org.jspecify.annotations.Nullable E ban( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Instant expires, + @org.jspecify.annotations.Nullable String source, boolean kickPlayer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'ban'"); + } + + @Override + public > @org.jspecify.annotations.Nullable E ban( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Duration duration, + @org.jspecify.annotations.Nullable String source, boolean kickPlayer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'ban'"); + } + + @Override + public @org.jspecify.annotations.Nullable BanEntry banIp( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Date expires, + @org.jspecify.annotations.Nullable String source, boolean kickPlayer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'banIp'"); + } + + @Override + public @org.jspecify.annotations.Nullable BanEntry banIp( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Instant expires, + @org.jspecify.annotations.Nullable String source, boolean kickPlayer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'banIp'"); + } + + @Override + public @org.jspecify.annotations.Nullable BanEntry banIp( + @org.jspecify.annotations.Nullable String reason, @org.jspecify.annotations.Nullable Duration duration, + @org.jspecify.annotations.Nullable String source, boolean kickPlayer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'banIp'"); + } + + @Override + public void chat(String msg) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'chat'"); + } + + @Override + public boolean performCommand(String command) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'performCommand'"); + } + + @Override + public boolean isSprinting() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSprinting'"); + } + + @Override + public void setSprinting(boolean sprinting) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSprinting'"); + } + + @Override + public void saveData() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'saveData'"); + } + + @Override + public void loadData() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'loadData'"); + } + + @Override + public void setSleepingIgnored(boolean isSleeping) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSleepingIgnored'"); + } + + @Override + public boolean isSleepingIgnored() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isSleepingIgnored'"); + } + + @Override + public void setRespawnLocation(@org.jspecify.annotations.Nullable Location location, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setRespawnLocation'"); + } + + @Override + public Collection getEnderPearls() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEnderPearls'"); + } + + @Override + public Input getCurrentInput() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCurrentInput'"); + } + + @Override + public void playNote(Location loc, Instrument instrument, Note note) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playNote'"); + } + + @Override + public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch, + long seed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch, + long seed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Entity entity, Sound sound, SoundCategory category, float volume, float pitch) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Entity entity, String sound, SoundCategory category, float volume, float pitch) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Entity entity, Sound sound, SoundCategory category, float volume, float pitch, long seed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void playSound(Entity entity, String sound, SoundCategory category, float volume, float pitch, long seed) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playSound'"); + } + + @Override + public void stopSound(String sound, @org.jspecify.annotations.Nullable SoundCategory category) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'stopSound'"); + } + + @Override + public void stopSound(SoundCategory category) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'stopSound'"); + } + + @Override + public void stopAllSounds() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'stopAllSounds'"); + } + + @Override + public void playEffect(Location loc, Effect effect, int data) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playEffect'"); + } + + @Override + public void playEffect(Location loc, Effect effect, @org.jspecify.annotations.Nullable T data) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'playEffect'"); + } + + @Override + public boolean breakBlock(Block block) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'breakBlock'"); + } + + @Override + public void sendBlockChange(Location loc, Material material, byte data) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendBlockChange'"); + } + + @Override + public void sendBlockChange(Location loc, BlockData block) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendBlockChange'"); + } + + @Override + public void sendBlockChanges(Collection blocks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendBlockChanges'"); + } + + @Override + public void sendMultiBlockChange(Map blockChanges) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMultiBlockChange'"); + } + + @Override + public void sendBlockDamage(Location loc, float progress, Entity source) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendBlockDamage'"); + } + + @Override + public void sendBlockDamage(Location loc, float progress, int sourceId) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendBlockDamage'"); + } + + @Override + public void sendEquipmentChange(LivingEntity entity, EquipmentSlot slot, + @org.jspecify.annotations.Nullable ItemStack item) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendEquipmentChange'"); + } + + @Override + public void sendEquipmentChange(LivingEntity entity, + Map items) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendEquipmentChange'"); + } + + @Override + public void sendSignChange(Location loc, @org.jspecify.annotations.Nullable List lines, + DyeColor dyeColor, boolean hasGlowingText) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendSignChange'"); + } + + @Override + public void sendSignChange(Location loc, + @org.jspecify.annotations.Nullable String @org.jspecify.annotations.Nullable [] lines) + throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendSignChange'"); + } + + @Override + public void sendSignChange(Location loc, + @org.jspecify.annotations.Nullable String @org.jspecify.annotations.Nullable [] lines, DyeColor dyeColor) + throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendSignChange'"); + } + + @Override + public void sendSignChange(Location loc, + @org.jspecify.annotations.Nullable String @org.jspecify.annotations.Nullable [] lines, DyeColor dyeColor, + boolean hasGlowingText) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendSignChange'"); + } + + @Override + public void sendBlockUpdate(Location loc, TileState tileState) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendBlockUpdate'"); + } + + @Override + public void sendPotionEffectChange(LivingEntity entity, PotionEffect effect) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendPotionEffectChange'"); + } + + @Override + public void sendPotionEffectChangeRemove(LivingEntity entity, PotionEffectType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendPotionEffectChangeRemove'"); + } + + @Override + public void sendMap(MapView map) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendMap'"); + } + + @Override + public void showWinScreen() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showWinScreen'"); + } + + @Override + public boolean hasSeenWinScreen() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasSeenWinScreen'"); + } + + @Override + public void setHasSeenWinScreen(boolean hasSeenWinScreen) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHasSeenWinScreen'"); + } + + @Override + public void sendActionBar(String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendActionBar'"); + } + + @Override + public void sendActionBar(char alternateChar, String message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendActionBar'"); + } + + @Override + public void sendActionBar(BaseComponent... message) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendActionBar'"); + } + + @Override + public void setPlayerListHeaderFooter(BaseComponent @org.jspecify.annotations.Nullable [] header, + BaseComponent @org.jspecify.annotations.Nullable [] footer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListHeaderFooter'"); + } + + @Override + public void setPlayerListHeaderFooter(@org.jspecify.annotations.Nullable BaseComponent header, + @org.jspecify.annotations.Nullable BaseComponent footer) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerListHeaderFooter'"); + } + + @Override + public void setTitleTimes(int fadeInTicks, int stayTicks, int fadeOutTicks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setTitleTimes'"); + } + + @Override + public void setSubtitle(BaseComponent[] subtitle) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSubtitle'"); + } + + @Override + public void setSubtitle(BaseComponent subtitle) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSubtitle'"); + } + + @Override + public void showTitle(@org.jspecify.annotations.Nullable BaseComponent[] title) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showTitle'"); + } + + @Override + public void showTitle(@org.jspecify.annotations.Nullable BaseComponent title) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showTitle'"); + } + + @Override + public void showTitle(@org.jspecify.annotations.Nullable BaseComponent[] title, + @org.jspecify.annotations.Nullable BaseComponent[] subtitle, int fadeInTicks, int stayTicks, + int fadeOutTicks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showTitle'"); + } + + @Override + public void showTitle(@org.jspecify.annotations.Nullable BaseComponent title, + @org.jspecify.annotations.Nullable BaseComponent subtitle, int fadeInTicks, int stayTicks, + int fadeOutTicks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showTitle'"); + } + + @Override + public void sendTitle(Title title) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendTitle'"); + } + + @Override + public void updateTitle(Title title) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'updateTitle'"); + } + + @Override + public void hideTitle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hideTitle'"); + } + + @Override + public void sendHurtAnimation(float yaw) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendHurtAnimation'"); + } + + @Override + public void sendLinks(ServerLinks links) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendLinks'"); + } + + @Override + public void addCustomChatCompletions(Collection completions) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addCustomChatCompletions'"); + } + + @Override + public void removeCustomChatCompletions(Collection completions) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeCustomChatCompletions'"); + } + + @Override + public void setCustomChatCompletions(Collection completions) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setCustomChatCompletions'"); + } + + @Override + public void updateInventory() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'updateInventory'"); + } + + @Override + public @org.jspecify.annotations.Nullable GameMode getPreviousGameMode() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPreviousGameMode'"); + } + + @Override + public void setPlayerTime(long time, boolean relative) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerTime'"); + } + + @Override + public long getPlayerTime() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerTime'"); + } + + @Override + public long getPlayerTimeOffset() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerTimeOffset'"); + } + + @Override + public boolean isPlayerTimeRelative() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isPlayerTimeRelative'"); + } + + @Override + public void resetPlayerTime() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetPlayerTime'"); + } + + @Override + public void setPlayerWeather(WeatherType type) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerWeather'"); + } + + @Override + public @org.jspecify.annotations.Nullable WeatherType getPlayerWeather() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerWeather'"); + } + + @Override + public void resetPlayerWeather() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetPlayerWeather'"); + } + + @Override + public int getExpCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getExpCooldown'"); + } + + @Override + public void setExpCooldown(int ticks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setExpCooldown'"); + } + + @Override + public void giveExp(int amount, boolean applyMending) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'giveExp'"); + } + + @Override + public int applyMending(int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'applyMending'"); + } + + @Override + public void giveExpLevels(int amount) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'giveExpLevels'"); + } + + @Override + public float getExp() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getExp'"); + } + + @Override + public void setExp(float exp) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setExp'"); + } + + @Override + public int getLevel() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLevel'"); + } + + @Override + public void setLevel(int level) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setLevel'"); + } + + @Override + public int getTotalExperience() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getTotalExperience'"); + } + + @Override + public void setTotalExperience(int exp) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setTotalExperience'"); + } + + @Override + public @Range(from = 0, to = 2147483647) int calculateTotalExperiencePoints() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'calculateTotalExperiencePoints'"); + } + + @Override + public void setExperienceLevelAndProgress(@Range(from = 0, to = 2147483647) int totalExperience) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setExperienceLevelAndProgress'"); + } + + @Override + public int getExperiencePointsNeededForNextLevel() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getExperiencePointsNeededForNextLevel'"); + } + + @Override + public void sendExperienceChange(float progress) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendExperienceChange'"); + } + + @Override + public void sendExperienceChange(float progress, int level) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendExperienceChange'"); + } + + @Override + public boolean getAllowFlight() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAllowFlight'"); + } + + @Override + public void setAllowFlight(boolean flight) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAllowFlight'"); + } + + @Override + public void setFlyingFallDamage(TriState flyingFallDamage) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFlyingFallDamage'"); + } + + @Override + public TriState hasFlyingFallDamage() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hasFlyingFallDamage'"); + } + + @Override + public void hidePlayer(Player player) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hidePlayer'"); + } + + @Override + public void showPlayer(Player player) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showPlayer'"); + } + + @Override + public boolean canSee(Player player) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'canSee'"); + } + + @Override + public void hideEntity(Plugin plugin, Entity entity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'hideEntity'"); + } + + @Override + public void showEntity(Plugin plugin, Entity entity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showEntity'"); + } + + @Override + public boolean canSee(Entity entity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'canSee'"); + } + + @Override + public boolean isListed(Player other) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isListed'"); + } + + @Override + public boolean unlistPlayer(Player other) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'unlistPlayer'"); + } + + @Override + public boolean listPlayer(Player other) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'listPlayer'"); + } + + @Override + public boolean isFlying() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isFlying'"); + } + + @Override + public void setFlying(boolean value) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFlying'"); + } + + @Override + public void setFlySpeed(float value) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setFlySpeed'"); + } + + @Override + public void setWalkSpeed(float value) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWalkSpeed'"); + } + + @Override + public float getFlySpeed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getFlySpeed'"); + } + + @Override + public float getWalkSpeed() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWalkSpeed'"); + } + + @Override + public void setResourcePack(String url, byte @org.jspecify.annotations.Nullable [] hash, + @org.jspecify.annotations.Nullable String prompt, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setResourcePack'"); + } + + @Override + public void setResourcePack(UUID id, String url, byte @org.jspecify.annotations.Nullable [] hash, + @org.jspecify.annotations.Nullable String prompt, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setResourcePack'"); + } + + @Override + public void setResourcePack(UUID uuid, String url, byte @org.jspecify.annotations.Nullable [] hash, + @org.jspecify.annotations.Nullable Component prompt, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setResourcePack'"); + } + + @Override + public @org.jspecify.annotations.Nullable Status getResourcePackStatus() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getResourcePackStatus'"); + } + + @Override + public void addResourcePack(UUID id, String url, byte @org.jspecify.annotations.Nullable [] hash, + @org.jspecify.annotations.Nullable String prompt, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addResourcePack'"); + } + + @Override + public void removeResourcePack(UUID id) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeResourcePack'"); + } + + @Override + public void removeResourcePacks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeResourcePacks'"); + } + + @Override + public Scoreboard getScoreboard() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getScoreboard'"); + } + + @Override + public void setScoreboard(Scoreboard scoreboard) throws IllegalArgumentException, IllegalStateException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setScoreboard'"); + } + + @Override + public @org.jspecify.annotations.Nullable WorldBorder getWorldBorder() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWorldBorder'"); + } + + @Override + public void setWorldBorder(@org.jspecify.annotations.Nullable WorldBorder border) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWorldBorder'"); + } + + @Override + public void sendHealthUpdate(double health, int foodLevel, float saturation) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendHealthUpdate'"); + } + + @Override + public void sendHealthUpdate() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendHealthUpdate'"); + } + + @Override + public boolean isHealthScaled() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isHealthScaled'"); + } + + @Override + public void setHealthScaled(boolean scale) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHealthScaled'"); + } + + @Override + public void setHealthScale(double scale) throws IllegalArgumentException { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setHealthScale'"); + } + + @Override + public double getHealthScale() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getHealthScale'"); + } + + @Override + public @org.jspecify.annotations.Nullable Entity getSpectatorTarget() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSpectatorTarget'"); + } + + @Override + public void setSpectatorTarget(@org.jspecify.annotations.Nullable Entity entity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSpectatorTarget'"); + } + + @Override + public void sendTitle(@org.jspecify.annotations.Nullable String title, + @org.jspecify.annotations.Nullable String subtitle) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendTitle'"); + } + + @Override + public void sendTitle(@org.jspecify.annotations.Nullable String title, + @org.jspecify.annotations.Nullable String subtitle, int fadeIn, int stay, int fadeOut) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendTitle'"); + } + + @Override + public void resetTitle() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetTitle'"); + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, + double offsetY, double offsetZ, double extra, @org.jspecify.annotations.Nullable T data, boolean force) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'spawnParticle'"); + } + + @Override + public AdvancementProgress getAdvancementProgress(Advancement advancement) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAdvancementProgress'"); + } + + @Override + public int getClientViewDistance() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getClientViewDistance'"); + } + + @Override + public Locale locale() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'locale'"); + } + + @Override + public int getPing() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPing'"); + } + + @Override + public String getLocale() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getLocale'"); + } + + @Override + public boolean getAffectsSpawning() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAffectsSpawning'"); + } + + @Override + public void setAffectsSpawning(boolean affects) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setAffectsSpawning'"); + } + + @Override + public int getViewDistance() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getViewDistance'"); + } + + @Override + public void setViewDistance(int viewDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setViewDistance'"); + } + + @Override + public int getSimulationDistance() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSimulationDistance'"); + } + + @Override + public void setSimulationDistance(int simulationDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSimulationDistance'"); + } + + @Override + public int getSendViewDistance() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSendViewDistance'"); + } + + @Override + public void setSendViewDistance(int viewDistance) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setSendViewDistance'"); + } + + @Override + public void updateCommands() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'updateCommands'"); + } + + @Override + public void openBook(ItemStack book) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openBook'"); + } + + @Override + public void openVirtualSign(Position block, Side side) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'openVirtualSign'"); + } + + @Override + public void showDemoScreen() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showDemoScreen'"); + } + + @Override + public boolean isAllowingServerListings() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isAllowingServerListings'"); + } + + @Override + public PlayerProfile getPlayerProfile() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getPlayerProfile'"); + } + + @Override + public void setPlayerProfile(PlayerProfile profile) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setPlayerProfile'"); + } + + @Override + public float getCooldownPeriod() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCooldownPeriod'"); + } + + @Override + public float getCooledAttackStrength(float adjustTicks) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getCooledAttackStrength'"); + } + + @Override + public void resetCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetCooldown'"); + } + + @Override + public T getClientOption(ClientOption option) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getClientOption'"); + } + + @Override + public void sendOpLevel(byte level) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendOpLevel'"); + } + + @Override + public void addAdditionalChatCompletions(Collection completions) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addAdditionalChatCompletions'"); + } + + @Override + public void removeAdditionalChatCompletions(Collection completions) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'removeAdditionalChatCompletions'"); + } + + @Override + public @org.jspecify.annotations.Nullable String getClientBrandName() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getClientBrandName'"); + } + + @Override + public void lookAt(Entity entity, LookAnchor playerAnchor, LookAnchor entityAnchor) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'lookAt'"); + } + + @Override + public void showElderGuardian(boolean silent) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'showElderGuardian'"); + } + + @Override + public int getWardenWarningCooldown() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWardenWarningCooldown'"); + } + + @Override + public void setWardenWarningCooldown(int cooldown) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWardenWarningCooldown'"); + } + + @Override + public int getWardenTimeSinceLastWarning() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWardenTimeSinceLastWarning'"); + } + + @Override + public void setWardenTimeSinceLastWarning(int time) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWardenTimeSinceLastWarning'"); + } + + @Override + public int getWardenWarningLevel() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getWardenWarningLevel'"); + } + + @Override + public void setWardenWarningLevel(int warningLevel) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setWardenWarningLevel'"); + } + + @Override + public void increaseWardenWarningLevel() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'increaseWardenWarningLevel'"); + } + + @Override + public Duration getIdleDuration() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getIdleDuration'"); + } + + @Override + public void resetIdleDuration() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'resetIdleDuration'"); + } + + @Override + public @Unmodifiable Set getSentChunkKeys() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSentChunkKeys'"); + } + + @Override + public @Unmodifiable Set getSentChunks() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getSentChunks'"); + } + + @Override + public boolean isChunkSent(long chunkKey) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'isChunkSent'"); + } + + @Override + public void sendEntityEffect(EntityEffect effect, Entity target) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'sendEntityEffect'"); + } + + @Override + public PlayerGiveResult give(Collection items, boolean dropIfFull) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'give'"); + } + + @Override + public int getDeathScreenScore() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getDeathScreenScore'"); + } + + @Override + public void setDeathScreenScore(int score) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'setDeathScreenScore'"); + } + + @Override + public PlayerGameConnection getConnection() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getConnection'"); + }} diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 49a7f29..3fe964b 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -49,9 +49,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "annotate-snippets" -version = "0.12.10" +version = "0.12.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15580ece6ea97cbf832d60ba19c021113469480852c6a2a6beb0db28f097bf1f" +checksum = "16e4850548ff4a25a77ce3bda7241874e17fb702ea551f0cc62a2dbe052f1272" dependencies = [ "anstyle", "unicode-width", @@ -122,6 +122,15 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "arc-swap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d03449bb8ca2cc2ef70869af31463d1ae5ccc8fa3e334b307203fbf815207e" +dependencies = [ + "rustversion", +] + [[package]] name = "arraydeque" version = "0.5.1" @@ -140,17 +149,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -228,9 +226,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.53" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "jobserver", @@ -267,13 +265,13 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chacha20" -version = "0.10.0-rc.6" +version = "0.10.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895fb33c1ad22da4bc79d37c0bddff8aee2ba4575705345eb73b8ffbc386074" +checksum = "c81d916c6ae06736ec667b51f95ee5ff660a75f4ea6ce1bd932c942365c0ea43" dependencies = [ "cfg-if", "cpufeatures", - "rand_core 0.10.0-rc-3", + "rand_core 0.10.0-rc-6", ] [[package]] @@ -297,9 +295,9 @@ dependencies = [ [[package]] name = "cmov" -version = "0.5.0-pre.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417da527aa9bf6a1e10a781231effd1edd3ee82f27d5f8529ac9b279babce96" +checksum = "de0758edba32d61d1fd9f4d69491b47604b91ee2f7e6b33de7e54ca4ebe55dc3" [[package]] name = "colorchoice" @@ -480,15 +478,14 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crossfire" -version = "2.1.10" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd901251b9b46c1752c85edfee0aee718c03a85a065f4126d32e5d6d419edf48" +checksum = "cf9c756fd351d7bc1f95698a33a90ce39c8f7458335cc7e95132d3d36124902a" dependencies = [ - "crossbeam-queue", "crossbeam-utils", - "enum_dispatch", "futures-core", "parking_lot", + "smallvec 1.15.1", ] [[package]] @@ -505,13 +502,13 @@ dependencies = [ [[package]] name = "crypto-bigint" -version = "0.7.0-rc.18" +version = "0.7.0-rc.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37387ceb32048ff590f2cbd24d8b05fffe63c3f69a5cfa089d4f722ca4385a19" +checksum = "053c3561863ce55e3226ecc48b08679f4b66cb1b92b9afb42c2c402dfe8b9b51" dependencies = [ "ctutils", "num-traits", - "rand_core 0.10.0-rc-3", + "rand_core 0.10.0-rc-6", "serdect", "zeroize", ] @@ -528,29 +525,29 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.0-rc.9" +version = "0.2.0-rc.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b8986f836d4aeb30ccf4c9d3bd562fd716074cfd7fc4a2948359fbd21ed809" +checksum = "c7722afd27468475c9b6063dc03a57ef2ca833816981619f8ebe64d38d207eef" dependencies = [ "hybrid-array", ] [[package]] name = "crypto-primes" -version = "0.7.0-pre.6" +version = "0.7.0-pre.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79c98a281f9441200b24e3151407a629bfbe720399186e50516da939195e482" +checksum = "334a79c97c0b7fa536716dc132fd417d0afbf471440a41fc25a5d9f66d8771cd" dependencies = [ - "crypto-bigint 0.7.0-rc.18", + "crypto-bigint 0.7.0-rc.22", "libm", - "rand_core 0.10.0-rc-3", + "rand_core 0.10.0-rc-6", ] [[package]] name = "ctutils" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758e5ed90be3c8abff7f9a6f37ab7f6d8c59c2210d448b81f3f508134aec84e4" +checksum = "1005a6d4446f5120ef475ad3d2af2b30c49c2c9c6904258e3bb30219bebed5e4" dependencies = [ "cmov", ] @@ -620,13 +617,13 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.0-rc.5" +version = "0.11.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebf9423bafb058e4142194330c52273c343f8a5beb7176d052f0e73b17dd35b9" +checksum = "bff8de092798697546237a3a701e4174fe021579faec9b854379af9bf1e31962" dependencies = [ "block-buffer 0.11.0", "const-oid 0.10.2", - "crypto-common 0.2.0-rc.9", + "crypto-common 0.2.0-rc.13", "subtle", ] @@ -828,9 +825,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" @@ -843,6 +840,12 @@ dependencies = [ "zlib-rs", ] +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + [[package]] name = "foldhash" version = "0.2.0" @@ -991,15 +994,16 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.0-rc.0" +version = "0.4.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b99f0d993a2b9b97b9a201193aa8ad21305cde06a3be9a7e1f8f4201e5cc27e" +checksum = "74f70a332ddf75e5e5e43284304179ba02f391f82f692f030b08a8378adf3c99" dependencies = [ "cfg-if", "libc", "r-efi", - "rand_core 0.10.0-rc-3", + "rand_core 0.10.0-rc-6", "wasip2", + "wasip3", ] [[package]] @@ -1025,6 +1029,15 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -1033,7 +1046,7 @@ checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.2.0", ] [[package]] @@ -1068,11 +1081,11 @@ dependencies = [ [[package]] name = "hmac" -version = "0.13.0-rc.3" +version = "0.13.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c597ac7d6cc8143e30e83ef70915e7f883b18d8bec2e2b2bce47f5bbb06d57" +checksum = "d9956e202a691c5c86c60303a421f66f93f44b29433407b7c43cf2bebadc750e" dependencies = [ - "digest 0.11.0-rc.5", + "digest 0.11.0-rc.9", ] [[package]] @@ -1102,9 +1115,9 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hybrid-array" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f471e0a81b2f90ffc0cb2f951ae04da57de8baa46fa99112b062a5173a5088d0" +checksum = "b41fb3dc24fe72c2e3a4685eed55917c2fb228851257f4a8f2d985da9443c3e5" dependencies = [ "typenum", ] @@ -1190,6 +1203,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "idna" version = "1.1.0" @@ -1266,7 +1285,7 @@ dependencies = [ "java-locator", "jni-sys", "libc", - "libloading", + "libloading 0.8.9", "log", "serde", "serde_json", @@ -1355,6 +1374,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libbz2-rs-sys" version = "0.2.2" @@ -1378,10 +1403,20 @@ dependencies = [ ] [[package]] -name = "libm" -version = "0.2.15" +name = "libloading" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" @@ -1543,9 +1578,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-derive" @@ -1653,8 +1688,8 @@ name = "patchbukkit" version = "0.1.0" dependencies = [ "anyhow", - "async-trait", "env_logger", + "futures", "glob", "j4rs", "j4rs_derive", @@ -1824,9 +1859,9 @@ dependencies = [ [[package]] name = "pkcs8" -version = "0.11.0-rc.8" +version = "0.11.0-rc.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77089aec8290d0b7bb01b671b091095cf1937670725af4fd73d47249f03b12c0" +checksum = "b226d2cc389763951db8869584fd800cbbe2962bf454e2edeb5172b31ee99774" dependencies = [ "der 0.8.0-rc.10", "spki 0.8.0-rc.4", @@ -1870,9 +1905,19 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppmd-rust" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d558c559f0450f16f2a27a1f017ef38468c1090c9ce63c8e51366232d53717b4" +checksum = "efca4c95a19a79d1c98f791f10aebd5c1363b473244630bb7dbde1dc98455a24" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] [[package]] name = "primeorder" @@ -1907,9 +1952,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1917,18 +1962,20 @@ dependencies = [ [[package]] name = "pumpkin" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ + "arc-swap", "base64", "bytes", "crossbeam", + "dashmap", "flate2", "futures", - "hmac 0.13.0-rc.3", - "libloading", + "hmac 0.13.0-rc.4", + "libloading 0.9.0", "log", "num-bigint", - "pkcs8 0.11.0-rc.8", + "pkcs8 0.11.0-rc.10", "pumpkin-config", "pumpkin-data", "pumpkin-inventory", @@ -1943,8 +1990,8 @@ dependencies = [ "rustyline", "serde", "serde_json", - "sha1 0.11.0-rc.3", - "sha2 0.11.0-rc.3", + "sha1 0.11.0-rc.4", + "sha2 0.11.0-rc.4", "signature 2.2.0", "simplelog", "thiserror", @@ -1958,7 +2005,7 @@ dependencies = [ [[package]] name = "pumpkin-api-macros" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "proc-macro-error2", "proc-macro2", @@ -1969,7 +2016,7 @@ dependencies = [ [[package]] name = "pumpkin-config" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "log", "pumpkin-util", @@ -1981,7 +2028,7 @@ dependencies = [ [[package]] name = "pumpkin-data" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "crc-fast", "heck", @@ -2001,7 +2048,7 @@ dependencies = [ [[package]] name = "pumpkin-inventory" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "crossbeam-utils", "log", @@ -2016,10 +2063,11 @@ dependencies = [ [[package]] name = "pumpkin-macros" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "proc-macro-error2", "proc-macro2", + "pumpkin-data", "quote", "syn", ] @@ -2027,7 +2075,7 @@ dependencies = [ [[package]] name = "pumpkin-nbt" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "bytes", "cesu8", @@ -2039,7 +2087,7 @@ dependencies = [ [[package]] name = "pumpkin-protocol" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "aes", "async-compression", @@ -2061,7 +2109,7 @@ dependencies = [ [[package]] name = "pumpkin-util" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "base64", "bytes", @@ -2086,7 +2134,7 @@ dependencies = [ [[package]] name = "pumpkin-world" version = "0.1.0-dev+1.21.11" -source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#bcdde4526fc8a96380d5aed72b6c002778cce697" +source = "git+https://github.com/Pumpkin-MC/Pumpkin.git?branch=master#d64f538138b4c2595215849daaf881fc666410e3" dependencies = [ "bitflags", "bytes", @@ -2112,7 +2160,7 @@ dependencies = [ "ruzstd", "serde", "serde_json", - "sha2 0.11.0-rc.3", + "sha2 0.11.0-rc.4", "slotmap", "thiserror", "thread_local", @@ -2123,9 +2171,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -2148,12 +2196,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.0-rc.6" -source = "git+https://github.com/rust-random/rand#f356bbae5817f382b19ac5741b549c4d2cd49b50" +version = "0.10.0-rc.8" +source = "git+https://github.com/rust-random/rand#a4c9a8e565fa310de423e3ba89593b647b721e8c" dependencies = [ "chacha20", - "getrandom 0.4.0-rc.0", - "rand_core 0.10.0-rc-3", + "getrandom 0.4.0-rc.1", + "rand_core 0.10.0-rc-6", ] [[package]] @@ -2167,9 +2215,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0-rc-3" +version = "0.10.0-rc-6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66ee92bc15280519ef199a274fe0cafff4245d31bc39aaa31c011ad56cb1f05" +checksum = "70765ff7112b0fb2d272d24d9a2f907fc206211304328fe58b2db15a5649ef28" [[package]] name = "rayon" @@ -2266,19 +2314,19 @@ dependencies = [ [[package]] name = "rsa" -version = "0.10.0-rc.12" +version = "0.10.0-rc.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2b1eacbc34fbaf77f6f1db1385518446008d49b9f9f59dc9d1340fce4ca9e" +checksum = "6ef381dd6f207f81aff2ee3a8264eddd68ba475bbfcdb44ca445e5906bce381b" dependencies = [ "const-oid 0.10.2", - "crypto-bigint 0.7.0-rc.18", + "crypto-bigint 0.7.0-rc.22", "crypto-primes", - "digest 0.11.0-rc.5", + "digest 0.11.0-rc.9", "pkcs1", - "pkcs8 0.11.0-rc.8", - "rand_core 0.10.0-rc-3", - "sha1 0.11.0-rc.3", - "signature 3.0.0-rc.6", + "pkcs8 0.11.0-rc.10", + "rand_core 0.10.0-rc-6", + "sha1 0.11.0-rc.4", + "signature 3.0.0-rc.9", "spki 0.8.0-rc.4", "zeroize", ] @@ -2449,6 +2497,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" version = "1.0.228" @@ -2556,13 +2610,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.11.0-rc.3" +version = "0.11.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa1ae819b9870cadc959a052363de870944a1646932d274a4e270f64bf79e5ef" +checksum = "9c777f0a122a53fddb0beb6e706771197000b8eb5c9f42b5b850f450ef48c788" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.11.0-rc.5", + "digest 0.11.0-rc.9", ] [[package]] @@ -2578,13 +2632,13 @@ dependencies = [ [[package]] name = "sha2" -version = "0.11.0-rc.3" +version = "0.11.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d43dc0354d88b791216bb5c1bfbb60c0814460cc653ae0ebd71f286d0bd927" +checksum = "7535f94fa3339fe9e5e9be6260a909e62af97f6e14b32345ccf79b92b8b81233" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.11.0-rc.5", + "digest 0.11.0-rc.9", ] [[package]] @@ -2624,12 +2678,12 @@ dependencies = [ [[package]] name = "signature" -version = "3.0.0-rc.6" +version = "3.0.0-rc.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a96996ccff7dfa16f052bd995b4cecc72af22c35138738dc029f0ead6608d" +checksum = "0ad0ce3b3f8efd7406f22e2ca5d02be21cdf3b3d1d53ab141f784de8965c7c7e" dependencies = [ - "digest 0.11.0-rc.5", - "rand_core 0.10.0-rc-3", + "digest 0.11.0-rc.9", + "rand_core 0.10.0-rc-6", ] [[package]] @@ -2652,9 +2706,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" @@ -2685,9 +2739,9 @@ checksum = "ef784004ca8777809dcdad6ac37629f0a97caee4c685fcea805278d81dd8b857" [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -2776,18 +2830,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2805,9 +2859,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "9da98b7d9b7dad93488a84b8248efc35352b0b2657397d4167e7ad67e5d535e5" dependencies = [ "deranged", "itoa", @@ -2823,15 +2877,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +checksum = "78cc610bac2dcee56805c99642447d4c5dbde4d01f752ffea0199aee1f601dc4" dependencies = [ "num-conv", "time-core", @@ -2979,6 +3033,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -3049,9 +3109,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -3088,7 +3148,16 @@ version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasip3" +version = "0.3.1+wasi-0.3.0-rc-2025-09-16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba4be47b1d11244670d11857eee0758a8f2c39aea64d80b78c1ce29b4642cd" +dependencies = [ + "wit-bindgen 0.48.1", ] [[package]] @@ -3136,6 +3205,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01164c9dda68301e34fdae536c23ed6fe90ce6d97213ccc171eebbd3d02d6b8" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876fe286f2fa416386deedebe8407e6f19e0b5aeaef3d03161e77a15fa80f167" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46d90019b1afd4b808c263e428de644f3003691f243387d30d673211ee0cb8e8" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + [[package]] name = "webpki-roots" version = "1.0.5" @@ -3353,12 +3456,100 @@ version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +[[package]] +name = "wit-bindgen" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8c2adb5f74ac9395bc3121c99a1254bf9310482c27b13f97167aedb5887138" +dependencies = [ + "wit-bindgen-rust-macro", +] + [[package]] name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +[[package]] +name = "wit-bindgen-core" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b881a098cae03686d7a0587f8f306f8a58102ad8da8b5599100fbe0e7f5800b" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69667efa439a453e1d50dac939c6cab6d2c3ac724a9d232b6631dad2472a5b70" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae2e22cceb5d105d52326c07e3e67603a861cc7add70fc467f7cc7ec5265017" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0c57df25e7ee612d946d3b7646c1ddb2310f8280aa2c17e543b66e0812241" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.241.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ef1c6ad67f35c831abd4039c02894de97034100899614d1c44e2268ad01c91" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + [[package]] name = "writeable" version = "0.6.2" @@ -3390,18 +3581,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "dafd85c832c1b68bbb4ec0c72c7f6f4fc5179627d2bc7c26b30e4c0cc11e76cc" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "7cb7e4e8436d9db52fbd6625dbf2f45243ab84994a72882ec8227b99e72b439a" dependencies = [ "proc-macro2", "quote", @@ -3518,9 +3709,9 @@ checksum = "40990edd51aae2c2b6907af74ffb635029d5788228222c4bb811e9351c0caad3" [[package]] name = "zmij" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" +checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" [[package]] name = "zopfli" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 620a173..b2788bd 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -11,7 +11,7 @@ pumpkin = { git = "https://github.com/Pumpkin-MC/Pumpkin.git", branch = "master" pumpkin-util = { git = "https://github.com/Pumpkin-MC/Pumpkin.git", branch = "master", package = "pumpkin-util" } pumpkin-api-macros = { git = "https://github.com/Pumpkin-MC/Pumpkin.git", branch = "master", package = "pumpkin-api-macros" } -async-trait = "0.1" +futures = "0.3" tokio = "1" log = "0.4" glob = "0.3.3" diff --git a/rust/src/config/spigot.rs b/rust/src/config/spigot.rs index cceeecb..259ad10 100644 --- a/rust/src/config/spigot.rs +++ b/rust/src/config/spigot.rs @@ -76,7 +76,7 @@ impl StringOrList { } /// The main plugin.yml configuration structure -#[derive(Debug, Deserialize)] +#[derive(Debug, Deserialize, Clone)] pub struct SpigotPluginYml { // Required fields /// The name of your plugin diff --git a/rust/src/events/join.rs b/rust/src/events/join.rs index 09e8f2f..f49de10 100644 --- a/rust/src/events/join.rs +++ b/rust/src/events/join.rs @@ -17,25 +17,27 @@ pub struct PatchBukkitJoinHandler { impl EventHandler for PatchBukkitJoinHandler { fn handle_blocking<'a>( &self, - _server: &Arc, + server: &Arc, event: &'a mut PlayerJoinEvent, ) -> BoxFuture<'a, ()> { - let event: &mut PlayerJoinEvent = event; + let command_tx = self.command_tx.clone(); + Box::pin(async move { + let event: &mut PlayerJoinEvent = event; - let (tx, rx) = oneshot::channel(); - let sent_event = event.clone(); - self.command_tx - .blocking_send(JvmCommand::TriggerEvent { - event: Event::PlayerJoinEvent(sent_event), - respond_to: tx, - }) - .unwrap(); + let (tx, rx) = oneshot::channel(); + let sent_event = event.clone(); + command_tx + .send(JvmCommand::TriggerEvent { + event: Event::PlayerJoinEvent(sent_event), + respond_to: tx, + }) + .await + .unwrap(); - match rx.await.unwrap().unwrap() { - Event::PlayerJoinEvent(player_join_event) => *event = player_join_event, - _ => unreachable!(), - }; - - Box::pin(async {}) + // match rx.await.unwrap().unwrap() { + // Event::PlayerJoinEvent(player_join_event) => *event = player_join_event, + // _ => unreachable!(), + // }; + }) } } diff --git a/rust/src/java/jvm/command_executor.rs b/rust/src/java/jvm/command_executor.rs new file mode 100644 index 0000000..bf9e223 --- /dev/null +++ b/rust/src/java/jvm/command_executor.rs @@ -0,0 +1,54 @@ +use std::sync::{Arc, Mutex}; + +use j4rs::{Instance, InvocationArg, Jvm}; +use pumpkin::command::CommandExecutor; +use tokio::sync::{mpsc, oneshot}; + +use crate::java::jvm::commands::JvmCommand; + +pub struct JavaCommandExecutor { + pub cmd_name: String, + pub command_tx: mpsc::Sender, + pub command: Arc>, +} + +#[derive(Clone)] +pub enum SimpleCommandSender { + Console, + // UUID + Player(String), +} + +impl CommandExecutor for JavaCommandExecutor { + fn execute<'a>( + &'a self, + sender: &'a pumpkin::command::CommandSender, + server: &'a pumpkin::server::Server, + args: &'a pumpkin::command::args::ConsumedArgs<'a>, + ) -> pumpkin::command::CommandResult<'a> { + Box::pin(async move { + let (tx, rx) = oneshot::channel(); + let sender = match sender { + pumpkin::command::CommandSender::Rcon(mutex) => todo!(), + pumpkin::command::CommandSender::Console => SimpleCommandSender::Console, + pumpkin::command::CommandSender::Player(player) => SimpleCommandSender::Player(player.gameprofile.id.to_string()), + pumpkin::command::CommandSender::CommandBlock(block_entity, world) => todo!(), + }; + self.command_tx + .send(JvmCommand::TriggerCommand { + cmd_name: self.cmd_name.clone(), + respond_to: tx, + command_sender: sender.clone(), + command: self.command.clone(), + }) + .await + .unwrap(); + + // match rx.await.unwrap().unwrap() { + // Event::PlayerJoinEvent(player_join_event) => *event = player_join_event, + // _ => unreachable!(), + // }; + Ok(()) + }) + } +} diff --git a/rust/src/java/jvm/commands.rs b/rust/src/java/jvm/commands.rs index 1e8be84..441190b 100644 --- a/rust/src/java/jvm/commands.rs +++ b/rust/src/java/jvm/commands.rs @@ -1,10 +1,14 @@ -use std::path::PathBuf; +use std::{ + path::PathBuf, + sync::{Arc, Mutex}, +}; use anyhow::Result; use j4rs::Instance; -use tokio::sync::oneshot; +use pumpkin::{command::CommandSender, plugin::Context, server::Server}; +use tokio::sync::{mpsc, oneshot}; -use crate::events::Event; +use crate::{events::Event, java::jvm::command_executor::SimpleCommandSender}; pub enum LoadPluginResult { SuccessfullyLoadedSpigot, @@ -30,6 +34,8 @@ pub enum JvmCommand { }, InstantiateAllPlugins { respond_to: oneshot::Sender>, + server: Arc, + command_tx: mpsc::Sender, }, EnableAllPlugins { respond_to: oneshot::Sender>, @@ -44,4 +50,10 @@ pub enum JvmCommand { event: Event, respond_to: oneshot::Sender>, }, + TriggerCommand { + cmd_name: String, + command_sender: SimpleCommandSender, + respond_to: oneshot::Sender>, + command: Arc>, + }, } diff --git a/rust/src/java/jvm/mod.rs b/rust/src/java/jvm/mod.rs index 1cdb224..2b0d9e1 100644 --- a/rust/src/java/jvm/mod.rs +++ b/rust/src/java/jvm/mod.rs @@ -1,2 +1,3 @@ +pub mod command_executor; pub mod commands; pub mod worker; diff --git a/rust/src/java/jvm/worker.rs b/rust/src/java/jvm/worker.rs index c809e81..76e6186 100644 --- a/rust/src/java/jvm/worker.rs +++ b/rust/src/java/jvm/worker.rs @@ -1,7 +1,8 @@ -use std::path::PathBuf; +use std::{path::PathBuf, sync::Arc}; use anyhow::bail; use j4rs::{Instance, InvocationArg, Jvm, JvmBuilder}; +use pumpkin::{net::bedrock::play, server::Server}; use tokio::sync::{mpsc, oneshot}; use crate::{ @@ -92,13 +93,20 @@ impl JvmWorker { } }; } - JvmCommand::InstantiateAllPlugins { respond_to } => { + JvmCommand::InstantiateAllPlugins { + respond_to, + server, + command_tx, + } => { let jvm = match self.jvm { Some(ref jvm) => jvm, None => &Jvm::attach_thread().unwrap(), }; - let _ = respond_to.send(self.plugin_manager.instantiate_all_plugins(jvm)); + let _ = respond_to.send( + self.plugin_manager + .instantiate_all_plugins(jvm, &server, command_tx), + ); } JvmCommand::EnableAllPlugins { respond_to } => { let jvm = match self.jvm { @@ -128,11 +136,87 @@ impl JvmWorker { match event { Event::PlayerJoinEvent(player_join_event) => { - // let player = jvm.create_instance("org.bukkit.entity.Player", &[]); + let server_instance = jvm + .invoke_static( + "org.bukkit.Bukkit", + "getServer", + InvocationArg::empty(), + ) + .map_err(|e| format!("Failed to get server: {}", e)) + .unwrap(); + + // let cloned_server_instance = + // jvm.clone_instance(&server_instance).unwrap(); + + // let j_entity = jvm + // .create_instance( + // "org.patchbukkit.entity.PatchBukkitEntity", + // &[ + // InvocationArg::from(cloned_server_instance), + // // InvocationArg::from(InvocationArg::empty()), // Placeholder for the actual NMS entity + // ], + // ) + // .unwrap(); + // let cloned_server_instance = + // jvm.clone_instance(&server_instance).unwrap(); + + let player = player_join_event.player; + + let j_uuid = jvm + .invoke_static( + "java.util.UUID", + "fromString", + &[InvocationArg::try_from(player.gameprofile.id.to_string()) + .unwrap()], + ) + .map_err(|e| format!("Failed to create Java UUID: {}", e)) + .unwrap(); + + let j_player = jvm + .create_instance( + "org.patchbukkit.entity.PatchBukkitPlayer", + &[ + InvocationArg::from(j_uuid), + InvocationArg::try_from(player.gameprofile.name.clone()) + .unwrap(), + ], + ) + .map_err(|e| format!("Failed to create player instance: {}", e)) + .unwrap(); + let patch_server = jvm + .cast(&server_instance, "org.patchbukkit.PatchBukkitServer") + .unwrap(); + + jvm.invoke( + &patch_server, + "registerPlayer", + &[InvocationArg::from(j_player)], + ) + .unwrap(); // self.event_manager.call_event(&jvm, event) } } } + JvmCommand::TriggerCommand { + cmd_name, + command_sender, + respond_to, + command, + } => { + let jvm = match self.jvm { + Some(ref jvm) => jvm, + None => &Jvm::attach_thread().unwrap(), + }; + self.plugin_manager + .trigger_command( + jvm, + &cmd_name, + command, + command_sender, + vec![cmd_name.clone()], + ) + .unwrap(); + } } } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 59c79f5..055e962 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use pumpkin::plugin::Context; +use pumpkin::{plugin::Context, server::Server}; use pumpkin_api_macros::{plugin_impl, plugin_method}; pub mod config; @@ -120,7 +120,11 @@ async fn on_load_inner(plugin: &mut PatchBukkitPlugin, server: Arc) -> let (tx, rx) = oneshot::channel(); plugin .command_tx - .send(JvmCommand::InstantiateAllPlugins { respond_to: tx }) + .send(JvmCommand::InstantiateAllPlugins { + respond_to: tx, + server: server.clone(), + command_tx: plugin.command_tx.clone(), + }) .await .map_err(|e| format!("Failed to send command to instantiate plugins: {}", e))?; rx.await diff --git a/rust/src/plugin/manager.rs b/rust/src/plugin/manager.rs index 26b7a5e..56acfc5 100644 --- a/rust/src/plugin/manager.rs +++ b/rust/src/plugin/manager.rs @@ -1,12 +1,25 @@ use std::{ collections::HashMap, path::{Path, PathBuf}, + sync::{Arc, Mutex}, }; use anyhow::Result; use j4rs::{Instance, InvocationArg, Jvm}; +use pumpkin::{command::tree::CommandTree, plugin::Context, server::Server}; +use pumpkin_util::permission::{Permission, PermissionDefault}; +use tokio::{runtime::Handle, sync::mpsc}; -use crate::config::{paper::PaperPluginYml, spigot::SpigotPluginYml}; +use crate::{ + config::{ + paper::PaperPluginYml, + spigot::{Command, SpigotPluginYml}, + }, + java::jvm::{ + command_executor::{JavaCommandExecutor, SimpleCommandSender}, + commands::JvmCommand, + }, +}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum PluginState { @@ -55,6 +68,9 @@ pub struct Plugin { /// Data folder for this plugin pub data_folder: PathBuf, pub instance: Option, + // The registered commands + pub commands: HashMap, + pub listeners: HashMap, } @@ -97,6 +113,7 @@ impl PluginManager { data_folder: jar_path.as_ref().parent().unwrap().join("data"), path: jar_path.as_ref().to_path_buf(), instance: None, + commands: HashMap::new(), listeners: HashMap::new(), }; @@ -116,12 +133,13 @@ impl PluginManager { version: parsed_spigot_plugin.version.clone(), main_class: parsed_spigot_plugin.main.clone(), plugin_type: PluginType::Spigot(SpigotPluginData { - spigot_config: parsed_spigot_plugin, + spigot_config: parsed_spigot_plugin.clone(), }), state: PluginState::Registered, data_folder: jar_path.as_ref().parent().unwrap().join("data"), path: jar_path.as_ref().to_path_buf(), instance: None, + commands: parsed_spigot_plugin.commands.unwrap_or(HashMap::new()), listeners: HashMap::new(), }; @@ -130,11 +148,20 @@ impl PluginManager { } pub fn enable_all_plugins(&mut self, jvm: &Jvm) -> Result<()> { + // IMPORANT: enable trough PluginManager not manually + let plugin_manager = jvm.invoke_static( + "org.bukkit.Bukkit", + "getPluginManager", + InvocationArg::empty(), + )?; for (_plugin_name, plugin) in &mut self.plugins { + let plugin_instance = plugin.instance.as_ref().unwrap(); + let plugin_instance = jvm.clone_instance(&plugin_instance).unwrap(); + let result = jvm.invoke( - plugin.instance.as_ref().unwrap(), - "onEnable", - InvocationArg::empty(), + &plugin_manager, + "enablePlugin", + &[InvocationArg::from(plugin_instance)], ); match result { @@ -156,11 +183,19 @@ impl PluginManager { } pub fn disable_all_plugins(&mut self, jvm: &Jvm) -> Result<()> { + let plugin_manager = jvm.invoke_static( + "org.bukkit.Bukkit", + "getPluginManager", + InvocationArg::empty(), + )?; for (_plugin_name, plugin) in &mut self.plugins { + let plugin_instance = plugin.instance.as_ref().unwrap(); + let plugin_instance = jvm.clone_instance(&plugin_instance).unwrap(); + let result = jvm.invoke( - plugin.instance.as_ref().unwrap(), - "onDisable", - InvocationArg::empty(), + &plugin_manager, + "disablePlugin", + &[InvocationArg::from(plugin_instance)], ); match result { @@ -181,28 +216,151 @@ impl PluginManager { Ok(()) } - pub fn instantiate_all_plugins(&mut self, jvm: &Jvm) -> Result<()> { + pub fn trigger_command( + &self, + jvm: &Jvm, + cmd_name: &str, + command: Arc>, + sender: SimpleCommandSender, + args: Vec, + ) -> Result<(), String> { + let j_sender = match sender { + SimpleCommandSender::Console => jvm + .invoke_static( + "org.bukkit.Bukkit", + "getConsoleSender", + InvocationArg::empty(), + ) + .map_err(|e| e.to_string())?, + + SimpleCommandSender::Player(uuid_str) => { + // Get the server and cast it to your implementation + let server = jvm + .invoke_static("org.bukkit.Bukkit", "getServer", InvocationArg::empty()) + .map_err(|e| e.to_string())?; + let patch_server = jvm + .cast(&server, "org.patchbukkit.PatchBukkitServer") + .map_err(|e| e.to_string())?; + + // Create Java UUID object + let j_uuid = jvm + .invoke_static( + "java.util.UUID", + "fromString", + &[InvocationArg::try_from(uuid_str).map_err(|e| e.to_string())?], + ) + .map_err(|e| e.to_string())?; + + // Call your getPlayer(UUID) method on the server + jvm.invoke(&patch_server, "getPlayer", &[InvocationArg::from(j_uuid)]) + .map_err(|e| e.to_string())? + } + }; + + let server_instance = jvm + .invoke_static("org.bukkit.Bukkit", "getServer", InvocationArg::empty()) + .unwrap(); + + let command_map = jvm + .invoke(&server_instance, "getCommandMap", InvocationArg::empty()) + .unwrap(); + + let dispatch_result = jvm + .invoke( + &command_map, + "dispatch", + &[ + InvocationArg::from(j_sender), + InvocationArg::try_from(cmd_name).unwrap(), + ], + ) + .unwrap(); + + let handled: bool = jvm.to_rust(dispatch_result).unwrap(); + + if !handled { + //log::warn!("Command was not handled by any Java plugin: {}", cmd_name); + } + + Ok(()) + } + + pub fn instantiate_all_plugins( + &mut self, + jvm: &Jvm, + server: &Arc, + command_tx: mpsc::Sender, + ) -> Result<()> { + let server_instance = + jvm.invoke_static("org.bukkit.Bukkit", "getServer", InvocationArg::empty())?; + for (_plugin_name, plugin) in &mut self.plugins { - let result = jvm.invoke_static( + let plugin_instance = jvm.invoke_static( "org.patchbukkit.loader.PatchBukkitPluginLoader", "createPlugin", &[ InvocationArg::try_from(&plugin.path.to_string_lossy().to_string())?, InvocationArg::try_from(&plugin.main_class)?, ], - ); + )?; - match result { - Ok(instance) => { - plugin.instance = Some(instance); - plugin.state = PluginState::Loaded; - log::info!("Loaded PatchBukkit plugin: {}", plugin.name); - } - Err(e) => { - plugin.state = PluginState::Errored; - log::error!("Failed to load PatchBukkit plugin {}: {:?}", plugin.name, e); + plugin.instance = Some(plugin_instance); + let instance_ref = plugin.instance.as_ref().unwrap(); + + let command_map = + jvm.invoke(&server_instance, "getCommandMap", InvocationArg::empty())?; + + for (cmd_name, cmd_data) in &plugin.commands { + let cloned_plugin_instance = jvm.clone_instance(instance_ref)?; + let j_plugin_arg = InvocationArg::from(cloned_plugin_instance); + + let j_plugin_cmd = Arc::new(Mutex::new(jvm.invoke_static( + "org.patchbukkit.command.CommandFactory", + "create", + &[InvocationArg::try_from(cmd_name)?, j_plugin_arg], + )?)); + log::info!("Registering Bukkit command: {}", cmd_name); + { + let cmd_lock = j_plugin_cmd.lock().unwrap(); + let j_plugin_cmd_owned = jvm.clone_instance(&*cmd_lock)?; + jvm.invoke( + &command_map, + "register", + &[ + InvocationArg::try_from(cmd_name)?, + InvocationArg::try_from(&plugin.name)?, + InvocationArg::from(j_plugin_cmd_owned), + ], + )?; } + let node = + CommandTree::new([cmd_name], cmd_data.description.clone().unwrap_or_default()) + .execute(JavaCommandExecutor { + cmd_name: cmd_name.clone(), + command_tx: command_tx.clone(), + command: j_plugin_cmd.clone(), + }); + let permission = if let Some(perm) = cmd_data.permission.clone() { + perm + } else { + format!("patchbukkit:{}", cmd_name) // TODO + }; + + futures::executor::block_on(async { + server + .register_permission(Permission::new( + &permission, + &permission, + PermissionDefault::Allow, + )) + .await + .unwrap(); + server.register_command(node, permission).await + }); } + + plugin.state = PluginState::Loaded; + log::info!("Loaded and registered commands for: {}", plugin.name); } Ok(()) }