/*
* CraftZ
* Copyright (C) JangoBrick <http://jangobrick.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 craftZ.modules;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Zombie;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import craftZ.CraftZ;
import craftZ.Module;
import craftZ.util.EntityChecker;
import craftZ.util.StackParser;
public class DeadPlayers extends Module {
public static List<Material> WEAPONS = Arrays.asList(new Material[] { // higher index = preferred when choosing hand item
Material.WOOD_SWORD, Material.WOOD_AXE, Material.STONE_SWORD, Material.STONE_AXE, Material.BOW,
Material.IRON_SWORD, Material.IRON_AXE, Material.GOLD_SWORD, Material.GOLD_AXE, Material.DIAMOND_SWORD, Material.DIAMOND_AXE,
});
public DeadPlayers(CraftZ craftZ) {
super(craftZ);
}
public Zombie create(Player p) {
PlayerInventory inv = p.getInventory();
List<ItemStack> inventory = new ArrayList<ItemStack>();
for (ItemStack stack : inv.getContents()) {
if (stack != null && stack.getType() != Material.AIR && !getCraftZ().getKits().isSoulbound(stack))
inventory.add(stack);
}
Zombie zombie = (Zombie) p.getWorld().spawnEntity(p.getLocation(), EntityType.ZOMBIE);
zombie.setBaby(false);
zombie.setVillager(true);
zombie.setCanPickupItems(false);
zombie.setRemoveWhenFarAway(false);
zombie.setCustomName(p.getName());
zombie.setCustomNameVisible(true);
zombie.getEquipment().setArmorContents(inv.getArmorContents());
zombie.getEquipment().setItemInHand(getHandItem(inventory));
zombie.getEquipment().setItemInHandDropChance(0);
zombie.setMetadata("inventory", new FixedMetadataValue(getCraftZ(), inventory));
return zombie;
}
@SuppressWarnings("unchecked")
public List<ItemStack> getInventory(Zombie zombie) {
List<ItemStack> inventory = new ArrayList<ItemStack>();
if (!zombie.hasMetadata("inventory"))
return inventory;
List<MetadataValue> metaList = zombie.getMetadata("inventory");
for (MetadataValue meta : metaList) {
if (meta.getOwningPlugin().getName().equals(getCraftZ().getName()) && meta.value() instanceof List<?>) {
inventory.addAll((List<ItemStack>) meta.value());
}
}
for (ItemStack item : zombie.getEquipment().getArmorContents()) {
if (item != null)
inventory.add(item);
}
return inventory;
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerDeath(PlayerDeathEvent event) {
final Player p = event.getEntity();
if (isWorld(p.getWorld())) {
if (getConfig("config").getBoolean("Config.players.spawn-death-zombie")) {
create(p);
event.getDrops().clear();
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onEntityDeath(EntityDeathEvent event) {
if (isWorld(event.getEntity().getWorld())) {
LivingEntity entity = event.getEntity();
List<ItemStack> drops = event.getDrops();
if (getCraftZ().isEnemy(entity)) {
drops.clear();
List<ItemStack> inventory = entity instanceof Zombie ? getInventory((Zombie) entity) : null;
if (inventory != null && !inventory.isEmpty()) {
drops.addAll(inventory);
} else {
MetadataValue meta = EntityChecker.getMeta(entity, "enemyType");
if (meta != null) {
ConfigurationSection sec = getCraftZ().getEnemyDefinition(meta.asString());
if (sec != null && sec.contains("drops")) {
ConfigurationSection dropsSec = sec.getConfigurationSection("drops");
for (String itemString : dropsSec.getKeys(false)) {
ItemStack item = StackParser.fromString(itemString, true);
if (item != null && CraftZ.RANDOM.nextDouble() <= dropsSec.getDouble(itemString))
drops.add(item);
}
}
}
}
}
}
}
public static ItemStack getHandItem(Collection<ItemStack> items) {
ItemStack hand = null;
int handIndex = 0;
for (ItemStack item : items) {
if (item == null)
continue;
int index = WEAPONS.indexOf(item.getType());
if (hand == null || index > handIndex) {
hand = item;
handIndex = index;
}
}
return hand;
}
}