From cfbd9e6039ca9cde70b20453d8559c81ac76e45a Mon Sep 17 00:00:00 2001 From: pietelite Date: Sun, 3 May 2020 00:09:03 -0400 Subject: [PATCH] Introducing ChangeSignListener for handling data when placing signs --- src/main/java/com/helion3/prism/Prism.java | 2 + .../helion3/prism/api/records/SignResult.java | 19 ++++++++ .../prism/configuration/Configuration.java | 1 + .../configuration/category/EventCategory.java | 11 +++++ .../prism/listeners/ChangeSignListener.java | 47 +++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 src/main/java/com/helion3/prism/api/records/SignResult.java create mode 100644 src/main/java/com/helion3/prism/listeners/ChangeSignListener.java diff --git a/src/main/java/com/helion3/prism/Prism.java b/src/main/java/com/helion3/prism/Prism.java index 384ffa1..27c124a 100644 --- a/src/main/java/com/helion3/prism/Prism.java +++ b/src/main/java/com/helion3/prism/Prism.java @@ -50,6 +50,7 @@ import com.helion3.prism.configuration.Config; import com.helion3.prism.configuration.Configuration; import com.helion3.prism.listeners.ChangeBlockListener; +import com.helion3.prism.listeners.ChangeSignListener; import com.helion3.prism.listeners.EntityListener; import com.helion3.prism.listeners.InventoryListener; import com.helion3.prism.listeners.RequiredInteractListener; @@ -171,6 +172,7 @@ public void onInitialization(GameInitializationEvent event) { Sponge.getEventManager().registerListeners(getPluginContainer(), new ChangeBlockListener()); Sponge.getEventManager().registerListeners(getPluginContainer(), new EntityListener()); Sponge.getEventManager().registerListeners(getPluginContainer(), new InventoryListener()); +// Sponge.getEventManager().registerListeners(getPluginContainer(), new ChangeSignListener()); // Events required for internal operation Sponge.getEventManager().registerListeners(getPluginContainer(), new RequiredInteractListener()); diff --git a/src/main/java/com/helion3/prism/api/records/SignResult.java b/src/main/java/com/helion3/prism/api/records/SignResult.java new file mode 100644 index 0000000..dd1cc5f --- /dev/null +++ b/src/main/java/com/helion3/prism/api/records/SignResult.java @@ -0,0 +1,19 @@ +package com.helion3.prism.api.records; + +public class SignResult extends ResultComplete implements Actionable { + @Override + public ActionableResult rollback() throws Exception { + + // TODO implement + return ActionableResult.skipped(SkipReason.UNIMPLEMENTED); + + } + + @Override + public ActionableResult restore() throws Exception { + + // TODO implement + return ActionableResult.skipped(SkipReason.UNIMPLEMENTED); + + } +} diff --git a/src/main/java/com/helion3/prism/configuration/Configuration.java b/src/main/java/com/helion3/prism/configuration/Configuration.java index 8a08637..0865777 100644 --- a/src/main/java/com/helion3/prism/configuration/Configuration.java +++ b/src/main/java/com/helion3/prism/configuration/Configuration.java @@ -135,6 +135,7 @@ private void convertConfiguration(ConfigurationNode configurationNode) { getConfig().getEventCategory().setBlockDecay(events.getNode("decay").getBoolean(true)); getConfig().getEventCategory().setBlockGrow(events.getNode("grow").getBoolean(true)); getConfig().getEventCategory().setBlockPlace(events.getNode("place").getBoolean(true)); + getConfig().getEventCategory().setSignChange(events.getNode("signchange").getBoolean(true)); getConfig().getEventCategory().setCommandExecute(events.getNode("command").getBoolean(false)); getConfig().getEventCategory().setEntityDeath(events.getNode("death").getBoolean(true)); getConfig().getEventCategory().setInventoryClose(events.getNode("close").getBoolean(false)); diff --git a/src/main/java/com/helion3/prism/configuration/category/EventCategory.java b/src/main/java/com/helion3/prism/configuration/category/EventCategory.java index 519a8b1..3992ddd 100644 --- a/src/main/java/com/helion3/prism/configuration/category/EventCategory.java +++ b/src/main/java/com/helion3/prism/configuration/category/EventCategory.java @@ -42,6 +42,9 @@ public class EventCategory { @Setting(value = "block-place", comment = "Log when blocks are placed") private boolean blockPlace = true; + @Setting(value = "sign-change", comment = "Log when a sign is changed") + private boolean signChange = true; + @Setting(value = "command-execute", comment = "Log when commands are executed") private boolean commandExecute = false; @@ -104,6 +107,14 @@ public void setBlockPlace(boolean blockPlace) { this.blockPlace = blockPlace; } + public boolean isSignChange() { + return signChange; + } + + public void setSignChange(boolean signChange) { + this.signChange = signChange; + } + public boolean isCommandExecute() { return commandExecute; } diff --git a/src/main/java/com/helion3/prism/listeners/ChangeSignListener.java b/src/main/java/com/helion3/prism/listeners/ChangeSignListener.java new file mode 100644 index 0000000..9358d0b --- /dev/null +++ b/src/main/java/com/helion3/prism/listeners/ChangeSignListener.java @@ -0,0 +1,47 @@ +package com.helion3.prism.listeners; + +import com.helion3.prism.Prism; +import org.spongepowered.api.block.tileentity.Sign; +import org.spongepowered.api.data.manipulator.mutable.tileentity.SignData; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.block.tileentity.ChangeSignEvent; + +public class ChangeSignListener { + + /** + * Listens to the base change block event. + * + * @param event ChangeBlockEvent + */ + @Listener(order = Order.POST) + public void onChangeSign(ChangeSignEvent event) { + if (event.getCause().first(Player.class).map(Player::getUniqueId).map(Prism.getInstance().getActiveWands()::contains).orElse(false)) { + // Cancel and exit event here, not supposed to place/track a block with an active wand. + event.setCancelled(true); + return; + } + + if (!Prism.getInstance().getConfig().getEventCategory().isSignChange()) { + return; + } + Sign tileEntity = event.getTargetTile(); + + // TODO implement + + // Get relevant data from this event -- namely, the changed sign data + SignData originalSignData = tileEntity.getSignData(); + SignData finalSignData = event.getText(); + + // Create prism record +// PrismRecord.create() +// .source(event.getCause()) +// .signOriginal(originalSignData) +// .signReplacement(finalSignData) +// .location(tileEntity.getLocation()) +// .event(PrismEvents.SIGN_CHANGE) +// .target(tileEntity.getBlock().getId().replace("_", " ")) +// .buildAndSave(); + } +}