package org.reunionemu.jreunion.game;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.reunionemu.jreunion.server.Server;
/**
* @author Aidamina
* @license http://reunion.googlecode.com/svn/trunk/license.txt
*/
public class Inventory {
private List<InventoryItem> items = null;;
private HandPosition holdingItem = null;
public Inventory() {
items = new Vector<InventoryItem>();
}
public void setHoldingItem(HandPosition holdingItem) {
this.holdingItem = holdingItem;
}
public HandPosition getHoldingItem() {
return holdingItem;
}
public Iterator<InventoryItem> getInventoryIterator() {
return items.iterator();
}
public boolean posEmpty(int tab, int posX, int posY) {
Iterator<InventoryItem> iter = getInventoryIterator();
while (iter.hasNext()) {
InventoryItem item = iter.next();
if(item.getPosition().getTab() == tab){
for (int x = item.getPosition().getPosX(); x < item.getPosition().getPosX()
+ item.getItem().getType().getSizeX(); x++) {
for (int y = item.getPosition().getPosY(); y < item.getPosition().getPosY()
+ item.getItem().getType().getSizeY(); y++) {
if (x == posX && y == posY) {
//LoggerFactory.getLogger(Inventory.class).debug("DETECETED ITEM COLISION: ["+x+"]["+y+"] "+item.getItem().getDescription());
return false;
}
}
}
}
}
return true;
}
public boolean itemFit(int tab, int posX, int posY, int sizeX, int sizeY) {
//checks if item size, from the position we are trying to place it,
//don't stay outside the inventory size.
if (posX + sizeX > 8 || posY + sizeY > 6) {
return false;
}
//checks if every position occupied by the item, in the inventory, is free
for (int x = posX; x < posX + sizeX; x++) {
for (int y = posY; y < posY + sizeY; y++) {
//LoggerFactory.getLogger(Inventory.class).debug("CHECKING FIT POSITION ["+x+"]["+y+"]");
if (posEmpty(tab, x, y) == false) {
return false;
}
}
}
return true;
}
//returns the stored item position (top left corner) of an inventory item.
//this is used, for example, if we check the position [1;3] in the inventory,
//and it correspond to an item that starts in the position [0;1].
public int[] getDetectedItemPosition(int tab, int posX, int posY, int sizeX, int sizeY){
int[] position = new int[3];
//checks if every position occupied by the item, in the inventory, is free
for (int x = posX; x < posX + sizeX; x++) {
for (int y = posY; y < posY + sizeY; y++) {
if (posEmpty(tab, x, y) == false) {
position[0] = tab;
position[1] = x;
position[2] = y;
return position;
//return getItem(tab, x, y);
}
}
}
return null;
}
//return the first free slot, of the item size, from a specified tab
public int[] getFreeSlots(Item<?> item, int neededTab){
if(item == null)
return null;
int[] position = new int[3];
int firstTab = 0;
int lastTab = 2;
if(neededTab > -1){
firstTab = neededTab;
lastTab= neededTab;
}
//checks what is the first free position, where the item fits and returns it.
for (int tab = firstTab; tab <= lastTab; tab++) {
for (int posX = 0; posX < 8; posX++) {
for (int posY = 0; posY < 6; posY++) {
if (itemFit(tab, posX, posY, item.getType().getSizeX(), item.getType().getSizeY())) {
position[0] = tab;
position[1] = posX;
position[2] = posY;
return position;
}
}
}
}
return null;
}
public boolean freeSlots(int tab, Item<?> item) {
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 6; y++) {
if (itemFit(tab, x, y, item.getType().getSizeX(), item.getType().getSizeY())) {
return true;
}
}
}
return false;
}
//returns the inventory item on the given position
public InventoryItem getItem(int tab, int posX, int posY) {
Iterator<InventoryItem> iter = getInventoryIterator();
while (iter.hasNext()) {
InventoryItem invItem = (InventoryItem) iter.next();
for (int x = invItem.getPosition().getPosX(); x < invItem.getPosition().getPosX()
+ invItem.getItem().getType().getSizeX(); x++) {
for (int y = invItem.getPosition().getPosY(); y < invItem.getPosition().getPosY()
+ invItem.getItem().getType().getSizeY(); y++) {
if (x == posX && y == posY && invItem.getPosition().getTab() == tab) {
return invItem;
}
}
}
}
return null;
}
public InventoryItem getItem(int itemEntityId) {
Iterator<InventoryItem> iter = getInventoryIterator();
while (iter.hasNext()) {
InventoryItem invItem = iter.next();
if (invItem.getItem().getEntityId() == itemEntityId) {
return invItem;
}
}
return null;
}
//stores an inventory item in the first free position.
//in this case, there is no item selected.
public InventoryItem storeItem(Item<?> item, int neededTab){
if(item != null){
int[] position = getFreeSlots(item, neededTab);
if(position == null)
return null;
InventoryItem inventoryItem = new InventoryItem(item,
new InventoryPosition(position[1],position[2],position[0]));
addInventoryItem(inventoryItem);
return inventoryItem;
}
return null;
}
//stores an inventory item on the given position.
public boolean storeInventoryItem(int tab, int posX, int posY){
HandPosition handPosition = getHoldingItem();
if(handPosition != null){
InventoryItem inventoryItem = new InventoryItem(handPosition.getItem(),new InventoryPosition(posX,posY,tab));
addInventoryItem(inventoryItem);
Item<?> item = inventoryItem.getItem();
LoggerFactory.getLogger(Inventory.class).info("Item "+item+" stored in player "+getPlayer()+
" inventory at position {tab:"+tab+", x:"+posX+", y:"+posY+"}");
setHoldingItem(null);
return true;
}
return false;
}
//removes an inventory item from the given position.
public boolean removeInventoryItem(int tab, int posX, int posY){
HandPosition handPosition = getHoldingItem();
int [] itemPosition = null;
InventoryItem inventoryItem = null;
if(handPosition != null){
Item<?> handItem = handPosition.getItem();
itemPosition = getDetectedItemPosition(tab, posX, posY, handItem.getType().getSizeX(),
handItem.getType().getSizeY());
inventoryItem = getItem(itemPosition[0], itemPosition[1], itemPosition[2]);
}else {
inventoryItem = getItem(tab,posX,posY);
}
Item<?> item = inventoryItem.getItem();
LoggerFactory.getLogger(Inventory.class).info("Item "+item+" removed from player "+getPlayer()+" inventory.");
deleteInventoryItem(inventoryItem);
if(handPosition != null){
storeInventoryItem(tab,posX,posY);
}
setHoldingItem(new HandPosition(inventoryItem.getItem()));
//when removing an item from the inventory, there must be an holding item.
if(getHoldingItem() == null)
return false;
else
return true;
}
public void addInventoryItem(InventoryItem inventoryItem){
if (inventoryItem != null) {
items.add(inventoryItem);
}
}
public void deleteInventoryItem(InventoryItem inventoryItem) {
if (inventoryItem != null) {
while (items.contains(inventoryItem)) {
items.remove(inventoryItem);
}
}
}
/****** Manages the Items on the Inventory ******/
public void handleInventory(int tab, int posX, int posY) {
HandPosition handPosition = getHoldingItem();
if(handPosition != null){
if(itemFit(tab,posX,posY,handPosition.getItem().getType().getSizeX(),
handPosition.getItem().getType().getSizeY())){
storeInventoryItem(tab,posX,posY);
}else {
removeInventoryItem(tab, posX, posY);
}
}else {
if(!posEmpty(tab, posX, posY)){
removeInventoryItem(tab, posX, posY);
}
}
}
public InventoryItem getItem(int tab, int itemTypeId) {
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 6; y++) {
InventoryItem inventoryItem = getItem(tab, x, y);
if(inventoryItem != null && inventoryItem.getItem().getType().getTypeId() == itemTypeId){
return inventoryItem;
}
}
}
return null;
}
public Player getPlayer(){
Iterator<Player> playerIter = Server.getInstance().getWorld().getPlayerManager().getPlayerListIterator();
while(playerIter.hasNext()){
Player player = (Player) playerIter.next();
if(player.getInventory() == this)
return player;
}
return null;
}
@Deprecated
public void PrintInventoryMap(int tab) { // Debug Only
boolean[][] newInvMap = new boolean[8][6];
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 6; y++) {
newInvMap[x][y] = false;
}
}
LoggerFactory.getLogger(Inventory.class).debug("Tab " + tab + ": \n");
Iterator<InventoryItem> iter = getInventoryIterator();
while (iter.hasNext()) {
InventoryItem item = iter.next();
for (int x = item.getPosition().getPosX(); x < item.getPosition().getPosX()
+ item.getItem().getType().getSizeX(); x++) {
for (int y = item.getPosition().getPosY(); y < item.getPosition().getPosY()
+ item.getItem().getType().getSizeY(); y++) {
if (item.getPosition().getTab() == tab) {
newInvMap[x][y] = true;
}
}
}
}
for (int y = 0; y < 6; y++) {
for (int x = 0; x < 8; x++) {
if (newInvMap[x][y] == false) {
LoggerFactory.getLogger(Inventory.class).debug("0");
}
if (newInvMap[x][y] == true) {
LoggerFactory.getLogger(Inventory.class).debug("1");
}
}
}
}
@Deprecated
public boolean addItem(Item<?> item) {
for (int tab = 0; tab < 3; tab++) {
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 6; y++) {
if(addItem(x, y, item, tab))
return true;
}
}
}
return false;
}
@Deprecated
public boolean addItem(int posX, int posY, Item<?> item, int tab) {
InventoryItem inventoryItem = new InventoryItem(item, new InventoryPosition(posX, posY, tab));
if (itemFit(tab, posX, posY, item.getType().getSizeX(), item.getType().getSizeY()) == true) {
items.add(inventoryItem);
return true;
// LoggerFactory.getLogger(Inventory.class).info("Item Inserted\n");
// PrintInventoryMap(0);
// PrintInventoryMap(1);
// PrintInventoryMap(2);
}
return false;
}
@Deprecated
public int getSize() {
return items.size();
}
@Deprecated
public InventoryItem getItem(Item<?> item) {
Iterator<InventoryItem> iter = getInventoryIterator();
while (iter.hasNext()) {
InventoryItem invItem = iter.next();
if (invItem.getItem() == item) {
return invItem;
}
}
return null;
}
}