From aab03649825227229c745ef7443563bdc1f3441d Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Thu, 4 Mar 2021 21:32:27 -0800 Subject: [PATCH] switch command modernization --- .../denizen/objects/EntityTag.java | 2 +- .../denizen/objects/LocationTag.java | 2 +- .../material/MaterialSwitchable.java | 2 +- .../commands/world/AdjustBlockCommand.java | 19 +++++--- .../commands/world/ModifyBlockCommand.java | 5 ++- .../commands/world/PlayEffectCommand.java | 2 +- .../scripts/commands/world/SignCommand.java | 2 +- .../scripts/commands/world/SwitchCommand.java | 45 +++++++++++++------ .../denizen/utilities/Utilities.java | 2 +- .../denizen/utilities/blocks/FakeBlock.java | 2 +- 10 files changed, 54 insertions(+), 29 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java index f81a57089a..861650fd0e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/EntityTag.java @@ -1582,7 +1582,7 @@ else if (mtr.angle == BlockFace.EAST) { if (!(object.entity instanceof FallingBlock)) { return null; } - return new MaterialTag(new ModernBlockData(((FallingBlock) object.entity).getBlockData())); + return new MaterialTag(((FallingBlock) object.entity).getBlockData()); }); // <--[tag] diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 42c174f165..ea9c879326 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -3468,7 +3468,7 @@ public void adjust(Mechanism mechanism) { return; } MaterialDirectional.getFrom(material).setFacing(Utilities.faceFor(faceVec.toVector())); - material.getModernData().setToBlock(block); + block.setBlockData(material.getModernData()); } // <--[mechanism] diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java index 41231cca60..a18ee821e9 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialSwitchable.java @@ -39,7 +39,7 @@ private MaterialSwitchable(MaterialTag _material) { material = _material; } - MaterialTag material; + public MaterialTag material; public static void registerTags() { diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/AdjustBlockCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/AdjustBlockCommand.java index 3abaa6dd97..cc6abb146b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/AdjustBlockCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/AdjustBlockCommand.java @@ -10,6 +10,7 @@ import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import com.denizenscript.denizencore.utilities.debugging.Debug; +import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -110,17 +111,21 @@ public void execute(ScriptEntry scriptEntry) { specialMaterial.safeAdjust(mechanism); if (doPhysics) { block.setBlockData(data, false); - NMSHandler.getBlockHelper().applyPhysics(location); - NMSHandler.getBlockHelper().applyPhysics(location.clone().add(1, 0, 0)); - NMSHandler.getBlockHelper().applyPhysics(location.clone().add(-1, 0, 0)); - NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, 0, 1)); - NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, 0, -1)); - NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, 1, 0)); - NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, -1, 0)); + applyPhysicsAt(location); } else { ModifyBlockCommand.setBlock(block.getLocation(), specialMaterial, false, null); } } } + + public static void applyPhysicsAt(Location location) { + NMSHandler.getBlockHelper().applyPhysics(location); + NMSHandler.getBlockHelper().applyPhysics(location.clone().add(1, 0, 0)); + NMSHandler.getBlockHelper().applyPhysics(location.clone().add(-1, 0, 0)); + NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, 0, 1)); + NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, 0, -1)); + NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, 1, 0)); + NMSHandler.getBlockHelper().applyPhysics(location.clone().add(0, -1, 0)); + } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/ModifyBlockCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/ModifyBlockCommand.java index 5570bd8395..c095ccfa22 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/ModifyBlockCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/ModifyBlockCommand.java @@ -19,6 +19,7 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.block.BlockState; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; @@ -380,7 +381,9 @@ void handleLocation(LocationTag location, int index, List materialL event = new BlockBreakEvent(location.getBlock(), source); } else { - event = new BlockPlaceEvent(location.getBlock(), material.getModernData().getBlockState(), location.getBlock(), new ItemTag(material, 1).getItemStack(), source, true, EquipmentSlot.HAND); + BlockState state = NMSHandler.getBlockHelper().generateBlockState(material.getMaterial()); + state.setBlockData(material.getModernData()); + event = new BlockPlaceEvent(location.getBlock(), state, location.getBlock(), new ItemTag(material, 1).getItemStack(), source, true, EquipmentSlot.HAND); } Bukkit.getPluginManager().callEvent(event); if (((Cancellable) event).isCancelled()) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java index 8d438cddf1..845ea64ae4 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/PlayEffectCommand.java @@ -285,7 +285,7 @@ else if (clazz == org.bukkit.Particle.DustOptions.class) { } else if (clazz == BlockData.class) { MaterialTag blockMaterial = MaterialTag.valueOf(special_data.asString(), scriptEntry.getContext()); - dataObject = blockmaterial.getModernData(); + dataObject = blockMaterial.getModernData(); } else if (clazz == ItemStack.class) { ItemTag itemType = ItemTag.valueOf(special_data.asString(), scriptEntry.getContext()); diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SignCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SignCommand.java index e1ca783ce7..800e94501e 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SignCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SignCommand.java @@ -104,7 +104,7 @@ public void setWallSign(Block sign, BlockFace bf, MaterialTag material) { sign.setType(material == null ? Material.OAK_WALL_SIGN : material.getMaterial(), false); MaterialTag signMaterial = new MaterialTag(sign); MaterialDirectional.getFrom(signMaterial).setFacing(bf); - signMaterial.getModernData().setToBlock(sign); + sign.setBlockData(signMaterial.getModernData()); } @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SwitchCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SwitchCommand.java index 97c93873d7..47635c4c21 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SwitchCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/SwitchCommand.java @@ -1,6 +1,7 @@ package com.denizenscript.denizen.scripts.commands.world; import com.denizenscript.denizen.Denizen; -import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizen.objects.MaterialTag; +import com.denizenscript.denizen.objects.properties.material.MaterialSwitchable; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizen.objects.LocationTag; import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; @@ -13,7 +14,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.entity.Player; +import org.bukkit.block.data.Bisected; import java.util.HashMap; import java.util.Map; @@ -107,7 +108,6 @@ public void execute(final ScriptEntry scriptEntry) { final ListTag interactLocations = scriptEntry.getObjectTag("locations"); long duration = ((DurationTag) scriptEntry.getObject("duration")).getTicks(); final SwitchState switchState = SwitchState.valueOf(scriptEntry.getElement("switchstate").asString()); - final Player player = Utilities.entryHasPlayer(scriptEntry) ? Utilities.getEntryPlayer(scriptEntry).getPlayerEntity() : null; // Switch the Block if (scriptEntry.dbCallShouldDebug()) { Debug.report(scriptEntry, getName(), interactLocations.debug() @@ -115,7 +115,7 @@ public void execute(final ScriptEntry scriptEntry) { + ArgumentHelper.debugObj("switchstate", switchState.name())); } for (final LocationTag interactLocation : interactLocations.filter(LocationTag.class, scriptEntry)) { - switchBlock(scriptEntry, interactLocation, switchState, player); + switchBlock(scriptEntry, interactLocation, switchState); // If duration set, schedule a delayed task. if (duration > 0) { // If this block already had a delayed task, cancel it. @@ -128,26 +128,43 @@ public void execute(final ScriptEntry scriptEntry) { } Debug.echoDebug(scriptEntry, "Setting delayed task 'SWITCH' for " + interactLocation.identify()); // Store new delayed task ID, for checking against, then schedule new delayed task. - taskMap.put(interactLocation, Bukkit.getScheduler().scheduleSyncDelayedTask(Denizen.getInstance(), () -> switchBlock(scriptEntry, interactLocation, SwitchState.TOGGLE, player), duration)); + taskMap.put(interactLocation, Bukkit.getScheduler().scheduleSyncDelayedTask(Denizen.getInstance(), () -> switchBlock(scriptEntry, interactLocation, SwitchState.TOGGLE), duration)); } } } public static boolean switchState(Block b) { - ModernBlockData mbd = new ModernBlockData(b); - Boolean switchState = mbd.getSwitchState(); - if (switchState != null) { - return switchState; + MaterialSwitchable switchable = MaterialSwitchable.getFrom(new MaterialTag(b.getBlockData())); + if (switchable == null) { + return false; } - return false; + return switchable.getState(); } // Break off this portion of the code from execute() so it can be used in both execute and the delayed runnable - public void switchBlock(ScriptEntry scriptEntry, Location interactLocation, SwitchState switchState, Player player) { - boolean currentState = switchState(interactLocation.getBlock()); + public void switchBlock(ScriptEntry scriptEntry, Location interactLocation, SwitchState switchState) { + MaterialSwitchable switchable = MaterialSwitchable.getFrom(new MaterialTag(interactLocation.getBlock().getBlockData())); + if (switchable == null) { + return; + } + boolean currentState = switchable.getState(); if ((switchState.equals(SwitchState.ON) && !currentState) || (switchState.equals(SwitchState.OFF) && currentState) || switchState.equals(SwitchState.TOGGLE)) { - ModernBlockData mbd = new ModernBlockData(interactLocation.getBlock()); - mbd.setSwitchState(interactLocation.getBlock(), !currentState); + switchable.setState(!currentState); + interactLocation.getBlock().setBlockData(switchable.material.getModernData()); + if (switchable.material.getModernData() instanceof Bisected) { + Location other = interactLocation.clone(); + if (((Bisected) switchable.material.getModernData()).getHalf() == Bisected.Half.TOP) { + other = other.add(0, -1, 0); + } + else { + other = other.add(0, 1, 0); + } + MaterialSwitchable switchable2 = MaterialSwitchable.getFrom(new MaterialTag(other.getBlock().getBlockData())); + switchable2.setState(!currentState); + other.getBlock().setBlockData(switchable2.material.getModernData()); + AdjustBlockCommand.applyPhysicsAt(other); + } + AdjustBlockCommand.applyPhysicsAt(interactLocation); Debug.echoDebug(scriptEntry, "Switched " + interactLocation.getBlock().getType().toString() + "! Current state now: " + (switchState(interactLocation.getBlock()) ? "ON" : "OFF")); } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index 48c9d40c71..dec188b87f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -371,7 +371,7 @@ else if (direction.startsWith("w")) { } MaterialTag signMaterial = new MaterialTag(signState.getBlock()); MaterialDirectional.getFrom(signMaterial).setFacing(bf); - signMaterial.getModernData().setToBlock(signState.getBlock()); + signState.getBlock().setBlockData(signMaterial.getModernData()); } /** diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/blocks/FakeBlock.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/blocks/FakeBlock.java index 2a71b42b47..f8977354c1 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/blocks/FakeBlock.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/blocks/FakeBlock.java @@ -134,7 +134,7 @@ private void updateBlock(MaterialTag material, DurationTag duration) { } this.material = material; if (player.hasChunkLoaded(location.getChunk())) { - material.getModernData().sendFakeChangeTo(player.getPlayerEntity(), location); + player.getPlayerEntity().sendBlockChange(location, material.getModernData()); if (material.getMaterial().name().endsWith("_BANNER")) { // Banners are weird location.getWorld().refreshChunk(chunkCoord.x, chunkCoord.z); }