Minestom/src/test/java/demo/PlayerInit.java

222 lines
9.9 KiB
Java

package demo;
import demo.generator.ChunkGeneratorDemo;
import demo.generator.NoiseTestGenerator;
import net.minestom.server.MinecraftServer;
import net.minestom.server.benchmark.BenchmarkManager;
import net.minestom.server.chat.ColoredText;
import net.minestom.server.data.Data;
import net.minestom.server.data.DataImpl;
import net.minestom.server.entity.*;
import net.minestom.server.entity.damage.DamageType;
import net.minestom.server.event.entity.EntityAttackEvent;
import net.minestom.server.event.item.ItemDropEvent;
import net.minestom.server.event.item.PickupItemEvent;
import net.minestom.server.event.player.*;
import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.block.Block;
import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.InventoryType;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import net.minestom.server.network.ConnectionManager;
import net.minestom.server.ping.ResponseDataConsumer;
import net.minestom.server.storage.StorageLocation;
import net.minestom.server.storage.StorageOptions;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.Vector;
import net.minestom.server.utils.time.TimeUnit;
import net.minestom.server.world.DimensionType;
import java.util.UUID;
public class PlayerInit {
private static final InstanceContainer instanceContainer;
private static final Inventory inventory;
static {
StorageLocation storageLocation = MinecraftServer.getStorageManager().getLocation("instance_data", new StorageOptions().setCompression(true));
ChunkGeneratorDemo chunkGeneratorDemo = new ChunkGeneratorDemo();
NoiseTestGenerator noiseTestGenerator = new NoiseTestGenerator();
instanceContainer = MinecraftServer.getInstanceManager().createInstanceContainer(DimensionType.OVERWORLD, storageLocation);
instanceContainer.enableAutoChunkLoad(true);
instanceContainer.setChunkGenerator(noiseTestGenerator);
// Load some chunks beforehand
final int loopStart = -3;
final int loopEnd = 3;
for (int x = loopStart; x < loopEnd; x++)
for (int z = loopStart; z < loopEnd; z++) {
//instanceContainer.loadChunk(x, z);
}
inventory = new Inventory(InventoryType.CHEST_1_ROW, "Test inventory");
inventory.addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> {
p.sendMessage("click type inventory: " + clickType);
System.out.println("slot inv: " + slot);
inventoryConditionResult.setCancel(false);
});
inventory.setItemStack(0, new ItemStack(Material.DIAMOND, (byte) 34));
}
public static void init() {
ConnectionManager connectionManager = MinecraftServer.getConnectionManager();
BenchmarkManager benchmarkManager = MinecraftServer.getBenchmarkManager();
MinecraftServer.getSchedulerManager().buildTask(() -> {
long ramUsage = benchmarkManager.getUsedMemory();
ramUsage /= 1e6; // bytes to MB
final ColoredText header = ColoredText.of("RAM USAGE: " + ramUsage + " MB");
final ColoredText footer = ColoredText.of(benchmarkManager.getCpuMonitoringMessage());
for (Player player : connectionManager.getOnlinePlayers()) {
player.sendHeaderFooter(header, footer);
}
}).repeat(10, TimeUnit.TICK).schedule();
connectionManager.onPacketReceive((player, packetController, packet) -> {
// Listen to all received packet
//System.out.println("PACKET: "+packet.getClass().getSimpleName());
packetController.setCancel(false);
});
connectionManager.addPlayerInitialization(player -> {
player.addEventCallback(EntityAttackEvent.class, event -> {
final Entity entity = event.getTarget();
if (entity instanceof EntityCreature) {
EntityCreature creature = (EntityCreature) entity;
creature.damage(DamageType.fromPlayer(player), -1);
Vector velocity = player.getPosition().clone().getDirection().multiply(6);
velocity.setY(4f);
entity.setVelocity(velocity);
player.sendMessage("You attacked an entity!");
} else if (entity instanceof Player) {
Player target = (Player) entity;
Vector velocity = player.getPosition().clone().getDirection().multiply(4);
velocity.setY(3.5f);
target.setVelocity(velocity);
target.damage(DamageType.fromPlayer(player), 5);
player.sendMessage("ATTACK");
}
});
player.addEventCallback(PlayerBlockPlaceEvent.class, event -> {
if (event.getHand() != Player.Hand.MAIN)
return;
final Block block = Block.fromStateId(event.getBlockStateId());
if (block == Block.STONE) {
event.setCustomBlock("custom_block");
System.out.println("custom stone");
}
if (block == Block.TORCH) {
event.setCustomBlock((short) 3); // custom torch block
}
});
player.addEventCallback(PlayerBlockInteractEvent.class, event -> {
if (event.getHand() != Player.Hand.MAIN)
return;
final short blockStateId = player.getInstance().getBlockStateId(event.getBlockPosition());
final Block block = Block.fromStateId(blockStateId);
player.sendMessage("You clicked at the block " + block);
});
player.addEventCallback(PickupItemEvent.class, event -> {
// Cancel event if player does not have enough inventory space
event.setCancelled(!player.getInventory().addItemStack(event.getItemStack()));
});
player.addEventCallback(ItemDropEvent.class, event -> {
ItemStack droppedItem = event.getItemStack();
Position position = player.getPosition().clone().add(0, 1.5f, 0);
ItemEntity itemEntity = new ItemEntity(droppedItem, position);
itemEntity.setPickupDelay(500, TimeUnit.MILLISECOND);
itemEntity.setInstance(player.getInstance());
Vector velocity = player.getPosition().clone().getDirection().multiply(6);
itemEntity.setVelocity(velocity);
});
player.addEventCallback(PlayerDisconnectEvent.class, event -> {
System.out.println("DISCONNECTION " + player.getUsername());
});
player.addEventCallback(PlayerLoginEvent.class, event -> {
event.setSpawningInstance(instanceContainer);
player.getInventory().addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> {
if (slot == -999)
return;
ItemStack itemStack = p.getInventory().getItemStack(slot);
Data data = itemStack.getData();
if (data != null) {
System.out.println("DATA: " + data.get("test"));
}
System.out.println("slot player: " + slot + " : " + itemStack.getMaterial() + " : " + (itemStack.getData() != null));
});
});
player.addEventCallback(PlayerSpawnEvent.class, event -> {
player.setGameMode(GameMode.SURVIVAL);
player.teleport(new Position(0, 73f, 0));
Data data = new DataImpl();
data.set("test", 5, Integer.class);
ItemStack itemStack = new ItemStack(Material.DIAMOND_PICKAXE, (byte) 1);
itemStack.setData(data);
player.getInventory().addItemStack(itemStack);
//player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte)64));
});
player.addEventCallback(PlayerRespawnEvent.class, event -> {
event.setRespawnPosition(new Position(0f, 75f, 0f));
});
player.addEventCallback(PlayerUseItemEvent.class, useEvent -> {
player.sendMessage("Using item in air: " + useEvent.getItemStack().getMaterial());
});
player.addEventCallback(PlayerUseItemOnBlockEvent.class, useEvent -> {
player.sendMessage("Main item: " + player.getInventory().getItemInMainHand().getMaterial());
player.sendMessage("Using item on block: " + useEvent.getItemStack().getMaterial() + " at " + useEvent.getPosition() + " on face " + useEvent.getBlockFace());
});
player.addEventCallback(PlayerChunkUnloadEvent.class, event -> {
Instance instance = player.getInstance();
Chunk chunk = instance.getChunk(event.getChunkX(), event.getChunkZ());
if (chunk == null)
return;
// Unload the chunk (save memory) if it has no remaining viewer
if (chunk.getViewers().isEmpty()) {
//player.getInstance().unloadChunk(chunk);
}
});
});
}
public static ResponseDataConsumer getResponseDataConsumer() {
return (playerConnection, responseData) -> {
responseData.setMaxPlayer(0);
responseData.setOnline(MinecraftServer.getConnectionManager().getOnlinePlayers().size());
responseData.addPlayer("A name", UUID.randomUUID());
responseData.addPlayer("Could be some message", UUID.randomUUID());
responseData.setDescription("IP test: " + playerConnection.getRemoteAddress());
};
}
}