package com.laytonsmith.abstraction.bukkit;
import com.laytonsmith.abstraction.Implementation;
import com.laytonsmith.abstraction.MCHumanEntity;
import com.laytonsmith.abstraction.MCInventory;
import com.laytonsmith.abstraction.MCInventoryHolder;
import com.laytonsmith.abstraction.MCItemStack;
import com.laytonsmith.abstraction.bukkit.entities.BukkitMCHumanEntity;
import com.laytonsmith.abstraction.enums.MCInventoryType;
import com.laytonsmith.core.CHLog;
import com.laytonsmith.core.CHLog.Tags;
import com.laytonsmith.core.LogLevel;
import com.laytonsmith.core.constructs.Target;
import com.laytonsmith.core.exceptions.CRE.CRERangeException;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
*
*/
public class BukkitMCInventory implements MCInventory {
private Inventory i;
public BukkitMCInventory(Inventory inventory) {
this.i = inventory;
}
@Override
public MCInventoryType getType() {
return MCInventoryType.valueOf(this.i.getType().name());
}
@Override
public int getSize() {
return this.i.getSize();
}
@Override
public MCItemStack getItem(int slot) {
try {
return new BukkitMCItemStack(i.getItem(slot));
} catch (ArrayIndexOutOfBoundsException aioobe) {
if (slot > 0 && slot < getSize()) {
CHLog.GetLogger().Log(Tags.RUNTIME, LogLevel.WARNING, "The API claims that a particular slot is"
+ " accessible, however the server implementation does not give access."
+ " This is the fault of the server and can't be helped by "
+ Implementation.GetServerType().getBranding() + ".", Target.UNKNOWN);
} else {
throw new CRERangeException("No slot " + slot + " exists in the given inventory", Target.UNKNOWN);
}
return null;
}
}
@Override
public void setItem(int slot, MCItemStack stack) {
try {
this.i.setItem(slot, stack == null ? null : ((BukkitMCItemStack) stack).is);
} catch (ArrayIndexOutOfBoundsException aioobe) {
if (slot > 0 && slot < getSize()) {
CHLog.GetLogger().Log(Tags.RUNTIME, LogLevel.WARNING, "The API claims that a particular slot is"
+ " accessible, however the server implementation does not give access."
+ " This is the fault of the server and can't be helped by "
+ Implementation.GetServerType().getBranding() + ".", Target.UNKNOWN);
} else {
throw new CRERangeException("No slot " + slot + " exists in the given inventory", Target.UNKNOWN);
}
}
if(this.i.getHolder() instanceof Player){
((Player)this.i.getHolder()).updateInventory();
}
}
@Override
public void clear() {
i.clear();
}
@Override
public void clear(int index) {
i.clear(index);
}
@Override
public Object getHandle() {
return i;
}
@Override
public String toString() {
return i.toString();
}
@Override
public boolean equals(Object obj) {
return (obj instanceof BukkitMCInventory?i.equals(((BukkitMCInventory)obj).i):false);
}
@Override
public int hashCode() {
return i.hashCode();
}
@Override
public Map<Integer, MCItemStack> addItem(MCItemStack stack) {
Map<Integer, ItemStack> h = i.addItem(stack==null?null:((BukkitMCItemStack)stack).is);
Map<Integer, MCItemStack> m = new HashMap<Integer, MCItemStack>();
for (Map.Entry<Integer, ItemStack> entry : h.entrySet()) {
Integer key = entry.getKey();
ItemStack value = entry.getValue();
m.put(key, new BukkitMCItemStack(value));
}
return m;
}
@Override
public List<MCHumanEntity> getViewers() {
List<MCHumanEntity> retn = new ArrayList<MCHumanEntity>();
for (HumanEntity human: i.getViewers()) {
retn.add(new BukkitMCHumanEntity((human)));
}
return retn;
}
@Override
public MCInventoryHolder getHolder() {
return new BukkitMCInventoryHolder(i.getHolder());
}
@Override
public String getTitle() {
return i.getTitle();
}
}