package org.reunionemu.jreunion.game.npc;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.reunionemu.jreunion.game.HandPosition;
import org.reunionemu.jreunion.game.InventoryItem;
import org.reunionemu.jreunion.game.InventoryPosition;
import org.reunionemu.jreunion.game.Item;
import org.reunionemu.jreunion.game.ItemType;
import org.reunionemu.jreunion.game.NpcType;
import org.reunionemu.jreunion.game.Player;
import org.reunionemu.jreunion.game.Skill;
import org.reunionemu.jreunion.game.StashItem;
import org.reunionemu.jreunion.game.StashPosition;
import org.reunionemu.jreunion.game.items.etc.Lime;
import org.reunionemu.jreunion.server.Client;
import org.reunionemu.jreunion.server.DatabaseUtils;
import org.reunionemu.jreunion.server.Server;
import org.reunionemu.jreunion.server.PacketFactory.Type;
/**
* @author Aidamina
* @license http://reunion.googlecode.com/svn/trunk/license.txt
*/
public class Warehouse extends NpcType {
public Warehouse(int id) {
super(id);
//loadFromReference(id);
}
/****** Open stash ******/
public void openStash(Player player) {
Client client = player.getClient();
int firstSlot = player.getStash().getTabFirstSlot(0);
int lastSlot = player.getStash().getTabLastSlot(2);
for(int pos=firstSlot; pos<=lastSlot; pos++){
if(!player.getStash().checkPosEmpty(pos)){
StashItem stashItem = player.getStash().getItem(pos);
client.sendPacket(Type.STASH, stashItem, player.getStash().getQuantity(pos));
}
}
/*
Iterator<StashItem> stashIter = player.getStash().itemListIterator();
while (stashIter.hasNext()) {
StashItem stashItem = stashIter.next();
int slot = stashItem.getStashPosition().getSlot();
client.sendPacket(Type.STASH, stashItem, player.getStash().getQuantity(slot));
}
*/
client.sendPacket(Type.STASH_END);
}
/****** Add/Remove single items to/from stash ******/
public void stashClick(Player player, int pos, int type, int gems, int special) {
if(pos == 12){
if(gems >= 0)
storeLime(player, pos, gems);
else
removeLime(player, pos, gems);
return;
}
HandPosition handPosition = player.getInventory().getHoldingItem();
StashItem stashItem = null;
// Withdraw item from stash
if(handPosition == null){
stashItem = player.getStash().getItem(pos);
player.getInventory().setHoldingItem(new HandPosition(removeItem(player, stashItem)));
LoggerFactory.getLogger(Warehouse.class).info("Player "+player+" removed item "+stashItem.getItem()+" from the warehouse");
player.getClient().sendPacket(Type.STASH_FROM, stashItem, player.getStash().getQuantity(pos));
} else { //store item on stash
stashItem = new StashItem(new StashPosition(pos), handPosition.getItem());
storeItem(player,stashItem);
LoggerFactory.getLogger(Warehouse.class).info("Player "+player+" stored item "+stashItem.getItem()+" in the warehouse");
}
}
/****** Add multiple items to stash ******/
public void stashPut(Player player, int[] packetData) {
int index = 0;
int itemTypeId = packetData[index++];
int invTab = packetData[index++];
int stashTab = packetData[index++];
int position = player.getStash().getItemSlot(stashTab, itemTypeId);
if(position == -1){
player.getClient().sendPacket(Type.SAY, "No free slots available on this Tab.");
return;
}
StashPosition stashPosition = new StashPosition(position);
StashItem stashItem = null;
while(index < packetData.length -1){
int posX = packetData[index++];
int posY = packetData[index++];
Item<?> item = player.getInventory().getItem(invTab, posX, posY).getItem();
stashItem = new StashItem(stashPosition, item);
player.getStash().addItem(stashItem);
player.getInventory().deleteInventoryItem(player.getInventory().getItem(invTab, posX, posY));
}
LoggerFactory.getLogger(Warehouse.class).info(
"Player " + player + " stored " + (packetData.length - 3) / 2
+ " item(s) " + stashItem.getItem() + " in the warehouse slot " + (stashPosition.getSlot()+1));
player.getClient().sendPacket(Type.STASH_PUT, itemTypeId, invTab,
stashTab, stashPosition.getSlot(), (packetData.length - 3) / 2, packetData);
}
/****** Remove multiple items from stash ******/
public void stashGet(Player player, int type, int inventoryTab, int unknown1, int pos) {
List<int[]> itemList = new Vector<int[]>();
int itemQuantity = player.getStash().getQuantity(pos);
StashItem stashItem = null;
itemQuantity = itemQuantity <= 10 ? itemQuantity : 10;
while(itemQuantity-- > 0){
stashItem = player.getStash().getItem(pos);
Item<?> item = removeItem(player,stashItem);
int[] itemData = new int[3];
itemData = player.getInventory().getFreeSlots(item, inventoryTab); //get item inventory position
player.getInventory().addInventoryItem(
new InventoryItem(item,
new InventoryPosition(itemData[1], itemData[2], itemData[0])));
itemData[0] = item.getEntityId(); //store item entity Id
itemList.add(itemData);
}
LoggerFactory.getLogger(Warehouse.class).info("Player " + player + " removed " + itemList.size()
+ " item(s) " + stashItem.getItem() + " from the warehouse slot " + (pos+1));
player.getClient().sendPacket(Type.STASH_GET, itemList, type, inventoryTab, unknown1, pos, itemList.size());
}
public void storeItem(Player player, StashItem stashItem){
int slot = stashItem.getStashPosition().getSlot();
player.getInventory().setHoldingItem(null);
player.getStash().addItem(stashItem);
player.getClient().sendPacket(Type.STASH_TO, stashItem, player.getStash().getQuantity(slot));
//LoggerFactory.getLogger(Warehouse.class).info("Player "+player+" stored item "+stashItem.getItem()+" in the warehouse");
}
public Item<?> removeItem(Player player, StashItem stashItem){
if(stashItem == null) {
return null;
}
Item<?> item = stashItem.getItem();
int slot = stashItem.getStashPosition().getSlot();
if(item.getEntityId() == -1 && slot != 12)
player.getPosition().getLocalMap().createEntityId(item);
//player.getInventory().setHoldingItem(new HandPosition(item));
player.getStash().removeItem(stashItem);
//LoggerFactory.getLogger(Warehouse.class).info("Player "+player+" removed item "+item+" from the warehouse");
return item;
}
//storing lime on the warehouse
public boolean storeLime(Player player, int pos, long limeAmount){
StashItem stashItem = player.getStash().getItem(pos);
Item<?> limeItem = null;
if(stashItem == null){
limeItem = player.getClient().getWorld().getItemManager().create(1014);
stashItem = new StashItem(new StashPosition(12), limeItem);
player.getStash().addItem(stashItem);
} else {
limeItem = stashItem.getItem();
}
long limeLimit = Server.getInstance().getWorld().getServerSetings().getWarehouseLimeLimit();
//check if warehouse lime limit is reached.
if((limeItem.getGemNumber() + limeAmount) > limeLimit){
long limeOverLimit = limeItem.getGemNumber() + limeAmount - limeLimit;
limeAmount = limeAmount - limeOverLimit;
player.getClient().sendPacket(Type.MSG, "Inventory maximum lime limit reached.");
}
//synchronized(player) {
if ((player.getLime() - limeAmount) >= 0)
player.setLime(player.getLime() - limeAmount);
else {
LoggerFactory.getLogger(Warehouse.class).warn(
"Player " + player + " is trying to remove " + limeAmount
+ " lime from character. " + "Lime available " + player.getLime());
return false;
}
//}
limeItem.setGemNumber((limeItem.getGemNumber()) + limeAmount);
DatabaseUtils.getDinamicInstance().saveItem(limeItem);
player.getClient().sendPacket(Type.STASH_TO, stashItem, player.getStash().getQuantity(pos));
return true;
}
public boolean removeLime(Player player, int pos, int limeAmmount){
StashItem stashItem = player.getStash().getItem(pos);
Item<?> limeItem = null;
if(stashItem == null){
LoggerFactory.getLogger(Warehouse.class).warn(
"Player " + player + " is trying to remove " + limeAmmount
+ " lime from Warehouse. " + "But there is no lim available.");
return false;
} else {
limeItem = stashItem.getItem();
}
//synchronized(player) {
if ((limeItem.getGemNumber() + limeAmmount) >= 0)
limeItem.setGemNumber(limeItem.getGemNumber() + limeAmmount);
else {
LoggerFactory.getLogger(Warehouse.class).warn(
"Player " + player + " is trying to remove " + limeAmmount
+ " lime from Warehouse. " + "Lime available " + player.getLime());
return false;
}
//}
player.setLime(player.getLime() - limeAmmount);
DatabaseUtils.getDinamicInstance().saveItem(limeItem);
player.getClient().sendPacket(Type.STASH_FROM, stashItem, player.getStash().getQuantity(pos));
return true;
}
}