Fix entity protection game rules

This commit is contained in:
Daniel Saukel 2018-08-13 19:13:25 +02:00
parent 0b0b8c6eff
commit 109dfd72c9
4 changed files with 44 additions and 24 deletions

View File

@ -17,6 +17,8 @@
package de.erethon.dungeonsxl.game; package de.erethon.dungeonsxl.game;
import de.erethon.caliburn.item.ExItem; import de.erethon.caliburn.item.ExItem;
import de.erethon.caliburn.mob.ExMob;
import de.erethon.caliburn.mob.VanillaMob;
import de.erethon.dungeonsxl.requirement.Requirement; import de.erethon.dungeonsxl.requirement.Requirement;
import de.erethon.dungeonsxl.reward.Reward; import de.erethon.dungeonsxl.reward.Reward;
import java.util.ArrayList; import java.util.ArrayList;
@ -28,7 +30,6 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.EntityType;
/** /**
* See {@link de.erethon.dungeonsxl.config.WorldConfig} * See {@link de.erethon.dungeonsxl.config.WorldConfig}
@ -53,13 +54,13 @@ public class GameRuleProvider {
DEFAULT_VALUES.breakPlacedBlocks = false; DEFAULT_VALUES.breakPlacedBlocks = false;
DEFAULT_VALUES.breakWhitelist = null; DEFAULT_VALUES.breakWhitelist = null;
DEFAULT_VALUES.damageProtectedEntities = new HashSet<>(Arrays.asList( DEFAULT_VALUES.damageProtectedEntities = new HashSet<>(Arrays.asList(
EntityType.ARMOR_STAND, VanillaMob.ARMOR_STAND,
EntityType.ITEM_FRAME, VanillaMob.ITEM_FRAME,
EntityType.PAINTING VanillaMob.PAINTING
)); ));
DEFAULT_VALUES.interactionProtectedEntities = new HashSet<>(Arrays.asList( DEFAULT_VALUES.interactionProtectedEntities = new HashSet<>(Arrays.asList(
EntityType.ARMOR_STAND, VanillaMob.ARMOR_STAND,
EntityType.ITEM_FRAME VanillaMob.ITEM_FRAME
)); ));
DEFAULT_VALUES.placeBlocks = false; DEFAULT_VALUES.placeBlocks = false;
DEFAULT_VALUES.placeWhitelist = null; DEFAULT_VALUES.placeWhitelist = null;
@ -117,8 +118,8 @@ public class GameRuleProvider {
protected Boolean breakBlocks; protected Boolean breakBlocks;
protected Boolean breakPlacedBlocks; protected Boolean breakPlacedBlocks;
protected Map<ExItem, HashSet<ExItem>> breakWhitelist; protected Map<ExItem, HashSet<ExItem>> breakWhitelist;
protected Set<EntityType> damageProtectedEntities; protected Set<ExMob> damageProtectedEntities;
protected Set<EntityType> interactionProtectedEntities; protected Set<ExMob> interactionProtectedEntities;
protected Boolean placeBlocks; protected Boolean placeBlocks;
protected Set<ExItem> placeWhitelist; protected Set<ExItem> placeWhitelist;
protected Boolean rain; protected Boolean rain;
@ -235,14 +236,14 @@ public class GameRuleProvider {
/** /**
* @return a Set of all entity types that cannot be damaged * @return a Set of all entity types that cannot be damaged
*/ */
public Set<EntityType> getDamageProtectedEntities() { public Set<ExMob> getDamageProtectedEntities() {
return damageProtectedEntities; return damageProtectedEntities;
} }
/** /**
* @return a Set of all entity types that cannot be damaged * @return a Set of all entity types that cannot be damaged
*/ */
public Set<EntityType> getInteractionProtectedEntities() { public Set<ExMob> getInteractionProtectedEntities() {
return interactionProtectedEntities; return interactionProtectedEntities;
} }

View File

