diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/action/ActionTicker.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/action/ActionTicker.java
deleted file mode 100644
index eb450aa..0000000
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/action/ActionTicker.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.github.hello09x.fakeplayer.api.action;
-
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ServiceLoader;
-
-public interface ActionTicker {
-
- static @NotNull ActionTicker create(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting) {
- var instance = ServiceLoader.load(
- ActionTicker.class,
- ActionTicker.class.getClassLoader()
- ).findFirst().orElseThrow();
- instance.init(player, action, setting);
- return instance;
- }
-
- void tick();
-
- void inactiveTick();
-
- void stop();
-
- void init(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting);
-
- boolean isDone();
-
-}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSEntity.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSEntity.java
deleted file mode 100644
index 3709b89..0000000
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSEntity.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package io.github.hello09x.fakeplayer.api.nms;
-
-public interface NMSEntity {
-
-
-}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSFactory.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSFactory.java
deleted file mode 100644
index 01a16ae..0000000
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package io.github.hello09x.fakeplayer.api.nms;
-
-import org.bukkit.Server;
-import org.bukkit.World;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ServiceLoader;
-
-public interface NMSFactory {
-
- static @NotNull NMSFactory getInstance() {
- return ServiceLoader.load(NMSFactory.class, NMSFactory.class.getClassLoader()).findFirst().orElseThrow();
- }
-
- NMSEntity entity(@NotNull Entity entity);
-
- NMSServer server(@NotNull Server server);
-
- NMSServerLevel world(@NotNull World world);
-
- NMSServerPlayer player(@NotNull Player player);
-
- NMSNetwork network();
-
-}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServerLevel.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServerLevel.java
deleted file mode 100644
index ed94a34..0000000
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServerLevel.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package io.github.hello09x.fakeplayer.api.nms;
-
-public interface NMSServerLevel {
-
-
-}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/action/Action.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/Action.java
similarity index 84%
rename from fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/action/Action.java
rename to fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/Action.java
index f98811b..3939a86 100644
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/action/Action.java
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/Action.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.api.action;
+package io.github.hello09x.fakeplayer.api.spi;
public interface Action {
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/ActionTicker.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/ActionTicker.java
new file mode 100644
index 0000000..9477949
--- /dev/null
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/ActionTicker.java
@@ -0,0 +1,13 @@
+package io.github.hello09x.fakeplayer.api.spi;
+
+public interface ActionTicker {
+
+ void tick();
+
+ void inactiveTick();
+
+ void stop();
+
+ boolean isDone();
+
+}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSEntity.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSEntity.java
new file mode 100644
index 0000000..e4ee729
--- /dev/null
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSEntity.java
@@ -0,0 +1,6 @@
+package io.github.hello09x.fakeplayer.api.spi;
+
+public interface NMSEntity {
+
+
+}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSNetwork.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSNetwork.java
similarity index 94%
rename from fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSNetwork.java
rename to fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSNetwork.java
index e2be011..d592fe3 100644
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSNetwork.java
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSNetwork.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.api.nms;
+package io.github.hello09x.fakeplayer.api.spi;
import org.bukkit.Server;
import org.bukkit.entity.Player;
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServer.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServer.java
similarity index 87%
rename from fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServer.java
rename to fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServer.java
index 0e19386..c34511f 100644
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServer.java
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServer.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.api.nms;
+package io.github.hello09x.fakeplayer.api.spi;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServerLevel.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServerLevel.java
new file mode 100644
index 0000000..263594f
--- /dev/null
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServerLevel.java
@@ -0,0 +1,6 @@
+package io.github.hello09x.fakeplayer.api.spi;
+
+public interface NMSServerLevel {
+
+
+}
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServerPlayer.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServerPlayer.java
similarity index 95%
rename from fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServerPlayer.java
rename to fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServerPlayer.java
index 3755463..33117b4 100644
--- a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/nms/NMSServerPlayer.java
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/NMSServerPlayer.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.api.nms;
+package io.github.hello09x.fakeplayer.api.spi;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
diff --git a/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/VersionSupport.java b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/VersionSupport.java
new file mode 100644
index 0000000..6ba0328
--- /dev/null
+++ b/fakeplayer-api/src/main/java/io/github/hello09x/fakeplayer/api/spi/VersionSupport.java
@@ -0,0 +1,40 @@
+package io.github.hello09x.fakeplayer.api.spi;
+
+import io.github.hello09x.fakeplayer.api.action.ActionSetting;
+import io.github.hello09x.fakeplayer.api.action.ActionType;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ServiceLoader;
+
+public interface VersionSupport {
+
+ static @Nullable VersionSupport getInstance() {
+ return ServiceLoader
+ .load(VersionSupport.class, VersionSupport.class.getClassLoader())
+ .stream()
+ .map(ServiceLoader.Provider::get)
+ .filter(v -> v.isSupported())
+ .findAny()
+ .orElse(null);
+ }
+
+ @NotNull NMSEntity entity(@NotNull Entity entity);
+
+ @NotNull NMSServer server(@NotNull Server server);
+
+ @NotNull NMSServerLevel world(@NotNull World world);
+
+ @NotNull NMSServerPlayer player(@NotNull Player player);
+
+ @NotNull NMSNetwork network();
+
+ boolean isSupported();
+
+ ActionTicker createAction(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting);
+
+}
diff --git a/fakeplayer-core/pom.xml b/fakeplayer-core/pom.xml
index e2d1098..e880356 100644
--- a/fakeplayer-core/pom.xml
+++ b/fakeplayer-core/pom.xml
@@ -47,14 +47,11 @@
provided
-
-
dev.jorel
- commandapi-bukkit-shade
+ commandapi-bukkit-core
+ provided
-
-
\ No newline at end of file
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/Main.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/Main.java
similarity index 73%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/Main.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/Main.java
index 7acee7e..57bc87d 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/Main.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/Main.java
@@ -1,15 +1,15 @@
-package io.github.hello09x.fakeplayer;
+package io.github.hello09x.fakeplayer.core;
-import dev.jorel.commandapi.CommandAPI;
-import dev.jorel.commandapi.CommandAPIBukkitConfig;
-import io.github.hello09x.fakeplayer.command.CommandRegistry;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.listener.PlayerListeners;
-import io.github.hello09x.fakeplayer.manager.FakeplayerManager;
-import io.github.hello09x.fakeplayer.manager.WildFakeplayerManager;
-import io.github.hello09x.fakeplayer.repository.UsedIdRepository;
-import io.github.hello09x.fakeplayer.util.update.UpdateChecker;
+import io.github.hello09x.fakeplayer.api.spi.VersionSupport;
+import io.github.hello09x.fakeplayer.core.command.CommandRegistry;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.listener.PlayerListeners;
+import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
+import io.github.hello09x.fakeplayer.core.manager.WildFakeplayerManager;
+import io.github.hello09x.fakeplayer.core.repository.UsedIdRepository;
+import io.github.hello09x.fakeplayer.core.util.update.UpdateChecker;
import lombok.Getter;
+import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.concurrent.CompletableFuture;
@@ -19,9 +19,15 @@ public final class Main extends JavaPlugin {
@Getter
private static Main instance;
+ @Getter
+ private static VersionSupport versionSupport;
+
@Override
public void onLoad() {
- CommandAPI.onLoad(new CommandAPIBukkitConfig(this).silentLogs(true));
+ versionSupport = VersionSupport.getInstance();
+ if (versionSupport == null) {
+ throw new ExceptionInInitializerError("不支持当前 minecraft 版本: " + Bukkit.getMinecraftVersion());
+ }
}
@Override
@@ -30,8 +36,6 @@ public final class Main extends JavaPlugin {
instance = this;
CommandRegistry.register();
- CommandAPI.onEnable();
-
{
var messenger = getServer().getMessenger();
messenger.registerIncomingPluginChannel(this, "BungeeCord", WildFakeplayerManager.instance);
@@ -78,7 +82,6 @@ public final class Main extends JavaPlugin {
@Override
public void onDisable() {
- CommandAPI.onDisable();
FakeplayerManager.instance.removeAll("plugin disabled");
UsedIdRepository.instance.saveAll();
FakeplayerManager.instance.onDisable();
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/AbstractCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/AbstractCommand.java
similarity index 85%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/AbstractCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/AbstractCommand.java
index 5f6a3a4..c79d7a6 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/AbstractCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/AbstractCommand.java
@@ -1,10 +1,10 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.CommandAPI;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.manager.FakeplayerManager;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ActionCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ActionCommand.java
similarity index 94%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ActionCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ActionCommand.java
index 1f142ac..36e4bf7 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ActionCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ActionCommand.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
@@ -6,10 +6,10 @@ import dev.jorel.commandapi.executors.CommandExecutor;
import dev.jorel.commandapi.wrappers.Rotation;
import io.github.hello09x.fakeplayer.api.action.ActionSetting;
import io.github.hello09x.fakeplayer.api.action.ActionType;
-import io.github.hello09x.fakeplayer.api.nms.NMSFactory;
-import io.github.hello09x.fakeplayer.command.support.Direction;
-import io.github.hello09x.fakeplayer.manager.action.ActionManager;
-import io.github.hello09x.fakeplayer.util.Mth;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.command.support.Direction;
+import io.github.hello09x.fakeplayer.core.manager.action.ActionManager;
+import io.github.hello09x.fakeplayer.core.util.Mth;
import io.papermc.paper.entity.LookAnchor;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Location;
@@ -143,7 +143,7 @@ public class ActionCommand extends AbstractCommand {
}
private void look(@NotNull Player player, float yaw, float pitch) {
- var handle = NMSFactory.getInstance().player(player);
+ var handle = Main.getVersionSupport().player(player);
handle.setYRot(yaw % 360);
handle.setXRot(Mth.clamp(pitch, -90, 90));
}
@@ -151,7 +151,7 @@ public class ActionCommand extends AbstractCommand {
public CommandExecutor move(float forward, float strafing) {
return (sender, args) -> {
var target = getTarget(sender, args);
- var handle = NMSFactory.getInstance().player(target);
+ var handle = Main.getVersionSupport().player(target);
float vel = target.isSneaking() ? 0.3F : 1.0F;
if (forward != 0.0F) {
handle.setZza(vel * forward);
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/CmdCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/CmdCommand.java
similarity index 97%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/CmdCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/CmdCommand.java
index a89f939..cf6394e 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/CmdCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/CmdCommand.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.CommandAPI;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/CommandRegistry.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/CommandRegistry.java
similarity index 98%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/CommandRegistry.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/CommandRegistry.java
index fc55d2e..7cb13af 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/CommandRegistry.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/CommandRegistry.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.CommandAPICommand;
import dev.jorel.commandapi.arguments.Argument;
@@ -9,11 +9,11 @@ import dev.jorel.commandapi.executors.CommandExecutor;
import io.github.hello09x.bedrock.command.Usage;
import io.github.hello09x.fakeplayer.api.action.ActionSetting;
import io.github.hello09x.fakeplayer.api.action.ActionType;
-import io.github.hello09x.fakeplayer.command.support.Direction;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.manager.FakeplayerManager;
-import io.github.hello09x.fakeplayer.repository.model.Config;
-import io.github.hello09x.fakeplayer.repository.model.Configs;
+import io.github.hello09x.fakeplayer.core.command.support.Direction;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
+import io.github.hello09x.fakeplayer.core.repository.model.Config;
+import io.github.hello09x.fakeplayer.core.repository.model.Configs;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ConfigCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ConfigCommand.java
similarity index 89%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ConfigCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ConfigCommand.java
index 295dfa2..bda85b0 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ConfigCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ConfigCommand.java
@@ -1,8 +1,8 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.executors.CommandArguments;
-import io.github.hello09x.fakeplayer.repository.UserConfigRepository;
-import io.github.hello09x.fakeplayer.repository.model.Config;
+import io.github.hello09x.fakeplayer.core.repository.UserConfigRepository;
+import io.github.hello09x.fakeplayer.core.repository.model.Config;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ExpCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ExpCommand.java
similarity index 96%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ExpCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ExpCommand.java
index 98922e0..5ca6f21 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ExpCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ExpCommand.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/HelpCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/HelpCommand.java
similarity index 89%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/HelpCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/HelpCommand.java
index c49fccf..f47b901 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/HelpCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/HelpCommand.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.executors.CommandArguments;
import org.bukkit.entity.Player;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/Permission.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/Permission.java
similarity index 88%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/Permission.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/Permission.java
index b5b2ea0..4277234 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/Permission.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/Permission.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
public interface Permission {
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ProfileCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ProfileCommand.java
similarity index 89%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ProfileCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ProfileCommand.java
index db2b222..3ae3c8b 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ProfileCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ProfileCommand.java
@@ -1,9 +1,10 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
import io.github.hello09x.bedrock.io.Experiences;
-import io.github.hello09x.fakeplayer.util.Mth;
+import io.github.hello09x.fakeplayer.core.util.Mth;
+import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.command.CommandSender;
@@ -28,7 +29,7 @@ public class ProfileCommand extends AbstractCommand {
sender.sendMessage(textOfChildren(
text(target.getName(), WHITE),
text(" 当前 ", GRAY),
- text(level, DARK_GREEN),
+ Component.text(level, DARK_GREEN),
text(" 级, 共 ", GRAY),
text(total, DARK_GREEN),
text(" 点经验值", GRAY)
@@ -60,7 +61,7 @@ public class ProfileCommand extends AbstractCommand {
sender.sendMessage(textOfChildren(
text(target.getName(), WHITE),
text(" 当前生命值: ", GRAY),
- text(Mth.floor(health, 0.5), color),
+ Component.text(Mth.floor(health, 0.5), color),
text("/", color),
text(max, color)
));
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ReloadCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ReloadCommand.java
similarity index 84%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ReloadCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ReloadCommand.java
index 899710f..0b847ae 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/ReloadCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/ReloadCommand.java
@@ -1,7 +1,7 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.executors.CommandArguments;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/RideCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/RideCommand.java
similarity index 85%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/RideCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/RideCommand.java
index 3c37613..58fe0e5 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/RideCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/RideCommand.java
@@ -1,9 +1,9 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.CommandAPI;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
-import io.github.hello09x.fakeplayer.api.nms.NMSFactory;
+import io.github.hello09x.fakeplayer.core.Main;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.AbstractHorse;
@@ -25,7 +25,7 @@ public class RideCommand extends AbstractCommand {
if (entities.isEmpty()) {
return;
}
- NMSFactory.getInstance().player(target).startRiding(entities.get(0), true);
+ Main.getVersionSupport().player(target).startRiding(entities.get(0), true);
}
/**
@@ -38,7 +38,7 @@ public class RideCommand extends AbstractCommand {
return;
}
- NMSFactory.getInstance().player(target).startRiding(entity, true);
+ Main.getVersionSupport().player(target).startRiding(entity, true);
}
/**
@@ -56,7 +56,7 @@ public class RideCommand extends AbstractCommand {
return;
}
- NMSFactory.getInstance().player(target).startRiding(entity, true);
+ Main.getVersionSupport().player(target).startRiding(entity, true);
}
/**
@@ -73,11 +73,11 @@ public class RideCommand extends AbstractCommand {
throw CommandAPI.failWithString("你离假人太远了");
}
- NMSFactory.getInstance().player(target).startRiding(sender, true);
+ Main.getVersionSupport().player(target).startRiding(sender, true);
}
public void stopRiding(@NotNull CommandSender sender, @NotNull CommandArguments args) throws WrapperCommandSyntaxException {
- NMSFactory.getInstance().player(getTarget(sender, args)).stopRiding();
+ Main.getVersionSupport().player(getTarget(sender, args)).stopRiding();
}
}
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/SpawnCommand.java
similarity index 98%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/SpawnCommand.java
index 611996c..a056ffc 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/SpawnCommand.java
@@ -1,10 +1,10 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
import io.github.hello09x.bedrock.command.MessageException;
import io.github.hello09x.bedrock.page.Page;
-import io.github.hello09x.fakeplayer.util.Mth;
+import io.github.hello09x.fakeplayer.core.util.Mth;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/TpCommand.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/TpCommand.java
similarity index 91%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/TpCommand.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/TpCommand.java
index 9fb0d11..6c988a9 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/TpCommand.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/TpCommand.java
@@ -1,8 +1,8 @@
-package io.github.hello09x.fakeplayer.command;
+package io.github.hello09x.fakeplayer.core.command;
import dev.jorel.commandapi.exceptions.WrapperCommandSyntaxException;
import dev.jorel.commandapi.executors.CommandArguments;
-import io.github.hello09x.fakeplayer.util.Teleportor;
+import io.github.hello09x.fakeplayer.core.util.Teleportor;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/support/Direction.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/support/Direction.java
similarity index 61%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/support/Direction.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/support/Direction.java
index 5c80c3b..61eeb46 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/command/support/Direction.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/command/support/Direction.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.command.support;
+package io.github.hello09x.fakeplayer.core.command.support;
public enum Direction {
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/config/FakeplayerConfig.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/config/FakeplayerConfig.java
similarity index 97%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/config/FakeplayerConfig.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/config/FakeplayerConfig.java
index 19834ea..b506a12 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/config/FakeplayerConfig.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/config/FakeplayerConfig.java
@@ -1,8 +1,8 @@
-package io.github.hello09x.fakeplayer.config;
+package io.github.hello09x.fakeplayer.core.config;
import io.github.hello09x.bedrock.config.Config;
-import io.github.hello09x.fakeplayer.Main;
+import io.github.hello09x.fakeplayer.core.Main;
import lombok.Getter;
import lombok.ToString;
import org.bukkit.configuration.file.FileConfiguration;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java
similarity index 90%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java
index f381c85..7484b34 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java
@@ -1,17 +1,16 @@
-package io.github.hello09x.fakeplayer.entity;
+package io.github.hello09x.fakeplayer.core.entity;
import io.github.hello09x.bedrock.task.Tasks;
-import io.github.hello09x.fakeplayer.Main;
import io.github.hello09x.fakeplayer.api.action.ActionSetting;
import io.github.hello09x.fakeplayer.api.action.ActionType;
-import io.github.hello09x.fakeplayer.api.nms.NMSFactory;
-import io.github.hello09x.fakeplayer.api.nms.NMSServerPlayer;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.manager.action.ActionManager;
-import io.github.hello09x.fakeplayer.manager.naming.SequenceName;
-import io.github.hello09x.fakeplayer.util.InternalAddressGenerator;
-import io.github.hello09x.fakeplayer.util.Teleportor;
-import io.github.hello09x.fakeplayer.util.Worlds;
+import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.manager.action.ActionManager;
+import io.github.hello09x.fakeplayer.core.manager.naming.SequenceName;
+import io.github.hello09x.fakeplayer.core.util.InternalAddressGenerator;
+import io.github.hello09x.fakeplayer.core.util.Teleportor;
+import io.github.hello09x.fakeplayer.core.util.Worlds;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@@ -81,7 +80,7 @@ public class FakePlayer {
this.creator = creator;
this.creatorIp = creatorIp;
this.sequenceName = sequenceName;
- this.handle = NMSFactory.getInstance().server(Bukkit.getServer()).newPlayer(uuid, name);
+ this.handle = Main.getVersionSupport().server(Bukkit.getServer()).newPlayer(uuid, name);
this.player = handle.getPlayer();
this.ticker = new FakeplayerTicker(this, removeAt);
@@ -133,7 +132,7 @@ public class FakePlayer {
));
}
- var network = NMSFactory.getInstance().network();
+ var network = Main.getVersionSupport().network();
network.bindEmptyServerGamePacketListener(Bukkit.getServer(), this.player, address);
network.bindEmptyLoginPacketListener(Bukkit.getServer(), this.player, address);
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/FakeplayerTicker.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakeplayerTicker.java
similarity index 95%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/FakeplayerTicker.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakeplayerTicker.java
index 8f357a3..3281308 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/FakeplayerTicker.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakeplayerTicker.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.entity;
+package io.github.hello09x.fakeplayer.core.entity;
-import io.github.hello09x.fakeplayer.manager.FakeplayerManager;
+import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/SpawnOption.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/SpawnOption.java
similarity index 90%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/SpawnOption.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/SpawnOption.java
index c6a162d..5f98e3a 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/entity/SpawnOption.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/SpawnOption.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.entity;
+package io.github.hello09x.fakeplayer.core.entity;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/listener/PlayerListeners.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/listener/PlayerListeners.java
similarity index 89%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/listener/PlayerListeners.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/listener/PlayerListeners.java
index 5e8733c..2e00875 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/listener/PlayerListeners.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/listener/PlayerListeners.java
@@ -1,11 +1,11 @@
-package io.github.hello09x.fakeplayer.listener;
+package io.github.hello09x.fakeplayer.core.listener;
import com.google.common.base.Throwables;
-import io.github.hello09x.fakeplayer.Main;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.manager.FakeplayerManager;
-import io.github.hello09x.fakeplayer.repository.UsedIdRepository;
-import io.github.hello09x.fakeplayer.util.InternalAddressGenerator;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
+import io.github.hello09x.fakeplayer.core.repository.UsedIdRepository;
+import io.github.hello09x.fakeplayer.core.util.InternalAddressGenerator;
import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.event.EventHandler;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerList.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/FakeplayerList.java
similarity index 96%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerList.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/FakeplayerList.java
index 03e64d3..8ac9a78 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerList.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/FakeplayerList.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.manager;
+package io.github.hello09x.fakeplayer.core.manager;
-import io.github.hello09x.fakeplayer.entity.FakePlayer;
+import io.github.hello09x.fakeplayer.core.entity.FakePlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/FakeplayerManager.java
similarity index 92%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/FakeplayerManager.java
index 092a4d0..95ca019 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/FakeplayerManager.java
@@ -1,22 +1,22 @@
-package io.github.hello09x.fakeplayer.manager;
+package io.github.hello09x.fakeplayer.core.manager;
import io.github.hello09x.bedrock.command.MessageException;
import io.github.hello09x.bedrock.task.Tasks;
-import io.github.hello09x.fakeplayer.Main;
import io.github.hello09x.fakeplayer.api.action.ActionSetting;
import io.github.hello09x.fakeplayer.api.action.ActionType;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.entity.FakePlayer;
-import io.github.hello09x.fakeplayer.entity.SpawnOption;
-import io.github.hello09x.fakeplayer.manager.action.ActionManager;
-import io.github.hello09x.fakeplayer.manager.naming.NameManager;
-import io.github.hello09x.fakeplayer.manager.naming.SequenceName;
-import io.github.hello09x.fakeplayer.manager.naming.exception.IllegalCustomNameException;
-import io.github.hello09x.fakeplayer.repository.UsedIdRepository;
-import io.github.hello09x.fakeplayer.repository.UserConfigRepository;
-import io.github.hello09x.fakeplayer.repository.model.Configs;
-import io.github.hello09x.fakeplayer.util.AddressUtils;
-import io.github.hello09x.fakeplayer.util.Commands;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.entity.FakePlayer;
+import io.github.hello09x.fakeplayer.core.entity.SpawnOption;
+import io.github.hello09x.fakeplayer.core.manager.action.ActionManager;
+import io.github.hello09x.fakeplayer.core.manager.naming.NameManager;
+import io.github.hello09x.fakeplayer.core.manager.naming.SequenceName;
+import io.github.hello09x.fakeplayer.core.manager.naming.exception.IllegalCustomNameException;
+import io.github.hello09x.fakeplayer.core.repository.UsedIdRepository;
+import io.github.hello09x.fakeplayer.core.repository.UserConfigRepository;
+import io.github.hello09x.fakeplayer.core.repository.model.Configs;
+import io.github.hello09x.fakeplayer.core.util.AddressUtils;
+import io.github.hello09x.fakeplayer.core.util.Commands;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.Location;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/WildFakeplayerManager.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/WildFakeplayerManager.java
similarity index 96%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/WildFakeplayerManager.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/WildFakeplayerManager.java
index 6feecb0..d370de8 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/WildFakeplayerManager.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/WildFakeplayerManager.java
@@ -1,8 +1,8 @@
-package io.github.hello09x.fakeplayer.manager;
+package io.github.hello09x.fakeplayer.core.manager;
import com.google.common.io.ByteStreams;
-import io.github.hello09x.fakeplayer.Main;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.PluginMessageListener;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/action/ActionManager.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/action/ActionManager.java
similarity index 87%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/action/ActionManager.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/action/ActionManager.java
index 7809bc6..a808ed7 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/action/ActionManager.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/action/ActionManager.java
@@ -1,9 +1,9 @@
-package io.github.hello09x.fakeplayer.manager.action;
+package io.github.hello09x.fakeplayer.core.manager.action;
-import io.github.hello09x.fakeplayer.Main;
import io.github.hello09x.fakeplayer.api.action.ActionSetting;
-import io.github.hello09x.fakeplayer.api.action.ActionTicker;
import io.github.hello09x.fakeplayer.api.action.ActionType;
+import io.github.hello09x.fakeplayer.api.spi.ActionTicker;
+import io.github.hello09x.fakeplayer.core.Main;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@@ -37,7 +37,7 @@ public class ActionManager {
@NotNull ActionSetting setting
) {
var managers = this.managers.computeIfAbsent(player.getUniqueId(), key -> new HashMap<>());
- managers.computeIfAbsent(action, key -> ActionTicker.create(player, action, setting));
+ managers.computeIfAbsent(action, key -> Main.getVersionSupport().createAction(player, action, setting));
}
public void tick() {
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/NameManager.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/NameManager.java
similarity index 94%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/NameManager.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/NameManager.java
index ac23468..324ede8 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/NameManager.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/NameManager.java
@@ -1,9 +1,9 @@
-package io.github.hello09x.fakeplayer.manager.naming;
+package io.github.hello09x.fakeplayer.core.manager.naming;
-import io.github.hello09x.fakeplayer.Main;
-import io.github.hello09x.fakeplayer.config.FakeplayerConfig;
-import io.github.hello09x.fakeplayer.manager.naming.exception.IllegalCustomNameException;
-import io.github.hello09x.fakeplayer.repository.UsedIdRepository;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.config.FakeplayerConfig;
+import io.github.hello09x.fakeplayer.core.manager.naming.exception.IllegalCustomNameException;
+import io.github.hello09x.fakeplayer.core.repository.UsedIdRepository;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.bukkit.Bukkit;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/NameSource.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/NameSource.java
similarity index 95%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/NameSource.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/NameSource.java
index 9c1947e..11c2228 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/NameSource.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/NameSource.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.manager.naming;
+package io.github.hello09x.fakeplayer.core.manager.naming;
import java.util.LinkedList;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/SequenceName.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/SequenceName.java
similarity index 86%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/SequenceName.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/SequenceName.java
index 071d642..fa8b950 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/SequenceName.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/SequenceName.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.manager.naming;
+package io.github.hello09x.fakeplayer.core.manager.naming;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/exception/IllegalCustomNameException.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/exception/IllegalCustomNameException.java
similarity index 84%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/exception/IllegalCustomNameException.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/exception/IllegalCustomNameException.java
index 4178f78..d100f48 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/manager/naming/exception/IllegalCustomNameException.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/manager/naming/exception/IllegalCustomNameException.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.manager.naming.exception;
+package io.github.hello09x.fakeplayer.core.manager.naming.exception;
import lombok.Getter;
import net.kyori.adventure.text.TextComponent;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/UsedIdRepository.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/UsedIdRepository.java
similarity index 95%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/UsedIdRepository.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/UsedIdRepository.java
index bdc4242..9803f16 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/UsedIdRepository.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/UsedIdRepository.java
@@ -1,7 +1,7 @@
-package io.github.hello09x.fakeplayer.repository;
+package io.github.hello09x.fakeplayer.core.repository;
import com.google.common.base.Throwables;
-import io.github.hello09x.fakeplayer.Main;
+import io.github.hello09x.fakeplayer.core.Main;
import org.apache.commons.io.IOUtils;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/UserConfigRepository.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/UserConfigRepository.java
similarity index 93%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/UserConfigRepository.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/UserConfigRepository.java
index a1a4005..ada2f22 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/UserConfigRepository.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/UserConfigRepository.java
@@ -1,9 +1,9 @@
-package io.github.hello09x.fakeplayer.repository;
+package io.github.hello09x.fakeplayer.core.repository;
import io.github.hello09x.bedrock.database.Repository;
-import io.github.hello09x.fakeplayer.Main;
-import io.github.hello09x.fakeplayer.repository.model.Config;
-import io.github.hello09x.fakeplayer.repository.model.UserConfig;
+import io.github.hello09x.fakeplayer.core.Main;
+import io.github.hello09x.fakeplayer.core.repository.model.Config;
+import io.github.hello09x.fakeplayer.core.repository.model.UserConfig;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/Config.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Config.java
similarity index 86%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/Config.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Config.java
index 379ad78..1986552 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/Config.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Config.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.repository.model;
+package io.github.hello09x.fakeplayer.core.repository.model;
import java.util.List;
import java.util.function.Function;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/Configs.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Configs.java
similarity index 97%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/Configs.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Configs.java
index d6d7886..a6881d6 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/Configs.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/Configs.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.repository.model;
+package io.github.hello09x.fakeplayer.core.repository.model;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/UserConfig.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/UserConfig.java
similarity index 87%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/UserConfig.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/UserConfig.java
index e0afa25..6530258 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/repository/model/UserConfig.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/repository/model/UserConfig.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.repository.model;
+package io.github.hello09x.fakeplayer.core.repository.model;
import io.github.hello09x.bedrock.database.Table;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/AddressUtils.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/AddressUtils.java
similarity index 91%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/AddressUtils.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/AddressUtils.java
index f818abe..a64b0a7 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/AddressUtils.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/AddressUtils.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util;
+package io.github.hello09x.fakeplayer.core.util;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Commands.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Commands.java
similarity index 96%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Commands.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Commands.java
index 338efa3..a840c25 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Commands.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Commands.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util;
+package io.github.hello09x.fakeplayer.core.util;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/InternalAddressGenerator.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/InternalAddressGenerator.java
similarity index 94%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/InternalAddressGenerator.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/InternalAddressGenerator.java
index 1b1c3e4..82d8b24 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/InternalAddressGenerator.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/InternalAddressGenerator.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util;
+package io.github.hello09x.fakeplayer.core.util;
import lombok.SneakyThrows;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Mth.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Mth.java
similarity index 94%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Mth.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Mth.java
index a0c37d1..41189da 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Mth.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Mth.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util;
+package io.github.hello09x.fakeplayer.core.util;
public class Mth {
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Teleportor.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Teleportor.java
similarity index 93%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Teleportor.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Teleportor.java
index 37e9610..bb5927d 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Teleportor.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Teleportor.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util;
+package io.github.hello09x.fakeplayer.core.util;
import org.bukkit.Location;
import org.bukkit.Sound;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Worlds.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Worlds.java
similarity index 93%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Worlds.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Worlds.java
index f88ccc3..6abad52 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/Worlds.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/Worlds.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util;
+package io.github.hello09x.fakeplayer.core.util;
import org.bukkit.Bukkit;
import org.bukkit.World;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/update/Release.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/update/Release.java
similarity index 87%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/update/Release.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/update/Release.java
index 36bba37..10f35e6 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/update/Release.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/update/Release.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util.update;
+package io.github.hello09x.fakeplayer.core.util.update;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/update/UpdateChecker.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/update/UpdateChecker.java
similarity index 97%
rename from fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/update/UpdateChecker.java
rename to fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/update/UpdateChecker.java
index df7d504..78bb57e 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/util/update/UpdateChecker.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/util/update/UpdateChecker.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.util.update;
+package io.github.hello09x.fakeplayer.core.util.update;
import com.google.gson.Gson;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-core/src/main/resources/plugin.yml b/fakeplayer-core/src/main/resources/plugin.yml
index 330348b..8d455ab 100644
--- a/fakeplayer-core/src/main/resources/plugin.yml
+++ b/fakeplayer-core/src/main/resources/plugin.yml
@@ -1,9 +1,11 @@
name: fakeplayer
version: '${project.version}'
-main: io.github.hello09x.fakeplayer.Main
+main: io.github.hello09x.fakeplayer.core.Main
api-version: '1.20'
author: hello09x
website: 'https://github.com/tanyaofei/minecraft-fakeplayer'
+depend:
+ - CommandAPI
permissions:
fakeplayer.all:
diff --git a/fakeplayer-dist/pom.xml b/fakeplayer-dist/pom.xml
new file mode 100644
index 0000000..6c76a50
--- /dev/null
+++ b/fakeplayer-dist/pom.xml
@@ -0,0 +1,67 @@
+
+
+ 4.0.0
+
+ io.github.hello09x.fakeplayer
+ fakeplayer-parent
+ 0.1.9
+
+
+ fakeplayer-dist
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+ io.github.hello09x.fakeplayer
+ fakeplayer-v1_20_R1
+ 0.1.9
+
+
+
+ io.github.hello09x.fakeplayer
+ fakeplayer-v1_20_R2
+ 0.1.9
+
+
+
+
+
+ ../target
+ fakeplayer-${version}
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ ${java.version}
+ ${java.version}
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.3.0
+
+
+ package
+
+ shade
+
+
+ false
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.VersionSupport b/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.VersionSupport
new file mode 100644
index 0000000..d326a64
--- /dev/null
+++ b/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.VersionSupport
@@ -0,0 +1,2 @@
+io.github.hello09x.fakeplayer.v1_20_R1.spi.VersionSupportImpl
+io.github.hello09x.fakeplayer.v1_20_R2.spi.VersionSupportImpl
diff --git a/fakeplayer-v1_20_R1/pom.xml b/fakeplayer-v1_20_R1/pom.xml
index 63ac686..23fec6a 100644
--- a/fakeplayer-v1_20_R1/pom.xml
+++ b/fakeplayer-v1_20_R1/pom.xml
@@ -54,41 +54,7 @@
- ../target
-
- org.apache.maven.plugins
- maven-compiler-plugin
- 3.8.1
-
- ${java.version}
- ${java.version}
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.3.0
-
-
- package
-
- shade
-
-
- false
-
-
-
-
-
-
- dev.jorel.commandapi
- io.github.hello09x.fakeplayer.shaded.commandapi
-
-
-
-
net.md-5
specialsource-maven-plugin
@@ -128,13 +94,6 @@
-
-
- src/main/resources
- true
-
-
-
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/AttackAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java
similarity index 94%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/AttackAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java
index 2b2577d..8e060e0 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/AttackAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropInventoryAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropInventoryAction.java
similarity index 86%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropInventoryAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropInventoryAction.java
index 7f060ff..9785224 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropInventoryAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropInventoryAction.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
-import io.github.hello09x.fakeplayer.api.action.Action;
+import io.github.hello09x.fakeplayer.api.spi.Action;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropItemAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropItemAction.java
similarity index 83%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropItemAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropItemAction.java
index 8efeb1c..ef6d1a4 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropItemAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropItemAction.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
-import io.github.hello09x.fakeplayer.api.action.Action;
+import io.github.hello09x.fakeplayer.api.spi.Action;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropStackAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropStackAction.java
similarity index 83%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropStackAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropStackAction.java
index c5bd5cf..97c27dd 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/DropStackAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/DropStackAction.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
-import io.github.hello09x.fakeplayer.api.action.Action;
+import io.github.hello09x.fakeplayer.api.spi.Action;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/JumpAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/JumpAction.java
similarity index 85%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/JumpAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/JumpAction.java
index 0f0d0ab..dbfc807 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/JumpAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/JumpAction.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
-import io.github.hello09x.fakeplayer.api.action.Action;
+import io.github.hello09x.fakeplayer.api.spi.Action;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/MineAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java
similarity index 97%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/MineAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java
index 5131fab..69bb70c 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/MineAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
@@ -14,7 +14,7 @@ public class MineAction extends TraceAction {
private final Current current = new Current();
- protected MineAction(ServerPlayer player) {
+ public MineAction(ServerPlayer player) {
super(player);
}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/StareEntityAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/StareEntityAction.java
similarity index 91%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/StareEntityAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/StareEntityAction.java
index 51b61a1..8d70341 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/StareEntityAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/StareEntityAction.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
-import io.github.hello09x.fakeplayer.api.action.Action;
+import io.github.hello09x.fakeplayer.api.spi.Action;
import io.papermc.paper.entity.LookAnchor;
import net.minecraft.server.level.ServerPlayer;
import org.bukkit.Bukkit;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/TraceAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java
similarity index 75%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/TraceAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java
index 07831d0..feaa840 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/TraceAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java
@@ -1,7 +1,7 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
-import io.github.hello09x.fakeplayer.api.action.Action;
-import io.github.hello09x.fakeplayer.x.action.util.Tracer;
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import io.github.hello09x.fakeplayer.v1_20_R1.action.util.Tracer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.phys.HitResult;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/UseAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java
similarity index 96%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/UseAction.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java
index 1080c3b..bdf89b0 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/UseAction.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.action;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerPlayer;
@@ -12,7 +12,7 @@ public class UseAction extends TraceAction {
private final Current current = new Current();
- protected UseAction(@NotNull ServerPlayer player) {
+ public UseAction(@NotNull ServerPlayer player) {
super(player);
}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/util/Tracer.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java
similarity index 98%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/util/Tracer.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java
index 4e812e8..f22ef0e 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/util/Tracer.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.action.util;
+package io.github.hello09x.fakeplayer.v1_20_R1.action.util;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.ClipContext;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyAdvancements.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyAdvancements.java
similarity index 96%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyAdvancements.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyAdvancements.java
index 6143140..1d4c515 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyAdvancements.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyAdvancements.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.network;
+package io.github.hello09x.fakeplayer.v1_20_R1.network;
import com.mojang.datafixers.DataFixer;
import net.minecraft.advancements.Advancement;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyChannel.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyChannel.java
similarity index 97%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyChannel.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyChannel.java
index 2857b47..602bddf 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyChannel.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyChannel.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.network;
+package io.github.hello09x.fakeplayer.v1_20_R1.network;
import io.netty.channel.*;
import org.jetbrains.annotations.NotNull;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyConnection.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyConnection.java
similarity index 93%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyConnection.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyConnection.java
index 437ab53..5b95d26 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyConnection.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyConnection.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.network;
+package io.github.hello09x.fakeplayer.v1_20_R1.network;
import net.minecraft.network.Connection;
import net.minecraft.network.PacketSendListener;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyLoginPacketListener.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyLoginPacketListener.java
similarity index 86%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyLoginPacketListener.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyLoginPacketListener.java
index 990c266..efbc344 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyLoginPacketListener.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyLoginPacketListener.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.network;
+package io.github.hello09x.fakeplayer.v1_20_R1.network;
import net.minecraft.network.Connection;
import net.minecraft.server.MinecraftServer;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyServerGamePacketListener.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyServerGamePacketListener.java
similarity index 91%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyServerGamePacketListener.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyServerGamePacketListener.java
index cc19a4f..bd3cede 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/network/EmptyServerGamePacketListener.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/EmptyServerGamePacketListener.java
@@ -1,4 +1,4 @@
-package io.github.hello09x.fakeplayer.x.network;
+package io.github.hello09x.fakeplayer.v1_20_R1.network;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.Packet;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/ActionTicker.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java
similarity index 72%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/ActionTicker.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java
index 8f33922..04fd50c 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/action/ActionTicker.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java
@@ -1,24 +1,41 @@
-package io.github.hello09x.fakeplayer.x.action;
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-import io.github.hello09x.fakeplayer.api.action.Action;
import io.github.hello09x.fakeplayer.api.action.ActionSetting;
import io.github.hello09x.fakeplayer.api.action.ActionType;
-import io.github.hello09x.fakeplayer.x.nms.NMSServerPlayerImpl;
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import io.github.hello09x.fakeplayer.v1_20_R1.action.*;
+import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
-public class ActionTicker implements io.github.hello09x.fakeplayer.api.action.ActionTicker {
+public class ActionTickerImpl implements io.github.hello09x.fakeplayer.api.spi.ActionTicker {
/**
* 行为类型
*/
- public Action action;
+ private final Action action;
/**
* 行为设置
*/
- public ActionSetting setting;
+ private final ActionSetting setting;
+
+ public ActionTickerImpl(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting) {
+ var handle = ((CraftPlayer) player).getHandle();
+ this.action = switch (action) {
+ case ATTACK -> new AttackAction(handle);
+ case MINE -> new MineAction(handle);
+ case USE -> new UseAction(handle);
+ case JUMP -> new JumpAction(handle);
+ case LOOK_AT_NEAREST_ENTITY -> new StareEntityAction(handle);
+ case DROP_ITEM -> new DropItemAction(handle);
+ case DROP_STACK -> new DropStackAction(handle);
+ case DROP_INVENTORY -> new DropInventoryAction(handle);
+ };
+ this.setting = setting;
+ }
+
@Override
public void tick() {
@@ -56,22 +73,4 @@ public class ActionTicker implements io.github.hello09x.fakeplayer.api.action.Ac
action.stop();
}
- @Override
- public void init(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting) {
- var handle = new NMSServerPlayerImpl(player).getHandle();
- this.action = switch (action) {
- case ATTACK -> new AttackAction(handle);
- case MINE -> new MineAction(handle);
- case USE -> new UseAction(handle);
- case JUMP -> new JumpAction(handle);
- case LOOK_AT_NEAREST_ENTITY -> new StareEntityAction(handle);
- case DROP_ITEM -> new DropItemAction(handle);
- case DROP_STACK -> new DropStackAction(handle);
- case DROP_INVENTORY -> new DropInventoryAction(handle);
- };
-
- this.setting = setting;
- }
-
-
}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSEntityImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java
similarity index 78%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSEntityImpl.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java
index 9331b1b..513976f 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSEntityImpl.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.nms;
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-import io.github.hello09x.fakeplayer.api.nms.NMSEntity;
+import io.github.hello09x.fakeplayer.api.spi.NMSEntity;
import lombok.Getter;
import net.minecraft.world.entity.Entity;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSNetworkImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java
similarity index 79%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSNetworkImpl.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java
index 42db9e5..defd606 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSNetworkImpl.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java
@@ -1,9 +1,9 @@
-package io.github.hello09x.fakeplayer.x.nms;
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-import io.github.hello09x.fakeplayer.api.nms.NMSNetwork;
-import io.github.hello09x.fakeplayer.x.network.EmptyConnection;
-import io.github.hello09x.fakeplayer.x.network.EmptyLoginPacketListener;
-import io.github.hello09x.fakeplayer.x.network.EmptyServerGamePacketListener;
+import io.github.hello09x.fakeplayer.api.spi.NMSNetwork;
+import io.github.hello09x.fakeplayer.v1_20_R1.network.EmptyConnection;
+import io.github.hello09x.fakeplayer.v1_20_R1.network.EmptyLoginPacketListener;
+import io.github.hello09x.fakeplayer.v1_20_R1.network.EmptyServerGamePacketListener;
import net.minecraft.network.protocol.PacketFlow;
import org.bukkit.Server;
import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java
similarity index 84%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerImpl.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java
index bbf2ea9..93e2e7c 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerImpl.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java
@@ -1,8 +1,8 @@
-package io.github.hello09x.fakeplayer.x.nms;
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
import com.mojang.authlib.GameProfile;
-import io.github.hello09x.fakeplayer.api.nms.NMSServer;
-import io.github.hello09x.fakeplayer.api.nms.NMSServerPlayer;
+import io.github.hello09x.fakeplayer.api.spi.NMSServer;
+import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
import lombok.Getter;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerLevelImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java
similarity index 84%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerLevelImpl.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java
index 683e28b..a9def56 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerLevelImpl.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java
@@ -1,6 +1,6 @@
-package io.github.hello09x.fakeplayer.x.nms;
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-import io.github.hello09x.fakeplayer.api.nms.NMSServerLevel;
+import io.github.hello09x.fakeplayer.api.spi.NMSServerLevel;
import lombok.Getter;
import net.minecraft.server.level.ServerLevel;
import org.bukkit.Bukkit;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerPlayerImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java
similarity index 96%
rename from fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerPlayerImpl.java
rename to fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java
index 43d8a13..41b0634 100644
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSServerPlayerImpl.java
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java
@@ -1,9 +1,9 @@
-package io.github.hello09x.fakeplayer.x.nms;
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
import com.google.common.collect.Iterables;
import io.github.hello09x.fakeplayer.api.Reflections;
-import io.github.hello09x.fakeplayer.api.nms.NMSServerPlayer;
-import io.github.hello09x.fakeplayer.x.network.EmptyAdvancements;
+import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
+import io.github.hello09x.fakeplayer.v1_20_R1.network.EmptyAdvancements;
import lombok.Getter;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.PlayerAdvancements;
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/VersionSupportImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/VersionSupportImpl.java
new file mode 100644
index 0000000..9475cf3
--- /dev/null
+++ b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/VersionSupportImpl.java
@@ -0,0 +1,54 @@
+package io.github.hello09x.fakeplayer.v1_20_R1.spi;
+
+import io.github.hello09x.fakeplayer.api.action.ActionSetting;
+import io.github.hello09x.fakeplayer.api.action.ActionType;
+import io.github.hello09x.fakeplayer.api.spi.*;
+import org.bukkit.Bukkit;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Set;
+
+public class VersionSupportImpl implements VersionSupport {
+
+ private final static Set SUPPORTS = Set.of("1.20", "1.20.1");
+
+ @Override
+ public @NotNull NMSEntity entity(@NotNull Entity entity) {
+ return new NMSEntityImpl(entity);
+ }
+
+ @Override
+ public @NotNull NMSServer server(@NotNull Server server) {
+ return new NMSServerImpl(server);
+ }
+
+ @Override
+ public @NotNull NMSServerLevel world(@NotNull World world) {
+ return new NMSServerLevelImpl(world);
+ }
+
+ @Override
+ public @NotNull NMSServerPlayer player(@NotNull Player player) {
+ return new NMSServerPlayerImpl(player);
+ }
+
+ @Override
+ public @NotNull NMSNetwork network() {
+ return new NMSNetworkImpl();
+ }
+
+ @Override
+ public boolean isSupported() {
+ return SUPPORTS.contains(Bukkit.getMinecraftVersion());
+ }
+
+ @Override
+ public ActionTicker createAction(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting) {
+ return new ActionTickerImpl(player, action, setting);
+ }
+
+}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSFactoryImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSFactoryImpl.java
deleted file mode 100644
index a926bab..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/x/nms/NMSFactoryImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package io.github.hello09x.fakeplayer.x.nms;
-
-import io.github.hello09x.fakeplayer.api.nms.*;
-import org.bukkit.Server;
-import org.bukkit.World;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-public class NMSFactoryImpl implements NMSFactory {
-
- @Override
- public NMSEntity entity(@NotNull Entity entity) {
- return new NMSEntityImpl(entity);
- }
-
- @Override
- public NMSServer server(@NotNull Server server) {
- return new NMSServerImpl(server);
- }
-
- @Override
- public NMSServerLevel world(@NotNull World world) {
- return new NMSServerLevelImpl(world);
- }
-
- @Override
- public NMSServerPlayer player(@NotNull Player player) {
- return new NMSServerPlayerImpl(player);
- }
-
- @Override
- public NMSNetwork network() {
- return new NMSNetworkImpl();
- }
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.action.ActionTicker b/fakeplayer-v1_20_R1/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.action.ActionTicker
deleted file mode 100644
index dac980b..0000000
--- a/fakeplayer-v1_20_R1/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.action.ActionTicker
+++ /dev/null
@@ -1 +0,0 @@
-io.github.hello09x.fakeplayer.x.action.ActionTicker
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R1/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.nms.NMSFactory b/fakeplayer-v1_20_R1/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.nms.NMSFactory
deleted file mode 100644
index 494e2ca..0000000
--- a/fakeplayer-v1_20_R1/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.nms.NMSFactory
+++ /dev/null
@@ -1 +0,0 @@
-io.github.hello09x.fakeplayer.x.nms.NMSFactoryImpl
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R2/pom.xml b/fakeplayer-v1_20_R2/pom.xml
new file mode 100644
index 0000000..82659fe
--- /dev/null
+++ b/fakeplayer-v1_20_R2/pom.xml
@@ -0,0 +1,99 @@
+
+
+ 4.0.0
+
+ io.github.hello09x.fakeplayer
+ fakeplayer-parent
+ 0.1.9
+
+
+ fakeplayer-v1_20_R2
+
+
+ 17
+ 17
+ UTF-8
+ 1.20.2-R0.1-SNAPSHOT
+
+
+
+
+ io.papermc.paper
+ paper-api
+ provided
+
+
+
+ io.github.hello09x.fakeplayer
+ fakeplayer-core
+ 0.1.9
+
+
+
+ io.github.hello09x.fakeplayer
+ fakeplayer-api
+ 0.1.9
+
+
+
+ org.spigotmc
+ spigot
+ ${craftbukkit.version}
+ remapped-mojang
+ provided
+
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+
+
+
+
+
+ net.md-5
+ specialsource-maven-plugin
+ 1.2.4
+
+
+ package
+
+ remap
+
+ remap-obf
+
+ org.spigotmc:minecraft-server:${craftbukkit.version}:txt:maps-mojang
+ true
+
+ org.spigotmc:spigot:${craftbukkit.version}:jar:remapped-mojang
+
+ true
+ remapped-obf
+
+
+
+ package
+
+ remap
+
+ remap-spigot
+
+
+ ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
+
+ org.spigotmc:minecraft-server:${craftbukkit.version}:csrg:maps-spigot
+ org.spigotmc:spigot:${craftbukkit.version}:jar:remapped-obf
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/AttackAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/AttackAction.java
new file mode 100644
index 0000000..d79468f
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/AttackAction.java
@@ -0,0 +1,49 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.InteractionHand;
+import net.minecraft.world.phys.EntityHitResult;
+import net.minecraft.world.phys.HitResult;
+
+
+public class AttackAction extends TraceAction {
+
+ private final ServerPlayer player;
+
+ public AttackAction(ServerPlayer player) {
+ super(player);
+ this.player = player;
+ }
+
+
+ @Override
+ public boolean tick() {
+ var hit = this.getTarget();
+ if (hit == null) {
+ return false;
+ }
+
+ if (hit.getType() != HitResult.Type.ENTITY) {
+ return false;
+ }
+
+ var entityHit = (EntityHitResult) hit;
+ player.attack(entityHit.getEntity());
+ player.swing(InteractionHand.MAIN_HAND);
+ player.resetAttackStrengthTicker();
+ player.resetLastActionTime();
+ return true;
+ }
+
+ @Override
+ public void inactiveTick() {
+
+ }
+
+ @Override
+ public void stop() {
+
+ }
+
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropInventoryAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropInventoryAction.java
new file mode 100644
index 0000000..5fb8b58
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropInventoryAction.java
@@ -0,0 +1,35 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import net.minecraft.server.level.ServerPlayer;
+import org.jetbrains.annotations.NotNull;
+
+public class DropInventoryAction implements Action {
+
+ private final ServerPlayer player;
+
+ public DropInventoryAction(@NotNull ServerPlayer player) {
+ this.player = player;
+ }
+
+ @Override
+ public boolean tick() {
+ var inventory = player.getInventory();
+ for (int i = inventory.getContainerSize(); i >= 0; i--) {
+ player.drop(inventory.removeItem(i, inventory.getItem(i).getCount()), false, true);
+ }
+ player.resetLastActionTime();
+ return true;
+ }
+
+ @Override
+ public void inactiveTick() {
+
+ }
+
+ @Override
+ public void stop() {
+
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropItemAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropItemAction.java
new file mode 100644
index 0000000..799c096
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropItemAction.java
@@ -0,0 +1,33 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import net.minecraft.server.level.ServerPlayer;
+import org.jetbrains.annotations.NotNull;
+
+public class DropItemAction implements Action {
+
+ private final ServerPlayer player;
+
+ public DropItemAction(@NotNull ServerPlayer player) {
+ this.player = player;
+ }
+
+
+ @Override
+ public boolean tick() {
+ player.resetLastActionTime();
+ player.drop(false);
+ player.resetLastActionTime();
+ return true;
+ }
+
+ @Override
+ public void inactiveTick() {
+
+ }
+
+ @Override
+ public void stop() {
+
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropStackAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropStackAction.java
new file mode 100644
index 0000000..3ca3bc1
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/DropStackAction.java
@@ -0,0 +1,33 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import net.minecraft.server.level.ServerPlayer;
+import org.jetbrains.annotations.NotNull;
+
+public class DropStackAction implements Action {
+
+ public final ServerPlayer player;
+
+ public DropStackAction(@NotNull ServerPlayer player) {
+ this.player = player;
+ }
+
+
+ @Override
+ public boolean tick() {
+ player.resetLastActionTime();
+ player.drop(true);
+ player.resetLastActionTime();
+ return true;
+ }
+
+ @Override
+ public void inactiveTick() {
+
+ }
+
+ @Override
+ public void stop() {
+
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/JumpAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/JumpAction.java
new file mode 100644
index 0000000..358aa52
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/JumpAction.java
@@ -0,0 +1,36 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import net.minecraft.server.level.ServerPlayer;
+import org.jetbrains.annotations.NotNull;
+
+public class JumpAction implements Action {
+
+ private final ServerPlayer player;
+
+ public JumpAction(@NotNull ServerPlayer player) {
+ this.player = player;
+ }
+
+ @Override
+ public boolean tick() {
+ if (player.onGround()) {
+ player.jumpFromGround();
+ } else {
+ player.setJumping(true);
+ }
+ player.resetLastActionTime();
+ return true;
+ }
+
+ @Override
+ public void inactiveTick() {
+ player.setJumping(false);
+ }
+
+ @Override
+ public void stop() {
+
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/MineAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/MineAction.java
new file mode 100644
index 0000000..031b9a5
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/MineAction.java
@@ -0,0 +1,159 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.InteractionHand;
+import net.minecraft.world.phys.BlockHitResult;
+import net.minecraft.world.phys.HitResult;
+import org.jetbrains.annotations.Nullable;
+
+import static net.minecraft.network.protocol.game.ServerboundPlayerActionPacket.Action.*;
+
+public class MineAction extends TraceAction {
+
+ private final Current current = new Current();
+
+ public MineAction(ServerPlayer player) {
+ super(player);
+ }
+
+ @Override
+ @SuppressWarnings("resource")
+ public boolean tick() {
+ var hit = this.getTarget();
+ if (hit == null) {
+ return false;
+ }
+
+ if (hit.getType() != HitResult.Type.BLOCK) {
+ return false;
+ }
+
+ if (current.freeze > 0) {
+ current.freeze--;
+ return false;
+ }
+
+ var blockHit = (BlockHitResult) hit;
+ var pos = blockHit.getBlockPos();
+ var side = blockHit.getDirection();
+
+ if (player.blockActionRestricted(player.level(), pos, player.gameMode.getGameModeForPlayer())) {
+ return false;
+ }
+
+ if (current.pos != null && player.level().getBlockState(current.pos).isAir()) {
+ current.pos = null;
+ return false;
+ }
+
+ var state = player.level().getBlockState(pos);
+ var broken = false;
+ if (player.gameMode.getGameModeForPlayer().isCreative()) {
+ player.gameMode.handleBlockBreakAction(
+ pos,
+ START_DESTROY_BLOCK,
+ side,
+ player.level().getMaxBuildHeight(),
+ -1
+ );
+ current.freeze = 5;
+ } else if (current.pos == null || !current.pos.equals(pos)) {
+ if (current.pos != null) {
+ player.gameMode.handleBlockBreakAction(
+ current.pos,
+ ABORT_DESTROY_BLOCK,
+ side,
+ player.level().getMaxBuildHeight(),
+ -1
+ );
+ }
+
+ player.gameMode.handleBlockBreakAction(
+ pos,
+ START_DESTROY_BLOCK,
+ side,
+ player.level().getMaxBuildHeight(),
+ -1
+ );
+
+ if (!state.isAir() && current.progress == 0) {
+ state.attack(player.level(), pos, player);
+ }
+
+ if (!state.isAir() && state.getDestroyProgress(player, player.level(), pos) >= 1) {
+ current.pos = null;
+ broken = true;
+ } else {
+ current.pos = pos;
+ current.progress = 0;
+ }
+ } else {
+ current.progress += state.getDestroyProgress(player, player.level(), pos);
+ if (current.progress >= 1) {
+ player.gameMode.handleBlockBreakAction(
+ pos,
+ STOP_DESTROY_BLOCK,
+ side,
+ player.level().getMaxBuildHeight(),
+ -1
+ );
+ current.pos = null;
+ current.freeze = 5;
+ broken = true;
+ }
+ player.level().destroyBlockProgress(-1, pos, (int) (current.progress * 10));
+ }
+
+ player.resetLastActionTime();
+ player.swing(InteractionHand.MAIN_HAND);
+ return broken;
+ }
+
+ @Override
+ public void inactiveTick() {
+ stop();
+ }
+
+ @Override
+ @SuppressWarnings("resource")
+ public void stop() {
+ if (current.pos == null) {
+ return;
+ }
+
+ player.level().destroyBlockProgress(-1, current.pos, -1);
+ player.gameMode.handleBlockBreakAction(
+ current.pos,
+ ABORT_DESTROY_BLOCK,
+ Direction.DOWN,
+ player.level().getMaxBuildHeight(),
+ -1
+ );
+ current.pos = null;
+ current.freeze = 0;
+ current.progress = 0;
+ }
+
+ private static class Current {
+
+ /**
+ * 当前左键的目标位置
+ */
+ @Nullable
+ public BlockPos pos;
+
+ /**
+ * 破坏方块的进度
+ */
+ public float progress;
+
+ /**
+ * 冷却, 单位: tick
+ */
+ public int freeze;
+
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/StareEntityAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/StareEntityAction.java
new file mode 100644
index 0000000..57207a3
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/StareEntityAction.java
@@ -0,0 +1,51 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import io.papermc.paper.entity.LookAnchor;
+import net.minecraft.server.level.ServerPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Damageable;
+import org.jetbrains.annotations.NotNull;
+
+public class StareEntityAction implements Action {
+
+ private final ServerPlayer player;
+
+ public StareEntityAction(@NotNull ServerPlayer player) {
+ this.player = player;
+ }
+
+ @Override
+ @SuppressWarnings("UnstableApiUsage")
+ public boolean tick() {
+ var bukkitPlayer = Bukkit.getPlayer(player.getUUID());
+ if (bukkitPlayer == null) {
+ return true;
+ }
+
+ var target = bukkitPlayer
+ .getNearbyEntities(4.5, 4.5, 4.5)
+ .stream()
+ .filter(e -> e instanceof Damageable)
+ .findAny()
+ .orElse(null);
+
+ if (target == null) {
+ return false;
+ }
+
+ bukkitPlayer.lookAt(target, LookAnchor.EYES, LookAnchor.EYES);
+ player.resetLastActionTime();
+ return true;
+ }
+
+ @Override
+ public void inactiveTick() {
+
+ }
+
+ @Override
+ public void stop() {
+
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/TraceAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/TraceAction.java
new file mode 100644
index 0000000..d71025b
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/TraceAction.java
@@ -0,0 +1,24 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import io.github.hello09x.fakeplayer.v1_20_R2.action.util.Tracer;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.phys.HitResult;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class TraceAction implements Action {
+
+ protected final ServerPlayer player;
+
+ protected TraceAction(@NotNull ServerPlayer player) {
+ this.player = player;
+ }
+
+ protected @Nullable HitResult getTarget() {
+ double reach = player.gameMode.isCreative() ? 5 : 4.5f;
+ return Tracer.rayTrace(player, 1, reach, false);
+ }
+
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/UseAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/UseAction.java
new file mode 100644
index 0000000..1e0fe00
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/UseAction.java
@@ -0,0 +1,98 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action;
+
+import net.minecraft.core.Direction;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.world.InteractionHand;
+import net.minecraft.world.entity.decoration.ItemFrame;
+import net.minecraft.world.phys.BlockHitResult;
+import net.minecraft.world.phys.EntityHitResult;
+import org.jetbrains.annotations.NotNull;
+
+public class UseAction extends TraceAction {
+
+ private final Current current = new Current();
+
+ public UseAction(@NotNull ServerPlayer player) {
+ super(player);
+ }
+
+ @Override
+ @SuppressWarnings("resource")
+ public boolean tick() {
+ if (current.freeze > 0) {
+ current.freeze--;
+ return false;
+ }
+
+ if (player.isUsingItem()) {
+ return true;
+ }
+
+ var hit = this.getTarget();
+ if (hit == null) {
+ return false;
+ }
+
+ for (var hand : InteractionHand.values()) {
+ switch (hit.getType()) {
+ case BLOCK -> {
+ player.resetLastActionTime();
+ var world = player.serverLevel();
+ var blockHit = (BlockHitResult) hit;
+ var pos = blockHit.getBlockPos();
+ var side = blockHit.getDirection();
+ if (pos.getY() < player.level().getMaxBuildHeight() - (side == Direction.UP ? 1 : 0) && world.mayInteract(player, pos)) {
+ var result = player.gameMode.useItemOn(player, world, player.getItemInHand(hand), hand, blockHit);
+ if (result.consumesAction()) {
+ player.swing(hand);
+ current.freeze = 3;
+ return true;
+ }
+ }
+ }
+ case ENTITY -> {
+ player.resetLastActionTime();
+ var entityHit = (EntityHitResult) hit;
+ var entity = entityHit.getEntity();
+ boolean handWasEmpty = player.getItemInHand(hand).isEmpty();
+ boolean itemFrameEmpty = (entity instanceof ItemFrame) && ((ItemFrame) entity).getItem().isEmpty();
+ var pos = entityHit.getLocation().subtract(entity.getX(), entity.getY(), entity.getZ());
+ if (entity.interactAt(player, pos, hand).consumesAction()) {
+ current.freeze = 3;
+ return true;
+ }
+ if (player.interactOn(entity, hand).consumesAction() && !(handWasEmpty && itemFrameEmpty)) {
+ current.freeze = 3;
+ return true;
+ }
+ }
+ }
+ var handItem = player.getItemInHand(hand);
+ if (player.gameMode.useItem(player, player.level(), handItem, hand).consumesAction()) {
+ player.resetLastActionTime();
+ current.freeze = 3;
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void inactiveTick() {
+ this.stop();
+ }
+
+ @Override
+ public void stop() {
+ current.freeze = 0;
+ player.releaseUsingItem();
+ }
+
+ private final static class Current {
+
+ /**
+ * 冷却, 单位: tick
+ */
+ public int freeze;
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/util/Tracer.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/util/Tracer.java
new file mode 100644
index 0000000..4bef3ee
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/util/Tracer.java
@@ -0,0 +1,105 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.action.util;
+
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.level.ClipContext;
+import net.minecraft.world.phys.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.function.Predicate;
+
+/**
+ * copy from fabric carpet mod
+ */
+public class Tracer {
+
+ public static @Nullable HitResult rayTrace(
+ @NotNull Entity source,
+ float partialTicks,
+ double reach,
+ boolean fluids
+ ) {
+ var blockHit = rayTraceBlocks(source, partialTicks, reach, fluids);
+ double maxSqDist = reach * reach;
+ if (blockHit != null) {
+ maxSqDist = blockHit.getLocation().distanceToSqr(source.getEyePosition(partialTicks));
+ }
+ EntityHitResult entityHit = rayTraceEntities(source, partialTicks, reach, maxSqDist);
+ return entityHit == null ? blockHit : entityHit;
+ }
+
+ @SuppressWarnings("resource")
+ public static @Nullable BlockHitResult rayTraceBlocks(
+ @NotNull Entity source,
+ float partialTicks,
+ double reach,
+ boolean fluids
+ ) {
+ var pos = source.getEyePosition(partialTicks);
+ var rotation = source.getViewVector(partialTicks);
+ var reachEnd = pos.add(rotation.x * reach, rotation.y * reach, rotation.z * reach);
+ return source.level().clip(new ClipContext(pos, reachEnd, ClipContext.Block.OUTLINE, fluids ?
+ ClipContext.Fluid.ANY : ClipContext.Fluid.NONE, source));
+ }
+
+ public static @Nullable EntityHitResult rayTraceEntities(
+ @NotNull Entity source,
+ float partialTicks,
+ double reach,
+ double maxSqDist
+ ) {
+ var pos = source.getEyePosition(partialTicks);
+ var reachVec = source.getViewVector(partialTicks).scale(reach);
+ var box = source.getBoundingBox().expandTowards(reachVec).inflate(1);
+ return rayTraceEntities(source,
+ pos,
+ pos.add(reachVec),
+ box,
+ e -> !e.isSpectator() && e.isPickable(),
+ maxSqDist);
+ }
+
+ public static @Nullable EntityHitResult rayTraceEntities(
+ @NotNull Entity source,
+ @NotNull Vec3 start,
+ @NotNull Vec3 end,
+ @NotNull AABB box,
+ @NotNull Predicate predicate,
+ double maxSqDistance
+ ) {
+ @SuppressWarnings("resource")
+ var world = source.level();
+ double targetDistance = maxSqDistance;
+ Entity target = null;
+ Vec3 targetHitPos = null;
+ for (Entity current : world.getEntities(source, box, predicate)) {
+ var currentBox = current.getBoundingBox().inflate(current.getPickRadius());
+ var currentHit = currentBox.clip(start, end);
+ if (currentBox.contains(start)) {
+ if (targetDistance >= 0) {
+ target = current;
+ targetHitPos = currentHit.orElse(start);
+ targetDistance = 0;
+ }
+ } else if (currentHit.isPresent()) {
+ var currentHitPos = currentHit.get();
+ var currentDistance = start.distanceToSqr(currentHitPos);
+ if (currentDistance < targetDistance || targetDistance == 0) {
+ if (current.getRootVehicle() == source.getRootVehicle()) {
+ if (targetDistance == 0) {
+ target = current;
+ targetHitPos = currentHitPos;
+ }
+ }
+ else
+ {
+ target = current;
+ targetHitPos = currentHitPos;
+ targetDistance = currentDistance;
+ }
+ }
+ }
+ }
+ return target == null ? null : new EntityHitResult(target, targetHitPos);
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyAdvancements.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyAdvancements.java
new file mode 100644
index 0000000..7c2694b
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyAdvancements.java
@@ -0,0 +1,63 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.network;
+
+import com.mojang.datafixers.DataFixer;
+import net.minecraft.advancements.AdvancementHolder;
+import net.minecraft.advancements.AdvancementProgress;
+import net.minecraft.server.PlayerAdvancements;
+import net.minecraft.server.ServerAdvancementManager;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.server.players.PlayerList;
+
+import java.nio.file.Path;
+
+public class EmptyAdvancements extends PlayerAdvancements {
+
+ public EmptyAdvancements(
+ DataFixer datafixer,
+ PlayerList playerlist,
+ ServerAdvancementManager manager,
+ Path path,
+ ServerPlayer player
+ ) {
+ super(datafixer, playerlist, manager, path, player);
+ this.save();
+ }
+
+ @Override
+ public boolean award(AdvancementHolder advancementholder, String s) {
+ return false;
+ }
+
+ @Override
+ public void flushDirty(ServerPlayer player) {
+ }
+
+ @Override
+ public AdvancementProgress getOrStartProgress(AdvancementHolder advancement) {
+ return new AdvancementProgress();
+ }
+
+ @Override
+ public boolean revoke(AdvancementHolder advancement, String s) {
+ return false;
+ }
+
+ @Override
+ public void save() {
+ }
+
+ @Override
+ public void setPlayer(ServerPlayer player) {
+ }
+
+ @Override
+ public void setSelectedTab(AdvancementHolder advancement) {
+ }
+
+ @Override
+ public void stopListening() {
+
+ }
+
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyChannel.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyChannel.java
new file mode 100644
index 0000000..3f46a4c
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyChannel.java
@@ -0,0 +1,92 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.network;
+
+import io.netty.channel.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+public class EmptyChannel extends AbstractChannel {
+ private final ChannelConfig config = new DefaultChannelConfig(this);
+
+ private final static EventLoop EVENT_LOOP = new DefaultEventLoop();
+ private final InetAddress address;
+
+ public EmptyChannel(@Nullable Channel parent, @NotNull InetAddress address) {
+ super(parent);
+ this.address = address;
+ }
+
+ @Override
+ public ChannelConfig config() {
+ config.setAutoRead(true);
+ return config;
+ }
+
+ @Override
+ protected void doBeginRead() throws Exception {
+ }
+
+ @Override
+ protected void doBind(SocketAddress arg0) throws Exception {
+ }
+
+ @Override
+ protected void doClose() throws Exception {
+ }
+
+ @Override
+ protected void doDisconnect() throws Exception {
+ }
+
+ @Override
+ protected void doWrite(ChannelOutboundBuffer arg0) throws Exception {
+ }
+
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ @Override
+ protected boolean isCompatible(EventLoop arg0) {
+ return true;
+ }
+
+ @Override
+ public boolean isOpen() {
+ return false;
+ }
+
+ @Override
+ protected SocketAddress localAddress0() {
+ return new InetSocketAddress(address, 25565);
+ }
+
+ @Override
+ public ChannelMetadata metadata() {
+ return new ChannelMetadata(true);
+ }
+
+ @Override
+ protected AbstractUnsafe newUnsafe() {
+ return new AbstractUnsafe() {
+ @Override
+ public void connect(SocketAddress remoteAddress, SocketAddress localAddress, ChannelPromise promise) {
+ safeSetSuccess(promise);
+ }
+ };
+ }
+
+ @Override
+ protected SocketAddress remoteAddress0() {
+ return new InetSocketAddress(address, 25565);
+ }
+
+ @Override
+ public EventLoop eventLoop() {
+ return EVENT_LOOP;
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyConnection.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyConnection.java
new file mode 100644
index 0000000..fa80256
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyConnection.java
@@ -0,0 +1,35 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.network;
+
+import net.minecraft.network.Connection;
+import net.minecraft.network.PacketSendListener;
+import net.minecraft.network.protocol.Packet;
+import net.minecraft.network.protocol.PacketFlow;
+import org.jetbrains.annotations.NotNull;
+
+import java.net.InetAddress;
+
+public class EmptyConnection extends Connection {
+ public EmptyConnection(@NotNull PacketFlow flag, @NotNull InetAddress address) {
+ super(flag);
+ this.channel = new EmptyChannel(null, address);
+ this.address = this.channel.remoteAddress();
+ }
+
+ @Override
+ public boolean isConnected() {
+ return true;
+ }
+
+ @Override
+ public void send(Packet> packet, PacketSendListener listener) {
+ }
+
+ @Override
+ public void send(Packet> packet) {
+ }
+
+ @Override
+ public void handleDisconnection() {
+ super.handleDisconnection();
+ }
+}
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyLoginPacketListener.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyLoginPacketListener.java
new file mode 100644
index 0000000..cd6c69b
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyLoginPacketListener.java
@@ -0,0 +1,12 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.network;
+
+import net.minecraft.network.Connection;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.network.ServerLoginPacketListenerImpl;
+
+public class EmptyLoginPacketListener extends ServerLoginPacketListenerImpl {
+ public EmptyLoginPacketListener(MinecraftServer server, Connection connection) {
+ super(server, connection);
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyServerGamePacketListener.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyServerGamePacketListener.java
new file mode 100644
index 0000000..1d0a53a
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/EmptyServerGamePacketListener.java
@@ -0,0 +1,19 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.network;
+
+import net.minecraft.network.Connection;
+import net.minecraft.network.protocol.Packet;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.server.network.CommonListenerCookie;
+import net.minecraft.server.network.ServerGamePacketListenerImpl;
+
+public class EmptyServerGamePacketListener extends ServerGamePacketListenerImpl {
+ public EmptyServerGamePacketListener(MinecraftServer minecraftServer, Connection networkManager, ServerPlayer entityPlayer, CommonListenerCookie commonListenerCookie) {
+ super(minecraftServer, networkManager, entityPlayer, commonListenerCookie);
+ }
+
+ @Override
+ public void send(Packet> packet) {
+ }
+
+}
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/ActionTickerImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/ActionTickerImpl.java
new file mode 100644
index 0000000..56cba51
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/ActionTickerImpl.java
@@ -0,0 +1,76 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+
+import io.github.hello09x.fakeplayer.api.action.ActionSetting;
+import io.github.hello09x.fakeplayer.api.action.ActionType;
+import io.github.hello09x.fakeplayer.api.spi.Action;
+import io.github.hello09x.fakeplayer.v1_20_R2.action.*;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+public class ActionTickerImpl implements io.github.hello09x.fakeplayer.api.spi.ActionTicker {
+
+ /**
+ * 行为类型
+ */
+ private final Action action;
+
+ /**
+ * 行为设置
+ */
+ private final ActionSetting setting;
+
+ public ActionTickerImpl(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting) {
+ var handle = ((CraftPlayer) player).getHandle();
+ this.action = switch (action) {
+ case ATTACK -> new AttackAction(handle);
+ case MINE -> new MineAction(handle);
+ case USE -> new UseAction(handle);
+ case JUMP -> new JumpAction(handle);
+ case LOOK_AT_NEAREST_ENTITY -> new StareEntityAction(handle);
+ case DROP_ITEM -> new DropItemAction(handle);
+ case DROP_STACK -> new DropStackAction(handle);
+ case DROP_INVENTORY -> new DropInventoryAction(handle);
+ };
+ this.setting = setting;
+ }
+
+
+ @Override
+ public void tick() {
+ if (setting.wait > 0) {
+ setting.wait--;
+ inactiveTick();
+ return;
+ }
+
+ if (setting.times == 0) {
+ inactiveTick();
+ return;
+ }
+
+ var valid = action.tick();
+ if (valid) {
+ if (setting.times > 0) {
+ setting.times--;
+ }
+ setting.wait = setting.interval;
+ }
+ }
+
+ public boolean isDone() {
+ return setting.times <= 0;
+ }
+
+ @Override
+ public void inactiveTick() {
+ action.inactiveTick();
+ }
+
+ @Override
+ public void stop() {
+ action.stop();
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSEntityImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSEntityImpl.java
new file mode 100644
index 0000000..0b6a51f
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSEntityImpl.java
@@ -0,0 +1,19 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+import io.github.hello09x.fakeplayer.api.spi.NMSEntity;
+import lombok.Getter;
+import net.minecraft.world.entity.Entity;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity;
+import org.jetbrains.annotations.NotNull;
+
+public class NMSEntityImpl implements NMSEntity {
+
+ @Getter
+ private Entity handle;
+
+ public NMSEntityImpl(@NotNull org.bukkit.entity.@NotNull Entity entity) {
+ this.handle = ((CraftEntity) entity).getHandle();
+ }
+
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSNetworkImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSNetworkImpl.java
new file mode 100644
index 0000000..b60b5a3
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSNetworkImpl.java
@@ -0,0 +1,46 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+import io.github.hello09x.fakeplayer.api.spi.NMSNetwork;
+import io.github.hello09x.fakeplayer.v1_20_R2.network.EmptyConnection;
+import io.github.hello09x.fakeplayer.v1_20_R2.network.EmptyLoginPacketListener;
+import io.github.hello09x.fakeplayer.v1_20_R2.network.EmptyServerGamePacketListener;
+import net.minecraft.network.protocol.PacketFlow;
+import net.minecraft.server.network.CommonListenerCookie;
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.net.InetAddress;
+
+public class NMSNetworkImpl implements NMSNetwork {
+
+ @Override
+ public void bindEmptyServerGamePacketListener(@NotNull Server server, @NotNull Player player, @NotNull InetAddress address) {
+ var connect = new EmptyConnection(PacketFlow.CLIENTBOUND, address);
+ var listener = new EmptyServerGamePacketListener(
+ ((CraftServer) server).getServer(),
+ connect,
+ ((CraftPlayer) player).getHandle(),
+ CommonListenerCookie.createInitial(((CraftPlayer) player).getProfile())
+ );
+ connect.setListener(listener);
+ }
+
+ @Override
+ public void bindEmptyLoginPacketListener(@NotNull Server server, @NotNull Player player, @NotNull InetAddress address) {
+ var connect = new EmptyConnection(PacketFlow.CLIENTBOUND, address);
+ var listener = new EmptyLoginPacketListener(
+ ((CraftServer) server).getServer(),
+ connect
+ );
+ ((CraftServer) server).getHandle().placeNewPlayer(
+ listener.connection,
+ ((CraftPlayer) player).getHandle(),
+ CommonListenerCookie.createInitial(((CraftPlayer) player).getProfile())
+ );
+ connect.setListener(listener);
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerImpl.java
new file mode 100644
index 0000000..2768eeb
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerImpl.java
@@ -0,0 +1,38 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+import com.mojang.authlib.GameProfile;
+import io.github.hello09x.fakeplayer.api.spi.NMSServer;
+import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
+import lombok.Getter;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.ClientInformation;
+import net.minecraft.server.level.ServerPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.UUID;
+
+public class NMSServerImpl implements NMSServer {
+
+
+ @Getter
+ private final MinecraftServer handle;
+
+ public NMSServerImpl(@NotNull Server server) {
+ this.handle = ((CraftServer) server).getServer();
+ }
+
+
+ @Override
+ public @NotNull NMSServerPlayer newPlayer(@NotNull UUID uuid, @NotNull String name) {
+ var handle = new ServerPlayer(
+ new NMSServerImpl(Bukkit.getServer()).getHandle(),
+ NMSServerLevelImpl.OVERWORLD.getHandle(),
+ new GameProfile(uuid, name),
+ ClientInformation.createDefault()
+ );
+ return new NMSServerPlayerImpl(handle.getBukkitEntity());
+ }
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerLevelImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerLevelImpl.java
new file mode 100644
index 0000000..7995c45
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerLevelImpl.java
@@ -0,0 +1,26 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+import io.github.hello09x.fakeplayer.api.spi.NMSServerLevel;
+import lombok.Getter;
+import net.minecraft.server.level.ServerLevel;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_20_R2.CraftWorld;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Objects;
+
+public class NMSServerLevelImpl implements NMSServerLevel {
+
+ public final static NMSServerLevelImpl OVERWORLD = new NMSServerLevelImpl(
+ Objects.requireNonNull(Bukkit.getWorld("world"))
+ );
+
+ @Getter
+ private final ServerLevel handle;
+
+ public NMSServerLevelImpl(@NotNull World world) {
+ this.handle = ((CraftWorld) world).getHandle();
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerPlayerImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerPlayerImpl.java
new file mode 100644
index 0000000..14fda5e
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerPlayerImpl.java
@@ -0,0 +1,200 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+import com.google.common.collect.Iterables;
+import io.github.hello09x.fakeplayer.api.Reflections;
+import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
+import io.github.hello09x.fakeplayer.v1_20_R2.network.EmptyAdvancements;
+import lombok.Getter;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.server.PlayerAdvancements;
+import net.minecraft.server.level.ServerPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.lang.reflect.Field;
+import java.util.Optional;
+
+public class NMSServerPlayerImpl implements NMSServerPlayer {
+
+ private final static Field ServerPlayer$advancements = Reflections.getFirstFieldByType(
+ ServerPlayer.class,
+ PlayerAdvancements.class,
+ false
+ );
+
+ @Getter
+ private final ServerPlayer handle;
+
+ @Getter
+ private final CraftPlayer player;
+
+ public NMSServerPlayerImpl(@NotNull Player player) {
+ this.player = ((CraftPlayer) player);
+ this.handle = ((CraftPlayer) player).getHandle();
+ }
+
+ @Override
+ public double getX() {
+ return handle.getX();
+ }
+
+ @Override
+ public double getY() {
+ return handle.getY();
+ }
+
+ @Override
+ public double getZ() {
+ return handle.getZ();
+ }
+
+ @Override
+ public void setXo(double xo) {
+ handle.xo = xo;
+ }
+
+ @Override
+ public void setYo(double yo) {
+ handle.yo = yo;
+ }
+
+ @Override
+ public void setZo(double zo) {
+ handle.zo = zo;
+ }
+
+ @Override
+ public void doTick() {
+ handle.doTick();
+ ;
+ }
+
+ @Override
+ public void absMoveTo(double x, double y, double z, float yRot, float xRot) {
+ handle.absMoveTo(x, y, z, yRot, xRot);
+ }
+
+ @Override
+ public float getYRot() {
+ return handle.getYRot();
+ }
+
+ @Override
+ public void setYRot(float yRot) {
+ handle.setYRot(yRot);
+ }
+
+ @Override
+ public float getXRot() {
+ return handle.getXRot();
+ }
+
+ @Override
+ public void setXRot(float xRot) {
+ handle.setXRot(xRot);
+ }
+
+ @Override
+ public void setZza(float zza) {
+ handle.zza = zza;
+ }
+
+ @Override
+ public void setXxa(float xxa) {
+ handle.xxa = xxa;
+ }
+
+ @Override
+ public boolean startRiding(@NotNull Entity entity, boolean flag) {
+ return handle.startRiding(new NMSEntityImpl(entity).getHandle(), flag);
+ }
+
+ @Override
+ public void stopRiding() {
+ handle.stopRiding();
+ }
+
+
+ @Override
+ public int getTickCount() {
+ return handle.tickCount;
+ }
+
+ @Override
+ public void drop(boolean all) {
+ handle.drop(all);
+ }
+
+ @Override
+ public void resetLastActionTime() {
+ handle.resetLastActionTime();
+ }
+
+ @Override
+ public boolean onGround() {
+ return handle.onGround();
+ }
+
+ @Override
+ public void jumpFromGround() {
+ handle.jumpFromGround();
+ }
+
+ @Override
+ public void setJumping(boolean jumping) {
+ handle.setJumping(jumping);
+ }
+
+ @Override
+ public boolean isUsingItem() {
+ return handle.isUsingItem();
+ }
+
+ @Override
+ public void unpersistAdvancements(@NotNull Plugin plugin) {
+ if (ServerPlayer$advancements == null) {
+ return;
+ }
+
+ var server = new NMSServerImpl(Bukkit.getServer()).getHandle();
+ try {
+ ServerPlayer$advancements.set(
+ handle,
+ new EmptyAdvancements(
+ server.getFixerUpper(),
+ server.getPlayerList(),
+ server.getAdvancements(),
+ plugin.getDataFolder().getParentFile().toPath(),
+ handle
+ )
+ );
+ } catch (IllegalAccessException ignored) {
+ }
+ }
+
+ @Override
+ public void copyTexture(@NotNull Player from) {
+ var source = new NMSServerPlayerImpl(from).getHandle();
+ Optional.of(source)
+ .map(h -> h.getGameProfile().getProperties().get("textures"))
+ .map(textures -> Iterables.getFirst(textures, null))
+ .ifPresent(texture -> handle.getGameProfile().getProperties().put("textures", texture));
+ }
+
+
+ @Override
+ public void drop(int slot, boolean flat, boolean flat1) {
+ var inventory = handle.getInventory();
+ handle.drop(inventory.removeItem(slot, inventory.getItem(slot).getCount()), flat, flat1);
+ }
+
+ @Override
+ public void setPlayBefore() {
+ player.readExtraData(new CompoundTag());
+ }
+
+}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/VersionSupportImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/VersionSupportImpl.java
new file mode 100644
index 0000000..86ad5e0
--- /dev/null
+++ b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/VersionSupportImpl.java
@@ -0,0 +1,54 @@
+package io.github.hello09x.fakeplayer.v1_20_R2.spi;
+
+import io.github.hello09x.fakeplayer.api.action.ActionSetting;
+import io.github.hello09x.fakeplayer.api.action.ActionType;
+import io.github.hello09x.fakeplayer.api.spi.*;
+import org.bukkit.Bukkit;
+import org.bukkit.Server;
+import org.bukkit.World;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Set;
+
+public class VersionSupportImpl implements VersionSupport {
+
+ private final static Set SUPPORTS = Set.of("1.20.2");
+
+ @Override
+ public @NotNull NMSEntity entity(@NotNull Entity entity) {
+ return new NMSEntityImpl(entity);
+ }
+
+ @Override
+ public @NotNull NMSServer server(@NotNull Server server) {
+ return new NMSServerImpl(server);
+ }
+
+ @Override
+ public @NotNull NMSServerLevel world(@NotNull World world) {
+ return new NMSServerLevelImpl(world);
+ }
+
+ @Override
+ public @NotNull NMSServerPlayer player(@NotNull Player player) {
+ return new NMSServerPlayerImpl(player);
+ }
+
+ @Override
+ public @NotNull NMSNetwork network() {
+ return new NMSNetworkImpl();
+ }
+
+ @Override
+ public boolean isSupported() {
+ return SUPPORTS.contains(Bukkit.getMinecraftVersion());
+ }
+
+ @Override
+ public ActionTicker createAction(@NotNull Player player, @NotNull ActionType action, @NotNull ActionSetting setting) {
+ return new ActionTickerImpl(player, action, setting);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 779954f..04188f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,8 @@
fakeplayer-api
fakeplayer-core
fakeplayer-v1_20_R1
+ fakeplayer-v1_20_R2
+ fakeplayer-dist
@@ -69,12 +71,11 @@
provided
-
-
dev.jorel
- commandapi-bukkit-shade
- 9.0.3
+ commandapi-bukkit-core
+ 9.2.0
+ provided