diff --git a/src/main/java/fr/moribus/imageonmap/image/MapInitEvent.java b/src/main/java/fr/moribus/imageonmap/image/MapInitEvent.java index 69acacf..64bb929 100644 --- a/src/main/java/fr/moribus/imageonmap/image/MapInitEvent.java +++ b/src/main/java/fr/moribus/imageonmap/image/MapInitEvent.java @@ -56,10 +56,12 @@ import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByBlockEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.hanging.HangingBreakEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerItemHeldEvent; -import org.bukkit.event.world.ChunkEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.map.MapView; @@ -145,6 +147,80 @@ public class MapInitEvent implements Listener { } } + @EventHandler + public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { + //Negate entity interaction with item frame containing IoM maps. + + Entity entity = event.getEntity(); + if (!(entity instanceof ItemFrame)) { + return; + } + Entity damager = event.getDamager(); + if (damager instanceof Player) { + //can solve the dup with the map here by doing a better handling + return; + } + ItemStack item = ((ItemFrame) entity).getItem(); + if (item.getType() == Material.FILLED_MAP) { + //if the map exist we canceled the event + if (MapManager.getMap(item) != null) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onEntityDamageByBlockEvent(EntityDamageByBlockEvent event) { + //Negate damage done to IoM maps by some blocks + + Entity entity = event.getEntity(); + if (!(entity instanceof ItemFrame)) { + return; + } + ItemStack item = ((ItemFrame) entity).getItem(); + if (item.getType() == Material.FILLED_MAP) { + //if the map exist we canceled the event + if (MapManager.getMap(item) != null) { + switch (event.getCause()) { + case MAGIC: + case ENTITY_EXPLOSION: + case FIRE_TICK: + case LIGHTNING: + case CRAMMING: + case WITHER: + case SUFFOCATION: + case DROWNING: + case BLOCK_EXPLOSION: + event.setCancelled(true); + break; + default: + } + } + } + } + + + @EventHandler + public void onHangingBreakEvent(HangingBreakEvent event) { + Entity entity = event.getEntity(); + PluginLogger.info("entity " + entity.toString()); + if (!(entity instanceof ItemFrame)) { + return; + } + + ItemStack item = ((ItemFrame) entity).getItem(); + if (item.getType() == Material.FILLED_MAP) { + //if the map exist we canceled the event + if (MapManager.getMap(item) != null) { + if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION) { + //creeper goes boom + event.setCancelled(true); + } + } + } + } + + protected static final class EntitiesLoadListener implements Listener { @FutureEventHandler(event = "world.EntitiesLoadEvent") public void onEntitiesLoad(WrappedEvent event) {