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

View File

@ -8,8 +8,9 @@ import org.jglrxavpok.hephaistos.nbt.SNBTParser;
import java.io.StringReader;
/**
* Argument used to retrieve a {@link NBT} based object, can be a
* {@link org.jglrxavpok.hephaistos.nbt.NBTCompound} or {@link org.jglrxavpok.hephaistos.nbt.NBTList}
* Argument used to retrieve a {@link NBT} based object, can be any kind of tag like
* {@link org.jglrxavpok.hephaistos.nbt.NBTCompound}, {@link org.jglrxavpok.hephaistos.nbt.NBTList},
* {@link org.jglrxavpok.hephaistos.nbt.NBTInt}, etc...
* <p>
* 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;
/**
* Represents an object which contain key/value based data.
* Represents an object which contains key/value based data.
* <p>
* 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 value the value object
@ -86,7 +86,7 @@ public interface Data {
/**
* 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();

View File

@ -5,7 +5,7 @@ import java.util.Set;
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 {

View File

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

View File

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

View File

@ -149,11 +149,11 @@ public class ItemStack implements DataContainer {
synchronized (ItemStack.class) {
final ColoredText itemDisplayName = itemStack.getDisplayName();
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 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) ||
(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.
* <p>
* Can be null if not any
* Can be null if not any.
*
* @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
*/
@ -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
*/

View File

@ -1,41 +1,31 @@
package demo;
import demo.blocks.StoneBlock;
import demo.generator.ChunkGeneratorDemo;
import demo.generator.NoiseTestGenerator;
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.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.ItemUpdateStateEvent;
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.WorldBorder;
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.InventoryType;
import net.minestom.server.item.Enchantment;
import net.minestom.server.item.ItemStack;
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.ping.ResponseDataConsumer;
import net.minestom.server.scoreboard.Sidebar;
import net.minestom.server.storage.StorageLocation;
import net.minestom.server.storage.StorageOptions;
import net.minestom.server.utils.BlockPosition;
import net.minestom.server.utils.Position;
import net.minestom.server.utils.Vector;
import net.minestom.server.utils.time.TimeUnit;
@ -44,9 +34,10 @@ import net.minestom.server.world.DimensionType;
import java.util.UUID;
public class PlayerInit {
private static volatile InstanceContainer instanceContainer;
private static volatile Inventory inventory;
private static final InstanceContainer instanceContainer;
private static final Inventory inventory;
static {
StorageLocation storageLocation = MinecraftServer.getStorageManager().getLocation("instance_data", new StorageOptions().setCompression(true));
@ -81,9 +72,9 @@ public class PlayerInit {
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()) {
ColoredText header = ColoredText.of("RAM USAGE: " + ramUsage + " MB");
ColoredText footer = ColoredText.of(benchmarkManager.getCpuMonitoringMessage());
player.sendHeaderFooter(header, footer);
}
}).repeat(10, TimeUnit.TICK).schedule();
@ -128,34 +119,6 @@ public class PlayerInit {
if (block == Block.TORCH) {
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)
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 Block block = Block.fromStateId(blockStateId);
player.sendMessage("You clicked at the block " + block);
@ -200,9 +152,6 @@ public class PlayerInit {
});
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);
player.setEnableRespawnScreen(false);
@ -210,19 +159,16 @@ public class PlayerInit {
player.setPermissionLevel(4);
player.getInventory().addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> {
player.sendMessage("CLICK PLAYER INVENTORY");
System.out.println("slot player: " + slot);
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));
});
/*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();
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.setGameMode(GameMode.CREATIVE);
player.setGameMode(GameMode.SURVIVAL);
player.teleport(new Position(0, 73f, 0));
player.getInventory().addItemStack(new ItemStack(Material.STONE, (byte) 1));
player.setGlowing(true);
ItemStack stone = new ItemStack(Material.DIAMOND_SWORD, (byte) 127);
stone.setEnchantment(Enchantment.AQUA_AFFINITY, (short) 1);
stone.addAttribute(new ItemAttribute(UUID.randomUUID(),
"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"));
Data data = new DataImpl();
data.set("test", 5, Integer.class);
ItemStack itemStack = new ItemStack(Material.NETHERITE_PICKAXE, (byte) 1);
itemStack.setEnchantment(Enchantment.EFFICIENCY, (short) 5);
itemStack.setData(data);
player.getInventory().addItemStack(itemStack);
});
player.addEventCallback(PlayerRespawnEvent.class, event -> {
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.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.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 -> {
Instance instance = player.getInstance();

View File

@ -6,7 +6,7 @@ import net.minestom.server.command.CommandSender;
import net.minestom.server.entity.Player;
/**
* A simple shutdown command
* A simple shutdown command.
*/
public class ShutdownCommand implements CommandProcessor {
@ -28,6 +28,6 @@ public class ShutdownCommand implements CommandProcessor {
@Override
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.Command;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.arguments.ArgumentType;
import net.minestom.server.item.ItemStack;
import net.minestom.server.command.builder.arguments.minecraft.ArgumentNbtTag;
public class TestCommand extends Command {
@ -18,12 +17,11 @@ public class TestCommand extends Command {
//addSyntax(this::execute, dynamicWord);
}
Argument test = ArgumentType.ItemStack("test");
Argument test = new ArgumentNbtTag("test");
addSyntax((source, args) -> {
System.out.println("arg: "+args.getNBT("test").getClass());
System.out.println("SUCCESS");
ItemStack itemStack = args.getItemStack("test");
source.asPlayer().getInventory().addItemStack(itemStack);
}, test);
}