diff --git a/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java b/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java new file mode 100644 index 0000000..74f559f --- /dev/null +++ b/src/de/jaschastarke/minecraft/limitedcreative/LCPlayer.java @@ -0,0 +1,154 @@ +/* + * Limited Creative - (Bukkit Plugin) + * Copyright (C) 2012 jascha@ja-s.de + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.jaschastarke.minecraft.limitedcreative; + +import static de.jaschastarke.minecraft.utils.Locale.L; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.inventory.ItemStack; + +import de.jaschastarke.minecraft.limitedcreative.serialize.Items; + +public class LCPlayer { + private static LimitedCreativeCore plugin = LimitedCreativeCore.plugin; + private static Map players = new HashMap(); + private Player player; + private Map tempinv = null; + + private LCPlayer(Player pplayer) { + player = pplayer; + } + + public static LCPlayer get(Player pplayer) { + if (!players.containsKey(pplayer)) { + LCPlayer p = new LCPlayer(pplayer); + players.put(pplayer, p); + return p; + } else { + return players.get(pplayer); + } + } + + public void onSetCreative() { + if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory")) + return; + Inventory inv = new Inventory(player); + inv.save(); + if (plugin.config.getStoreCreative() && inv.isStored(GameMode.CREATIVE)) { + inv.load(GameMode.CREATIVE); + } else { + inv.clear(); + } + } + public void onSetSurvival() { + if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory")) + return; + Inventory inv = new Inventory(player); + if (plugin.config.getStoreCreative()) { + inv.save(); + } + if (inv.isStored(GameMode.SURVIVAL)) + inv.load(GameMode.SURVIVAL); + } + public void onDropItem(PlayerDropItemEvent event) { + if (player.getGameMode() == GameMode.CREATIVE) { + if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.drop")) + return; + event.setCancelled(true); + } + } + public void onPickupItem(PlayerPickupItemEvent event) { + if (player.getGameMode() == GameMode.CREATIVE && plugin.config.getBlockPickupInCreative()) { + if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.pickup")) + return; + event.setCancelled(true); + } + } + + public void onDie(EntityDeathEvent event) { + if (player.getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.drop")) { + event.getDrops().clear(); + tempinv = Items.storeInventory(player.getInventory()); + } + } + } + public void onRespawn(PlayerRespawnEvent event) { + if (player.getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.drop")) { + if (tempinv != null) { + Items.restoreInventory(player.getInventory(), tempinv); + } + } + } + tempinv = null; + } + + public void onDamage(EntityDamageByEntityEvent event) { + if (event.getDamager() instanceof Player) { + // its PVP + Player attacker = (Player) event.getDamager(); + if (attacker.getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !attacker.hasPermission("limitedcreative.nolimit.pvp")) { + event.setCancelled(true); + } + } + if (player.getGameMode() == GameMode.CREATIVE) { + if (!plugin.config.getPermissionsEnabled() || !player.hasPermission("limitedcreative.nolimit.pvp")) { + event.setCancelled(true); + } + } + } + } + public void onChestAccess(PlayerInteractEvent event) { + if (player.getGameMode() != GameMode.CREATIVE) + return; + if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest")) + return; + event.getPlayer().sendMessage(L("blocked.chest")); + event.setCancelled(true); + } + public void onChestAccess(PlayerInteractEntityEvent event) { // chest-minecarts are different events + if (player.getGameMode() != GameMode.CREATIVE) + return; + if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest")) + return; + event.getPlayer().sendMessage(L("blocked.chest")); + event.setCancelled(true); + } + public void onSignAccess(PlayerInteractEvent event) { + if (!plugin.config.getSignBlock() || player.getGameMode() != GameMode.CREATIVE) + return; + if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.sign")) + return; + event.getPlayer().sendMessage(L("blocked.sign")); + event.setCancelled(true); + } + +} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/Listener.java b/src/de/jaschastarke/minecraft/limitedcreative/Listener.java index 04ecd32..a1df001 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/Listener.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/Listener.java @@ -29,6 +29,7 @@ import org.bukkit.event.Event.Priority; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityListener; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerGameModeChangeEvent; @@ -36,8 +37,8 @@ import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.plugin.PluginManager; -import static de.jaschastarke.minecraft.utils.Locale.L; public final class Listener { private static LimitedCreativeCore plugin; @@ -47,52 +48,41 @@ public final class Listener { @Override public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) { if (event.getNewGameMode() == GameMode.CREATIVE) { - new PlayerCore(plugin, event.getPlayer()).onSetCreative(); + LCPlayer.get(event.getPlayer()).onSetCreative(); } else if (event.getNewGameMode() == GameMode.SURVIVAL) { - new PlayerCore(plugin, event.getPlayer()).onSetSurvival(); + LCPlayer.get(event.getPlayer()).onSetSurvival(); } } + @Override + public void onPlayerRespawn(PlayerRespawnEvent event) { + LCPlayer.get(event.getPlayer()).onRespawn(event); + } + + @Override public void onPlayerDropItem(PlayerDropItemEvent event) { - if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { - if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.drop")) - return; - event.setCancelled(true); - } + LCPlayer.get(event.getPlayer()).onDropItem(event); } @Override public void onPlayerPickupItem(PlayerPickupItemEvent event) { - if (event.getPlayer().getGameMode() == GameMode.CREATIVE && plugin.config.getBlockPickupInCreative()) { - if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.pickup")) - return; - event.setCancelled(true); - } - } + LCPlayer.get(event.getPlayer()).onPickupItem(event); + } @Override public void onPlayerInteract(PlayerInteractEvent event) { - if (event.isCancelled() || event.getPlayer().getGameMode() == GameMode.SURVIVAL) - return; - - if (event.getAction() != Action.RIGHT_CLICK_BLOCK) + if (event.isCancelled() || event.getAction() != Action.RIGHT_CLICK_BLOCK) return; Block block = event.getClickedBlock(); if (block.getState() instanceof ContainerBlock) { - if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest")) - return; - event.getPlayer().sendMessage(L("blocked.chest")); - event.setCancelled(true); + LCPlayer.get(event.getPlayer()).onChestAccess(event); } - if (plugin.config.getSignBlock() && block.getState() instanceof Sign) { - if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.sign")) - return; - event.getPlayer().sendMessage(L("blocked.sign")); - event.setCancelled(true); + if (block.getState() instanceof Sign) { + LCPlayer.get(event.getPlayer()).onSignAccess(event); } } @@ -104,10 +94,7 @@ public final class Listener { Entity entity = event.getRightClicked(); if (entity instanceof StorageMinecart) { - if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest")) - return; - event.getPlayer().sendMessage(L("blocked.chest")); - event.setCancelled(true); + LCPlayer.get(event.getPlayer()).onChestAccess(event); } } @@ -117,6 +104,7 @@ public final class Listener { pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, this, Priority.Normal, plugin); pm.registerEvent(Event.Type.PLAYER_INTERACT, this, Priority.Lowest, plugin); pm.registerEvent(Event.Type.PLAYER_INTERACT_ENTITY, this, Priority.Lowest, plugin); + pm.registerEvent(Event.Type.PLAYER_RESPAWN, this, Priority.Normal, plugin); } } @@ -125,26 +113,23 @@ public final class Listener { public void onEntityDamage(EntityDamageEvent meta_event) { if (meta_event instanceof EntityDamageByEntityEvent) { EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) meta_event; - if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) { - // its PVP - Player attacker = (Player) event.getDamager(); - Player attacked = (Player) event.getEntity(); - if (attacker.getGameMode() == GameMode.CREATIVE) { - if (!plugin.config.getPermissionsEnabled() || !attacker.hasPermission("limitedcreative.nolimit.pvp")) { - event.setCancelled(true); - } - } - if (attacked.getGameMode() == GameMode.CREATIVE) { - if (!plugin.config.getPermissionsEnabled() || !attacked.hasPermission("limitedcreative.nolimit.pvp")) { - event.setCancelled(true); - } - } + if (event.getEntity() instanceof Player) { + LCPlayer.get((Player) event.getEntity()).onDamage(event); } } } + @Override + public void onEntityDeath(EntityDeathEvent event) { + if (event.getEntity() instanceof Player) { + Player player = (Player) event.getEntity(); + LCPlayer.get(player).onDie(event); + } + } + private void register() { pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Normal, plugin); + pm.registerEvent(Event.Type.ENTITY_DEATH, this, Priority.Low, plugin); } } diff --git a/src/de/jaschastarke/minecraft/limitedcreative/PlayerCore.java b/src/de/jaschastarke/minecraft/limitedcreative/PlayerCore.java deleted file mode 100644 index f208b1c..0000000 --- a/src/de/jaschastarke/minecraft/limitedcreative/PlayerCore.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Limited Creative - (Bukkit Plugin) - * Copyright (C) 2012 jascha@ja-s.de - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package de.jaschastarke.minecraft.limitedcreative; - -import org.bukkit.GameMode; -import org.bukkit.entity.Player; - -public class PlayerCore { - private static LimitedCreativeCore plugin; - private Player player; - - public PlayerCore(LimitedCreativeCore pplugin, Player pplayer) { - plugin = pplugin; - player = pplayer; - } - - public void onSetCreative() { - if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory")) - return; - Inventory inv = new Inventory(player); - inv.save(); - if (plugin.config.getStoreCreative() && inv.isStored(GameMode.CREATIVE)) { - inv.load(GameMode.CREATIVE); - } else { - inv.clear(); - } - } - public void onSetSurvival() { - if (plugin.config.getPermissionToKeepInventory() && player.hasPermission("limitedcreative.keepinventory")) - return; - Inventory inv = new Inventory(player); - if (plugin.config.getStoreCreative()) { - inv.save(); - } - if (inv.isStored(GameMode.SURVIVAL)) - inv.load(GameMode.SURVIVAL); - } -} diff --git a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java b/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java index 03224be..8cd740f 100644 --- a/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java +++ b/src/de/jaschastarke/minecraft/limitedcreative/serialize/Items.java @@ -17,6 +17,7 @@ */ package de.jaschastarke.minecraft.limitedcreative.serialize; +import java.util.HashMap; import java.util.Map; import org.bukkit.Material; @@ -72,4 +73,33 @@ public class Items implements Storeable { return ItemStack.deserialize(serialize); } } + public static Map storeInventory(PlayerInventory inv) { + Map map = new HashMap(); + for (int i = 0; i < inv.getSize(); i++) { + if (inv.getItem(i) != null && inv.getItem(i).getTypeId() != 0) { + map.put(i, inv.getItem(i)); + } + } + for (int i = 0; i < inv.getArmorContents().length; i++) { + map.put((i * -1) - 1, inv.getArmorContents()[i]); + } + return map; + } + public static void restoreInventory(PlayerInventory inv, Map map) { + for (int i = 0; i < inv.getSize(); i++) { + if (map.containsKey(i)) { + inv.setItem(i, map.get(i)); + } else { + inv.setItem(i, null); + } + } + for (int i = 0; i < inv.getArmorContents().length; i++) { + int _i = (i * -1) - 1; + if (map.containsKey(_i)) { + inv.getArmorContents()[i] = map.get(_i); + } else { + inv.getArmorContents()[i] = null; + } + } + } }