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;
+ }
+ }
+ }
}