package org.reunionemu.jreunion.game;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.reunionemu.jreunion.game.items.SpecialWeapon;
import org.reunionemu.jreunion.game.items.equipment.Armor;
import org.reunionemu.jreunion.game.items.equipment.Bracelet;
import org.reunionemu.jreunion.game.items.equipment.HeavyWeapon;
import org.reunionemu.jreunion.game.items.equipment.Mantle;
import org.reunionemu.jreunion.game.items.equipment.Necklace;
import org.reunionemu.jreunion.game.items.equipment.Ring;
import org.reunionemu.jreunion.game.items.equipment.Shield;
import org.reunionemu.jreunion.game.items.equipment.SlayerWeapon;
import org.reunionemu.jreunion.game.items.equipment.WandWeapon;
import org.reunionemu.jreunion.game.items.equipment.Weapon;
import org.reunionemu.jreunion.game.items.equipment.Wing;
import org.reunionemu.jreunion.game.items.pet.PetEgg;
/**
* @author Aidamina
* @license http://reunion.googlecode.com/svn/trunk/license.txt
*/
public class Equipment {
private Item<?> weapon;
private Item<?> helmet;
private Item<?> armor;
private Item<?> pants;
private Item<?> boots;
private Item<?> shield;
private Item<?> wand;
private Item<?> specialWeapon;
private Item<?> mantle;
private Item<?> wings;
private Item<?> ring;
private Item<?> necklace;
private Item<?> bracelet;
private Item<?> egg;
private Player owner;
public Equipment(Player player) {
setOwner(player);
}
public Item<?> getArmor() {
return armor;
}
public Item<?> getBoots() {
return boots;
}
public Item<?> getBracelet() {
return bracelet;
}
public Item<?> getMainHand() {
return weapon;
}
public Item<?> getHelmet() {
return helmet;
}
public int getTypeId(Slot slot){
Item<?> item = getItem(slot);
return item == null ? -1 : item.getType().getTypeId();
}
public int getEntityId(Slot slot){
Item<?> item = getItem(slot);
return item == null ? -1 : item.getEntityId();
}
public long getExtraStats(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getExtraStats();
}
public long getGemNumber(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getGemNumber();
}
public int getDurability(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getDurability();
}
public int getMaxDurability(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getType().getMaxDurability();
}
public int getUnknown1(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getUnknown1();
}
public int getUnknown2(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getUnknown2();
}
public int getUnknown3(Slot slot){
Item<?> item = getItem(slot);
return item == null ? 0 : item.getUnknown3();
}
public Item<?> getItem(Slot slot) {
switch (slot) {
case BRACELET:
return getBracelet();
case BOOTS:
return getBoots();
case MAINHAND:
return getMainHand();
case HELMET:
return getHelmet();
case PANTS:
return getPants();
case NECKLACE:
return getNecklace();
case RING:
return getRing();
case OFFHAND:
return getOffHand();
case SHOULDER:
return getShoulderMount();
case CHEST:
return getArmor();
}
return null;
}
private Item<?> getMantle() {
return mantle;
}
public Item<?> getNecklace() {
return necklace;
}
public Item<?> getPants() {
return pants;
}
public Item<?> getRing() {
return ring;
}
public Item<?> getOffHand() {
if (getShield() != null) {
return getShield();
} else if (getWand() != null) {
return getWand();
}
return null;
}
private Item<?> getShield() {
return shield;
}
public Item<?> getShoulderMount() {
if (getSpecialWeapon() != null) {
return getSpecialWeapon();
} else if (getMantle() != null) {
return getMantle();
} else if (getWings() != null) {
return getWings();
} else if (getEgg() != null) {
return getEgg();
} else {
return null;
}
}
private Item<?> getSpecialWeapon() {
return specialWeapon;
}
private Item<?> getWand() {
return wand;
}
private Item<?> getWings() {
return wings;
}
public void setArmor(Item<?> armor) {
if(armor!=null&&!armor.is(Armor.class)){
throw new IllegalArgumentException();
}
this.armor = armor;
}
public void setBoots(Item<?> boots) {
if(boots!=null&&!boots.is(Armor.class)){
throw new IllegalArgumentException();
}
this.boots = boots;
}
public void setBracelet(Item<?> bracelet) {
if(bracelet!=null&&!bracelet.is(Bracelet.class)){
throw new IllegalArgumentException();
}
this.bracelet = bracelet;
}
public void setMainhand(Item<?> weapon) {
if(weapon!=null&&!weapon.is(Weapon.class)){
throw new IllegalArgumentException();
}
this.weapon = weapon;
}
public void setHelmet(Item<?> helmet) {
if(helmet!=null&&!helmet.is(Armor.class)){
throw new IllegalArgumentException();
}
this.helmet = helmet;
}
public boolean setItem(Slot slot, Item<?> item) {
try{
switch (slot) {
case HELMET: {
setHelmet(item);
break;
}
case CHEST: {
setArmor(item);
break;
}
case PANTS: {
setPants(item);
break;
}
case SHOULDER: {
setShoulderMount(item);
break;
}
case BOOTS: {
setBoots(item);
break;
}
case OFFHAND: {
setOffhand(item);
break;
}
case NECKLACE: {
setNecklace(item);
break;
}
case RING: {
setRing(item);
break;
}
case BRACELET: {
setBracelet(item);
break;
}
case MAINHAND: {
setMainhand(item);
break;
}
}
}catch(IllegalAccessError e){
return false;
}
return true;
}
private void setMantle(Item<?> mantle) {
if(mantle!=null&&!mantle.is(Mantle.class)){
throw new IllegalArgumentException();
}
this.mantle = mantle;
}
public void setNecklace(Item<?> necklace) {
if(necklace!=null&&!necklace.is(Necklace.class)){
throw new IllegalArgumentException();
}
this.necklace = necklace;
}
public void setPants(Item<?> pants) {
if(pants!=null&&!pants.is(Armor.class)){
throw new IllegalArgumentException();
}
this.pants = pants;
}
public void setRing(Item<?> ring) {
if(ring!=null&&!ring.is(Ring.class)){
throw new IllegalArgumentException();
}
this.ring = ring;
}
public void setOffhand(Item<?> secondHand) {
try{
if (secondHand.is(Shield.class)) {
setShield(secondHand);
setWand(null);
} else if (secondHand.is(WandWeapon.class)) {
setWand(secondHand);
setShield(null);
} else {
setShield(null);
setWand(null);
}
} catch (NullPointerException e)
{
LoggerFactory.getLogger(Equipment.class).error("Player has wrong item");
}
}
private void setShield(Item<?> shield) {
if(shield!=null&&!shield.is(Shield.class)){
throw new IllegalArgumentException();
}
this.shield = shield;
}
public void setShoulderMount(Item<?> shoulderMount) {
if(shoulderMount == null) {
setSpecialWeapon(null);
setMantle(null);
setWings(null);
setEgg(null);
} else if (shoulderMount.is(SlayerWeapon.class)) {
setMantle(null);
setWings(null);
setSpecialWeapon(shoulderMount);
setEgg(null);
} else if (shoulderMount.is(HeavyWeapon.class)) {
setMantle(null);
setWings(null);
setSpecialWeapon(shoulderMount);
setEgg(null);
} else if (shoulderMount.is(Mantle.class)) {
setSpecialWeapon(null);
setWings(null);
setMantle(shoulderMount);
setEgg(null);
} else if (shoulderMount.is(Wing.class)) {
setSpecialWeapon(null);
setMantle(null);
setWings(shoulderMount);
setEgg(null);
} else if (shoulderMount.is(PetEgg.class)) {
setSpecialWeapon(null);
setMantle(null);
setWings(null);
setEgg(shoulderMount);
}
}
private void setSpecialWeapon(Item<?> specialWeapon) {
if(specialWeapon!=null&&!specialWeapon.is(SpecialWeapon.class)){
throw new IllegalArgumentException();
}
this.specialWeapon = specialWeapon;
}
private void setWand(Item<?> wand) {
if(wand!=null&&!wand.is(WandWeapon.class)){
throw new IllegalArgumentException();
}
this.wand = wand;
}
private void setWings(Item<?> wings) {
if(wings!=null&&!wings.is(Wing.class)){
throw new IllegalArgumentException();
}
this.wings = wings;
}
public Item<?> getEgg() {
return egg;
}
public void setEgg(Item<?> egg) {
if(egg!=null&&!egg.is(PetEgg.class)){
throw new IllegalArgumentException();
}
this.egg = egg;
}
public Player getOwner() {
return owner;
}
public void setOwner(Player owner) {
this.owner = owner;
}
public static enum Slot
{
EMPTY(-1),
HELMET(0),
CHEST(1),
PANTS(2),
SHOULDER(3),
BOOTS(4),
OFFHAND(5),
NECKLACE(6),
RING(7),
BRACELET(8),
MAINHAND(9);
int value;
Slot(int value){
this.value = value;
}
public int value(){
return value;
}
public static Slot byValue(int slotId){
for(Slot slot:Slot.values())
{
if(slot.value()==slotId){
return slot;
}
}
return null;
}
}
}