From 926a0a62a03b47fd944e772e8f2f0d894570c27f Mon Sep 17 00:00:00 2001 From: David Cernat Date: Wed, 3 Jul 2013 21:40:24 +0300 Subject: [PATCH] Add "on player clicks in inventory" and "on player changes gamemode" world events. --- .../denizen/objects/dInventory.java | 35 ++++ .../containers/core/WorldScriptHelper.java | 164 ++++++++++++++---- .../tags/core/NotableLocationTags.java | 2 +- 3 files changed, 163 insertions(+), 38 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dInventory.java b/src/main/java/net/aufdemrand/denizen/objects/dInventory.java index 9c772c454b..922c31a9ee 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dInventory.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dInventory.java @@ -252,6 +252,33 @@ public dInventory fill(ItemStack[] items) { return this; } + /** + * Return the dLocation of this inventory's + * holder + * + * @return The holder's dLocation + * + */ + + public dLocation getLocation() { + + if (inventory != null) { + + InventoryHolder holder = inventory.getHolder(); + + if (holder instanceof BlockState) { + + return new dLocation(((BlockState) holder).getLocation()); + } + else if (holder instanceof Player) { + + return new dLocation(((Player) holder).getLocation()); + } + } + + return null; + } + /** * Remove an array of items from this inventory, * and return the result @@ -388,6 +415,14 @@ public String getAttribute(Attribute attribute) { } } + // Get the location of this inventory's holder + + if (attribute.startsWith("location")) { + + return new dLocation(getLocation()) + .getAttribute(attribute.fulfill(1)); + } + // Get the combined quantity of itemstacks that match an item if // one if specified, or the combined quantity of all itemstacks // if one is not diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java index 45bfc6a4b3..87713834f1 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/WorldScriptHelper.java @@ -39,6 +39,7 @@ import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.*; import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.event.weather.LightningStrikeEvent; @@ -318,15 +319,15 @@ public void entityDamage(EntityDamageEvent event) { Player contextPlayer = null; dNPC contextNPC = null; - if (entity instanceof Player) { - contextPlayer = (Player) entity; - context.put("entity", new dPlayer((Player) entity)); - } - else if (CitizensAPI.getNPCRegistry().isNPC(entity)) { + if (CitizensAPI.getNPCRegistry().isNPC(entity)) { contextNPC = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity)); context.put("entity", contextNPC); entityType = "npc"; } + else if (entity instanceof Player) { + contextPlayer = (Player) entity; + context.put("entity", new dPlayer((Player) entity)); + } else { context.put("entity", new dEntity(entity)); } @@ -367,14 +368,7 @@ else if (CitizensAPI.getNPCRegistry().isNPC(entity)) { Entity damager = subEvent.getDamager(); String damagerType = damager.getType().name(); - if (damager instanceof Player) { - subContextPlayer = (Player) entity; - context.put("damager", new dPlayer((Player) damager)); - - // If we had no player in our regular context, use this one - if (contextPlayer == null) contextPlayer = subContextPlayer; - } - else if (CitizensAPI.getNPCRegistry().isNPC(damager)) { + if (CitizensAPI.getNPCRegistry().isNPC(damager)) { subContextNPC = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity)); context.put("damager", DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(damager))); damagerType = "npc"; @@ -382,6 +376,13 @@ else if (CitizensAPI.getNPCRegistry().isNPC(damager)) { // If we had no NPC in our regular context, use this one if (contextNPC == null) contextNPC = subContextNPC; } + else if (damager instanceof Player) { + subContextPlayer = (Player) damager; + context.put("damager", new dPlayer((Player) damager)); + + // If we had no player in our regular context, use this one + if (contextPlayer == null) contextPlayer = subContextPlayer; + } else { context.put("damager", new dEntity(damager)); } @@ -447,25 +448,44 @@ public void entityExplode(EntityExplodeEvent event) { event.setCancelled(true); } - // TODO: Make work with all entities @EventHandler public void entityRegainHealth(EntityRegainHealthEvent event) { - if (event.getEntity() instanceof Player - && !CitizensAPI.getNPCRegistry().isNPC(event.getEntity())) { - Map context = new HashMap(); - context.put("reason", event.getRegainReason().toString()); - context.put("amount", String.valueOf(event.getAmount())); + Map context = new HashMap(); + Entity entity = event.getEntity(); + String entityType = entity.getType().name(); + + context.put("reason", event.getRegainReason().name()); + context.put("amount", event.getAmount()); + + Player player = null; + dNPC npc = null; + + if (CitizensAPI.getNPCRegistry().isNPC(entity)) { + npc = DenizenAPI.getDenizenNPC(CitizensAPI.getNPCRegistry().getNPC(entity)); + context.put("entity", npc); + entityType = "npc"; + } + else if (entity instanceof Player) { + player = (Player) entity; + context.put("entity", new dPlayer(player)); + } + else { + context.put("entity", new dEntity(entity)); + } - String determination = doEvents(Arrays.asList - ("player regains health"), - null, (Player) event.getEntity(), context); + String determination = doEvents(Arrays.asList + ("entity heals", + "entity heals because " + event.getRegainReason().name(), + entityType + " heals", + entityType + " heals because " + event.getRegainReason().name()), + npc, player, context); - if (determination.toUpperCase().startsWith("CANCELLED")) - event.setCancelled(true); - if (aH.matchesValueArg("AMOUNT", determination, aH.ArgumentType.Double)) - event.setAmount(aH.getDoubleFrom(determination)); - } + if (determination.toUpperCase().startsWith("CANCELLED")) + event.setCancelled(true); + + if (aH.matchesValueArg("AMOUNT", determination, aH.ArgumentType.Double)) + event.setAmount(aH.getDoubleFrom(determination)); } @EventHandler @@ -573,8 +593,8 @@ public void foodLevelChange(FoodLevelChangeEvent event) { new dPlayer((Player) entity) : new dEntity(entity)); - String determination = doEvents - (Arrays.asList(entity.getType().name() + " changes hunger"), + String determination = doEvents(Arrays.asList + (entity.getType().name() + " changes food level"), null, null, context); if (determination.toUpperCase().startsWith("CANCELLED")) @@ -584,12 +604,55 @@ public void foodLevelChange(FoodLevelChangeEvent event) { } + ///////////////////// + // INVENTORY EVENTS + ///////////////// + + @EventHandler + public void inventoryClickEvent(InventoryClickEvent event) { + + Map context = new HashMap(); + dItem item = new dItem(event.getCurrentItem()); + + Player player = (Player) event.getWhoClicked(); + String type = event.getInventory().getType().name(); + String click = event.getClick().name(); + + context.put("item", item); + context.put("inventory", new dInventory(event.getInventory())); + context.put("click", click); + + List events = new ArrayList(); + events.add("on player clicks in inventory"); + events.add("on player clicks in " + type + " inventory"); + + String interaction = "on player " + click + " clicks"; + + events.add(interaction + " in inventory"); + events.add(interaction + " in " + type + " inventory"); + events.add(interaction + " on " + + item.identify().split(":")[0] + " in inventory"); + events.add(interaction + " on " + + item.identify().split(":")[0] + " in " + type + " inventory"); + events.add(interaction + " on " + + item.identify() + " in inventory"); + events.add(interaction + " on " + + item.identify() + " in " + type + " inventory"); + + String determination = doEvents(events, null, player, context); + + if (determination.toUpperCase().startsWith("CANCELLED")) + event.setCancelled(true); + } + + ///////////////////// // PLAYER EVENTS ///////////////// @EventHandler(priority = EventPriority.LOWEST) public void playerChat(final AsyncPlayerChatEvent event) { + final Map context = new HashMap(); context.put("message", event.getMessage()); @@ -621,10 +684,12 @@ public String call() { @EventHandler public void bedEnterEvent(PlayerBedEnterEvent event) { + Map context = new HashMap(); context.put("location", new dLocation(event.getBed().getLocation())); - String determination = doEvents(Arrays.asList("player enters bed"), + String determination = doEvents + (Arrays.asList("player enters bed"), null, event.getPlayer(), context); if (determination.toUpperCase().startsWith("CANCELLED")) @@ -633,10 +698,12 @@ public void bedEnterEvent(PlayerBedEnterEvent event) { @EventHandler public void bedLeaveEvent(PlayerBedLeaveEvent event) { + Map context = new HashMap(); context.put("location", new dLocation(event.getBed().getLocation())); - doEvents(Arrays.asList("player leaves bed"), + doEvents(Arrays.asList + ("player leaves bed"), null, event.getPlayer(), context); } @@ -647,7 +714,8 @@ public void playerBucketEmpty(PlayerBucketEmptyEvent event) { context.put("item", new dItem(event.getBucket())); context.put("location", new dLocation(event.getBlockClicked().getLocation())); - String determination = doEvents(Arrays.asList("player empties bucket"), + String determination = doEvents(Arrays.asList + ("player empties bucket"), null, event.getPlayer(), context); // Handle message @@ -667,7 +735,8 @@ public void playerBucketFill(PlayerBucketFillEvent event) { context.put("item", new dItem(event.getBucket())); context.put("location", new dLocation(event.getBlockClicked().getLocation())); - String determination = doEvents(Arrays.asList("player fills bucket"), + String determination = doEvents(Arrays.asList + ("player fills bucket"), null, event.getPlayer(), context); // Handle message @@ -721,7 +790,7 @@ public void playerDeath(PlayerDeathEvent event) { context.put("message", event.getDeathMessage()); String determination = doEvents(Arrays.asList - ("player death"), + ("player dies"), null, event.getEntity(), context); // Handle message @@ -729,6 +798,22 @@ public void playerDeath(PlayerDeathEvent event) { event.setDeathMessage(aH.getStringFrom(determination)); } + @EventHandler + public void playerGameModeChange(PlayerGameModeChangeEvent event) { + + Map context = new HashMap(); + context.put("gamemode", event.getNewGameMode().name()); + + String determination = doEvents(Arrays.asList + ("player changes gamemode", + "player changes gamemode to " + event.getNewGameMode().name()), + null, event.getPlayer(), context); + + // Handle message + if (determination.toUpperCase().startsWith("CANCELLED")) + event.setCancelled(true); + } + @EventHandler public void playerInteract(PlayerInteractEvent event) { @@ -884,7 +969,8 @@ public void playerMoveEvent(PlayerMoveEvent event) { "player walks over " + name), null, event.getPlayer(), context); - if (determination.toUpperCase().startsWith("FROZEN")) + if (determination.toUpperCase().startsWith("CANCELLED") || + determination.toUpperCase().startsWith("FROZEN")) event.setCancelled(true); } } @@ -922,8 +1008,12 @@ public void respawnEvent(PlayerRespawnEvent event) { String determination = doEvents(events, null, event.getPlayer(), context); // Handle determine message - if (determination.toUpperCase().startsWith("LOCATION")) - event.setRespawnLocation(dLocation.valueOf(aH.getStringFrom(determination))); + if (determination.toUpperCase().startsWith("LOCATION")) { + + dLocation location = dLocation.valueOf(aH.getStringFrom(determination)); + + if (location != null) event.setRespawnLocation(location); + } } diff --git a/src/main/java/net/aufdemrand/denizen/tags/core/NotableLocationTags.java b/src/main/java/net/aufdemrand/denizen/tags/core/NotableLocationTags.java index 433d3a4b5d..976f869c2c 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/core/NotableLocationTags.java +++ b/src/main/java/net/aufdemrand/denizen/tags/core/NotableLocationTags.java @@ -40,7 +40,7 @@ public void notableTags(ReplaceableTagEvent event) { attribute.fulfill(1); tag = location.getAttribute(attribute); - event.setReplaced(tag.substring("location:".length())); + event.setReplaced(tag); } } \ No newline at end of file