Image are now protected against creeper explosion, arrows, and other unwanted events that could grief maps

This commit is contained in:
Vlammar 2021-11-12 04:46:00 +01:00
parent 52ba80ab70
commit 7ef03a0eae

View File

@ -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) {