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