Use negative entity id for the custom breaking system

This commit is contained in:
themode 2020-10-19 11:56:26 +02:00
parent 32d13dcbd1
commit b2e3d3e78d
11 changed files with 45 additions and 190 deletions

View File

@ -96,6 +96,7 @@ public class ColoredText extends JsonMessage {
* Gets the raw text. * Gets the raw text.
* *
* @return the raw text * @return the raw text
* @see #toString() for the Json representation
*/ */
public String getMessage() { public String getMessage() {
return message; return message;
@ -104,7 +105,7 @@ public class ColoredText extends JsonMessage {
/** /**
* Gets the Json representation of this colored text. * Gets the Json representation of this colored text.
* <p> * <p>
* Used to send a message. * Used to "compile" the message, retrieved with {@link #toString()}.
* *
* @return the Json representation of the text * @return the Json representation of the text
*/ */
@ -129,7 +130,6 @@ public class ColoredText extends JsonMessage {
mainObject.add("extra", extraArray); mainObject.add("extra", extraArray);
} }
return mainObject; return mainObject;
} }

View File

@ -33,7 +33,9 @@ public abstract class JsonMessage {
} }
/** /**
* Gets the string json representation. * Gets the Json representation.
* <p>
* Used to send messages.
* *
* @return the string json representation * @return the string json representation
*/ */

View File

@ -8,8 +8,9 @@ import org.jglrxavpok.hephaistos.nbt.SNBTParser;
import java.io.StringReader; import java.io.StringReader;
/** /**
* Argument used to retrieve a {@link NBT} based object, can be a * Argument used to retrieve a {@link NBT} based object, can be any kind of tag like
* {@link org.jglrxavpok.hephaistos.nbt.NBTCompound} or {@link org.jglrxavpok.hephaistos.nbt.NBTList} * {@link org.jglrxavpok.hephaistos.nbt.NBTCompound}, {@link org.jglrxavpok.hephaistos.nbt.NBTList},
* {@link org.jglrxavpok.hephaistos.nbt.NBTInt}, etc...
* <p> * <p>
* Example: {display:{Name:"{\"text\":\"Sword of Power\"}"}} or [{display:{Name:"{\"text\":\"Sword of Power\"}"}}] * Example: {display:{Name:"{\"text\":\"Sword of Power\"}"}} or [{display:{Name:"{\"text\":\"Sword of Power\"}"}}]
*/ */

View File

@ -4,7 +4,7 @@ import java.util.Collections;
import java.util.Set; import java.util.Set;
/** /**
* Represents an object which contain key/value based data. * Represents an object which contains key/value based data.
* <p> * <p>
* See {@link DataImpl} for the default implementation. * See {@link DataImpl} for the default implementation.
*/ */
@ -47,7 +47,7 @@ public interface Data {
}; };
/** /**
* Sets a value to a specific key. * Assigns a value to a specific key.
* *
* @param key the key * @param key the key
* @param value the value object * @param value the value object
@ -86,7 +86,7 @@ public interface Data {
/** /**
* Gets the list of data keys. * Gets the list of data keys.
* *
* @return an unmodifiable {@link Set} containing all keys * @return an unmodifiable {@link Set} containing all the keys
*/ */
Set<String> getKeys(); Set<String> getKeys();

View File

