Events reworked (moved all logic to LCPlayer, previously PlayerCore)

added ondie-dropping prevention, AND give items back on respawn
This commit is contained in:
Jascha Starke 2012-01-18 16:19:37 +01:00
parent 237ff18841
commit d07a3a6b78
4 changed files with 214 additions and 98 deletions

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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<Player, LCPlayer> players = new HashMap<Player, LCPlayer>();
private Player player;
private Map<Integer, ItemStack> 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);
}
}

View file

@ -29,6 +29,7 @@ import org.bukkit.event.Event.Priority;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityListener; import org.bukkit.event.entity.EntityListener;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerGameModeChangeEvent; 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.PlayerInteractEvent;
import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import static de.jaschastarke.minecraft.utils.Locale.L;
public final class Listener { public final class Listener {
private static LimitedCreativeCore plugin; private static LimitedCreativeCore plugin;
@ -47,52 +48,41 @@ public final class Listener {
@Override @Override
public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) { public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) {
if (event.getNewGameMode() == GameMode.CREATIVE) { if (event.getNewGameMode() == GameMode.CREATIVE) {
new PlayerCore(plugin, event.getPlayer()).onSetCreative(); LCPlayer.get(event.getPlayer()).onSetCreative();
} else if (event.getNewGameMode() == GameMode.SURVIVAL) { } 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 @Override
public void onPlayerDropItem(PlayerDropItemEvent event) { public void onPlayerDropItem(PlayerDropItemEvent event) {
if (event.getPlayer().getGameMode() == GameMode.CREATIVE) { LCPlayer.get(event.getPlayer()).onDropItem(event);
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.drop"))
return;
event.setCancelled(true);
}
} }
@Override @Override
public void onPlayerPickupItem(PlayerPickupItemEvent event) { public void onPlayerPickupItem(PlayerPickupItemEvent event) {
if (event.getPlayer().getGameMode() == GameMode.CREATIVE && plugin.config.getBlockPickupInCreative()) { LCPlayer.get(event.getPlayer()).onPickupItem(event);
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.pickup"))
return;
event.setCancelled(true);
}
} }
@Override @Override
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if (event.isCancelled() || event.getPlayer().getGameMode() == GameMode.SURVIVAL) if (event.isCancelled() || event.getAction() != Action.RIGHT_CLICK_BLOCK)
return;
if (event.getAction() != Action.RIGHT_CLICK_BLOCK)
return; return;
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
if (block.getState() instanceof ContainerBlock) { if (block.getState() instanceof ContainerBlock) {
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest")) LCPlayer.get(event.getPlayer()).onChestAccess(event);
return;
event.getPlayer().sendMessage(L("blocked.chest"));
event.setCancelled(true);
} }
if (plugin.config.getSignBlock() && block.getState() instanceof Sign) { if (block.getState() instanceof Sign) {
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.sign")) LCPlayer.get(event.getPlayer()).onSignAccess(event);
return;
event.getPlayer().sendMessage(L("blocked.sign"));
event.setCancelled(true);
} }
} }
@ -104,10 +94,7 @@ public final class Listener {
Entity entity = event.getRightClicked(); Entity entity = event.getRightClicked();
if (entity instanceof StorageMinecart) { if (entity instanceof StorageMinecart) {
if (plugin.config.getPermissionsEnabled() && event.getPlayer().hasPermission("limitedcreative.nolimit.chest")) LCPlayer.get(event.getPlayer()).onChestAccess(event);
return;
event.getPlayer().sendMessage(L("blocked.chest"));
event.setCancelled(true);
} }
} }
@ -117,6 +104,7 @@ public final class Listener {
pm.registerEvent(Event.Type.PLAYER_PICKUP_ITEM, this, Priority.Normal, plugin); 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, this, Priority.Lowest, plugin);
pm.registerEvent(Event.Type.PLAYER_INTERACT_ENTITY, 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) { public void onEntityDamage(EntityDamageEvent meta_event) {
if (meta_event instanceof EntityDamageByEntityEvent) { if (meta_event instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) meta_event; EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) meta_event;
if (event.getEntity() instanceof Player && event.getDamager() instanceof Player) { if (event.getEntity() instanceof Player) {
// its PVP LCPlayer.get((Player) event.getEntity()).onDamage(event);
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);
}
}
} }
} }
} }
@Override
public void onEntityDeath(EntityDeathEvent event) {
if (event.getEntity() instanceof Player) {
Player player = (Player) event.getEntity();
LCPlayer.get(player).onDie(event);
}
}
private void register() { private void register() {
pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Normal, plugin); pm.registerEvent(Event.Type.ENTITY_DAMAGE, this, Priority.Normal, plugin);
pm.registerEvent(Event.Type.ENTITY_DEATH, this, Priority.Low, plugin);
} }
} }

View file

@ -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 <http://www.gnu.org/licenses/>.
*/
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);
}
}

View file

@ -17,6 +17,7 @@
*/ */
package de.jaschastarke.minecraft.limitedcreative.serialize; package de.jaschastarke.minecraft.limitedcreative.serialize;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.bukkit.Material; import org.bukkit.Material;
@ -72,4 +73,33 @@ public class Items implements Storeable {
return ItemStack.deserialize(serialize); return ItemStack.deserialize(serialize);
} }
} }
public static Map<Integer, ItemStack> storeInventory(PlayerInventory inv) {
Map<Integer, ItemStack> map = new HashMap<Integer, ItemStack>();
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<Integer, ItemStack> 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;
}
}
}
} }