diff --git a/pom.xml b/pom.xml index a09a2dc..4a6c4f0 100644 --- a/pom.xml +++ b/pom.xml @@ -3,12 +3,12 @@ de.jaschastarke LimitedCreative LimitedCreative - 2.1-SNAPSHOT + 2.1 https://github.com/possi/LimitedCreative UTF-8 - 1.3-SNAPSHOT + 1.3 diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModCreativeLimits.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModCreativeLimits.java index 61b4c3a..48669e3 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModCreativeLimits.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModCreativeLimits.java @@ -1,21 +1,19 @@ package de.jaschastarke.minecraft.limitedcreative; -import java.util.WeakHashMap; - -import org.bukkit.entity.Entity; - import de.jaschastarke.bukkit.lib.CoreModule; import de.jaschastarke.bukkit.lib.modules.AdditionalBlockBreaks; import de.jaschastarke.minecraft.limitedcreative.limits.BlockListener; import de.jaschastarke.minecraft.limitedcreative.limits.EntityListener; +import de.jaschastarke.minecraft.limitedcreative.limits.EntityNoDrop; import de.jaschastarke.minecraft.limitedcreative.limits.LimitConfig; import de.jaschastarke.minecraft.limitedcreative.limits.PlayerListener; +import de.jaschastarke.minecraft.limitedcreative.limits.VehicleListener; import de.jaschastarke.modularize.IModule; import de.jaschastarke.modularize.ModuleEntry; public class ModCreativeLimits extends CoreModule { protected LimitConfig config; - private WeakHashMap no_xp_mobs = new WeakHashMap(); + private EntityNoDrop noDropsMobs = null; public ModCreativeLimits(LimitedCreative plugin) { super(plugin); @@ -34,6 +32,7 @@ public class ModCreativeLimits extends CoreModule { listeners.addListener(new PlayerListener(this)); listeners.addListener(new EntityListener(this)); listeners.addListener(new BlockListener(this)); + listeners.addListener(new VehicleListener(this)); config = plugin.getPluginConfig().registerSection(new LimitConfig(this, entry)); blockDrops = modules.linkSharedModule(FeatureBlockItemSpawn.class, plugin.getModules()); @@ -54,8 +53,10 @@ public class ModCreativeLimits extends CoreModule { return config; } - public WeakHashMap getNoXPMobs() { - return no_xp_mobs; + public EntityNoDrop getNoDropMobs() { + if (noDropsMobs == null) + noDropsMobs = new EntityNoDrop(); + return noDropsMobs; } } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java index 3fa76ce..6500b13 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockStateConfig.java @@ -70,10 +70,10 @@ public class BlockStateConfig extends Configuration implements IConfigurationSub /** * BlockStateEnabled * - * This experimental Feature stores the GameMode a Block was created in, and prevents drops if a Block was created + * This Feature stores the GameMode a Block was created in, and prevents drops if a Block was created * in creative mode. * - * Due to the Experimental state this Feature isn't enabled by default. It uses the Database-credentials from + * Due to the huge load of this Feature, it isn't enabled by default. It uses the Database-credentials from * bukkit.yml (http://wiki.bukkit.org/Bukkit.yml#database) in the server-directory. * * default: false @@ -86,9 +86,9 @@ public class BlockStateConfig extends Configuration implements IConfigurationSub /** * BlockStateThreading * - * This experimental variant of the experimental Feature uses Threading to minimize lag. This fully relies on - * Bukkit metadata implementation. You only should need this, if there are often plays more then 10 players at once - * on your server. Be aware that this requires more memory. + * Uses Threading to minimize lag. This fully relies on Bukkit metadata implementation. You only should need this, + * if there are often plays more then 10 players at once on your server. Be aware that this requires more memory, + * to increase the performance * * default: false */ diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityListener.java index a4fe370..f043b66 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityListener.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityListener.java @@ -54,11 +54,15 @@ public class EntityListener implements Listener { @EventHandler public void onEntityDeath(EntityDeathEvent event) { if (event.getEntity() instanceof LivingEntity && event.getDroppedExp() > 0) { - if (mod.getNoXPMobs().containsKey(event.getEntity())) { + if (mod.getNoDropMobs().isXPPrevented(event.getEntity())) { event.setDroppedExp(0); - mod.getNoXPMobs().remove(event.getEntity()); + event.getDrops().clear(); } } + if (event.getDrops().size() > 0 && mod.getNoDropMobs().isDropPrevented(event.getEntity())) { + event.getDrops().clear(); + } + mod.getNoDropMobs().remove(event.getEntity()); } private boolean checkPermission(Player player, IAbstractPermission perm) { diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityNoDrop.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityNoDrop.java new file mode 100644 index 0000000..6b25e87 --- /dev/null +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/EntityNoDrop.java @@ -0,0 +1,37 @@ +package de.jaschastarke.minecraft.limitedcreative.limits; + +import java.util.Map; +import java.util.WeakHashMap; + +import org.bukkit.entity.Entity; + +public class EntityNoDrop { + private Map nodrop = new WeakHashMap(); + + private Prevent get(Entity entity) { + if (!nodrop.containsKey(entity)) + nodrop.put(entity, new Prevent()); + return nodrop.get(entity); + } + + public void preventXP(Entity entity) { + get(entity).xp = true; + } + public void preventDrop(Entity entity) { + get(entity).drops = true; + } + public boolean isXPPrevented(Entity entity) { + return nodrop.containsKey(entity) && nodrop.get(entity).xp; + } + public boolean isDropPrevented(Entity entity) { + return nodrop.containsKey(entity) && nodrop.get(entity).drops; + } + public void remove(Entity entity) { + nodrop.remove(entity); + } + + private class Prevent { + boolean xp = false; + boolean drops = false; + } +} diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/PlayerListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/PlayerListener.java index 878fecb..574e331 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/PlayerListener.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/PlayerListener.java @@ -218,7 +218,7 @@ public class PlayerListener implements Listener { } } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onEntityDamageByEntity(EntityDamageEvent rawevent) { if (rawevent instanceof EntityDamageByEntityEvent && !rawevent.isCancelled()) { EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) rawevent; @@ -240,7 +240,12 @@ public class PlayerListener implements Listener { } } else if (event.getEntity() instanceof LivingEntity) { if (!checkPermission(player, NoLimitPermissions.STATS_XP)) { - mod.getNoXPMobs().put(event.getEntity(), null); + mod.getNoDropMobs().preventXP(event.getEntity()); + } + } + if (!event.isCancelled()) { + if (!checkPermission(player, NoLimitPermissions.DROP)) { + mod.getNoDropMobs().preventDrop(event.getEntity()); } } } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/VehicleListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/VehicleListener.java new file mode 100644 index 0000000..f215734 --- /dev/null +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/limits/VehicleListener.java @@ -0,0 +1,47 @@ +package de.jaschastarke.minecraft.limitedcreative.limits; + +import org.bukkit.GameMode; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.vehicle.VehicleDestroyEvent; + +import de.jaschastarke.minecraft.limitedcreative.ModCreativeLimits; + +public class VehicleListener implements Listener { + private ModCreativeLimits mod; + public VehicleListener(ModCreativeLimits mod) { + this.mod = mod; + } + + @EventHandler(ignoreCancelled = true) + public void onVehicleDestroy(VehicleDestroyEvent event) { + if (event.getAttacker() instanceof Player) { + Player player = (Player) event.getAttacker(); + if (player.getGameMode() == GameMode.CREATIVE && !mod.getPlugin().getPermManager().hasPermission(player, NoLimitPermissions.DROP)) { + switch (event.getVehicle().getType()) { + case MINECART: + mod.getBlockSpawn().block(event.getVehicle().getLocation().getBlock().getLocation(), Material.MINECART); + break; + case MINECART_CHEST: + mod.getBlockSpawn().block(event.getVehicle().getLocation().getBlock().getLocation(), Material.STORAGE_MINECART); + break; + case MINECART_FURNACE: + mod.getBlockSpawn().block(event.getVehicle().getLocation().getBlock().getLocation(), Material.POWERED_MINECART); + break; + case MINECART_HOPPER: + mod.getBlockSpawn().block(event.getVehicle().getLocation().getBlock().getLocation(), Material.HOPPER_MINECART); + break; + case MINECART_TNT: + mod.getBlockSpawn().block(event.getVehicle().getLocation().getBlock().getLocation(), Material.EXPLOSIVE_MINECART); + break; + default: + break; + + } + } + } + } + +}