Changed the way to create FakePlayer

This commit is contained in:
Felix Cravic 2020-07-06 16:06:31 +02:00
parent da48ba8fb0
commit e74c8ac9fd
3 changed files with 68 additions and 30 deletions

View File

@ -10,13 +10,15 @@ import net.minestom.server.chat.ChatColor;
import net.minestom.server.chat.ColoredText; import net.minestom.server.chat.ColoredText;
import net.minestom.server.entity.*; import net.minestom.server.entity.*;
import net.minestom.server.entity.damage.DamageType; import net.minestom.server.entity.damage.DamageType;
import net.minestom.server.entity.fakeplayer.FakePlayer;
import net.minestom.server.entity.fakeplayer.FakePlayerController;
import net.minestom.server.entity.type.EntityZombie; import net.minestom.server.entity.type.EntityZombie;
import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.entity.EntityAttackEvent;
import net.minestom.server.event.entity.EntityDeathEvent;
import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.ItemDropEvent;
import net.minestom.server.event.item.ItemUpdateStateEvent; import net.minestom.server.event.item.ItemUpdateStateEvent;
import net.minestom.server.event.item.PickupItemEvent; import net.minestom.server.event.item.PickupItemEvent;
import net.minestom.server.event.player.*; import net.minestom.server.event.player.*;
import net.minestom.server.gamedata.tags.TagManager;
import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.Instance; import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceContainer;
@ -29,18 +31,15 @@ import net.minestom.server.item.ItemFlag;
import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material; import net.minestom.server.item.Material;
import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.ConnectionManager;
import net.minestom.server.network.packet.server.play.TagsPacket;
import net.minestom.server.ping.ResponseDataConsumer; import net.minestom.server.ping.ResponseDataConsumer;
import net.minestom.server.timer.TaskRunnable; import net.minestom.server.timer.TaskRunnable;
import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.MathUtils;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.utils.Position; import net.minestom.server.utils.Position;
import net.minestom.server.utils.Vector; import net.minestom.server.utils.Vector;
import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.utils.time.TimeUnit;
import net.minestom.server.utils.time.UpdateOption; import net.minestom.server.utils.time.UpdateOption;
import net.minestom.server.world.Dimension; import net.minestom.server.world.Dimension;
import java.io.FileNotFoundException;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -65,11 +64,11 @@ public class PlayerInit {
// Load some chunks beforehand // Load some chunks beforehand
int loopStart = -2; int loopStart = -2;
int loopEnd = 2; int loopEnd = 10;
for (int x = loopStart; x < loopEnd; x++) for (int x = loopStart; x < loopEnd; x++)
for (int z = loopStart; z < loopEnd; z++) { for (int z = loopStart; z < loopEnd; z++) {
instanceContainer.loadChunk(x, z); instanceContainer.loadChunk(x, z);
netherTest.loadChunk(x, z); //netherTest.loadChunk(x, z);
} }
@ -163,14 +162,18 @@ public class PlayerInit {
zombie.setAttribute(Attribute.MOVEMENT_SPEED, 0.25f); zombie.setAttribute(Attribute.MOVEMENT_SPEED, 0.25f);
zombie.setInstance(player.getInstance()); zombie.setInstance(player.getInstance());
/*FakePlayer fakePlayer = new FakePlayer(UUID.randomUUID(), "test"); FakePlayer.initPlayer(UUID.randomUUID(), "test", false, fakePlayer -> {
fakePlayer.addEventCallback(EntityDeathEvent.class, e -> { //fakePlayer.setInstance(player.getInstance());
fakePlayer.getController().respawn(); fakePlayer.teleport(player.getPosition());
});
fakePlayer.setArrowCount(25);
FakePlayerController controller = fakePlayer.getController();
controller.sendChatMessage("I am a bot!");*/
fakePlayer.addEventCallback(EntityDeathEvent.class, e -> {
fakePlayer.getController().respawn();
});
fakePlayer.setArrowCount(25);
FakePlayerController controller = fakePlayer.getController();
controller.sendChatMessage("I am a bot!");
});
//Hologram hologram = new Hologram(player.getInstance(), player.getPosition(), "Hey guy"); //Hologram hologram = new Hologram(player.getInstance(), player.getPosition(), "Hey guy");
}); });
@ -243,9 +246,13 @@ public class PlayerInit {
item.setEnchantment(Enchantment.SHARPNESS, (short) 50); item.setEnchantment(Enchantment.SHARPNESS, (short) 50);
player.getInventory().addItemStack(item); player.getInventory().addItemStack(item);
player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 127)); for (int i = 0; i < 9; i++) {
player.getInventory().setItemStack(i, new ItemStack(Material.STONE, (byte) 127));
}
//player.setHelmet(new ItemStack(Material.DIAMOND_HELMET, (byte) 1)); player.setHelmet(new ItemStack(Material.DIAMOND_HELMET, (byte) 1));
player.getInventory().setItemStack(41, ItemStack.getAirItem());
inventory.addItemStack(item.clone()); inventory.addItemStack(item.clone());
//player.openInventory(inventory); //player.openInventory(inventory);
@ -278,7 +285,12 @@ public class PlayerInit {
belowNameScoreboard.updateScore(this, 50);*/ belowNameScoreboard.updateScore(this, 50);*/
player.sendLegacyMessage("&aIm &bHere", '&'); player.sendLegacyMessage("&aIm &bHere", '&');
player.sendMessage(ColoredText.of("{#ff55ff}test")); player.sendMessage(ColoredText.of("{#ff55ff}" + ChatColor.RESET + "test"));
/*RichMessage richMessage = RichMessage.of(ColoredText.of("Hey the item"))
.setHoverEvent(ChatHoverEvent.showItem(new ItemStack(Material.IRON_HELMET, (byte) 1)));
System.out.println(richMessage.toString());
player.sendMessage(richMessage);*/
}); });

