diff --git a/Lobby/src/main/java/de/fanta/lobby/Config.java b/Lobby/src/main/java/de/fanta/lobby/Config.java index d6f9262..51d85b7 100644 --- a/Lobby/src/main/java/de/fanta/lobby/Config.java +++ b/Lobby/src/main/java/de/fanta/lobby/Config.java @@ -3,9 +3,9 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.block.BlockFace; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Steerable; import java.io.File; import java.util.ArrayList; @@ -48,8 +48,22 @@ boolean hangable = hangableSection.getBoolean("hangable"); Location fenceLocation = hangableSection.getLocation("fenceLocation"); Location onlineBlockLocation = hangableSection.getLocation("onlineBlockLocation"); + String onlineBlockFacingString = hangableSection.getString("onlineBlockFacing"); + BlockFace onlineBlockFacing = null; + if (onlineBlockFacingString != null) { + onlineBlockFacing = BlockFace.valueOf(onlineBlockFacingString); + } + String onlineBlockNbt = hangableSection.getString("onlineBlockNbt"); + int onlineBlockNbtVersion = hangableSection.getInt("onlineBlockNbtVersion"); Location offlineBlockLocation = hangableSection.getLocation("offlineBlockLocation"); - hangableData = new HangableData(hangable, fenceLocation, null, onlineBlockLocation, null, offlineBlockLocation); + String offlineBlockFacingString = hangableSection.getString("offlineBlockFacing"); + BlockFace offlineBlockFacing = null; + if (offlineBlockFacingString != null) { + offlineBlockFacing = BlockFace.valueOf(offlineBlockFacingString); + } + String offlineBlockNbt = hangableSection.getString("offlineBlockNbt"); + int offlineBlockNbtVersion = hangableSection.getInt("offlineBlockNbtVersion"); + hangableData = new HangableData(hangable, fenceLocation, onlineBlockNbt, onlineBlockNbtVersion, onlineBlockLocation, onlineBlockFacing, offlineBlockNbt, offlineBlockNbtVersion, offlineBlockLocation, offlineBlockFacing); } plugin.addPiglin(UUID.fromString(piglin.getString("uuid")), serverName, piglin.getString("gpLocation"), piglin.getString("displayName"), hangableData, false); plugin.getGlobalDataHelper().requestInitialData(serverName); @@ -123,7 +137,20 @@ hangableSection.set("hangable", hangableData.isHangable()); hangableSection.set("fenceLocation", hangableData.getFenceLocation()); hangableSection.set("onlineBlockLocation", hangableData.getOnlineBlockLocation()); + BlockFace onlineBlockFace = hangableData.getOnlineBlockFacing(); + if (onlineBlockFace != null) { + hangableSection.set("onlineBlockFacing", onlineBlockFace.toString()); + } + + hangableSection.set("onlineBlockNbt", hangableData.getOnlineBlockNbt()); + hangableSection.set("onlineBlockNbtVersion", hangableData.getOnlineBlockNbtVersion()); hangableSection.set("offlineBlockLocation", hangableData.getOfflineBlockLocation()); + BlockFace offlineBlockFace = hangableData.getOnlineBlockFacing(); + if (offlineBlockFace != null) { + hangableSection.set("offlineBlockFacing", offlineBlockFace.toString()); + } + hangableSection.set("offlineBlockNbt", hangableData.getOfflineBlockNbt()); + hangableSection.set("offlineBlockNbtVersion", hangableData.getOfflineBlockNbtVersion()); } plugin.saveConfig(); diff --git a/Lobby/src/main/java/de/fanta/lobby/HangableData.java b/Lobby/src/main/java/de/fanta/lobby/HangableData.java index 8cdc616..6ea3a7e 100644 --- a/Lobby/src/main/java/de/fanta/lobby/HangableData.java +++ b/Lobby/src/main/java/de/fanta/lobby/HangableData.java @@ -2,6 +2,7 @@ import org.bukkit.Location; +import org.bukkit.block.BlockFace; import org.jetbrains.annotations.Nullable; public class HangableData { @@ -10,19 +11,27 @@ private Location fenceLocation; - private String onlineBlock; + private String onlineBlockNbt; + private Integer onlineBlockNbtVersion; private Location onlineBlockLocation; + private BlockFace onlineBlockFacing; - private String offlineBlock; + private String offlineBlockNbt; + private Integer offlineBlockNbtVersion; private Location offlineBlockLocation; + private BlockFace offlineBlockFacing; - public HangableData(boolean isHangable, @Nullable Location fenceLocation, @Nullable String onlineBlock, @Nullable Location onlineBlockLocation, @Nullable String offlineBlock, @Nullable Location offlineBlockLocation) { + public HangableData(boolean isHangable, @Nullable Location fenceLocation, @Nullable String onlineBlockNbt, @Nullable Integer onlineBlockNbtVersion, @Nullable Location onlineBlockLocation, @Nullable BlockFace onlineBlockFacing, @Nullable String offlineBlockNbt, @Nullable Integer offlineBlockNbtVersion, @Nullable Location offlineBlockLocation, @Nullable BlockFace offlineBlockFacing) { this.isHangable = isHangable; this.fenceLocation = fenceLocation; - this.onlineBlock = onlineBlock; + this.onlineBlockNbt = onlineBlockNbt; + this.onlineBlockNbtVersion = onlineBlockNbtVersion; this.onlineBlockLocation = onlineBlockLocation; - this.offlineBlock = offlineBlock; + this.onlineBlockFacing = onlineBlockFacing; + this.offlineBlockNbt = offlineBlockNbt; + this.offlineBlockNbtVersion = offlineBlockNbtVersion; this.offlineBlockLocation = offlineBlockLocation; + this.offlineBlockFacing = offlineBlockFacing; } public boolean isHangable() { @@ -44,12 +53,20 @@ } @Nullable - public String getOnlineBlock() { - return onlineBlock; + public String getOnlineBlockNbt() { + return onlineBlockNbt; } - public void setOnlineBlock(String onlineBlock) { - this.onlineBlock = onlineBlock; + public void setOnlineBlockNbt(String onlineBlockNbt) { + this.onlineBlockNbt = onlineBlockNbt; + } + + public Integer getOnlineBlockNbtVersion() { + return onlineBlockNbtVersion; + } + + public void setOnlineBlockNbtVersion(int onlineBlockNbtVersion) { + this.onlineBlockNbtVersion = onlineBlockNbtVersion; } @Nullable @@ -61,13 +78,29 @@ this.onlineBlockLocation = onlineBlockLocation; } - @Nullable - public String getOfflineBlock() { - return offlineBlock; + public BlockFace getOnlineBlockFacing() { + return onlineBlockFacing; } - public void setOfflineBlock(String offlineBlock) { - this.offlineBlock = offlineBlock; + public void setOnlineBlockFacing(BlockFace onlineBlockFacing) { + this.onlineBlockFacing = onlineBlockFacing; + } + + @Nullable + public String getOfflineBlockNbt() { + return offlineBlockNbt; + } + + public void setOfflineBlockNbt(String offlineBlockNbt) { + this.offlineBlockNbt = offlineBlockNbt; + } + + public Integer getOfflineBlockNbtVersion() { + return offlineBlockNbtVersion; + } + + public void setOfflineBlockNbtVersion(int offlineBlockNbtVersion) { + this.offlineBlockNbtVersion = offlineBlockNbtVersion; } @Nullable @@ -78,4 +111,12 @@ public void setOfflineBlockLocation(Location offlineBlockLocation) { this.offlineBlockLocation = offlineBlockLocation; } + + public BlockFace getOfflineBlockFacing() { + return offlineBlockFacing; + } + + public void setOfflineBlockFacing(BlockFace offlineBlockFacing) { + this.offlineBlockFacing = offlineBlockFacing; + } } diff --git a/Lobby/src/main/java/de/fanta/lobby/Lobby.java b/Lobby/src/main/java/de/fanta/lobby/Lobby.java index 66be41c..cfc414a 100644 --- a/Lobby/src/main/java/de/fanta/lobby/Lobby.java +++ b/Lobby/src/main/java/de/fanta/lobby/Lobby.java @@ -1,6 +1,7 @@ package de.fanta.lobby; import de.cubeside.nmsutils.NMSUtils; +import de.cubeside.nmsutils.nbt.CompoundTag; import de.fanta.challenge.Challenge; import de.fanta.challengeutils.Color; import de.fanta.lobby.adventure.AdventureMapsConfig; @@ -44,6 +45,9 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Rotatable; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -362,10 +366,8 @@ case ONLINE -> { piglin.getEquipment().clear(); HangableData hangableData = data.getHangableData(); - boolean isHangable; - if (hangableData == null) { - isHangable = false; - } else { + boolean isHangable = false; + if (hangableData != null) { isHangable = hangableData.isHangable(); } if (isHangable) { @@ -373,6 +375,26 @@ location.setPitch(0); piglin.teleport(location); } + + if (hangableData != null && hangableData.getOfflineBlockLocation() != null && hangableData.getOnlineBlockLocation() != null) { + Block onlineBlock = hangableData.getOnlineBlockLocation().getBlock(); + onlineBlock.setType(Material.PLAYER_HEAD); + String nbt = hangableData.getOnlineBlockNbt(); + Integer version = hangableData.getOnlineBlockNbtVersion(); + if (nbt != null && version != null) { + CompoundTag tag = plugin.nmsUtils.getNbtUtils().updateBlockEntity(plugin.nmsUtils.getNbtUtils().parseString(nbt), version); + plugin.nmsUtils.getNbtUtils().setBlockEntityNbt(onlineBlock, tag); + Block offlineBlock = hangableData.getOfflineBlockLocation().getBlock(); + offlineBlock.setType(Material.AIR); + } + BlockFace blockFacing = hangableData.getOnlineBlockFacing(); + if (blockFacing != null) { + if (onlineBlock.getBlockData() instanceof Rotatable rotatable) { + rotatable.setRotation(blockFacing); + onlineBlock.setBlockData(rotatable); + } + } + } if (nmsUtils != null) { nmsUtils.getEntityUtils().setPiglinDancing(piglin, true); } @@ -382,19 +404,37 @@ nmsUtils.getEntityUtils().setPiglinDancing(piglin, false); } HangableData hangableData = data.getHangableData(); - boolean isHangable; - if (hangableData == null) { - isHangable = false; - } else { + boolean isHangable = false; + if (hangableData != null) { isHangable = hangableData.isHangable(); } if (isHangable) { - Location location = piglin.getLocation().clone(); - location.setPitch(45); - piglin.teleport(location); + Location location = piglin.getLocation().clone(); + location.setPitch(45); + piglin.teleport(location); } else { piglin.getEquipment().setItemInOffHand(new ItemStack(Material.GOLD_INGOT)); } + + if (hangableData != null && hangableData.getOfflineBlockLocation() != null && hangableData.getOnlineBlockLocation() != null) { + Block offlineBlock = hangableData.getOfflineBlockLocation().getBlock(); + offlineBlock.setType(Material.PLAYER_HEAD); + String nbt = hangableData.getOfflineBlockNbt(); + Integer version = hangableData.getOfflineBlockNbtVersion(); + if (nbt != null && version != null) { + CompoundTag tag = plugin.nmsUtils.getNbtUtils().updateBlockEntity(plugin.nmsUtils.getNbtUtils().parseString(nbt), version); + plugin.nmsUtils.getNbtUtils().setBlockEntityNbt(offlineBlock, tag); + Block onlineBlock = hangableData.getOnlineBlockLocation().getBlock(); + onlineBlock.setType(Material.AIR); + } + BlockFace blockFacing = hangableData.getOfflineBlockFacing(); + if (blockFacing != null) { + if (offlineBlock.getBlockData() instanceof Rotatable rotatable) { + rotatable.setRotation(blockFacing); + offlineBlock.setBlockData(rotatable); + } + } + } } case RUNNING -> { piglin.getEquipment().clear(); diff --git a/Lobby/src/main/java/de/fanta/lobby/commands/PiglinCommand/HangableDataPiglinCommand.java b/Lobby/src/main/java/de/fanta/lobby/commands/PiglinCommand/HangableDataPiglinCommand.java index 18c6f70..6ab4449 100644 --- a/Lobby/src/main/java/de/fanta/lobby/commands/PiglinCommand/HangableDataPiglinCommand.java +++ b/Lobby/src/main/java/de/fanta/lobby/commands/PiglinCommand/HangableDataPiglinCommand.java @@ -7,6 +7,8 @@ import de.iani.cubesideutils.commands.ArgsParser; import org.bukkit.Location; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.Rotatable; import org.bukkit.block.data.type.Fence; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -59,7 +61,7 @@ return false; } if (hangableData == null) { - hangableData = new HangableData(isHangable, null, null, null, null, null); + hangableData = new HangableData(isHangable, null, null, null, null, null, null, null, null, null); } hangableData.setHangable(isHangable); data.setHangableData(hangableData); @@ -67,13 +69,13 @@ } case "fenceLocation" -> { Block block = getTargetBlock(player); - if (!(block.getBlockData() instanceof Fence)) { + if (block == null || !(block.getBlockData() instanceof Fence)) { plugin.getComponentUtil().sendWarningMessage(player, "Du musst einen Zaun anschauen."); return true; } Location fenceLocation = block.getLocation(); if (hangableData == null) { - hangableData = new HangableData(false, fenceLocation, null, null, null, null); + hangableData = new HangableData(false, fenceLocation, null, null, null, null, null, null, null, null); } hangableData.setFenceLocation(fenceLocation); data.setHangableData(hangableData); @@ -87,12 +89,33 @@ } Location blockLaction = block.getLocation(); if (hangableData == null) { - hangableData = new HangableData(false, null, null, blockLaction, null, null); + hangableData = new HangableData(false, null, null, null, blockLaction, null, null, null, null, null); } hangableData.setOnlineBlockLocation(blockLaction); + if (block.getBlockData() instanceof Rotatable rotatable) { + BlockFace blockFace = rotatable.getRotation(); + hangableData.setOnlineBlockFacing(blockFace); + } data.setHangableData(hangableData); plugin.getComponentUtil().sendNormalMessage(player, "Die Onlineblock Location von " + serverName + " wurde erfolgreich gesetzt."); } + case "onlineBlockNbt" -> { + Block block = getTargetBlock(player); + if (block == null) { + plugin.getComponentUtil().sendWarningMessage(player, "Du musst einen Block anschauen."); + return true; + } + if (hangableData == null) { + plugin.getComponentUtil().sendErrorMessage(player, "HangableData muss aktiv sein."); + return true; + } + String nbt = plugin.nmsUtils.getNbtUtils().writeString(plugin.nmsUtils.getNbtUtils().getBlockEntityNbt(block)); + int nbtVersion = plugin.nmsUtils.getNbtUtils().getCurrentDataVersion(); + hangableData.setOnlineBlockNbt(nbt); + hangableData.setOnlineBlockNbtVersion(nbtVersion); + data.setHangableData(hangableData); + plugin.getComponentUtil().sendNormalMessage(player, "OnlineblockNbt von " + serverName + " erfolgreich gesetzt."); + } case "offlineBlockLocation" -> { Block block = getTargetBlock(player); if (block == null) { @@ -101,11 +124,32 @@ } Location blockLaction = block.getLocation(); if (hangableData == null) { - hangableData = new HangableData(false, null, null, null, null, blockLaction); + hangableData = new HangableData(false, null, null, null, null, null, null,null , blockLaction, null); } hangableData.setOfflineBlockLocation(blockLaction); + if (block.getBlockData() instanceof Rotatable rotatable) { + BlockFace blockFace = rotatable.getRotation(); + hangableData.setOfflineBlockFacing(blockFace); + } data.setHangableData(hangableData); - plugin.getComponentUtil().sendNormalMessage(player, "Die Offlineblock von " + serverName + " wurde erfolgreich gesetzt."); + plugin.getComponentUtil().sendNormalMessage(player, "Die Offlineblock Location von " + serverName + " wurde erfolgreich gesetzt."); + } + case "offlineBlockNbt" -> { + Block block = getTargetBlock(player); + if (block == null) { + plugin.getComponentUtil().sendWarningMessage(player, "Du musst einen Block anschauen."); + return true; + } + if (hangableData == null) { + plugin.getComponentUtil().sendErrorMessage(player, "HangableData muss aktiv sein."); + return true; + } + String nbt = plugin.nmsUtils.getNbtUtils().writeString(plugin.nmsUtils.getNbtUtils().getBlockEntityNbt(block)); + int nbtVersion = plugin.nmsUtils.getNbtUtils().getCurrentDataVersion(); + hangableData.setOfflineBlockNbt(nbt); + hangableData.setOfflineBlockNbtVersion(nbtVersion); + data.setHangableData(hangableData); + plugin.getComponentUtil().sendNormalMessage(player, "OfflineblockNbt von " + serverName + " erfolgreich gesetzt."); } default -> { return false; @@ -131,7 +175,7 @@ } String enabled = args.getNext(); if (!args.hasNext()) { - return List.of("enabled", "fenceLocation", "onlineBlockLocation", "offlineBlockLocation"); + return List.of("enabled", "fenceLocation", "onlineBlockLocation", "onlineBlockNbt", "offlineBlockLocation", "offlineBlockNbt"); } args.next(); if (enabled.equalsIgnoreCase("enabled")) {