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 0a769843c7..12fcdb0998 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -56,6 +56,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(new EntityDamagedScriptEvent()); ScriptEvent.registerScriptEvent(new EntityDeathScriptEvent()); ScriptEvent.registerScriptEvent(new EntityDespawnScriptEvent()); + ScriptEvent.registerScriptEvent(new EntityDropsItemScriptEvent()); ScriptEvent.registerScriptEvent(new EntityEntersPortalScriptEvent()); ScriptEvent.registerScriptEvent(new EntityEntersVehicleScriptEvent()); ScriptEvent.registerScriptEvent(new EntityExitsPortalScriptEvent()); @@ -131,7 +132,6 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(new PlayerCraftsItemScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerDamagesBlockScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerDragsInInvScriptEvent()); - ScriptEvent.registerScriptEvent(new PlayerDropsItemScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerEditsBookScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerEmptiesBucketScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerEntersBedScriptEvent()); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDropsItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java similarity index 51% rename from plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDropsItemScriptEvent.java rename to plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java index 739d7f4547..12cfa096c0 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerDropsItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/entity/EntityDropsItemScriptEvent.java @@ -1,4 +1,4 @@ -package com.denizenscript.denizen.events.player; +package com.denizenscript.denizen.events.entity; import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.objects.ItemTag; @@ -10,46 +10,55 @@ import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent; -public class PlayerDropsItemScriptEvent extends BukkitScriptEvent implements Listener { +public class EntityDropsItemScriptEvent extends BukkitScriptEvent implements Listener { // <--[event] // @Events - // player drops item - // player drops + // entity drops item + // drops // - // @Regex ^on player drops [^\s]+$ + // @Regex ^on [^\s]+ drops [^\s]+$ // - // @Group Player + // @Group Entity // // @Location true // // @Cancellable true // - // @Triggers when a player drops an item. + // @Triggers when an entity drops an item. // // @Context // returns the ItemTag. // returns a EntityTag of the item. + // returns the EntityTag that dropped the item. // returns a LocationTag of the item's location. // - // @Player Always. + // @Player When the entity dropping an item is a player. // // --> - public PlayerDropsItemScriptEvent() { + public EntityDropsItemScriptEvent() { instance = this; } - public static PlayerDropsItemScriptEvent instance; + public static EntityDropsItemScriptEvent instance; public ItemTag item; public LocationTag location; - public PlayerDropItemEvent event; + public EntityTag itemEntity; + public EntityTag dropper; @Override public boolean couldMatch(ScriptPath path) { - if (!path.eventLower.startsWith("player drops")) { + if (!path.eventArgLowerAt(1).equals("drops")) { + return false; + } + if (!couldMatchEntity(path.eventArgLowerAt(0))) { + return false; + } + if (path.eventArgLowerAt(2).equals("from")) { return false; } if (!couldMatchItem(path.eventArgLowerAt(2))) { @@ -60,6 +69,9 @@ public boolean couldMatch(ScriptPath path) { @Override public boolean matches(ScriptPath path) { + if (!tryEntity(dropper, path.eventArgLowerAt(0))) { + return false; + } String iCheck = path.eventArgLowerAt(2); if (!iCheck.equals("item") && !tryItem(item, iCheck)) { return false; @@ -72,12 +84,12 @@ public boolean matches(ScriptPath path) { @Override public String getName() { - return "PlayerDropsItem"; + return "EntityDropsItem"; } @Override public ScriptEntryData getScriptEntryData() { - return new BukkitScriptEntryData(event.getPlayer()); + return new BukkitScriptEntryData(dropper); } @Override @@ -86,7 +98,10 @@ public ObjectTag getContext(String name) { return item; } else if (name.equals("entity")) { - return new EntityTag(event.getItemDrop()); + return itemEntity; + } + else if (name.equals("dropped_by")) { + return dropper.getDenizenObject(); } else if (name.equals("location")) { return location; @@ -96,14 +111,21 @@ else if (name.equals("location")) { @EventHandler public void onPlayerDropsItem(PlayerDropItemEvent event) { - if (EntityTag.isNPC(event.getPlayer())) { - return; - } - location = new LocationTag(event.getPlayer().getLocation()); - Item itemDrop = event.getItemDrop(); - EntityTag.rememberEntity(itemDrop); - item = new ItemTag(itemDrop.getItemStack()); - this.event = event; + dropper = new EntityTag(event.getPlayer()); + location = dropper.getLocation(); + itemEntity = new EntityTag(event.getItemDrop()); + EntityTag.rememberEntity(itemEntity.getBukkitEntity()); + item = new ItemTag(((Item) itemEntity.getBukkitEntity()).getItemStack()); + fire(event); + } + + @EventHandler + public void onEntityDropsItem(EntityDropItemEvent event) { + dropper = new EntityTag(event.getEntity()); + location = dropper.getLocation(); + itemEntity = new EntityTag(event.getItemDrop()); + EntityTag.rememberEntity(itemEntity.getBukkitEntity()); + item = new ItemTag(((Item) itemEntity.getBukkitEntity()).getItemStack()); fire(event); } }