diff --git a/README.md b/README.md
index 8ef7cdd..aa1e0c7 100644
--- a/README.md
+++ b/README.md
@@ -6,11 +6,11 @@
### 支持版本
-仅支持 `Paper` 及其下游 `Purpur` 核心
+仅支持 `Paper` 及其下游如 (`Purpur`) 核心,所有测试均在 `Purpur` 进行,因此 `Purpur` 的兼容性最高
-+ 1.20 / 1.20.1
-+ 1.20.2
-+ 1.20.3 / 1.20.4 (_**未经过测试**_)
+0.2.9 版本支持 1.20.1 - 1.20.4,请在 Release 里查找历史版本下载
+
+0.3.x 版本支持 1.21.1 及之后的版本。
## 特性
diff --git a/fakeplayer-api/pom.xml b/fakeplayer-api/pom.xml
index 5218e98..66ec7e9 100644
--- a/fakeplayer-api/pom.xml
+++ b/fakeplayer-api/pom.xml
@@ -12,8 +12,8 @@
fakeplayer-api
- 17
- 17
+ 21
+ 21
UTF-8
diff --git a/fakeplayer-core/pom.xml b/fakeplayer-core/pom.xml
index ad3c034..804c5c9 100644
--- a/fakeplayer-core/pom.xml
+++ b/fakeplayer-core/pom.xml
@@ -12,8 +12,8 @@
fakeplayer-core
- 17
- 17
+ 21
+ 21
UTF-8
diff --git a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java
index 619391c..ccb2061 100644
--- a/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java
+++ b/fakeplayer-core/src/main/java/io/github/hello09x/fakeplayer/core/entity/FakePlayer.java
@@ -217,10 +217,8 @@ public class FakePlayer {
var event = new AsyncPlayerPreLoginEvent(
this.name,
address,
- address,
this.uuid,
- player.getPlayerProfile(),
- address.getHostAddress()
+ false
);
Bukkit.getPluginManager().callEvent(event);
return event;
diff --git a/fakeplayer-dist/pom.xml b/fakeplayer-dist/pom.xml
index f1e078d..0942dc3 100644
--- a/fakeplayer-dist/pom.xml
+++ b/fakeplayer-dist/pom.xml
@@ -12,8 +12,8 @@
fakeplayer-dist
- 17
- 17
+ 21
+ 21
UTF-8
@@ -29,21 +29,6 @@
fakeplayer-api
-
- io.github.hello09x.fakeplayer
- fakeplayer-v1_20_R1
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-v1_20_R2
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-v1_20_R4
-
-
io.github.hello09x.fakeplayer
fakeplayer-v1_21_R1
diff --git a/fakeplayer-v1_20_R1/pom.xml b/fakeplayer-v1_20_R1/pom.xml
deleted file mode 100644
index 15988ed..0000000
--- a/fakeplayer-v1_20_R1/pom.xml
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
- 4.0.0
-
- io.github.hello09x.fakeplayer
- fakeplayer-parent
- 1.0.0
-
-
- fakeplayer-v1_20_R1
-
-
- 17
- 17
- UTF-8
-
-
-
-
- io.papermc.paper
- paper-api
- provided
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-core
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-api
- provided
-
-
-
- org.spigotmc
- spigot
- 1.20.1-R0.1-SNAPSHOT
- remapped-mojang
- provided
-
-
-
- org.projectlombok
- lombok
- provided
-
-
-
-
-
-
-
- net.md-5
- specialsource-maven-plugin
- 1.2.4
-
-
- package
-
- remap
-
- remap-obf
-
- org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:txt:maps-mojang
- true
-
- org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-mojang
-
- true
- remapped-obf
-
-
-
- package
-
- remap
-
- remap-spigot
-
-
- ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
-
- org.spigotmc:minecraft-server:1.20.1-R0.1-SNAPSHOT:csrg:maps-spigot
- org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:jar:remapped-obf
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java
deleted file mode 100644
index 8e060e0..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java
deleted file mode 100644
index 55936c5..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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;
- broken = true;
- } 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_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java
deleted file mode 100644
index feaa840..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.action;
-
-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;
-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_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java
deleted file mode 100644
index 0066f96..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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() {
- }
-
- @Override
- public void stop() {
- current.freeze = 0;
- player.releaseUsingItem();
- }
-
- private final static class Current {
-
- /**
- * 冷却, 单位: tick
- */
- public int freeze;
- }
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java
deleted file mode 100644
index f22ef0e..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyChannel.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyChannel.java
deleted file mode 100644
index 0377c03..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyChannel.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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 DummyChannel extends AbstractChannel {
- private final static EventLoop EVENT_LOOP = new DefaultEventLoop();
- private final ChannelConfig config = new DefaultChannelConfig(this);
- private final InetAddress address;
-
- public DummyChannel(@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 in) throws Exception {
- for (; ; ) {
- Object msg = in.current();
- if (msg == null) {
- break;
- }
- in.remove();
- }
- }
-
- @Override
- public boolean isActive() {
- return true;
- }
-
- @Override
- protected boolean isCompatible(EventLoop arg0) {
- return true;
- }
-
- @Override
- public boolean isOpen() {
- return true;
- }
-
- @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_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyConnection.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyConnection.java
deleted file mode 100644
index a98b974..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyConnection.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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 DummyConnection extends Connection {
- public DummyConnection(@NotNull InetAddress address) {
- super(PacketFlow.SERVERBOUND);
- this.channel = new DummyChannel(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_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyPlayerAdvancements.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyPlayerAdvancements.java
deleted file mode 100644
index 05f1439..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyPlayerAdvancements.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.network;
-
-import com.mojang.datafixers.DataFixer;
-import net.minecraft.advancements.Advancement;
-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 DummyPlayerAdvancements extends PlayerAdvancements {
-
- public DummyPlayerAdvancements(
- DataFixer datafixer,
- PlayerList playerlist,
- ServerAdvancementManager manager,
- Path path,
- ServerPlayer player
- ) {
- super(datafixer, playerlist, manager, path, player);
- this.save();
- }
-
- @Override
- public boolean award(Advancement advancement, String s) {
- return false;
- }
-
- @Override
- public void flushDirty(ServerPlayer player) {
- }
-
- @Override
- public AdvancementProgress getOrStartProgress(Advancement advancement) {
- return new AdvancementProgress();
- }
-
- @Override
- public boolean revoke(Advancement advancement, String s) {
- return false;
- }
-
- @Override
- public void save() {
- }
-
- @Override
- public void setPlayer(ServerPlayer player) {
- }
-
- @Override
- public void setSelectedTab(Advancement advancement) {
- }
-
- @Override
- public void stopListening() {
- }
-
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyServerGamePacketListenerImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyServerGamePacketListenerImpl.java
deleted file mode 100644
index dd7237c..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyServerGamePacketListenerImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.network;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener;
-import io.github.hello09x.fakeplayer.core.Main;
-import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
-import net.minecraft.network.Connection;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.server.network.ServerGamePacketListenerImpl;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.plugin.messaging.StandardMessenger;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-
-public class DummyServerGamePacketListenerImpl extends ServerGamePacketListenerImpl implements NMSServerGamePacketListener {
-
- private final static FakeplayerManager manager = FakeplayerManager.instance;
-
- public DummyServerGamePacketListenerImpl(
- @NotNull MinecraftServer server,
- @NotNull Connection connection,
- @NotNull ServerPlayer player
- ) {
- super(server, connection, player);
- Optional.ofNullable(Bukkit.getPlayer(player.getUUID()))
- .map(CraftPlayer.class::cast)
- .ifPresent(p -> p.addChannel(StandardMessenger.validateAndCorrectChannel(BUNGEE_CORD_CHANNEL)));
- }
-
- @Override
- public void send(Packet> packet) {
- if (packet instanceof ClientboundCustomPayloadPacket p) {
- // 接收到自定义的数据包,由于假人没有连接导致 BungeeCord 的插件消息无法正确通过 Proxy 发送
- // 因此将该数据包通过真实的玩家重新发送一份
- this.handleCustomPayloadPacket(p);
- }
- }
-
- private void handleCustomPayloadPacket(@NotNull ClientboundCustomPayloadPacket packet) {
- var channel = StandardMessenger.validateAndCorrectChannel(packet.getIdentifier().getNamespace() + ":" + packet.getIdentifier().getPath());
- if (!channel.equals(BUNGEE_CORD_CHANNEL)) {
- return;
- }
-
- var recipient = Bukkit
- .getOnlinePlayers()
- .stream()
- .filter(manager::notContains)
- .findAny()
- .orElse(null);
- if (recipient == null) {
- return;
- }
-
- var message = packet.getData().array();
- recipient.sendPluginMessage(Main.getInstance(), channel, message);
- }
-
-}
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java
deleted file mode 100644
index 14444f4..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-
-
-import io.github.hello09x.fakeplayer.api.spi.Action;
-import io.github.hello09x.fakeplayer.api.spi.ActionTicker;
-import io.github.hello09x.fakeplayer.core.entity.action.BaseActionTicker;
-import io.github.hello09x.fakeplayer.v1_20_R1.action.AttackAction;
-import io.github.hello09x.fakeplayer.v1_20_R1.action.MineAction;
-import io.github.hello09x.fakeplayer.v1_20_R1.action.UseAction;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-public class ActionTickerImpl extends BaseActionTicker implements ActionTicker {
-
-
- public ActionTickerImpl(@NotNull Player player, @NotNull Action.ActionType action, @NotNull Action.ActionSetting setting) {
- super(player, action, setting);
- if (this.action == null) {
- this.action = switch (action) {
- case ATTACK -> new AttackAction(((CraftPlayer) player).getHandle());
- case MINE -> new MineAction(((CraftPlayer) player).getHandle());
- case USE -> new UseAction(((CraftPlayer) player).getHandle());
- case JUMP, LOOK_AT_NEAREST_ENTITY, DROP_INVENTORY, DROP_STACK, DROP_ITEM ->
- throw new UnsupportedOperationException();
- };
- }
- }
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSBridgeImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSBridgeImpl.java
deleted file mode 100644
index aee9604..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSBridgeImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-
-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.net.InetAddress;
-import java.util.Set;
-
-public class NMSBridgeImpl implements NMSBridge {
-
- private final static Set SUPPORTS = Set.of("1.20", "1.20.1");
-
- @Override
- public @NotNull NMSEntity fromEntity(@NotNull Entity entity) {
- return new NMSEntityImpl(entity);
- }
-
- @Override
- public @NotNull NMSServer fromServer(@NotNull Server server) {
- return new NMSServerImpl(server);
- }
-
- @Override
- public @NotNull NMSServerLevel fromWorld(@NotNull World world) {
- return new NMSServerLevelImpl(world);
- }
-
- @Override
- public @NotNull NMSServerPlayer fromPlayer(@NotNull Player player) {
- return new NMSServerPlayerImpl(player);
- }
-
- @Override
- public @NotNull NMSNetwork createNetwork(@NotNull InetAddress address) {
- return new NMSNetworkImpl(address);
- }
-
- @Override
- public boolean isSupported() {
- return SUPPORTS.contains(Bukkit.getMinecraftVersion());
- }
-
- @Override
- public @NotNull ActionTicker createAction(@NotNull Player player, @NotNull Action.ActionType action, @NotNull Action.ActionSetting setting) {
- return new ActionTickerImpl(player, action, setting);
- }
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java
deleted file mode 100644
index 66dcd01..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-
-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;
-import org.jetbrains.annotations.NotNull;
-
-public class NMSEntityImpl implements NMSEntity {
-
- @Getter
- private final Entity handle;
-
- public NMSEntityImpl(@NotNull org.bukkit.entity.@NotNull Entity entity) {
- this.handle = ((CraftEntity) entity).getHandle();
- }
-
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java
deleted file mode 100644
index 995d8a0..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSNetwork;
-import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener;
-import io.github.hello09x.fakeplayer.v1_20_R1.network.DummyConnection;
-import io.github.hello09x.fakeplayer.v1_20_R1.network.DummyServerGamePacketListenerImpl;
-import org.bukkit.Server;
-import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.net.InetAddress;
-
-public class NMSNetworkImpl implements NMSNetwork {
-
- private final @NotNull DummyConnection connection;
-
- private NMSServerGamePacketListener serverGamePacketListener;
-
- public NMSNetworkImpl(
- @NotNull InetAddress address
- ) {
- this.connection = new DummyConnection(address);
- }
-
- @Override
- public @NotNull NMSServerGamePacketListener placeNewPlayer(@NotNull Server server, @NotNull Player player) {
- var handle = ((CraftPlayer) player).getHandle();
- var listener = new DummyServerGamePacketListenerImpl(
- ((CraftServer) server).getServer(),
- this.connection,
- handle
- );
- handle.connection = listener;
- ((CraftServer) server).getHandle().placeNewPlayer(
- this.connection,
- handle
- );
- this.serverGamePacketListener = listener;
- return listener;
- }
-
- @NotNull
- @Override
- public NMSServerGamePacketListener getServerGamePacketListener() throws IllegalStateException {
- if (this.serverGamePacketListener == null) {
- throw new IllegalStateException("not initialized");
- }
- return this.serverGamePacketListener;
- }
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java
deleted file mode 100644
index 4bf0f48..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-
-import com.mojang.authlib.GameProfile;
-import io.github.hello09x.bedrock.util.Worlds;
-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;
-import org.bukkit.Bukkit;
-import org.bukkit.Server;
-import org.bukkit.craftbukkit.v1_20_R1.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(),
- new NMSServerLevelImpl(Worlds.getMainWorld()).getHandle(),
- new GameProfile(uuid, name)
- );
- return new NMSServerPlayerImpl(handle.getBukkitEntity());
- }
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java
deleted file mode 100644
index 1255587..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.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_R1.CraftWorld;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Objects;
-
-public class NMSServerLevelImpl implements NMSServerLevel {
-
- @Getter
- private final ServerLevel handle;
-
- public NMSServerLevelImpl(@NotNull World world) {
- this.handle = ((CraftWorld) world).getHandle();
- }
-
-}
diff --git a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java b/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java
deleted file mode 100644
index dd00f7a..0000000
--- a/fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R1.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
-import io.github.hello09x.fakeplayer.core.constant.ConstantPool;
-import io.github.hello09x.fakeplayer.core.util.Reflections;
-import io.github.hello09x.fakeplayer.v1_20_R1.network.DummyPlayerAdvancements;
-import lombok.Getter;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.network.protocol.game.ServerboundClientCommandPacket;
-import net.minecraft.network.protocol.game.ServerboundClientInformationPacket;
-import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
-import net.minecraft.server.PlayerAdvancements;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.world.entity.HumanoidArm;
-import net.minecraft.world.entity.player.ChatVisiblity;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R1.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;
-
-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 force) {
- return handle.startRiding(new NMSEntityImpl(entity).getHandle(), force);
- }
-
- @Override
- public void stopRiding() {
- handle.stopRiding();
- }
-
-
- @Override
- public int getTickCount() {
- return handle.tickCount;
- }
-
- @Override
- public void drop(boolean allStack) {
- handle.drop(allStack);
- }
-
- @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 disableAdvancements(@NotNull Plugin plugin) {
- if (ServerPlayer$advancements == null) {
- return;
- }
-
- var server = ((CraftServer) Bukkit.getServer()).getServer();
- try {
- ServerPlayer$advancements.set(
- handle,
- new DummyPlayerAdvancements(
- server.getFixerUpper(),
- server.getPlayerList(),
- server.getAdvancements(),
- plugin.getDataFolder().getParentFile().toPath(),
- handle
- )
- );
- } catch (IllegalAccessException ignored) {
- }
- }
-
- @Override
- public void drop(int slot, boolean flag, boolean flag1) {
- var inventory = handle.getInventory();
- handle.drop(inventory.removeItem(slot, inventory.getItem(slot).getCount()), flag, flag1);
- }
-
- @Override
- public void setPlayBefore() {
- player.readExtraData(new CompoundTag());
- }
-
- @Override
- public void setupClientOptions() {
- var option = new ServerboundClientInformationPacket(
- "en_us",
- Bukkit.getViewDistance(),
- ChatVisiblity.SYSTEM,
- false,
- ConstantPool.MODEL_CUSTOMISATION,
- HumanoidArm.RIGHT,
- false,
- true
- );
- handle.updateOptions(option);
- }
-
- @Override
- public void respawn() {
- if (!this.player.isDead()) {
- return;
- }
-
- var packet = new ServerboundClientCommandPacket(ServerboundClientCommandPacket.Action.PERFORM_RESPAWN);
- handle.connection.handleClientCommand(packet);
- }
-
- public void swapItemWithOffhand() {
- handle.connection.handlePlayerAction(new ServerboundPlayerActionPacket(
- ServerboundPlayerActionPacket.Action.SWAP_ITEM_WITH_OFFHAND,
- new BlockPos(0, 0, 0),
- Direction.DOWN
- ));
- }
-
-}
diff --git a/fakeplayer-v1_20_R2/pom.xml b/fakeplayer-v1_20_R2/pom.xml
deleted file mode 100644
index e427457..0000000
--- a/fakeplayer-v1_20_R2/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
- 4.0.0
-
- io.github.hello09x.fakeplayer
- fakeplayer-parent
- 1.0.0
-
-
- fakeplayer-v1_20_R2
-
-
- 17
- 17
- UTF-8
-
-
-
-
- io.papermc.paper
- paper-api
- provided
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-core
- provided
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-api
- provided
-
-
-
- org.spigotmc
- spigot
- 1.20.2-R0.1-SNAPSHOT
- remapped-mojang
- provided
-
-
-
- org.projectlombok
- lombok
- provided
-
-
-
-
-
-
-
- net.md-5
- specialsource-maven-plugin
- 1.2.4
-
-
- package
-
- remap
-
- remap-obf
-
- org.spigotmc:minecraft-server:1.20.2-R0.1-SNAPSHOT:txt:maps-mojang
- true
-
- org.spigotmc:spigot:1.20.2-R0.1-SNAPSHOT:jar:remapped-mojang
-
- true
- remapped-obf
-
-
-
- package
-
- remap
-
- remap-spigot
-
-
- ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
-
- org.spigotmc:minecraft-server:1.20.2-R0.1-SNAPSHOT:csrg:maps-spigot
- org.spigotmc:spigot:1.20.2-R0.1-SNAPSHOT: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
deleted file mode 100644
index d79468f..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/AttackAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-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/MineAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/MineAction.java
deleted file mode 100644
index 8b63810..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/MineAction.java
+++ /dev/null
@@ -1,160 +0,0 @@
-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;
- broken = true;
- } 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/TraceAction.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/TraceAction.java
deleted file mode 100644
index d71025b..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/TraceAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644
index d2e3439..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/UseAction.java
+++ /dev/null
@@ -1,97 +0,0 @@
-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() {
- }
-
- @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
deleted file mode 100644
index 4bef3ee..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/util/Tracer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-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/DummyChannel.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyChannel.java
deleted file mode 100644
index 87c8665..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyChannel.java
+++ /dev/null
@@ -1,99 +0,0 @@
-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 DummyChannel extends AbstractChannel {
- private final static EventLoop EVENT_LOOP = new DefaultEventLoop();
- private final ChannelConfig config = new DefaultChannelConfig(this);
-
- private final InetAddress address;
-
- public DummyChannel(@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 in) throws Exception {
- for (;;) {
- Object msg = in.current();
- if (msg == null) {
- break;
- }
- in.remove();
- }
- }
-
- @Override
- public boolean isActive() {
- return true;
- }
-
- @Override
- protected boolean isCompatible(EventLoop arg0) {
- return true;
- }
-
- @Override
- public boolean isOpen() {
- return true;
- }
-
- @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/DummyConnection.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyConnection.java
deleted file mode 100644
index a12c0f2..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyConnection.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.network;
-
-import net.minecraft.network.Connection;
-import net.minecraft.network.ConnectionProtocol;
-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 DummyConnection extends Connection {
- public DummyConnection(@NotNull InetAddress address) {
- super(PacketFlow.SERVERBOUND);
- this.channel = new DummyChannel(null, address);
- this.address = this.channel.remoteAddress();
- Connection.configureSerialization(this.channel.pipeline(), PacketFlow.SERVERBOUND, null);
- }
-
- @Override
- public boolean isConnected() {
- return true;
- }
-
- @Override
- public void send(Packet> packet, PacketSendListener listener) {
- }
-
- @Override
- public void send(Packet> packet) {
- }
-
- public void setProtocolAttr(@NotNull ConnectionProtocol protocol) {
- this.channel.attr(Connection.ATTRIBUTE_SERVERBOUND_PROTOCOL).set(protocol.codec(PacketFlow.SERVERBOUND));
- this.channel.attr(Connection.ATTRIBUTE_CLIENTBOUND_PROTOCOL).set(protocol.codec(PacketFlow.CLIENTBOUND));
- }
-
-}
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyPlayerAdvancements.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyPlayerAdvancements.java
deleted file mode 100644
index 9d780da..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyPlayerAdvancements.java
+++ /dev/null
@@ -1,63 +0,0 @@
-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 DummyPlayerAdvancements extends PlayerAdvancements {
-
- public DummyPlayerAdvancements(
- 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/DummyServerGamePacketListenerImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyServerGamePacketListenerImpl.java
deleted file mode 100644
index 802e1ca..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyServerGamePacketListenerImpl.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.network;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener;
-import io.github.hello09x.fakeplayer.core.Main;
-import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
-import io.netty.buffer.Unpooled;
-import net.minecraft.network.Connection;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
-import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.server.network.CommonListenerCookie;
-import net.minecraft.server.network.ServerGamePacketListenerImpl;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
-import org.bukkit.plugin.messaging.StandardMessenger;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-
-public class DummyServerGamePacketListenerImpl extends ServerGamePacketListenerImpl implements NMSServerGamePacketListener {
-
- private final static FakeplayerManager manager = FakeplayerManager.instance;
-
- public DummyServerGamePacketListenerImpl(
- @NotNull MinecraftServer server,
- @NotNull Connection connection,
- @NotNull ServerPlayer player,
- @NotNull CommonListenerCookie cookie
- ) {
- super(server, connection, player, cookie);
- Optional.ofNullable(Bukkit.getPlayer(player.getUUID()))
- .map(CraftPlayer.class::cast)
- .ifPresent(p -> p.addChannel(StandardMessenger.validateAndCorrectChannel(BUNGEE_CORD_CHANNEL)));
- }
-
- @Override
- public void send(Packet> packet) {
- if (packet instanceof ClientboundCustomPayloadPacket p) {
- this.handleCustomPayloadPacket(p.payload());
- }
- }
-
- private void handleCustomPayloadPacket(@NotNull CustomPacketPayload payload) {
- var channel = payload.id().getNamespace() + ":" + payload.id().getPath();
- if (!channel.equals(BUNGEE_CORD_CHANNEL)) {
- return;
- }
-
- var recipient = Bukkit
- .getOnlinePlayers()
- .stream()
- .filter(manager::notContains)
- .findAny()
- .orElse(null);
- if (recipient == null) {
- return;
- }
-
- var buf = new FriendlyByteBuf(Unpooled.buffer(0, 1048576));
- payload.write(buf);
- var message = buf.array();
-
- recipient.sendPluginMessage(Main.getInstance(), channel, message);
- }
-
-}
\ 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
deleted file mode 100644
index 9eb1e40..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/ActionTickerImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.spi;
-
-
-import io.github.hello09x.fakeplayer.api.spi.Action;
-import io.github.hello09x.fakeplayer.api.spi.ActionTicker;
-import io.github.hello09x.fakeplayer.core.entity.action.BaseActionTicker;
-import io.github.hello09x.fakeplayer.v1_20_R2.action.AttackAction;
-import io.github.hello09x.fakeplayer.v1_20_R2.action.MineAction;
-import io.github.hello09x.fakeplayer.v1_20_R2.action.UseAction;
-import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-public class ActionTickerImpl extends BaseActionTicker implements ActionTicker {
-
- public ActionTickerImpl(@NotNull Player player, @NotNull Action.ActionType action, @NotNull Action.ActionSetting setting) {
- super(player, action, setting);
- if (this.action == null) {
- this.action = switch (action) {
- case ATTACK -> new AttackAction(((CraftPlayer) player).getHandle());
- case MINE -> new MineAction(((CraftPlayer) player).getHandle());
- case USE -> new UseAction(((CraftPlayer) player).getHandle());
- case JUMP, LOOK_AT_NEAREST_ENTITY, DROP_INVENTORY, DROP_STACK, DROP_ITEM ->
- throw new UnsupportedOperationException();
- };
- }
- }
-
-}
diff --git a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSBridgeImpl.java b/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSBridgeImpl.java
deleted file mode 100644
index 63eb47b..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSBridgeImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.spi;
-
-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.net.InetAddress;
-import java.util.Set;
-
-public class NMSBridgeImpl implements NMSBridge {
-
- private final static Set SUPPORTS = Set.of("1.20.2");
-
- @Override
- public @NotNull NMSEntity fromEntity(@NotNull Entity entity) {
- return new NMSEntityImpl(entity);
- }
-
- @Override
- public @NotNull NMSServer fromServer(@NotNull Server server) {
- return new NMSServerImpl(server);
- }
-
- @Override
- public @NotNull NMSServerLevel fromWorld(@NotNull World world) {
- return new NMSServerLevelImpl(world);
- }
-
- @Override
- public @NotNull NMSServerPlayer fromPlayer(@NotNull Player player) {
- return new NMSServerPlayerImpl(player);
- }
-
- @Override
- public @NotNull NMSNetwork createNetwork(@NotNull InetAddress address) {
- return new NMSNetworkImpl(address);
- }
-
- @Override
- public boolean isSupported() {
- return SUPPORTS.contains(Bukkit.getMinecraftVersion());
- }
-
- @Override
- public @NotNull ActionTicker createAction(@NotNull Player player, @NotNull Action.ActionType action, @NotNull Action.ActionSetting setting) {
- return new ActionTickerImpl(player, action, setting);
- }
-
-}
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
deleted file mode 100644
index 52b9f4e..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSEntityImpl.java
+++ /dev/null
@@ -1,19 +0,0 @@
-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 final 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
deleted file mode 100644
index 3d6fca4..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSNetworkImpl.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSNetwork;
-import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener;
-import io.github.hello09x.fakeplayer.v1_20_R2.network.DummyConnection;
-import io.github.hello09x.fakeplayer.v1_20_R2.network.DummyServerGamePacketListenerImpl;
-import net.minecraft.network.ConnectionProtocol;
-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 {
-
- @NotNull
- private final DummyConnection connection;
-
- private NMSServerGamePacketListener serverGamePacketListener;
-
- public NMSNetworkImpl(
- @NotNull InetAddress address
- ) {
- this.connection = new DummyConnection(address);
- }
-
- @NotNull
- @Override
- public NMSServerGamePacketListener placeNewPlayer(
- @NotNull Server server,
- @NotNull Player player
- ) {
- this.connection.setProtocolAttr(ConnectionProtocol.PLAY);
- var handle = ((CraftPlayer) player).getHandle();
- var cookie = CommonListenerCookie.createInitial(((CraftPlayer) player).getProfile());
- var listener = new DummyServerGamePacketListenerImpl(
- ((CraftServer) server).getServer(),
- this.connection,
- handle,
- cookie
- );
- handle.connection = listener;
- ((CraftServer) server).getHandle().placeNewPlayer(
- this.connection,
- handle,
- cookie
- );
- this.serverGamePacketListener = listener;
- return listener;
- }
-
- @NotNull
- @Override
- public NMSServerGamePacketListener getServerGamePacketListener() throws IllegalStateException {
- if (this.serverGamePacketListener == null) {
- throw new IllegalStateException("not initialized");
- }
- return this.serverGamePacketListener;
- }
-
-}
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
deleted file mode 100644
index 424f689..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.spi;
-
-import com.mojang.authlib.GameProfile;
-import io.github.hello09x.bedrock.util.Worlds;
-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(),
- new NMSServerLevelImpl(Worlds.getMainWorld()).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
deleted file mode 100644
index 1c4e303..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerLevelImpl.java
+++ /dev/null
@@ -1,22 +0,0 @@
-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 {
-
- @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
deleted file mode 100644
index d78e708..0000000
--- a/fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerPlayerImpl.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R2.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
-import io.github.hello09x.fakeplayer.core.constant.ConstantPool;
-import io.github.hello09x.fakeplayer.core.util.Reflections;
-import io.github.hello09x.fakeplayer.v1_20_R2.network.DummyPlayerAdvancements;
-import lombok.Getter;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.network.protocol.game.ServerboundClientCommandPacket;
-import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
-import net.minecraft.server.PlayerAdvancements;
-import net.minecraft.server.level.ClientInformation;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.world.entity.HumanoidArm;
-import net.minecraft.world.entity.player.ChatVisiblity;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R2.CraftServer;
-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;
-
-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 force) {
- return handle.startRiding(new NMSEntityImpl(entity).getHandle(), force);
- }
-
- @Override
- public void stopRiding() {
- handle.stopRiding();
- }
-
-
- @Override
- public int getTickCount() {
- return handle.tickCount;
- }
-
- @Override
- public void drop(boolean allStack) {
- handle.drop(allStack);
- }
-
- @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 disableAdvancements(@NotNull Plugin plugin) {
- if (ServerPlayer$advancements == null) {
- return;
- }
-
- var server = ((CraftServer) Bukkit.getServer()).getServer();
- try {
- ServerPlayer$advancements.set(
- handle,
- new DummyPlayerAdvancements(
- server.getFixerUpper(),
- server.getPlayerList(),
- server.getAdvancements(),
- plugin.getDataFolder().getParentFile().toPath(),
- handle
- )
- );
- } catch (IllegalAccessException ignored) {
- }
- }
-
- @Override
- public void drop(int slot, boolean flag, boolean flag1) {
- var inventory = handle.getInventory();
- handle.drop(inventory.removeItem(slot, inventory.getItem(slot).getCount()), flag, flag1);
- }
-
- @Override
- public void setPlayBefore() {
- player.readExtraData(new CompoundTag());
- }
-
- @Override
- public void setupClientOptions() {
- var option = new ClientInformation(
- "en_us",
- Bukkit.getViewDistance(),
- ChatVisiblity.SYSTEM,
- false,
- ConstantPool.MODEL_CUSTOMISATION,
- HumanoidArm.RIGHT,
- false,
- true
- );
-
- handle.updateOptions(option);
- }
-
- @Override
- public void respawn() {
- if (!this.player.isDead()) {
- return;
- }
-
- var packet = new ServerboundClientCommandPacket(ServerboundClientCommandPacket.Action.PERFORM_RESPAWN);
- handle.connection.handleClientCommand(packet);
- }
-
- @Override
- public void swapItemWithOffhand() {
- handle.connection.handlePlayerAction(new ServerboundPlayerActionPacket(
- ServerboundPlayerActionPacket.Action.SWAP_ITEM_WITH_OFFHAND,
- new BlockPos(0, 0, 0),
- Direction.DOWN
- ));
- }
-
-}
diff --git a/fakeplayer-v1_20_R4/pom.xml b/fakeplayer-v1_20_R4/pom.xml
deleted file mode 100644
index 9d9a26e..0000000
--- a/fakeplayer-v1_20_R4/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
- 4.0.0
-
- io.github.hello09x.fakeplayer
- fakeplayer-parent
- 1.0.0
-
-
- fakeplayer-v1_20_R4
-
-
- 17
- 17
- UTF-8
-
-
-
-
- io.papermc.paper
- paper-api
- provided
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-core
- provided
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-api
- provided
-
-
-
- org.spigotmc
- spigot
- 1.20.4-R0.1-SNAPSHOT
- remapped-mojang
- provided
-
-
-
- org.projectlombok
- lombok
- provided
-
-
-
-
-
-
-
- net.md-5
- specialsource-maven-plugin
- 1.2.4
-
-
- package
-
- remap
-
- remap-obf
-
- org.spigotmc:minecraft-server:1.20.4-R0.1-SNAPSHOT:txt:maps-mojang
- true
-
- org.spigotmc:spigot:1.20.4-R0.1-SNAPSHOT:jar:remapped-mojang
-
- true
- remapped-obf
-
-
-
- package
-
- remap
-
- remap-spigot
-
-
- ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
-
- org.spigotmc:minecraft-server:1.20.4-R0.1-SNAPSHOT:csrg:maps-spigot
- org.spigotmc:spigot:1.20.4-R0.1-SNAPSHOT:jar:remapped-obf
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/AttackAction.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/AttackAction.java
deleted file mode 100644
index 3b3d212..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/AttackAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.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_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/MineAction.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/MineAction.java
deleted file mode 100644
index 4cc66df..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/MineAction.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.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;
- broken = true;
- } 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_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/TraceAction.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/TraceAction.java
deleted file mode 100644
index 02afe92..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/TraceAction.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.action;
-
-import io.github.hello09x.fakeplayer.api.spi.Action;
-import io.github.hello09x.fakeplayer.v1_20_R4.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_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/UseAction.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/UseAction.java
deleted file mode 100644
index df5a3a6..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/UseAction.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.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() {
- }
-
- @Override
- public void stop() {
- current.freeze = 0;
- player.releaseUsingItem();
- }
-
- private final static class Current {
-
- /**
- * 冷却, 单位: tick
- */
- public int freeze;
- }
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/util/Tracer.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/util/Tracer.java
deleted file mode 100644
index 782a52e..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/util/Tracer.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.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_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyChannel.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyChannel.java
deleted file mode 100644
index 8bee8a2..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyChannel.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.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 DummyChannel extends AbstractChannel {
- private final static EventLoop EVENT_LOOP = new DefaultEventLoop();
- private final ChannelConfig config = new DefaultChannelConfig(this);
-
- private final InetAddress address;
-
- public DummyChannel(@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 in) throws Exception {
- for (;;) {
- Object msg = in.current();
- if (msg == null) {
- break;
- }
- in.remove();
- }
- }
-
- @Override
- public boolean isActive() {
- return true;
- }
-
- @Override
- protected boolean isCompatible(EventLoop arg0) {
- return true;
- }
-
- @Override
- public boolean isOpen() {
- return true;
- }
-
- @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_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyConnection.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyConnection.java
deleted file mode 100644
index e8ab138..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyConnection.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.network;
-
-import net.minecraft.network.Connection;
-import net.minecraft.network.ConnectionProtocol;
-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 DummyConnection extends Connection {
- public DummyConnection(@NotNull InetAddress address) {
- super(PacketFlow.SERVERBOUND);
- this.channel = new DummyChannel(null, address);
- this.address = this.channel.remoteAddress();
- Connection.configureSerialization(this.channel.pipeline(), PacketFlow.SERVERBOUND, null);
- }
-
- @Override
- public boolean isConnected() {
- return true;
- }
-
- @Override
- public void send(Packet> packet, PacketSendListener listener) {
- }
-
- @Override
- public void send(Packet> packet) {
- }
-
- public void setProtocolAttr(@NotNull ConnectionProtocol protocol) {
- this.channel.attr(Connection.ATTRIBUTE_SERVERBOUND_PROTOCOL).set(protocol.codec(PacketFlow.SERVERBOUND));
- this.channel.attr(Connection.ATTRIBUTE_CLIENTBOUND_PROTOCOL).set(protocol.codec(PacketFlow.CLIENTBOUND));
- }
-
-}
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyPlayerAdvancements.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyPlayerAdvancements.java
deleted file mode 100644
index 02b9b81..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyPlayerAdvancements.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.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 DummyPlayerAdvancements extends PlayerAdvancements {
-
- public DummyPlayerAdvancements(
- 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_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyServerGamePacketListenerImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyServerGamePacketListenerImpl.java
deleted file mode 100644
index a9445ba..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyServerGamePacketListenerImpl.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.network;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener;
-import io.github.hello09x.fakeplayer.core.Main;
-import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
-import io.netty.buffer.Unpooled;
-import net.minecraft.network.Connection;
-import net.minecraft.network.FriendlyByteBuf;
-import net.minecraft.network.protocol.Packet;
-import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
-import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.server.network.CommonListenerCookie;
-import net.minecraft.server.network.ServerGamePacketListenerImpl;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
-import org.bukkit.plugin.messaging.StandardMessenger;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-
-public class DummyServerGamePacketListenerImpl extends ServerGamePacketListenerImpl implements NMSServerGamePacketListener {
-
- private final static FakeplayerManager manager = FakeplayerManager.instance;
-
- public DummyServerGamePacketListenerImpl(
- @NotNull MinecraftServer server,
- @NotNull Connection connection,
- @NotNull ServerPlayer player,
- @NotNull CommonListenerCookie cookie
- ) {
- super(server, connection, player, cookie);
- Optional.ofNullable(Bukkit.getPlayer(player.getUUID()))
- .map(CraftPlayer.class::cast)
- .ifPresent(p -> p.addChannel(StandardMessenger.validateAndCorrectChannel(BUNGEE_CORD_CHANNEL)));
- }
-
- @Override
- public void send(Packet> packet) {
- if (packet instanceof ClientboundCustomPayloadPacket p) {
- this.handleCustomPayloadPacket(p.payload());
- }
- }
-
- private void handleCustomPayloadPacket(@NotNull CustomPacketPayload payload) {
- var channel = payload.id().getNamespace() + ":" + payload.id().getPath();
- if (!channel.equals(BUNGEE_CORD_CHANNEL)) {
- return;
- }
-
- var recipient = Bukkit
- .getOnlinePlayers()
- .stream()
- .filter(manager::notContains)
- .findAny()
- .orElse(null);
- if (recipient == null) {
- return;
- }
-
- var buf = new FriendlyByteBuf(Unpooled.buffer(0, 1048576));
- payload.write(buf);
- var message = buf.array();
-
- recipient.sendPluginMessage(Main.getInstance(), channel, message);
- }
-
-}
\ No newline at end of file
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/ActionTickerImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/ActionTickerImpl.java
deleted file mode 100644
index 17abf06..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/ActionTickerImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-
-import io.github.hello09x.fakeplayer.api.spi.Action;
-import io.github.hello09x.fakeplayer.api.spi.ActionTicker;
-import io.github.hello09x.fakeplayer.core.entity.action.BaseActionTicker;
-import io.github.hello09x.fakeplayer.v1_20_R4.action.AttackAction;
-import io.github.hello09x.fakeplayer.v1_20_R4.action.MineAction;
-import io.github.hello09x.fakeplayer.v1_20_R4.action.UseAction;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-public class ActionTickerImpl extends BaseActionTicker implements ActionTicker {
-
- public ActionTickerImpl(@NotNull Player player, @NotNull Action.ActionType action, @NotNull Action.ActionSetting setting) {
- super(player, action, setting);
- if (this.action == null) {
- this.action = switch (action) {
- case ATTACK -> new AttackAction(((CraftPlayer) player).getHandle());
- case MINE -> new MineAction(((CraftPlayer) player).getHandle());
- case USE -> new UseAction(((CraftPlayer) player).getHandle());
- case JUMP, LOOK_AT_NEAREST_ENTITY, DROP_INVENTORY, DROP_STACK, DROP_ITEM ->
- throw new UnsupportedOperationException();
- };
- }
- }
-
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSBridgeImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSBridgeImpl.java
deleted file mode 100644
index c84f4d4..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSBridgeImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-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.net.InetAddress;
-import java.util.Set;
-
-public class NMSBridgeImpl implements NMSBridge {
-
- private final static Set SUPPORTS = Set.of("1.20.3", "1.20.4");
-
- @Override
- public @NotNull NMSEntity fromEntity(@NotNull Entity entity) {
- return new NMSEntityImpl(entity);
- }
-
- @Override
- public @NotNull NMSServer fromServer(@NotNull Server server) {
- return new NMSServerImpl(server);
- }
-
- @Override
- public @NotNull NMSServerLevel fromWorld(@NotNull World world) {
- return new NMSServerLevelImpl(world);
- }
-
- @Override
- public @NotNull NMSServerPlayer fromPlayer(@NotNull Player player) {
- return new NMSServerPlayerImpl(player);
- }
-
- @Override
- public @NotNull NMSNetwork createNetwork(@NotNull InetAddress address) {
- return new NMSNetworkImpl(address);
- }
-
- @Override
- public boolean isSupported() {
- return SUPPORTS.contains(Bukkit.getMinecraftVersion());
- }
-
- @Override
- public @NotNull ActionTicker createAction(@NotNull Player player, @NotNull Action.ActionType action, @NotNull Action.ActionSetting setting) {
- return new ActionTickerImpl(player, action, setting);
- }
-
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSEntityImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSEntityImpl.java
deleted file mode 100644
index 49687fb..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSEntityImpl.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSEntity;
-import lombok.Getter;
-import net.minecraft.world.entity.Entity;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity;
-import org.jetbrains.annotations.NotNull;
-
-public class NMSEntityImpl implements NMSEntity {
-
- @Getter
- private final Entity handle;
-
- public NMSEntityImpl(@NotNull org.bukkit.entity.@NotNull Entity entity) {
- this.handle = ((CraftEntity) entity).getHandle();
- }
-
-
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSNetworkImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSNetworkImpl.java
deleted file mode 100644
index 43ced5f..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSNetworkImpl.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSNetwork;
-import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener;
-import io.github.hello09x.fakeplayer.v1_20_R4.network.DummyConnection;
-import io.github.hello09x.fakeplayer.v1_20_R4.network.DummyServerGamePacketListenerImpl;
-import net.minecraft.network.ConnectionProtocol;
-import net.minecraft.server.network.CommonListenerCookie;
-import org.bukkit.Server;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-
-import java.net.InetAddress;
-
-public class NMSNetworkImpl implements NMSNetwork {
-
- @NotNull
- private final DummyConnection connection;
-
- private NMSServerGamePacketListener serverGamePacketListener;
-
- public NMSNetworkImpl(
- @NotNull InetAddress address
- ) {
- this.connection = new DummyConnection(address);
- }
-
- @NotNull
- @Override
- public NMSServerGamePacketListener placeNewPlayer(
- @NotNull Server server,
- @NotNull Player player
- ) {
- this.connection.setProtocolAttr(ConnectionProtocol.PLAY);
- var handle = ((CraftPlayer) player).getHandle();
- var cookie = CommonListenerCookie.createInitial(((CraftPlayer) player).getProfile());
- var listener = new DummyServerGamePacketListenerImpl(
- ((CraftServer) server).getServer(),
- this.connection,
- handle,
- cookie
- );
- handle.connection = listener;
- ((CraftServer) server).getHandle().placeNewPlayer(
- this.connection,
- handle,
- cookie
- );
- this.serverGamePacketListener = listener;
- return listener;
- }
-
- @NotNull
- @Override
- public NMSServerGamePacketListener getServerGamePacketListener() throws IllegalStateException {
- if (this.serverGamePacketListener == null) {
- throw new IllegalStateException("not initialized");
- }
- return this.serverGamePacketListener;
- }
-
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerImpl.java
deleted file mode 100644
index 99c8d84..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-import com.mojang.authlib.GameProfile;
-import io.github.hello09x.bedrock.util.Worlds;
-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_R3.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(),
- new NMSServerLevelImpl(Worlds.getMainWorld()).getHandle(),
- new GameProfile(uuid, name),
- ClientInformation.createDefault()
- );
- return new NMSServerPlayerImpl(handle.getBukkitEntity());
- }
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerLevelImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerLevelImpl.java
deleted file mode 100644
index 93bb71d..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerLevelImpl.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerLevel;
-import lombok.Getter;
-import net.minecraft.server.level.ServerLevel;
-import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_20_R3.CraftWorld;
-import org.jetbrains.annotations.NotNull;
-
-public class NMSServerLevelImpl implements NMSServerLevel {
-
- @Getter
- private final ServerLevel handle;
-
- public NMSServerLevelImpl(@NotNull World world) {
- this.handle = ((CraftWorld) world).getHandle();
- }
-
-}
diff --git a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerPlayerImpl.java b/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerPlayerImpl.java
deleted file mode 100644
index 02c58ba..0000000
--- a/fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerPlayerImpl.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package io.github.hello09x.fakeplayer.v1_20_R4.spi;
-
-import io.github.hello09x.fakeplayer.api.spi.NMSServerPlayer;
-import io.github.hello09x.fakeplayer.core.constant.ConstantPool;
-import io.github.hello09x.fakeplayer.core.util.Reflections;
-import io.github.hello09x.fakeplayer.v1_20_R4.network.DummyPlayerAdvancements;
-import lombok.Getter;
-import net.minecraft.core.BlockPos;
-import net.minecraft.core.Direction;
-import net.minecraft.nbt.CompoundTag;
-import net.minecraft.network.protocol.game.ServerboundClientCommandPacket;
-import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
-import net.minecraft.server.PlayerAdvancements;
-import net.minecraft.server.level.ClientInformation;
-import net.minecraft.server.level.ServerPlayer;
-import net.minecraft.world.entity.HumanoidArm;
-import net.minecraft.world.entity.player.ChatVisiblity;
-import org.bukkit.Bukkit;
-import org.bukkit.craftbukkit.v1_20_R3.CraftServer;
-import org.bukkit.craftbukkit.v1_20_R3.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;
-
-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 force) {
- return handle.startRiding(new NMSEntityImpl(entity).getHandle(), force);
- }
-
- @Override
- public void stopRiding() {
- handle.stopRiding();
- }
-
-
- @Override
- public int getTickCount() {
- return handle.tickCount;
- }
-
- @Override
- public void drop(boolean allStack) {
- handle.drop(allStack);
- }
-
- @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 disableAdvancements(@NotNull Plugin plugin) {
- if (ServerPlayer$advancements == null) {
- return;
- }
-
- var server = ((CraftServer) Bukkit.getServer()).getServer();
- try {
- ServerPlayer$advancements.set(
- handle,
- new DummyPlayerAdvancements(
- server.getFixerUpper(),
- server.getPlayerList(),
- server.getAdvancements(),
- plugin.getDataFolder().getParentFile().toPath(),
- handle
- )
- );
- } catch (IllegalAccessException ignored) {
- }
- }
-
- @Override
- public void drop(int slot, boolean flag, boolean flag1) {
- var inventory = handle.getInventory();
- handle.drop(inventory.removeItem(slot, inventory.getItem(slot).getCount()), flag, flag1);
- }
-
- @Override
- public void setPlayBefore() {
- player.readExtraData(new CompoundTag());
- }
-
- @Override
- public void setupClientOptions() {
- var option = new ClientInformation(
- "en_us",
- Bukkit.getViewDistance(),
- ChatVisiblity.SYSTEM,
- false,
- ConstantPool.MODEL_CUSTOMISATION,
- HumanoidArm.RIGHT,
- false,
- true
- );
-
- handle.updateOptions(option);
- }
-
- @Override
- public void respawn() {
- if (!this.player.isDead()) {
- return;
- }
-
- var packet = new ServerboundClientCommandPacket(ServerboundClientCommandPacket.Action.PERFORM_RESPAWN);
- handle.connection.handleClientCommand(packet);
- }
-
- @Override
- public void swapItemWithOffhand() {
- handle.connection.handlePlayerAction(new ServerboundPlayerActionPacket(
- ServerboundPlayerActionPacket.Action.SWAP_ITEM_WITH_OFFHAND,
- new BlockPos(0, 0, 0),
- Direction.DOWN
- ));
- }
-
-}
diff --git a/fakeplayer-v1_21_R1/pom.xml b/fakeplayer-v1_21_R1/pom.xml
index 014d6d0..dd08aaf 100644
--- a/fakeplayer-v1_21_R1/pom.xml
+++ b/fakeplayer-v1_21_R1/pom.xml
@@ -12,8 +12,8 @@
fakeplayer-v1_21_R1
- 17
- 17
+ 21
+ 21
UTF-8
@@ -57,7 +57,7 @@
net.md-5
specialsource-maven-plugin
- 1.2.4
+ 2.0.3
package
diff --git a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyConnection.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyConnection.java
index 0211b38..e8bf222 100644
--- a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyConnection.java
+++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyConnection.java
@@ -1,7 +1,6 @@
package io.github.hello09x.fakeplayer.v1_21_R1.network;
import net.minecraft.network.Connection;
-import net.minecraft.network.ConnectionProtocol;
import net.minecraft.network.PacketSendListener;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.PacketFlow;
@@ -14,7 +13,7 @@ public class DummyConnection extends Connection {
super(PacketFlow.SERVERBOUND);
this.channel = new DummyChannel(null, address);
this.address = this.channel.remoteAddress();
- Connection.configureSerialization(this.channel.pipeline(), PacketFlow.SERVERBOUND, null);
+ Connection.configureSerialization(this.channel.pipeline(), PacketFlow.SERVERBOUND, false, null);
}
@Override
@@ -30,9 +29,9 @@ public class DummyConnection extends Connection {
public void send(Packet> packet) {
}
- public void setProtocolAttr(@NotNull ConnectionProtocol protocol) {
- this.channel.attr(Connection.ATTRIBUTE_SERVERBOUND_PROTOCOL).set(protocol.codec(PacketFlow.SERVERBOUND));
- this.channel.attr(Connection.ATTRIBUTE_CLIENTBOUND_PROTOCOL).set(protocol.codec(PacketFlow.CLIENTBOUND));
- }
+// public void setProtocolAttr(@NotNull ConnectionProtocol protocol) {
+// this.channel.attr(Connection.ATTRIBUTE_SERVERBOUND_PROTOCOL).set(protocol.codec(PacketFlow.SERVERBOUND));
+// this.channel.attr(Connection.ATTRIBUTE_CLIENTBOUND_PROTOCOL).set(protocol.codec(PacketFlow.CLIENTBOUND));
+// }
}
\ No newline at end of file
diff --git a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyServerGamePacketListenerImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyServerGamePacketListenerImpl.java
index f7039d6..19dae16 100644
--- a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyServerGamePacketListenerImpl.java
+++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyServerGamePacketListenerImpl.java
@@ -6,8 +6,11 @@ import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager;
import io.netty.buffer.Unpooled;
import net.minecraft.network.Connection;
import net.minecraft.network.FriendlyByteBuf;
+import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
+import net.minecraft.network.protocol.common.ClientboundCustomReportDetailsPacket;
+import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket;
import net.minecraft.network.protocol.common.custom.CustomPacketPayload;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
@@ -39,12 +42,14 @@ public class DummyServerGamePacketListenerImpl extends ServerGamePacketListenerI
@Override
public void send(Packet> packet) {
if (packet instanceof ClientboundCustomPayloadPacket p) {
- this.handleCustomPayloadPacket(p.payload());
+ this.handleCustomPayloadPacket(p);
}
}
- private void handleCustomPayloadPacket(@NotNull CustomPacketPayload payload) {
- var channel = payload.id().getNamespace() + ":" + payload.id().getPath();
+ private void handleCustomPayloadPacket(@NotNull ClientboundCustomPayloadPacket packet) {
+ var payload = packet.payload();
+ var resourceLocation = payload.type().id();
+ var channel = resourceLocation.getNamespace() + ":" + resourceLocation.getPath();
if (!channel.equals(BUNGEE_CORD_CHANNEL)) {
return;
}
@@ -59,10 +64,10 @@ public class DummyServerGamePacketListenerImpl extends ServerGamePacketListenerI
return;
}
- var buf = new FriendlyByteBuf(Unpooled.buffer(0, 1048576));
- payload.write(buf);
- var message = buf.array();
+ var buf = RegistryFriendlyByteBuf.decorator(server.registryAccess()).apply(Unpooled.buffer(0, 1048576));
+ ClientboundCustomPayloadPacket.GAMEPLAY_STREAM_CODEC.encode(buf, packet);
+ var message = buf.array();
recipient.sendPluginMessage(Main.getInstance(), channel, message);
}
diff --git a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSBridgeImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSBridgeImpl.java
index 53e1436..d6e567c 100644
--- a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSBridgeImpl.java
+++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSBridgeImpl.java
@@ -13,7 +13,7 @@ import java.util.Set;
public class NMSBridgeImpl implements NMSBridge {
- private final static Set SUPPORTS = Set.of("1.20.3", "1.20.4");
+ private final static Set SUPPORTS = Set.of("1.21", "1.21.0");
@Override
public @NotNull NMSEntity fromEntity(@NotNull Entity entity) {
diff --git a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSNetworkImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSNetworkImpl.java
index 4983fdf..8b8aea0 100644
--- a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSNetworkImpl.java
+++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSNetworkImpl.java
@@ -33,9 +33,12 @@ public class NMSNetworkImpl implements NMSNetwork {
@NotNull Server server,
@NotNull Player player
) {
- this.connection.setProtocolAttr(ConnectionProtocol.PLAY);
+// this.connection.setProtocolAttr(ConnectionProtocol.PLAY);
var handle = ((CraftPlayer) player).getHandle();
- var cookie = CommonListenerCookie.createInitial(((CraftPlayer) player).getProfile());
+
+ // false 应该是 1.21 新增的玩家跨服标识符
+ var cookie = CommonListenerCookie.createInitial(((CraftPlayer) player).getProfile(), false);
+
var listener = new DummyServerGamePacketListenerImpl(
((CraftServer) server).getServer(),
this.connection,
diff --git a/pom.xml b/pom.xml
index 86c13bc..6bd098f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,16 +14,13 @@
fakeplayer-api
fakeplayer-core
fakeplayer-dist
- fakeplayer-v1_20_R1
- fakeplayer-v1_20_R2
- fakeplayer-v1_20_R4
fakeplayer-v1_21_R1
- 17
+ 21
UTF-8
- 0.2.9
+ 0.3.1
@@ -54,14 +51,14 @@
io.papermc.paper
paper-api
- 1.20.1-R0.1-SNAPSHOT
+ 1.21-R0.1-SNAPSHOT
provided
org.projectlombok
lombok
- 1.18.28
+ 1.18.34
provided
@@ -97,24 +94,6 @@
${project.version}
-
- io.github.hello09x.fakeplayer
- fakeplayer-v1_20_R1
- ${project.version}
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-v1_20_R2
- ${project.version}
-
-
-
- io.github.hello09x.fakeplayer
- fakeplayer-v1_20_R4
- ${project.version}
-
-
io.github.hello09x.fakeplayer
fakeplayer-v1_21_R1