diff --git a/pom.xml b/pom.xml index 2839f73..72504b0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.hello09x fakeplayer - 1_20_R1-0.1.2 + 1_20_R1-0.1.3 jar fakeplayer diff --git a/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java b/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java index b3d2fcf..c2e5185 100644 --- a/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java +++ b/src/main/java/io/github/hello09x/fakeplayer/command/SpawnCommand.java @@ -21,7 +21,7 @@ public class SpawnCommand extends AbstractCommand { public final static SpawnCommand instance = new SpawnCommand(); public void create(@NotNull Player sender, CommandArguments args) { - var fakePlayer = fakeplayerManager.spawn(sender, sender.getLocation()); + var fakePlayer = fakeplayerManager.spawn(sender, sender.getLocation().clone()); if (fakePlayer != null) { sender.sendMessage(textOfChildren( text("你创建了假人 ", GRAY), diff --git a/src/main/java/io/github/hello09x/fakeplayer/core/EmptyConnection.java b/src/main/java/io/github/hello09x/fakeplayer/core/EmptyConnection.java index 8c6eaad..e9755ed 100644 --- a/src/main/java/io/github/hello09x/fakeplayer/core/EmptyConnection.java +++ b/src/main/java/io/github/hello09x/fakeplayer/core/EmptyConnection.java @@ -18,7 +18,11 @@ public class EmptyConnection extends Connection { } @Override - public void send(Packet packet, PacketSendListener listener) { + public void send(Packet packet, PacketSendListener listener) { + } + + @Override + public void send(Packet packet) { } @Override diff --git a/src/main/java/io/github/hello09x/fakeplayer/entity/DebugServerPlayer.java b/src/main/java/io/github/hello09x/fakeplayer/entity/DebugServerPlayer.java new file mode 100644 index 0000000..10a543e --- /dev/null +++ b/src/main/java/io/github/hello09x/fakeplayer/entity/DebugServerPlayer.java @@ -0,0 +1,30 @@ +package io.github.hello09x.fakeplayer.entity; + +import com.mojang.authlib.GameProfile; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; + +public class DebugServerPlayer extends ServerPlayer { + public DebugServerPlayer(MinecraftServer minecraftserver, ServerLevel worldserver, GameProfile gameprofile) { + super(minecraftserver, worldserver, gameprofile); + } + + @Override + public void tick() { + System.out.println("tick"); + super.tick(); + } + + @Override + public void doTick() { + System.out.println("dotick"); + super.doTick(); + } + + @Override + public void baseTick() { + System.out.println("baseTick"); + super.baseTick(); + } +} diff --git a/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java b/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java index 90e5ee8..3cca188 100644 --- a/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java +++ b/src/main/java/io/github/hello09x/fakeplayer/entity/FakePlayer.java @@ -17,6 +17,7 @@ import net.minecraft.server.PlayerAdvancements; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.craftbukkit.v1_20_R1.CraftServer; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.entity.Player; @@ -54,7 +55,8 @@ public class FakePlayer { @NotNull String creator, @NotNull MinecraftServer server, @NotNull UUID uniqueId, - @NotNull String name + @NotNull String name, + @NotNull Location spawnAt ) { this.creator = creator; this.handle = new ServerPlayer(server, Objects.requireNonNull(server.getLevel(ServerLevel.OVERWORLD), "缺少 overworld 世界"), new GameProfile(uniqueId, name)); @@ -86,7 +88,6 @@ public class FakePlayer { boolean pickupItems ) { if (properties.isSimulateLogin()) { - preLogin: new BukkitRunnable() { @Override public void run() { @@ -102,7 +103,6 @@ public class FakePlayer { } }.runTaskAsynchronously(Main.getInstance()); - login: { Bukkit.getPluginManager().callEvent(new PlayerLoginEvent( this.bukkitPlayer, @@ -112,7 +112,6 @@ public class FakePlayer { } } - gaming: { var connection = new EmptyConnection(PacketFlow.CLIENTBOUND); var listener = new EmptyServerGamePacketListener(this.server, connection, this.handle); @@ -120,7 +119,6 @@ public class FakePlayer { connection.setListener(listener); } - spawn: { var connection = new EmptyConnection(PacketFlow.CLIENTBOUND); var listener = new EmptyLoginPacketListener(server, connection); diff --git a/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java b/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java index 299bb53..3e9e3fe 100644 --- a/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java +++ b/src/main/java/io/github/hello09x/fakeplayer/manager/FakeplayerManager.java @@ -4,7 +4,6 @@ import io.github.hello09x.fakeplayer.Main; import io.github.hello09x.fakeplayer.entity.FakePlayer; import io.github.hello09x.fakeplayer.entity.FakeplayerMetadata; import io.github.hello09x.fakeplayer.entity.action.Action; -import io.github.hello09x.fakeplayer.entity.action.PlayerActionManager; import io.github.hello09x.fakeplayer.optional.BungeeCordServer; import io.github.hello09x.fakeplayer.properties.FakeplayerProperties; import io.github.hello09x.fakeplayer.repository.UsedIdRepository; @@ -54,8 +53,6 @@ public class FakeplayerManager { private final BungeeCordServer bungee = BungeeCordServer.instance; - private final PlayerActionManager playerActionManager = PlayerActionManager.instance; - private FakeplayerManager() { var timer = new Timer(); @@ -80,7 +77,7 @@ public class FakeplayerManager { timer.schedule(new TimerTask() { @Override public void run() { - if (!properties.isFollowQuiting() || !properties.isBungee()) { + if (!properties.isFollowQuiting() || !properties.isBungeecord()) { return; } @@ -88,12 +85,12 @@ public class FakeplayerManager { .stream() .collect(Collectors.groupingBy(FakeplayerManager.this::getCreator)); - for(var entry: group.entrySet()) { + for (var entry : group.entrySet()) { if (bungee.isPlayerOnline(entry.getKey())) { continue; } - for(var fakePlayer: entry.getValue()) { + for (var fakePlayer : entry.getValue()) { remove(fakePlayer.getName()); } @@ -143,47 +140,51 @@ public class FakeplayerManager { pickupItems = userConfigRepository.selectOrDefault(creatorId, Configs.pickup_items); } - var serverPlayer = new FakePlayer( + var player = new FakePlayer( creator.getName(), ((CraftServer) Bukkit.getServer()).getServer(), generateId(name.name()), - name.name() + name.name(), + spawnAt ); - var player = serverPlayer.getBukkitPlayer(); - player.setMetadata(FakeplayerMetadata.CREATOR.key, new FixedMetadataValue(Main.getInstance(), creator.getName())); - player.setMetadata(FakeplayerMetadata.CREATOR_IP.key, new FixedMetadataValue(Main.getInstance(), AddressUtils.getAddress(creator))); - player.setMetadata(FakeplayerMetadata.NAME_SOURCE.key, new FixedMetadataValue(Main.getInstance(), name.source())); - player.setMetadata(FakeplayerMetadata.NAME_SEQUENCE.key, new FixedMetadataValue(Main.getInstance(), name.sequence())); - player.playerListName(text(creator.getName() + "的假人").style(Style.style(GRAY, ITALIC))); + var bukkitPlayer = player.getBukkitPlayer(); + bukkitPlayer.setMetadata(FakeplayerMetadata.CREATOR.key, new FixedMetadataValue(Main.getInstance(), creator.getName())); + bukkitPlayer.setMetadata(FakeplayerMetadata.CREATOR_IP.key, new FixedMetadataValue(Main.getInstance(), AddressUtils.getAddress(creator))); + bukkitPlayer.setMetadata(FakeplayerMetadata.NAME_SOURCE.key, new FixedMetadataValue(Main.getInstance(), name.source())); + bukkitPlayer.setMetadata(FakeplayerMetadata.NAME_SEQUENCE.key, new FixedMetadataValue(Main.getInstance(), name.sequence())); + bukkitPlayer.playerListName(text(creator.getName() + "的假人").style(Style.style(GRAY, ITALIC))); - serverPlayer.spawn(invulnerable, collidable, lookAtEntity, pickupItems); + player.spawn(invulnerable, collidable, lookAtEntity, pickupItems); - usedIdRepository.add(player.getUniqueId()); + usedIdRepository.add(bukkitPlayer.getUniqueId()); - dispatchCommands(player, properties.getPreparingCommands()); - performCommands(player); + dispatchCommands(bukkitPlayer, properties.getPreparingCommands()); + performCommands(bukkitPlayer); - // 先等待玩家 spawn 之后再 tp, 否则 tp 不生效 - // 可能会被别的插件干预, 因此 tp 两次 - var spawnpoint = spawnAt.getWorld().getSpawnLocation().clone(); + bukkitPlayer.teleport(spawnAt); // 当前 tick 必须传到出生点否则无法触发区块刷新 + spawnAt.getWorld().playSound(spawnAt, Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 1.0F); + + // 可能被别的插件干预 + // 在下一 tick 里探测 new BukkitRunnable() { @Override public void run() { - player.teleport(spawnpoint); - } - }.runTaskLater(Main.getInstance(), 5); + if (spawnAt.distance(bukkitPlayer.getLocation()) < 16) { + return; + } - var moveTo = spawnAt.clone(); - new BukkitRunnable() { - @Override - public void run() { - player.teleport(moveTo); - moveTo.getWorld().playSound(moveTo, Sound.ENTITY_ENDERMAN_TELEPORT, 1.0F, 1.0F); + bukkitPlayer.teleport(spawnAt.getWorld().getSpawnLocation()); + new BukkitRunnable() { + @Override + public void run() { + bukkitPlayer.teleport(spawnAt); + } + }.runTaskLater(Main.getInstance(), 1); } - }.runTaskLater(Main.getInstance(), 20); + }.runTaskLater(Main.getInstance(), 1); - return player; + return bukkitPlayer; } public @Nullable Player get(@NotNull CommandSender creator, @NotNull String name) { @@ -361,7 +362,7 @@ public class FakeplayerManager { } public void performCommands(@NotNull Player player) { - if (!isFake(player)) { + if (!isFake(player)) { return; } diff --git a/src/main/java/io/github/hello09x/fakeplayer/properties/FakeplayerProperties.java b/src/main/java/io/github/hello09x/fakeplayer/properties/FakeplayerProperties.java index 705858d..0648ecf 100644 --- a/src/main/java/io/github/hello09x/fakeplayer/properties/FakeplayerProperties.java +++ b/src/main/java/io/github/hello09x/fakeplayer/properties/FakeplayerProperties.java @@ -50,7 +50,7 @@ public class FakeplayerProperties extends AbstractProperties