View File

@ -2,24 +2,22 @@ package net.minestom.server.entity.fakeplayer;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.event.player.PlayerLoginEvent;
import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.ConnectionManager;
import net.minestom.server.network.player.FakePlayerConnection; import net.minestom.server.network.player.FakePlayerConnection;
import net.minestom.server.timer.TaskRunnable;
import net.minestom.server.utils.time.TimeUnit;
import net.minestom.server.utils.time.UpdateOption;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer;
public class FakePlayer extends Player { public class FakePlayer extends Player {
private FakePlayerController fakePlayerController; private FakePlayerController fakePlayerController;
private boolean registered; private boolean registered;
/** private FakePlayer(UUID uuid, String username, boolean addInCache) {
* @param uuid the player uuid
* @param username the player username
* @param addInCache should the player be registered internally
* (gettable with {@link ConnectionManager#getOnlinePlayers()}
* and {@link ConnectionManager#getPlayer(String)})
*/
public FakePlayer(UUID uuid, String username, boolean addInCache) {
super(uuid, username, new FakePlayerConnection()); super(uuid, username, new FakePlayerConnection());
this.fakePlayerController = new FakePlayerController(this); this.fakePlayerController = new FakePlayerController(this);
@ -32,13 +30,41 @@ public class FakePlayer extends Player {
} }
/** /**
* Create a FakePlayer not registered in {@link ConnectionManager} * Init a new FakePlayer
* *
* @param uuid the player uuid * @param uuid the FakePlayer uuid
* @param username the player username * @param username the FakePlayer username
* @param addInCache should the player be registered internally
* (gettable with {@link ConnectionManager#getOnlinePlayers()})
* @param scheduledCallback the callback called when the FakePlayer is finished logging
* (1 tick after the {@link PlayerLoginEvent})
* WARNING: it will be called in the
* {@link net.minestom.server.timer.SchedulerManager} thread pool
*/ */
public FakePlayer(UUID uuid, String username) { public static void initPlayer(UUID uuid, String username, boolean addInCache, Consumer<FakePlayer> scheduledCallback) {
this(uuid, username, false); final FakePlayer fakePlayer = new FakePlayer(uuid, username, addInCache);
fakePlayer.addEventCallback(PlayerLoginEvent.class, event -> {
MinecraftServer.getSchedulerManager().addDelayedTask(new TaskRunnable() {
@Override
public void run() {
scheduledCallback.accept(fakePlayer);
}
}, new UpdateOption(1, TimeUnit.TICK));
});
}
/**
* Init a new FakePlayer without adding him in cache
*
* @param uuid the FakePlayer uuid
* @param username the FakePlayer username
* @param scheduledCallback the callback called when the FakePlayer is finished logging
* WARNING: it will be called in the
* {@link net.minestom.server.timer.SchedulerManager} thread pool
*/
public static void initPlayer(UUID uuid, String username, Consumer<FakePlayer> scheduledCallback) {
initPlayer(uuid, username, false, scheduledCallback);
} }
public FakePlayerController getController() { public FakePlayerController getController() {

View File

@ -186,7 +186,7 @@ public final class ConnectionManager {
* Add a new player in the players list * Add a new player in the players list
* Is currently used at * Is currently used at
* {@link net.minestom.server.network.packet.client.login.LoginStartPacket#process(PlayerConnection, ConnectionManager)} * {@link net.minestom.server.network.packet.client.login.LoginStartPacket#process(PlayerConnection, ConnectionManager)}
* and in {@link net.minestom.server.entity.fakeplayer.FakePlayer#FakePlayer(UUID, String, boolean)} * and in {@link net.minestom.server.entity.fakeplayer.FakePlayer#initPlayer(UUID, String, boolean, Consumer)}
* *
* @param player the player to add * @param player the player to add
*/ */