@ -569,7 +569,7 @@ public class DGameWorld extends DInstanceWorld {
} }
if (entity.getLocation().getBlock().getRelative(((Hanging) entity).getAttachedFace()).equals(block)) { if (entity.getLocation().getBlock().getRelative(((Hanging) entity).getAttachedFace()).equals(block)) {
Hanging hanging = (Hanging) entity; Hanging hanging = (Hanging) entity;
if (rules.getDamageProtectedEntities().contains(hanging.getType())) { if (rules.getDamageProtectedEntities().contains(CaliburnAPI.getInstance().getExMob(hanging))) {
event.setCancelled(true); event.setCancelled(true);
break; break;
} }

View File

@ -16,10 +16,15 @@
*/ */
package de.erethon.dungeonsxl.world; package de.erethon.dungeonsxl.world;
import de.erethon.caliburn.CaliburnAPI;
import de.erethon.caliburn.item.VanillaItem; import de.erethon.caliburn.item.VanillaItem;
import de.erethon.caliburn.mob.ExMob;
import de.erethon.dungeonsxl.game.Game; import de.erethon.dungeonsxl.game.Game;
import java.util.Set;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Cancellable;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -30,6 +35,8 @@ import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.player.PlayerArmorStandManipulateEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.weather.WeatherChangeEvent; import org.bukkit.event.weather.WeatherChangeEvent;
import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.ChunkUnloadEvent;
@ -126,24 +133,37 @@ public class DWorldListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent event) { public void onEntityDamage(EntityDamageEvent event) {
DGameWorld gameWorld = DGameWorld.getByWorld(event.getEntity().getWorld()); onTouch(event, event.getEntity(), false);
if (gameWorld == null) { }
return;
} @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
Game game = Game.getByGameWorld(gameWorld); public void onHangingBreak(HangingBreakEvent event) {
if (game.getRules().getDamageProtectedEntities().contains(event.getEntityType())) { onTouch(event, event.getEntity(), false);
event.setCancelled(true);
}
} }
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
DGameWorld gameWorld = DGameWorld.getByWorld(event.getPlayer().getWorld()); onTouch(event, event.getRightClicked(), true);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onArmorStandManipulate(PlayerArmorStandManipulateEvent event) {
onTouch(event, event.getRightClicked(), true);
}
/**
* @param event the event
* @param entity the entity
* @param interact true = interact; false = break
*/
public void onTouch(Cancellable event, Entity entity, boolean interact) {
DGameWorld gameWorld = DGameWorld.getByWorld(entity.getWorld());
if (gameWorld == null) { if (gameWorld == null) {
return; return;
} }
Game game = Game.getByGameWorld(gameWorld); Game game = Game.getByGameWorld(gameWorld);
if (game.getRules().getInteractionProtectedEntities().contains(event.getRightClicked().getType())) { Set<ExMob> prot = interact ? game.getRules().getInteractionProtectedEntities() : game.getRules().getDamageProtectedEntities();
if (prot.contains(CaliburnAPI.getInstance().getExMob(entity))) {
event.setCancelled(true); event.setCancelled(true);
} }
} }

View File

@ -39,7 +39,6 @@ import org.bukkit.World.Environment;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.EntityType;
/** /**
* The world configuration is a simple game rule source. Besides game rules, WorldConfig also stores some map specific data such as the invited players. It is * The world configuration is a simple game rule source. Besides game rules, WorldConfig also stores some map specific data such as the invited players. It is
@ -166,12 +165,12 @@ public class WorldConfig extends GameRuleProvider {
if (configFile.contains("damageProtectedEntities")) { if (configFile.contains("damageProtectedEntities")) {
damageProtectedEntities = new HashSet<>(); damageProtectedEntities = new HashSet<>();
configFile.getStringList("damageProtectedEntities").forEach(e -> damageProtectedEntities.add(EnumUtil.getEnumIgnoreCase(EntityType.class, e))); configFile.getStringList("damageProtectedEntities").forEach(e -> damageProtectedEntities.add(caliburn.getExMob(e)));
} }
if (configFile.contains("interactionProtectedEntities")) { if (configFile.contains("interactionProtectedEntities")) {
interactionProtectedEntities = new HashSet<>(); interactionProtectedEntities = new HashSet<>();
configFile.getStringList("interactionProtectedEntities").forEach(e -> interactionProtectedEntities.add(EnumUtil.getEnumIgnoreCase(EntityType.class, e))); configFile.getStringList("interactionProtectedEntities").forEach(e -> interactionProtectedEntities.add(caliburn.getExMob(e)));
} }
if (configFile.contains("placeBlocks")) { if (configFile.contains("placeBlocks")) {