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

View File

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

View File

@ -16,10 +16,15 @@
*/
package de.erethon.dungeonsxl.world;
import de.erethon.caliburn.CaliburnAPI;
import de.erethon.caliburn.item.VanillaItem;
import de.erethon.caliburn.mob.ExMob;
import de.erethon.dungeonsxl.game.Game;
import java.util.Set;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Cancellable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
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.EntityExplodeEvent;
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.weather.WeatherChangeEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
@ -126,24 +133,37 @@ public class DWorldListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent event) {
DGameWorld gameWorld = DGameWorld.getByWorld(event.getEntity().getWorld());
if (gameWorld == null) {
return;
}
Game game = Game.getByGameWorld(gameWorld);
if (game.getRules().getDamageProtectedEntities().contains(event.getEntityType())) {
event.setCancelled(true);
}
onTouch(event, event.getEntity(), false);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onHangingBreak(HangingBreakEvent event) {
onTouch(event, event.getEntity(), false);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
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) {
return;
}
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);
}
}

View File

@ -39,7 +39,6 @@ import org.bukkit.World.Environment;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
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
@ -166,12 +165,12 @@ public class WorldConfig extends GameRuleProvider {
if (configFile.contains("damageProtectedEntities")) {
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")) {
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")) {