From 4f4a6aef10f30a249b4a21dbda4ef17b8b465a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Tue, 3 Sep 2024 21:35:23 +0200 Subject: [PATCH 01/21] wip: added persistent data tags on items --- .../minecraft/pixelblocks/PixelBlockItem.java | 36 +++++++++++++++---- .../pixelblocks/PixelBlocksPlugin.java | 1 - .../listeners/CraftPixelBlockListener.java | 25 ------------- .../listeners/DiscoverRecipesListener.java | 2 +- .../listeners/PlacePixelBlockListener.java | 17 ++++----- .../pixelblocks/pixelblock/PixelBlock.java | 24 ++++++++----- 6 files changed, 52 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CraftPixelBlockListener.java diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockItem.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockItem.java index 7f52d37..1562cfc 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockItem.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlockItem.java @@ -11,30 +11,52 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.UUID; public class PixelBlockItem { - public static UUID unusedBlockID = UUID.fromString("98fdf0ae-c3ab-4ef7-ae25-efd518d600de"); - public static final String itemTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzE5NGU5ZTc3NTdkMDZkNmY1ZTViZTg0NTQ4YTdjYjUyMTczZDY4Y2NmODAyZDIxMTI3NWQzMWNkYmEwYTA2ZSJ9fX0="; public static final NamespacedKey recipeKey = new NamespacedKey(PixelBlocksPlugin.plugin, "pixelblock"); + public static NamespacedKey idProperty = new NamespacedKey(PixelBlocksPlugin.plugin, "id"); + public static NamespacedKey ownerProperty = new NamespacedKey(PixelBlocksPlugin.plugin, "owner"); + + public static final String itemTexture = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzE5NGU5ZTc3NTdkMDZkNmY1ZTViZTg0NTQ4YTdjYjUyMTczZDY4Y2NmODAyZDIxMTI3NWQzMWNkYmEwYTA2ZSJ9fX0="; + + public record BlockInfo(UUID id, @Nullable UUID owner) { + public boolean hasOwner() { + return owner != null; + } + } + public static @Nullable BlockInfo getBlockInfo(ItemStack item) { + PersistentDataContainer container = item.getItemMeta().getPersistentDataContainer(); + if(!container.has(idProperty)) return null; + UUID blockId = UUID.fromString(Objects.requireNonNull(container.get(idProperty, PersistentDataType.STRING))); + UUID ownerId = container.has(ownerProperty) + ? UUID.fromString(Objects.requireNonNull(container.get(ownerProperty, PersistentDataType.STRING))) + : null; + return new BlockInfo(blockId, ownerId); + } public static @NotNull ItemStack getBlockAsItem(@NotNull PixelBlock block) { String ownerName = Optional.ofNullable(Bukkit.getOfflinePlayer(block.ownerUUID).getName()).orElseGet(() -> block.ownerUUID.toString()); ItemStack itemStack = HeadUtil.getCustomTextureHead(itemTexture); ItemMeta meta = itemStack.getItemMeta(); - meta.itemName(Component.text(block.blockUUID.toString())); + meta.setMaxStackSize(1); + meta.getPersistentDataContainer().set(idProperty, PersistentDataType.STRING, block.blockUUID.toString()); + meta.getPersistentDataContainer().set(ownerProperty, PersistentDataType.STRING, block.ownerUUID.toString()); meta.displayName(Component.text("Pixelblock von " + ownerName)); meta.lore(List.of( Component.text(ownerName + " ist der Besitzer dieses Blocks."), Component.text("Klicke auf den gesetzten Block, um diesen zu bearbeiten!"), Component.text(block.blockUUID.toString()).color(NamedTextColor.DARK_GRAY) )); - meta.setEnchantmentGlintOverride(true); itemStack.setItemMeta(meta); return itemStack; @@ -43,13 +65,13 @@ public class PixelBlockItem { public static @NotNull ItemStack getEmptyPixelBlock() { ItemStack item = HeadUtil.getCustomTextureHead(itemTexture); ItemMeta meta = item.getItemMeta(); + meta.setMaxStackSize(1); meta.displayName(Component.text("Leerer Pixelblock")); meta.lore(List.of( Component.text("Der erste Spieler, der den Block platziert wird zum Besitzer des Blocks."), Component.text("Klicke auf den gesetzten Block, um diesen zu bearbeiten!") )); - meta.setEnchantmentGlintOverride(true); - meta.itemName(Component.text(unusedBlockID.toString())); + meta.getPersistentDataContainer().set(idProperty, PersistentDataType.STRING, UUID.randomUUID().toString()); item.setItemMeta(meta); return item; } @@ -61,7 +83,7 @@ public class PixelBlockItem { recipe.setIngredient('B', Material.DIAMOND_BLOCK); recipe.setIngredient('C', Material.HEART_OF_THE_SEA); recipe.setIngredient('D', Material.GRASS_BLOCK); - recipe.setIngredient('E', Material.GLOW_BERRIES); + recipe.setIngredient('E', Material.END_CRYSTAL); return recipe; } } diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java index ef0c9bb..eb3e46e 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/PixelBlocksPlugin.java @@ -52,7 +52,6 @@ public final class PixelBlocksPlugin extends JavaPlugin { new PlacePixelBlockListener(), new PreventInventorysListener(), new ExitPixelWorldListener(), - new CraftPixelBlockListener(), new PreventIllegalBlocksListener(), new BreakPixelBlockListener(), new PlacePixelListener(), diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CraftPixelBlockListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CraftPixelBlockListener.java deleted file mode 100644 index 0201d53..0000000 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/CraftPixelBlockListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package eu.mhsl.minecraft.pixelblocks.listeners; - -import eu.mhsl.minecraft.pixelblocks.PixelBlockItem; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.CraftItemEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.Objects; - -public class CraftPixelBlockListener implements Listener { - @EventHandler - static void onCraftItem(CraftItemEvent event) { - ItemStack craftedItem = event.getCurrentItem(); - Objects.requireNonNull(craftedItem); - - ItemMeta craftedItemMeta = craftedItem.getItemMeta(); - String itemName = PlainTextComponentSerializer.plainText().serialize(craftedItemMeta.itemName()); - - if(!itemName.equals(PixelBlockItem.unusedBlockID.toString())) return; - if(event.isShiftClick()) event.setCancelled(true); - } -} diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/DiscoverRecipesListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/DiscoverRecipesListener.java index 6efb61c..2350bbb 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/DiscoverRecipesListener.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/DiscoverRecipesListener.java @@ -17,8 +17,8 @@ public class DiscoverRecipesListener implements Listener { public void shouldDiscover(InventoryClickEvent event) { ItemStack clickedItem = event.getCurrentItem(); if(clickedItem == null) return; - if(!List.of(Material.HEART_OF_THE_SEA, Material.GLOW_BERRIES).contains(clickedItem.getType())) return; if(!(event.getWhoClicked() instanceof Player player)) return; + if(!List.of(Material.HEART_OF_THE_SEA, Material.END_CRYSTAL).contains(clickedItem.getType())) return; if(player.hasDiscoveredRecipe(PixelBlockItem.recipeKey)) return; PixelBlocksPlugin.plugin.getLogger().log(Level.INFO, String.format("%s unlocked tne PixelBlock recipe!", player.getName())); player.discoverRecipe(PixelBlockItem.recipeKey); diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelBlockListener.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelBlockListener.java index 5e34565..123aa63 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelBlockListener.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/listeners/PlacePixelBlockListener.java @@ -6,7 +6,7 @@ import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlock; import eu.mhsl.minecraft.pixelblocks.pixelblock.PixelBlockWorld; import eu.mhsl.minecraft.pixelblocks.utils.Direction; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -14,7 +14,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import java.util.UUID; @@ -22,15 +21,12 @@ public class PlacePixelBlockListener implements Listener { @EventHandler static void onBlockPlace(BlockPlaceEvent event) { ItemStack usedItem = event.getItemInHand(); - ItemMeta usedItemMeta = usedItem.getItemMeta(); - Component displayName = usedItemMeta.displayName(); - if(displayName == null) return; - if(!displayName.toString().contains("Pixelblock")) return; - if(!usedItemMeta.getEnchantmentGlintOverride()) return; + PixelBlockItem.BlockInfo info = PixelBlockItem.getBlockInfo(usedItem); + if(info == null) return; World playerWorld = event.getPlayer().getWorld(); if(PixelBlockWorld.isPixelWorld(playerWorld)) { - event.getPlayer().sendMessage("In Pixelblöcken kann kein Pixelblock erstellt werden."); + event.getPlayer().sendMessage(Component.text("In Pixelblöcken kann kein Pixelblock platziert werden.", NamedTextColor.RED)); event.setCancelled(true); return; } @@ -39,10 +35,9 @@ public class PlacePixelBlockListener implements Listener { playerWorld.getBlockAt(newBlockLocation).setType(Material.AIR); Direction direction = Direction.vectorToDirection(event.getPlayer().getLocation().getDirection()); - String itemName = PlainTextComponentSerializer.plainText().serialize(usedItemMeta.itemName()); PixelBlock pixelBlock; - if(itemName.equals(PixelBlockItem.unusedBlockID.toString())) { + if(!info.hasOwner()) { pixelBlock = new PixelBlock( newBlockLocation, event.getPlayer().getUniqueId(), @@ -50,7 +45,7 @@ public class PlacePixelBlockListener implements Listener { direction ); } else { - UUID itemUUID = UUID.fromString(itemName); + UUID itemUUID = info.id(); pixelBlock = PixelBlocksPlugin.pixelBlocks.stream() .filter(block -> block.blockUUID.equals(itemUUID)) .findFirst() diff --git a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java index 3170042..06c5e9f 100644 --- a/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java +++ b/src/main/java/eu/mhsl/minecraft/pixelblocks/pixelblock/PixelBlock.java @@ -4,6 +4,8 @@ import eu.mhsl.minecraft.pixelblocks.PixelBlockItem; import eu.mhsl.minecraft.pixelblocks.PixelBlocksPlugin; import eu.mhsl.minecraft.pixelblocks.utils.Direction; import eu.mhsl.minecraft.pixelblocks.utils.MinMaxUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.*; import org.bukkit.block.data.BlockData; import org.bukkit.entity.*; @@ -23,7 +25,7 @@ public class PixelBlock { public Location pixelBlockLocation; public Direction facingDirection; - public ArrayList pixels = new ArrayList<>(); + public List pixels = new ArrayList<>(); public Interaction hitbox; public ItemDisplay barrier; @@ -33,6 +35,8 @@ public class PixelBlock { public UUID ownerUUID; public UUID blockUUID; + public static final int maxPixelsPerBlock = 2000; + public static @NotNull String getWorldName(@NotNull PixelBlock pixelBlock) { return PixelBlocksPlugin.plugin.getDataFolder().getPath() + File.separator + pixelBlock.blockUUID; } @@ -58,7 +62,7 @@ public class PixelBlock { searchLocation.setYaw(0); return PixelBlocksPlugin.pixelBlocks.stream() - .filter(block -> block.pixelBlockLocation.equals(searchLocation)) + .filter(block -> Objects.equals(block.pixelBlockLocation, searchLocation)) .findFirst() .orElse(null); } @@ -80,7 +84,7 @@ public class PixelBlock { public void enterBlock(@NotNull Player player) { if(PixelBlocksPlugin.configuration.onlyEditableByOwner() && !player.getUniqueId().equals(ownerUUID)) { - player.sendMessage("Dieser Pixelblock gehört nicht dir!"); + player.sendMessage(Component.text("Dieser Pixelblock gehört nicht dir!", NamedTextColor.RED)); return; } @@ -169,15 +173,18 @@ public class PixelBlock { BlockData block = blockLocation.getBlock().getBlockData(); if(block.getMaterial() != Material.AIR) { - Pixel newPixel = new Pixel(relativeLocation, block, ((double) 1 /pixelsPerBlock)); - pixels.add(newPixel); + pixels.add(new Pixel(relativeLocation, block, ((double) 1/pixelsPerBlock))); } } } } - for(Pixel pixel : this.pixels) { - pixel.place(this.pixelBlockLocation); + this.pixels.stream() + .limit(maxPixelsPerBlock) + .forEach(pixel -> pixel.place(this.pixelBlockLocation)); + + if(this.pixels.size() > maxPixelsPerBlock) { + } if(this.pixels.size() < 5) { @@ -222,7 +229,7 @@ public class PixelBlock { } this.pixelWorld.getPlayersInWorld().forEach(p -> { - p.sendMessage("Der Pixelblock wurde von einem anderen Spieler abgebaut."); + p.sendMessage(Component.text("Der Pixelblock wurde von einem anderen Spieler abgebaut!", NamedTextColor.RED)); p.teleport(this.lastEntryLocation); }); @@ -234,6 +241,7 @@ public class PixelBlock { PixelBlocksPlugin.database.deletePixelBlock(this); this.pixelBlockLocation.getWorld().playSound(this.pixelBlockLocation, Sound.BLOCK_COPPER_BULB_BREAK, 1.0F, 30); this.pixelBlockLocation.getWorld().dropItem(this.pixelBlockLocation.add(new Vector(0.5, 0.5, 0.5)), PixelBlockItem.getBlockAsItem(this)); + this.pixelBlockLocation = null; } private void clearEntities() { -- 2.30.2 From ab71f09f8a260014e6e4dff2bb40e4af0597cb8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Fri, 4 Oct 2024 20:42:17 +0200 Subject: [PATCH 02/21] added and implemented taskchain --- .idea/jarRepositories.xml | 10 ++ build.gradle | 25 ++-- .../{PixelBlocksPlugin.java => Main.java} | 23 +++- .../pixelblocks/PixelBlockDatabase.java | 12 +- .../minecraft/pixelblocks/PixelBlockItem.java | 6 +- .../listeners/BreakPixelBlockListener.java | 4 +- .../listeners/DiscoverRecipesListener.java | 4 +- .../listeners/EnterPixelBlockListener.java | 4 +- .../listeners/PlacePixelBlockListener.java | 4 +- .../pixelblocks/pixelblock/PixelBlock.java | 128 +++++++++--------- .../pixelblock/PixelBlockWorld.java | 10 +- src/main/resources/plugin.yml | 2 +- 12 files changed, 130 insertions(+), 102 deletions(-) rename src/main/java/eu/mhsl/minecraft/pixelblocks/{PixelBlocksPlugin.java => Main.java} (79%) diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 3fd2793..35cc0b4 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -26,5 +26,15 @@