@ -5,7 +5,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* {@link Data} implementation which use a {@link ConcurrentHashMap} * {@link Data} implementation which uses a {@link ConcurrentHashMap}.
*/ */
public class DataImpl implements Data { public class DataImpl implements Data {

View File

@ -5,6 +5,7 @@ import net.minestom.server.event.Event;
/** /**
* Called after a chunk being unload to a certain player. * Called after a chunk being unload to a certain player.
* <p>
* Could be used to unload the chunk internally in order to save memory. * Could be used to unload the chunk internally in order to save memory.
*/ */
public class PlayerChunkUnloadEvent extends Event { public class PlayerChunkUnloadEvent extends Event {

View File

@ -41,7 +41,7 @@ public abstract class CustomBlock {
private final Map<Instance, InstanceBreakData> instanceBreakDataMap = new HashMap<>(); private final Map<Instance, InstanceBreakData> instanceBreakDataMap = new HashMap<>();
public int getBreakEntityId(Player firstBreaker) { public int getBreakEntityId(Player firstBreaker) {
return firstBreaker.getEntityId() + 1; return -firstBreaker.getEntityId();
} }
private final short defaultBlockStateId; private final short defaultBlockStateId;

View File

@ -149,11 +149,11 @@ public class ItemStack implements DataContainer {
synchronized (ItemStack.class) { synchronized (ItemStack.class) {
final ColoredText itemDisplayName = itemStack.getDisplayName(); final ColoredText itemDisplayName = itemStack.getDisplayName();
final boolean displayNameCheck = (displayName == null && itemDisplayName == null) || final boolean displayNameCheck = (displayName == null && itemDisplayName == null) ||
(displayName != null && itemDisplayName != null && displayName.equals(itemDisplayName)); (displayName != null && displayName.equals(itemDisplayName));
final Data itemData = itemStack.getData(); final Data itemData = itemStack.getData();
final boolean dataCheck = (data == null && itemData == null) || final boolean dataCheck = (data == null && itemData == null) ||
(data != null && itemData != null && data.equals(itemData)); (data != null && data.equals(itemData));
final boolean sameMeta = (itemStack.itemMeta == null && itemMeta == null) || final boolean sameMeta = (itemStack.itemMeta == null && itemMeta == null) ||
(itemStack.itemMeta != null && itemMeta != null && (itemStack.itemMeta.isSimilar(itemMeta))); (itemStack.itemMeta != null && itemMeta != null && (itemStack.itemMeta.isSimilar(itemMeta)));
@ -215,7 +215,7 @@ public class ItemStack implements DataContainer {
/** /**
* Gets the special meta object for this item. * Gets the special meta object for this item.
* <p> * <p>
* Can be null if not any * Can be null if not any.
* *
* @return the item meta * @return the item meta
*/ */
@ -550,7 +550,7 @@ public class ItemStack implements DataContainer {
} }
/** /**
* Gets the nbt consumer called when the item is serialized into a packet. * Gets the {@link NBTConsumer} called when the item is serialized into a packet.
* *
* @return the item nbt consumer, null if not any * @return the item nbt consumer, null if not any
*/ */
@ -559,7 +559,7 @@ public class ItemStack implements DataContainer {
} }
/** /**
* Changes the item nbt consumer. * Changes the item {@link NBTConsumer}.
* *
* @param nbtConsumer the new item nbt consumer * @param nbtConsumer the new item nbt consumer
*/ */

View File

@ -1,41 +1,31 @@
package demo; package demo;
import demo.blocks.StoneBlock;
import demo.generator.ChunkGeneratorDemo; import demo.generator.ChunkGeneratorDemo;
import demo.generator.NoiseTestGenerator; import demo.generator.NoiseTestGenerator;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.attribute.Attribute;
import net.minestom.server.attribute.AttributeOperation;
import net.minestom.server.benchmark.BenchmarkManager; import net.minestom.server.benchmark.BenchmarkManager;
import net.minestom.server.chat.ColoredText; import net.minestom.server.chat.ColoredText;
import net.minestom.server.data.Data; import net.minestom.server.data.Data;
import net.minestom.server.data.DataImpl;
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.event.entity.EntityAttackEvent; import net.minestom.server.event.entity.EntityAttackEvent;
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.PickupItemEvent; import net.minestom.server.event.item.PickupItemEvent;
import net.minestom.server.event.player.*; import net.minestom.server.event.player.*;
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;
import net.minestom.server.instance.WorldBorder;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.CustomBlock;
import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.Inventory;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import net.minestom.server.item.Enchantment; import net.minestom.server.item.Enchantment;
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.item.attribute.AttributeSlot;
import net.minestom.server.item.attribute.ItemAttribute;
import net.minestom.server.item.metadata.MapMeta;
import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.ConnectionManager;
import net.minestom.server.ping.ResponseDataConsumer; import net.minestom.server.ping.ResponseDataConsumer;
import net.minestom.server.scoreboard.Sidebar;
import net.minestom.server.storage.StorageLocation; import net.minestom.server.storage.StorageLocation;
import net.minestom.server.storage.StorageOptions; import net.minestom.server.storage.StorageOptions;
import net.minestom.server.utils.BlockPosition;
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;
@ -44,9 +34,10 @@ import net.minestom.server.world.DimensionType;
import java.util.UUID; import java.util.UUID;
public class PlayerInit { public class PlayerInit {
private static volatile InstanceContainer instanceContainer;
private static volatile Inventory inventory; private static final InstanceContainer instanceContainer;
private static final Inventory inventory;
static { static {
StorageLocation storageLocation = MinecraftServer.getStorageManager().getLocation("instance_data", new StorageOptions().setCompression(true)); StorageLocation storageLocation = MinecraftServer.getStorageManager().getLocation("instance_data", new StorageOptions().setCompression(true));
@ -81,9 +72,9 @@ public class PlayerInit {
long ramUsage = benchmarkManager.getUsedMemory(); long ramUsage = benchmarkManager.getUsedMemory();
ramUsage /= 1e6; // bytes to MB 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()) { for (Player player : connectionManager.getOnlinePlayers()) {
ColoredText header = ColoredText.of("RAM USAGE: " + ramUsage + " MB");
ColoredText footer = ColoredText.of(benchmarkManager.getCpuMonitoringMessage());
player.sendHeaderFooter(header, footer); player.sendHeaderFooter(header, footer);
} }
}).repeat(10, TimeUnit.TICK).schedule(); }).repeat(10, TimeUnit.TICK).schedule();
@ -128,34 +119,6 @@ public class PlayerInit {
if (block == Block.TORCH) { if (block == Block.TORCH) {
event.setCustomBlock((short) 3); // custom torch block event.setCustomBlock((short) 3); // custom torch block
} }
/*for (Player p : player.getInstance().getPlayers()) {
if (p != player)
p.teleport(player.getPosition());
}*/
/*for (int i = 0; i < 100; i++) {
ChickenCreature chickenCreature = new ChickenCreature(player.getPosition());
chickenCreature.setInstance(player.getInstance());
}*/
/*EntityZombie zombie = new EntityZombie(player.getPosition());
zombie.setAttribute(Attribute.MOVEMENT_SPEED, 0.25f);
zombie.setInstance(player.getInstance());*/
/*FakePlayer.initPlayer(UUID.randomUUID(), "test", fakePlayer -> {
//fakePlayer.setInstance(player.getInstance());
fakePlayer.teleport(player.getPosition());
fakePlayer.setSkin(PlayerSkin.fromUsername("TheMode911"));
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");
}); });
@ -163,17 +126,6 @@ public class PlayerInit {
if (event.getHand() != Player.Hand.MAIN) if (event.getHand() != Player.Hand.MAIN)
return; return;
final Instance instance = player.getInstance();
final BlockPosition blockPosition = event.getBlockPosition();
final CustomBlock customBlock = instance.getCustomBlock(blockPosition);
if (customBlock instanceof StoneBlock) {
final Data data = instance.getBlockData(blockPosition);
if (data != null) {
player.sendMessage("test: " + data.get("test"));
}
}
final short blockStateId = player.getInstance().getBlockStateId(event.getBlockPosition()); final short blockStateId = player.getInstance().getBlockStateId(event.getBlockPosition());
final Block block = Block.fromStateId(blockStateId); final Block block = Block.fromStateId(blockStateId);
player.sendMessage("You clicked at the block " + block); player.sendMessage("You clicked at the block " + block);
@ -200,9 +152,6 @@ public class PlayerInit {
}); });
player.addEventCallback(PlayerLoginEvent.class, event -> { player.addEventCallback(PlayerLoginEvent.class, event -> {
//final String url = "https://download.mc-packs.net/pack/a83a04f5d78061e0890e13519fea925550461c74.zip";
//final String hash = "a83a04f5d78061e0890e13519fea925550461c74";
//player.setResourcePack(new ResourcePack(url, hash));
event.setSpawningInstance(instanceContainer); event.setSpawningInstance(instanceContainer);
player.setEnableRespawnScreen(false); player.setEnableRespawnScreen(false);
@ -210,19 +159,16 @@ public class PlayerInit {
player.setPermissionLevel(4); player.setPermissionLevel(4);
player.getInventory().addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> { player.getInventory().addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> {
player.sendMessage("CLICK PLAYER INVENTORY"); if (slot == -999)
System.out.println("slot player: " + slot); 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));
}); });
/*Sidebar scoreboard = new Sidebar("Scoreboard Title");
for (int i = 0; i < 15; i++) {
scoreboard.createLine(new Sidebar.ScoreboardLine("id" + i, "Hey guys " + i, i));
}
scoreboard.addViewer(player);
scoreboard.updateLineContent("id3", "I HAVE BEEN UPDATED");
scoreboard.setTitle("test");*/
{ {
/*AdvancementManager advancementManager = MinecraftServer.getAdvancementManager(); /*AdvancementManager advancementManager = MinecraftServer.getAdvancementManager();
AdvancementRoot root = new AdvancementRoot(ColoredText.of("title"), ColoredText.of(ChatColor.BLUE + "description"), AdvancementRoot root = new AdvancementRoot(ColoredText.of("title"), ColoredText.of(ChatColor.BLUE + "description"),
@ -248,100 +194,21 @@ public class PlayerInit {
}); });
player.addEventCallback(PlayerSpawnEvent.class, event -> { player.addEventCallback(PlayerSpawnEvent.class, event -> {
player.setGameMode(GameMode.CREATIVE); player.setGameMode(GameMode.SURVIVAL);
player.teleport(new Position(0, 73f, 0)); player.teleport(new Position(0, 73f, 0));
player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 1)); Data data = new DataImpl();
data.set("test", 5, Integer.class);
player.setGlowing(true); ItemStack itemStack = new ItemStack(Material.NETHERITE_PICKAXE, (byte) 1);
ItemStack stone = new ItemStack(Material.DIAMOND_SWORD, (byte) 127); itemStack.setEnchantment(Enchantment.EFFICIENCY, (short) 5);
stone.setEnchantment(Enchantment.AQUA_AFFINITY, (short) 1); itemStack.setData(data);
stone.addAttribute(new ItemAttribute(UUID.randomUUID(), player.getInventory().addItemStack(itemStack);
"test_name",
Attribute.ATTACK_DAMAGE, AttributeOperation.ADDITION, 50, AttributeSlot.MAINHAND));
player.getInventory().addItemStack(stone);
/*for (int i = 0; i < 9; i++) {
player.getInventory().setItemStack(i, new ItemStack(Material.STONE, (byte) 127));
}*/
{
Sidebar sidebar = new Sidebar("title");
sidebar.createLine(new Sidebar.ScoreboardLine("id1", ColoredText.of("text"), 1));
sidebar.addViewer(player);
}
{
ItemStack map = new ItemStack(Material.FILLED_MAP, (byte) 1);
MapMeta mapMeta = (MapMeta) map.getItemMeta();
mapMeta.setMapId(1);
//player.getInventory().setItemStack(0, map);
}
ItemStack item = new ItemStack(Material.STONE_SWORD, (byte) 1);
item.setDisplayName(ColoredText.of("Item name"));
item.setDamage(5);
//item.getLore().add(ColoredText.of(ChatColor.RED + "a lore line " + ChatColor.BLACK + " BLACK"));
//item.addItemFlags(ItemFlag.HIDE_ENCHANTS);
//item.setEnchantment(Enchantment.SHARPNESS, (short) 50);
//player.getInventory().addItemStack(item);
//player.setHelmet(new ItemStack(Material.DIAMOND_HELMET, (byte) 1));
//inventory.addItemStack(item.clone());
//player.openInventory(inventory);
//player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 100));
{
/*EntityItemFrame entityItemFrame = new EntityItemFrame(new Position(-5, 36, 9, 0, 180), EntityItemFrame.ItemFrameOrientation.DOWN);
entityItemFrame.setNoGravity(true);
entityItemFrame.setInstance(player.getInstance());
entityItemFrame.setItemStack(item);*/
}
Instance instance = player.getInstance();
WorldBorder worldBorder = instance.getWorldBorder();
//worldBorder.setDiameter(30);
//EntityBoat entityBoat = new EntityBoat(player.getPosition());
//entityBoat.setInstance(player.getInstance());
//entityBoat.addPassenger(player);
//player.getInventory().addItemStack(new ItemStack(Material.DIAMOND_CHESTPLATE, (byte) 1));
/*TeamManager teamManager = Main.getTeamManager();
Team team = teamManager.createTeam(getUsername());
team.setTeamDisplayName("display");
team.setPrefix("[Test] ");
team.setTeamColor(ChatColor.RED);
setTeam(team);
setAttribute(Attribute.MAX_HEALTH, 10);
heal();
BelowNameScoreboard belowNameScoreboard = new BelowNameScoreboard();
setBelowNameScoreboard(belowNameScoreboard);
belowNameScoreboard.updateScore(this, 50);*/
//player.sendLegacyMessage("&aIm &bHere", '&');
//player.sendMessage(ColoredText.of("{#ff55ff}" + ChatColor.RESET + "test"));
}); });
player.addEventCallback(PlayerRespawnEvent.class, event -> { player.addEventCallback(PlayerRespawnEvent.class, event -> {
event.setRespawnPosition(new Position(0f, 75f, 0f)); event.setRespawnPosition(new Position(0f, 75f, 0f));
}); });
player.addEventCallback(PlayerStartDiggingEvent.class, event -> {
//event.setCancelled(true);
});
player.addEventCallback(PlayerCommandEvent.class, event -> {
System.out.println("COMMAND EVENT");
});
player.addEventCallback(PlayerUseItemEvent.class, useEvent -> { player.addEventCallback(PlayerUseItemEvent.class, useEvent -> {
player.sendMessage("Using item in air: " + useEvent.getItemStack().getMaterial()); player.sendMessage("Using item in air: " + useEvent.getItemStack().getMaterial());
}); });
@ -351,20 +218,6 @@ public class PlayerInit {
player.sendMessage("Using item on block: " + useEvent.getItemStack().getMaterial() + " at " + useEvent.getPosition() + " on face " + useEvent.getBlockFace()); player.sendMessage("Using item on block: " + useEvent.getItemStack().getMaterial() + " at " + useEvent.getPosition() + " on face " + useEvent.getBlockFace());
}); });
player.addEventCallback(ItemUpdateStateEvent.class, event -> {
System.out.println("ITEM UPDATE STATE");
});
player.addEventCallback(PlayerPreEatEvent.class, event -> {
ItemStack itemStack = event.getFoodItem();
Material material = itemStack.getMaterial();
event.setEatingTime(material == Material.PORKCHOP ? 100 : 1000);
});
player.addEventCallback(PlayerEatEvent.class, event -> {
System.out.println("PLAYER EAT EVENT");
});
player.addEventCallback(PlayerChunkUnloadEvent.class, event -> { player.addEventCallback(PlayerChunkUnloadEvent.class, event -> {
Instance instance = player.getInstance(); Instance instance = player.getInstance();

View File

@ -6,7 +6,7 @@ import net.minestom.server.command.CommandSender;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
/** /**
* A simple shutdown command * A simple shutdown command.
*/ */
public class ShutdownCommand implements CommandProcessor { public class ShutdownCommand implements CommandProcessor {
@ -28,6 +28,6 @@ public class ShutdownCommand implements CommandProcessor {
@Override @Override
public boolean hasAccess(Player player) { public boolean hasAccess(Player player) {
return player.getPermissionLevel() >= 4; return true;
} }
} }

View File

@ -4,8 +4,7 @@ import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.Arguments; import net.minestom.server.command.builder.Arguments;
import net.minestom.server.command.builder.Command; import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.command.builder.arguments.minecraft.ArgumentNbtTag;
import net.minestom.server.item.ItemStack;
public class TestCommand extends Command { public class TestCommand extends Command {
@ -18,12 +17,11 @@ public class TestCommand extends Command {
//addSyntax(this::execute, dynamicWord); //addSyntax(this::execute, dynamicWord);
} }
Argument test = ArgumentType.ItemStack("test"); Argument test = new ArgumentNbtTag("test");
addSyntax((source, args) -> { addSyntax((source, args) -> {
System.out.println("arg: "+args.getNBT("test").getClass());
System.out.println("SUCCESS"); System.out.println("SUCCESS");
ItemStack itemStack = args.getItemStack("test");
source.asPlayer().getInventory().addItemStack(itemStack);
}, test); }, test);
} }