From 877404b3e0d743ffbd358a9cfae38deaa3e949c3 Mon Sep 17 00:00:00 2001 From: tanyaofei Date: Sat, 15 Jun 2024 21:19:18 +0800 Subject: [PATCH 1/3] =?UTF-8?q?1.21=20=E5=88=9D=E6=AD=A5=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fakeplayer-dist/pom.xml | 5 + ...thub.hello09x.fakeplayer.api.spi.NMSBridge | 1 + fakeplayer-v1_21_R1/pom.xml | 98 ++++++++ .../v1_21_R1/action/AttackAction.java | 49 ++++ .../v1_21_R1/action/MineAction.java | 160 ++++++++++++ .../v1_21_R1/action/TraceAction.java | 24 ++ .../fakeplayer/v1_21_R1/action/UseAction.java | 97 ++++++++ .../v1_21_R1/action/util/Tracer.java | 105 ++++++++ .../v1_21_R1/network/DummyChannel.java | 99 ++++++++ .../v1_21_R1/network/DummyConnection.java | 38 +++ .../network/DummyPlayerAdvancements.java | 63 +++++ .../DummyServerGamePacketListenerImpl.java | 69 ++++++ .../v1_21_R1/spi/ActionTickerImpl.java | 29 +++ .../v1_21_R1/spi/NMSBridgeImpl.java | 53 ++++ .../v1_21_R1/spi/NMSEntityImpl.java | 19 ++ .../v1_21_R1/spi/NMSNetworkImpl.java | 64 +++++ .../v1_21_R1/spi/NMSServerImpl.java | 38 +++ .../v1_21_R1/spi/NMSServerLevelImpl.java | 19 ++ .../v1_21_R1/spi/NMSServerPlayerImpl.java | 232 ++++++++++++++++++ pom.xml | 7 + 20 files changed, 1269 insertions(+) create mode 100644 fakeplayer-v1_21_R1/pom.xml create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/AttackAction.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/MineAction.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/TraceAction.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/UseAction.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/util/Tracer.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyChannel.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyConnection.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyPlayerAdvancements.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyServerGamePacketListenerImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/ActionTickerImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSBridgeImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSEntityImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSNetworkImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerLevelImpl.java create mode 100644 fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerPlayerImpl.java diff --git a/fakeplayer-dist/pom.xml b/fakeplayer-dist/pom.xml index 19bcd89..f1e078d 100644 --- a/fakeplayer-dist/pom.xml +++ b/fakeplayer-dist/pom.xml @@ -44,6 +44,11 @@ fakeplayer-v1_20_R4 + + io.github.hello09x.fakeplayer + fakeplayer-v1_21_R1 + + diff --git a/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.NMSBridge b/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.NMSBridge index b295c80..bb891ec 100644 --- a/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.NMSBridge +++ b/fakeplayer-dist/src/main/resources/META-INF/services/io.github.hello09x.fakeplayer.api.spi.NMSBridge @@ -1,3 +1,4 @@ io.github.hello09x.fakeplayer.v1_20_R1.spi.NMSBridgeImpl io.github.hello09x.fakeplayer.v1_20_R2.spi.NMSBridgeImpl io.github.hello09x.fakeplayer.v1_20_R4.spi.NMSBridgeImpl +io.github.hello09x.fakeplayer.v1_21_R1.spi.NMSBridgeImpl diff --git a/fakeplayer-v1_21_R1/pom.xml b/fakeplayer-v1_21_R1/pom.xml new file mode 100644 index 0000000..014d6d0 --- /dev/null +++ b/fakeplayer-v1_21_R1/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + io.github.hello09x.fakeplayer + fakeplayer-parent + 1.0.0 + + + fakeplayer-v1_21_R1 + + + 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.21-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.21-R0.1-SNAPSHOT:txt:maps-mojang + true + + org.spigotmc:spigot:1.21-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.21-R0.1-SNAPSHOT:csrg:maps-spigot + org.spigotmc:spigot:1.21-R0.1-SNAPSHOT:jar:remapped-obf + + + + + + + + + \ No newline at end of file diff --git a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/AttackAction.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/AttackAction.java new file mode 100644 index 0000000..c8c3f5c --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/AttackAction.java @@ -0,0 +1,49 @@ +package io.github.hello09x.fakeplayer.v1_21_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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/MineAction.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/MineAction.java new file mode 100644 index 0000000..f5a2398 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/MineAction.java @@ -0,0 +1,160 @@ +package io.github.hello09x.fakeplayer.v1_21_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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/TraceAction.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/TraceAction.java new file mode 100644 index 0000000..b04d347 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/TraceAction.java @@ -0,0 +1,24 @@ +package io.github.hello09x.fakeplayer.v1_21_R1.action; + +import io.github.hello09x.fakeplayer.api.spi.Action; +import io.github.hello09x.fakeplayer.v1_21_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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/UseAction.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/UseAction.java new file mode 100644 index 0000000..b50745f --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/UseAction.java @@ -0,0 +1,97 @@ +package io.github.hello09x.fakeplayer.v1_21_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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/util/Tracer.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/util/Tracer.java new file mode 100644 index 0000000..f6bc336 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/action/util/Tracer.java @@ -0,0 +1,105 @@ +package io.github.hello09x.fakeplayer.v1_21_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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyChannel.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyChannel.java new file mode 100644 index 0000000..7a55714 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyChannel.java @@ -0,0 +1,99 @@ +package io.github.hello09x.fakeplayer.v1_21_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_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 new file mode 100644 index 0000000..0211b38 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyConnection.java @@ -0,0 +1,38 @@ +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; +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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyPlayerAdvancements.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyPlayerAdvancements.java new file mode 100644 index 0000000..d76f3dd --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyPlayerAdvancements.java @@ -0,0 +1,63 @@ +package io.github.hello09x.fakeplayer.v1_21_R1.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_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 new file mode 100644 index 0000000..f7039d6 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/network/DummyServerGamePacketListenerImpl.java @@ -0,0 +1,69 @@ +package io.github.hello09x.fakeplayer.v1_21_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 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_21_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, + @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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/ActionTickerImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/ActionTickerImpl.java new file mode 100644 index 0000000..58003a4 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/ActionTickerImpl.java @@ -0,0 +1,29 @@ +package io.github.hello09x.fakeplayer.v1_21_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_21_R1.action.AttackAction; +import io.github.hello09x.fakeplayer.v1_21_R1.action.MineAction; +import io.github.hello09x.fakeplayer.v1_21_R1.action.UseAction; +import org.bukkit.craftbukkit.v1_21_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_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 new file mode 100644 index 0000000..53e1436 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSBridgeImpl.java @@ -0,0 +1,53 @@ +package io.github.hello09x.fakeplayer.v1_21_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.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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSEntityImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSEntityImpl.java new file mode 100644 index 0000000..392f32d --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSEntityImpl.java @@ -0,0 +1,19 @@ +package io.github.hello09x.fakeplayer.v1_21_R1.spi; + +import io.github.hello09x.fakeplayer.api.spi.NMSEntity; +import lombok.Getter; +import net.minecraft.world.entity.Entity; +import org.bukkit.craftbukkit.v1_21_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_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 new file mode 100644 index 0000000..4983fdf --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSNetworkImpl.java @@ -0,0 +1,64 @@ +package io.github.hello09x.fakeplayer.v1_21_R1.spi; + +import io.github.hello09x.fakeplayer.api.spi.NMSNetwork; +import io.github.hello09x.fakeplayer.api.spi.NMSServerGamePacketListener; +import io.github.hello09x.fakeplayer.v1_21_R1.network.DummyConnection; +import io.github.hello09x.fakeplayer.v1_21_R1.network.DummyServerGamePacketListenerImpl; +import net.minecraft.network.ConnectionProtocol; +import net.minecraft.server.network.CommonListenerCookie; +import org.bukkit.Server; +import org.bukkit.craftbukkit.v1_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_R1.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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerImpl.java new file mode 100644 index 0000000..5436326 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerImpl.java @@ -0,0 +1,38 @@ +package io.github.hello09x.fakeplayer.v1_21_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.ClientInformation; +import net.minecraft.server.level.ServerPlayer; +import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.craftbukkit.v1_21_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), + ClientInformation.createDefault() + ); + return new NMSServerPlayerImpl(handle.getBukkitEntity()); + } +} diff --git a/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerLevelImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerLevelImpl.java new file mode 100644 index 0000000..062d52b --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerLevelImpl.java @@ -0,0 +1,19 @@ +package io.github.hello09x.fakeplayer.v1_21_R1.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_21_R1.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_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerPlayerImpl.java b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerPlayerImpl.java new file mode 100644 index 0000000..9282251 --- /dev/null +++ b/fakeplayer-v1_21_R1/src/main/java/io/github/hello09x/fakeplayer/v1_21_R1/spi/NMSServerPlayerImpl.java @@ -0,0 +1,232 @@ +package io.github.hello09x.fakeplayer.v1_21_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_21_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.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_21_R1.CraftServer; +import org.bukkit.craftbukkit.v1_21_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 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/pom.xml b/pom.xml index bc4aa74..86c13bc 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ fakeplayer-v1_20_R1 fakeplayer-v1_20_R2 fakeplayer-v1_20_R4 + fakeplayer-v1_21_R1 @@ -114,6 +115,12 @@ ${project.version} + + io.github.hello09x.fakeplayer + fakeplayer-v1_21_R1 + ${project.version} + + com.github.jikoo.OpenInv openinvapi From 90b04f1042f5b490b3323407f9158a94eb7295ac Mon Sep 17 00:00:00 2001 From: tanyaofei Date: Sat, 15 Jun 2024 21:25:29 +0800 Subject: [PATCH 2/3] gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1b3ce09..fd19785 100644 --- a/.gitignore +++ b/.gitignore @@ -128,4 +128,4 @@ fabric.properties /purpur/ /server -./buildtool \ No newline at end of file +buildtool/ \ No newline at end of file From 062ce5d4782e7ebe8650639d6e2b190c6dbe3aec Mon Sep 17 00:00:00 2001 From: tanyaofei Date: Sat, 29 Jun 2024 17:29:27 +0800 Subject: [PATCH 3/3] 1.21 --- README.md | 8 +- fakeplayer-api/pom.xml | 4 +- fakeplayer-core/pom.xml | 4 +- .../fakeplayer/core/entity/FakePlayer.java | 4 +- fakeplayer-dist/pom.xml | 19 +- fakeplayer-v1_20_R1/pom.xml | 97 -------- .../v1_20_R1/action/AttackAction.java | 49 ---- .../v1_20_R1/action/MineAction.java | 160 ------------ .../v1_20_R1/action/TraceAction.java | 24 -- .../fakeplayer/v1_20_R1/action/UseAction.java | 97 -------- .../v1_20_R1/action/util/Tracer.java | 105 -------- .../v1_20_R1/network/DummyChannel.java | 98 -------- .../v1_20_R1/network/DummyConnection.java | 35 --- .../network/DummyPlayerAdvancements.java | 62 ----- .../DummyServerGamePacketListenerImpl.java | 63 ----- .../v1_20_R1/spi/ActionTickerImpl.java | 30 --- .../v1_20_R1/spi/NMSBridgeImpl.java | 53 ---- .../v1_20_R1/spi/NMSEntityImpl.java | 19 -- .../v1_20_R1/spi/NMSNetworkImpl.java | 53 ---- .../v1_20_R1/spi/NMSServerImpl.java | 36 --- .../v1_20_R1/spi/NMSServerLevelImpl.java | 22 -- .../v1_20_R1/spi/NMSServerPlayerImpl.java | 229 ----------------- fakeplayer-v1_20_R2/pom.xml | 98 -------- .../v1_20_R2/action/AttackAction.java | 49 ---- .../v1_20_R2/action/MineAction.java | 160 ------------ .../v1_20_R2/action/TraceAction.java | 24 -- .../fakeplayer/v1_20_R2/action/UseAction.java | 97 -------- .../v1_20_R2/action/util/Tracer.java | 105 -------- .../v1_20_R2/network/DummyChannel.java | 99 -------- .../v1_20_R2/network/DummyConnection.java | 38 --- .../network/DummyPlayerAdvancements.java | 63 ----- .../DummyServerGamePacketListenerImpl.java | 69 ------ .../v1_20_R2/spi/ActionTickerImpl.java | 29 --- .../v1_20_R2/spi/NMSBridgeImpl.java | 53 ---- .../v1_20_R2/spi/NMSEntityImpl.java | 19 -- .../v1_20_R2/spi/NMSNetworkImpl.java | 64 ----- .../v1_20_R2/spi/NMSServerImpl.java | 38 --- .../v1_20_R2/spi/NMSServerLevelImpl.java | 22 -- .../v1_20_R2/spi/NMSServerPlayerImpl.java | 232 ------------------ fakeplayer-v1_20_R4/pom.xml | 98 -------- .../v1_20_R4/action/AttackAction.java | 49 ---- .../v1_20_R4/action/MineAction.java | 160 ------------ .../v1_20_R4/action/TraceAction.java | 24 -- .../fakeplayer/v1_20_R4/action/UseAction.java | 97 -------- .../v1_20_R4/action/util/Tracer.java | 105 -------- .../v1_20_R4/network/DummyChannel.java | 99 -------- .../v1_20_R4/network/DummyConnection.java | 38 --- .../network/DummyPlayerAdvancements.java | 63 ----- .../DummyServerGamePacketListenerImpl.java | 69 ------ .../v1_20_R4/spi/ActionTickerImpl.java | 29 --- .../v1_20_R4/spi/NMSBridgeImpl.java | 53 ---- .../v1_20_R4/spi/NMSEntityImpl.java | 19 -- .../v1_20_R4/spi/NMSNetworkImpl.java | 64 ----- .../v1_20_R4/spi/NMSServerImpl.java | 38 --- .../v1_20_R4/spi/NMSServerLevelImpl.java | 19 -- .../v1_20_R4/spi/NMSServerPlayerImpl.java | 232 ------------------ fakeplayer-v1_21_R1/pom.xml | 6 +- .../v1_21_R1/network/DummyConnection.java | 11 +- .../DummyServerGamePacketListenerImpl.java | 17 +- .../v1_21_R1/spi/NMSBridgeImpl.java | 2 +- .../v1_21_R1/spi/NMSNetworkImpl.java | 7 +- pom.xml | 29 +-- 62 files changed, 40 insertions(+), 3818 deletions(-) delete mode 100644 fakeplayer-v1_20_R1/pom.xml delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/AttackAction.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/MineAction.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/TraceAction.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/UseAction.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/action/util/Tracer.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyChannel.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyConnection.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyPlayerAdvancements.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/network/DummyServerGamePacketListenerImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/ActionTickerImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSBridgeImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSEntityImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSNetworkImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerLevelImpl.java delete mode 100644 fakeplayer-v1_20_R1/src/main/java/io/github/hello09x/fakeplayer/v1_20_R1/spi/NMSServerPlayerImpl.java delete mode 100644 fakeplayer-v1_20_R2/pom.xml delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/AttackAction.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/MineAction.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/TraceAction.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/UseAction.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/action/util/Tracer.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyChannel.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyConnection.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyPlayerAdvancements.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/network/DummyServerGamePacketListenerImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/ActionTickerImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSBridgeImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSEntityImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSNetworkImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerLevelImpl.java delete mode 100644 fakeplayer-v1_20_R2/src/main/java/io/github/hello09x/fakeplayer/v1_20_R2/spi/NMSServerPlayerImpl.java delete mode 100644 fakeplayer-v1_20_R4/pom.xml delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/AttackAction.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/MineAction.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/TraceAction.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/UseAction.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/action/util/Tracer.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyChannel.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyConnection.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyPlayerAdvancements.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/network/DummyServerGamePacketListenerImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/ActionTickerImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSBridgeImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSEntityImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSNetworkImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerLevelImpl.java delete mode 100644 fakeplayer-v1_20_R4/src/main/java/io/github/hello09x/fakeplayer/v1_20_R4/spi/NMSServerPlayerImpl.java 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