/******************************************************************************* * Copyright 2014 Tobias Welther * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tobiyas.racesandclasses.datacontainer.armorandtool; import java.util.HashSet; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.inventory.ItemStack; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.datacontainer.traitholdercontainer.AbstractTraitHolder; import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.resolvers.WorldResolver; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.racesandclasses.util.items.ItemUtils; import de.tobiyas.racesandclasses.util.items.ItemUtils.ArmorSlot; import de.tobiyas.racesandclasses.util.items.ItemUtils.ItemQuality; public class ArmorToolManager { private HashSet<AbstractItemPermission> itemPerms; private RaCPlayer player; public ArmorToolManager(RaCPlayer player){ this.player = player; this.itemPerms = new HashSet<AbstractItemPermission>(); } public void rescanPermission(){ itemPerms.clear(); if(player != null && !player.isOnline() && WorldResolver.isOnDisabledWorld(player)){ itemPerms.add(new AllItemsPermission()); return; } AbstractTraitHolder container = player.getRace(); if(container != null){ for(ItemQuality quality : container.getArmorPerms()){ addPerm(quality); } } //Add ItemIDs or other here. AbstractTraitHolder classContainer = player.getclass(); if(classContainer != null){ for(ItemQuality quality : classContainer.getArmorPerms()){ addPerm(quality); } } addDefaultPerm(); } private void addDefaultPerm() { //permission for HEADS (skull, ...) itemPerms.add(new ItemPermission(Material.SKULL_ITEM)); itemPerms.add(new ItemPermission(Material.PUMPKIN)); //Other stuff to put into armor slots //TODO ? } /** * Adds a Permission to the Permission list * * @param quality */ private void addPerm(ItemQuality quality){ for(AbstractItemPermission perm : itemPerms){ if(perm.isAlreadyRegistered(quality)) { return; } } itemPerms.add(new MaterialArmorPermission(quality)); } /** * Checks if the item is permitted to be used * * @param stack to check * @return true if permission granted, false otherwise */ public boolean hasPermissionForItem(ItemStack stack){ if(stack == null || stack.getType() == Material.AIR){ return true; } for(AbstractItemPermission permission : itemPerms){ if(permission.hasPermission(stack)){ return true; } } return false; } /** * Calculates the damage to the Armor * * @param damage * @param cause * * @return the Damage after modification */ public double calcDamageToArmor(double damage, DamageCause cause){ if(player == null){ return damage; } //check Cause switch(cause){ case DROWNING: case FIRE_TICK: case FIRE: case LAVA: case FALL: case POISON: case STARVATION: case SUICIDE: case LIGHTNING: return damage; default: break; } double playerArmor = getArmorLevel(player.getPlayer()); double playerDamageReduce = 1D - ((8D * playerArmor) / 200D); return damage * playerDamageReduce; } /** * Returns the Toughness of the Armor. * * @param player to get from. * @return the toughness. */ public int getArmorLevel(Player player) { //TODO fix me somehow! /*int armorLevel = 0; ItemStack inventory[] = player.getInventory().getArmorContents(); for(ItemStack stack : inventory){ //armorLevel += ItemUtils.getArmorValueOfItem(stack); } */ return 0; } /** * Checks if Armor is equipped that is not valid to the current permissions. * If found, it is stored in Inventory or thrown away if no place. * * @return true if settings is correct. False if something got thrown away. */ public boolean checkArmorNotValidEquiped() { if(player == null){ return true; } boolean disableArmorCheck = RacesAndClasses.getPlugin().getConfigManager().getGeneralConfig().isConfig_disableArmorChecking(); if(disableArmorCheck) return true; ItemStack helmet = ItemUtils.getItemInArmorSlotOfPlayer(player.getPlayer(), ArmorSlot.HELMET); ItemStack chest = ItemUtils.getItemInArmorSlotOfPlayer(player.getPlayer(), ArmorSlot.CHESTPLATE); ItemStack legs = ItemUtils.getItemInArmorSlotOfPlayer(player.getPlayer(), ArmorSlot.LEGGINGS); ItemStack boots = ItemUtils.getItemInArmorSlotOfPlayer(player.getPlayer(), ArmorSlot.BOOTS); boolean everythingOK = true; //check helmet if(!hasPermissionForItem(helmet)){ if(!player.getPlayer().getInventory().addItem(helmet).isEmpty()){ player.getPlayer().getWorld().dropItem(player.getLocation(), helmet); } player.getPlayer().getInventory().setHelmet(new ItemStack(Material.AIR)); everythingOK = false; } //check chest if(!hasPermissionForItem(chest)){ if(!player.getPlayer().getInventory().addItem(chest).isEmpty()){ player.getPlayer().getWorld().dropItem(player.getLocation(), chest); } player.getPlayer().getInventory().setChestplate(new ItemStack(Material.AIR)); everythingOK = false; } //check legs if(!hasPermissionForItem(legs)){ if(!player.getPlayer().getInventory().addItem(legs).isEmpty()){ player.getPlayer().getWorld().dropItem(player.getLocation(), legs); } player.getPlayer().getInventory().setLeggings(new ItemStack(Material.AIR)); everythingOK = false; } //check boots if(!hasPermissionForItem(boots)){ if(!player.getPlayer().getInventory().addItem(boots).isEmpty()){ player.getPlayer().getWorld().dropItem(player.getLocation(), boots); } player.getPlayer().getInventory().setBoots(new ItemStack(Material.AIR)); everythingOK = false; } return everythingOK; } }