From ff9386ca8e2c703776ea410200b8cce47000f321 Mon Sep 17 00:00:00 2001 From: Fortifier42 Date: Tue, 4 Aug 2020 12:02:59 +1000 Subject: [PATCH] Minor updates (#2241) * Added MaterialTag.count support for Respawn Anchor Charges. * Added Turtle Egg hatch count. MaterialTag.hatch_count Tag & Mechanism MaterialTag.hatch_count_max Tag * Add EntityPicksUp Item Event (1.16.1) Deprecates "PlayerPickupItemEvent". Added extra check in inventory picks up item event to remove any possible matches. * Meta Fixes cause hadurrr * That explains that --- .../denizen/events/ScriptEventRegistry.java | 5 +- .../EntityPicksUpItemScriptEvent.java} | 71 +++++++++++-------- .../item/InventoryPicksUpItemScriptEvent.java | 2 +- .../properties/material/MaterialCount.java | 54 ++++++++++---- 4 files changed, 88 insertions(+), 44 deletions(-) rename plugin/src/main/java/com/denizenscript/denizen/events/{player/PlayerPicksUpScriptEvent.java => entity/EntityPicksUpItemScriptEvent.java} (61%) diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index 4c7c05417c..947b132651 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -13,6 +13,7 @@ import com.denizenscript.denizen.nms.NMSHandler; import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizencore.events.ScriptEvent; +import net.citizensnpcs.util.NMS; public class ScriptEventRegistry { @@ -65,6 +66,9 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(new EntityHealsScriptEvent()); ScriptEvent.registerScriptEvent(new EntityInteractScriptEvent()); ScriptEvent.registerScriptEvent(new EntityKilledScriptEvent()); + if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16)) { + ScriptEvent.registerScriptEvent(new EntityPicksUpItemScriptEvent()); + } ScriptEvent.registerScriptEvent(new EntityPotionEffectScriptEvent()); ScriptEvent.registerScriptEvent(new EntityResurrectScriptEvent()); if (!Denizen.supportsPaper) { @@ -144,7 +148,6 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(new PlayerLoginScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerMendsItemScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerOpensInvScriptEvent()); - ScriptEvent.registerScriptEvent(new PlayerPicksUpScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerPlacesBlockScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerPlacesHangingScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerPreLoginScriptEvent()); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPicksUpScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPicksUpItemScriptEvent.java similarity index 61% rename from plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPicksUpScriptEvent.java rename to plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPicksUpItemScriptEvent.java index 1b8e69c203..f58d88f09f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPicksUpScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityPicksUpItemScriptEvent.java @@ -1,33 +1,35 @@ -package com.denizenscript.denizen.events.player; +package com.denizenscript.denizen.events.entity; -import com.denizenscript.denizen.objects.EntityTag; -import com.denizenscript.denizen.objects.ItemTag; -import com.denizenscript.denizen.objects.LocationTag; -import com.denizenscript.denizen.objects.PlayerTag; -import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.*; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; import com.denizenscript.denizencore.objects.ObjectTag; import com.denizenscript.denizencore.scripts.ScriptEntryData; import com.denizenscript.denizencore.utilities.CoreUtilities; import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import java.util.HashSet; import java.util.Set; import java.util.UUID; -public class PlayerPicksUpScriptEvent extends BukkitScriptEvent implements Listener { +public class EntityPicksUpItemScriptEvent extends BukkitScriptEvent implements Listener { // <--[event] // @Events - // player picks up item - // player picks up - // player takes item - // player takes + // entity picks up item + // entity picks up + // picks up + // picks up item + // entity takes item + // entity takes + // takes item + // takes // - // @Regex ^on player (picks up|takes) [^\s]+$ + // @Regex ^on [^\s]+ picks up [^\s]+$ // // @Group Player // @@ -35,40 +37,47 @@ public class PlayerPicksUpScriptEvent extends BukkitScriptEvent implements Liste // // @Cancellable true // - // @Triggers when a player picks up an item. + // @Triggers when an entity picks up an item. // // @Context // returns the ItemTag. - // returns a EntityTag of the item. + // returns the EntityTag of the item being picked up. + // returns the EntityTag of the entity picking up the item. // returns a LocationTag of the item's location. // // @Determine // "ITEM:" + ItemTag to changed the item being picked up. // - // @Player Always. + // @Player when the entity picking up the item is a player. + // + // @NPC when the entity picking up the item is an npc. // // --> - public PlayerPicksUpScriptEvent() { + public EntityPicksUpItemScriptEvent() { instance = this; } - public static PlayerPicksUpScriptEvent instance; + public static EntityPicksUpItemScriptEvent instance; public ItemTag item; + public EntityTag entity; public LocationTag location; - public PlayerPickupItemEvent event; + public EntityPickupItemEvent event; private static final Set editedItems = new HashSet<>(); @Override public boolean couldMatch(ScriptPath path) { - boolean isUp = path.eventLower.startsWith("player picks up"); - if (!isUp && !path.eventLower.startsWith("player takes")) { + boolean isUp = path.eventLower.contains("picks up"); + if (!isUp && !path.eventArgLowerAt(1).equals("takes")) { return false; } if (path.eventArgLowerAt(3).equals("from")) { return false; } + if (!couldMatchEntity(path.eventArgLowerAt(0))) { + return false; + } if (!couldMatchItem(path.eventArgLowerAt(isUp ? 3 : 2))) { return false; } @@ -77,9 +86,11 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { - String iTest = path.eventArgLowerAt(1).equals("picks") ? - path.eventArgLowerAt(3) : path.eventArgLowerAt(2); - if (!tryItem(item, iTest)) { + if (!tryEntity(entity, path.eventArgAt(0))) { + return false; + } + String itemTest = path.eventArgLowerAt(path.eventArgLowerAt(1).equals("picks") ? 3 : 2); + if (!tryItem(item, itemTest)) { return false; } if (!runInCheck(path, location)) { @@ -90,7 +101,7 @@ public boolean matches(ScriptPath path) { @Override public String getName() { - return "PlayerPicksUp"; + return "EntityPicksUpItem"; } @Override @@ -109,7 +120,8 @@ public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { @Override public ScriptEntryData getScriptEntryData() { - return new BukkitScriptEntryData(new PlayerTag(event.getPlayer()), null); + return new BukkitScriptEntryData(entity.isPlayer() ? entity.getDenizenPlayer() : null, + entity.isNPC() ? entity.getDenizenNPC() : null); } @Override @@ -120,6 +132,9 @@ public ObjectTag getContext(String name) { else if (name.equals("entity")) { return new EntityTag(event.getItem()); } + else if (name.equals("pickup_entity")) { + return entity; + } else if (name.equals("location")) { return location; } @@ -127,10 +142,8 @@ else if (name.equals("location")) { } @EventHandler - public void onPlayerPicksUp(PlayerPickupItemEvent event) { - if (EntityTag.isNPC(event.getPlayer())) { - return; - } + public void onEntityPicksUpItem(EntityPickupItemEvent event) { + entity = new EntityTag(event.getEntity()); Item itemEntity = event.getItem(); UUID itemUUID = itemEntity.getUniqueId(); if (editedItems.contains(itemUUID)) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/item/InventoryPicksUpItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/item/InventoryPicksUpItemScriptEvent.java index b9b8f894ee..f1e30dde0b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/item/InventoryPicksUpItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/item/InventoryPicksUpItemScriptEvent.java @@ -49,7 +49,7 @@ public boolean couldMatch(ScriptPath path) { if (!path.eventArgLowerAt(1).equals("picks") || !path.eventArgLowerAt(2).equals("up")) { return false; } - if (path.eventArgLowerAt(0).equals("player")) { + if (couldMatchEntity(path.eventArgLowerAt(0))) { return false; } if (!couldMatchInventory(path.eventArgLowerAt(0))) { diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java index 656d6aca5f..683abadb9f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/material/MaterialCount.java @@ -1,5 +1,7 @@ package com.denizenscript.denizen.objects.properties.material; +import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.objects.MaterialTag; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizencore.objects.Mechanism; @@ -7,6 +9,8 @@ import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.RespawnAnchor; import org.bukkit.block.data.type.SeaPickle; import org.bukkit.block.data.type.TurtleEgg; @@ -16,7 +20,9 @@ public static boolean describes(ObjectTag material) { return material instanceof MaterialTag && ((MaterialTag) material).hasModernData() && (((MaterialTag) material).getModernData().data instanceof SeaPickle - || ((MaterialTag) material).getModernData().data instanceof TurtleEgg); + || ((MaterialTag) material).getModernData().data instanceof TurtleEgg + || (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16) + && ((MaterialTag) material).getModernData().data instanceof RespawnAnchor)); } public static MaterialCount getFrom(ObjectTag _material) { @@ -46,7 +52,7 @@ public static void registerTags() { // @mechanism MaterialTag.count // @group properties // @description - // Returns the amount of pickles in a Sea Pickle material, or eggs in a TurtleEgg material. + // Returns the amount of pickles in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material. // --> PropertyParser.registerTag("count", (attribute, material) -> { return new ElementTag(material.getCurrent()); @@ -58,7 +64,7 @@ public static void registerTags() { // @mechanism MaterialTag.count // @group properties // @description - // Returns the maximum amount of pickles allowed in a Sea Pickle material, or eggs in a TurtleEgg material. + // Returns the maximum amount of pickles allowed in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material. // --> PropertyParser.registerTag("count_max", (attribute, material) -> { return new ElementTag(material.getMax()); @@ -70,51 +76,70 @@ public static void registerTags() { // @mechanism MaterialTag.count // @group properties // @description - // Returns the minimum amount of pickles allowed in a Sea Pickle material, or eggs in a TurtleEgg material. + // Returns the minimum amount of pickles allowed in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material. // --> PropertyParser.registerTag("count_min", (attribute, material) -> { return new ElementTag(material.getMin()); }, "pickle_min"); + } + public boolean isSeaPickle() { + return material.getModernData().data instanceof SeaPickle; } - public SeaPickle getSeaPickle() { - return (SeaPickle) material.getModernData().data; + public boolean isTurtleEgg() { + return material.getModernData().data instanceof TurtleEgg; + } + + public boolean isRespawnAnchor() { + return NMSHandler.getVersion().isAtLeast(NMSVersion.v1_16) && material.getModernData().data instanceof RespawnAnchor; } public TurtleEgg getTurtleEgg() { return (TurtleEgg) material.getModernData().data; } - public boolean isSeaPickle() { - return material.getModernData().data instanceof SeaPickle; + public SeaPickle getSeaPickle() { + return (SeaPickle) material.getModernData().data; } public int getCurrent() { if (isSeaPickle()) { return getSeaPickle().getPickles(); } - else { + else if (isTurtleEgg()) { return getTurtleEgg().getEggs(); } + else if (isRespawnAnchor()) { + return ((RespawnAnchor) material.getModernData().data).getCharges(); + } + return 0; } public int getMax() { if (isSeaPickle()) { return getSeaPickle().getMaximumPickles(); } - else { + else if (isTurtleEgg()) { return getTurtleEgg().getMaximumEggs(); } + else if (isRespawnAnchor()) { + return ((RespawnAnchor) material.getModernData().data).getMaximumCharges(); + } + return 0; } public int getMin() { if (isSeaPickle()) { return getSeaPickle().getMinimumPickles(); } - else { + else if (isTurtleEgg()) { return getTurtleEgg().getMinimumEggs(); } + else if (isRespawnAnchor()) { + return 0; + } + return 0; } @Override @@ -135,7 +160,7 @@ public void adjust(Mechanism mechanism) { // @name count // @input ElementTag(Number) // @description - // Sets the amount of pickles in a Sea Pickle material, or eggs in a TurtleEgg material. + // Sets the amount of pickles in a Sea Pickle material, or eggs in a Turtle Egg material, or charges in a Respawn Anchor material. // @tags // // @@ -150,9 +175,12 @@ public void adjust(Mechanism mechanism) { if (isSeaPickle()) { getSeaPickle().setPickles(count); } - else { + else if (isTurtleEgg()) { getTurtleEgg().setEggs(count); } + else if (isRespawnAnchor()) { + ((RespawnAnchor) material.getModernData().data).setCharges(count); + } } } }