package org.reunionemu.jreunion.game;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.reunionemu.jreunion.game.Player.Status;
import org.reunionemu.jreunion.game.items.etc.ScrollOfNAgen;
import org.reunionemu.jreunion.server.PacketFactory.Type;
/**
* @author Aidamina
* @license http://reunion.googlecode.com/svn/trunk/license.txt
*/
public class Exchange {
private List<ExchangeItem> itemList;
private Player owner;
private Player otherTrader;
private long money;
private boolean isAccepted;
public Exchange(Player player) {
itemList = new Vector<ExchangeItem>();
setOwner(player);
setOtherTrader(null);
setAccepted(false);
}
public void addItem(ExchangeItem item) {
if (itemList.contains(item)) {
return;
}
if(getOtherTrader() != null){
if(isAccepted() || getOtherTrader().getExchange().isAccepted()){
disable();
}
getOtherTrader().getClient().sendPacket(Type.EXCH_INVEN_TO, item);
}
itemList.add(item);
}
public void clearExchange() {
itemList.clear();
}
public ExchangeItem getItem(int posX, int posY) {
Iterator<ExchangeItem> exchangeIter = itemListIterator();
while (exchangeIter.hasNext()) {
ExchangeItem exchangeItem = exchangeIter.next();
for (int x = 0; x < exchangeItem.getItem().getType().getSizeX(); x++) {
for (int y = 0; y < exchangeItem.getItem().getType().getSizeY(); y++) {
if (posX == x + exchangeItem.getPosition().getPosX()
&& posY == y + exchangeItem.getPosition().getPosY()) {
return exchangeItem;
}
}
}
}
return null;
}
public Iterator<ExchangeItem> itemListIterator() {
return itemList.iterator();
}
public List<ExchangeItem> getItemList(){
return this.itemList;
}
public void setList(List<ExchangeItem> itemList){
this.itemList = itemList;
}
public int listSize() {
return itemList.size();
}
public void removeItem(ExchangeItem item) {
if (!itemList.contains(item)) {
return;
}
if(getOtherTrader() != null){
if(isAccepted() || getOtherTrader().getExchange().isAccepted()){
disable();
}
getOtherTrader().getClient().sendPacket(Type.EXCH_INVEN_FROM, item);
}
itemList.remove(item);
}
public boolean isItemsScrolls(){
for(ExchangeItem exchangeItem: itemList){
Item<?> item = exchangeItem.getItem();
if(!(item.is(ScrollOfNAgen.class))){
return false;
}
}
return true;
}
public Player getOwner() {
return owner;
}
public void setOwner(Player owner) {
this.owner = owner;
}
public void request(Player target){
if(target.isInCombat()){
getOwner().getClient().sendPacket(Type.EXCH, "cancel");
getOwner().getClient().sendPacket(Type.MSG, target.getName()+" user is in combat mode or unable to engage in an item exchange/refining trade.");
return;
}
setOtherTrader(target);
target.getExchange().setOtherTrader(getOwner());
target.getClient().sendPacket(Type.EXCH_ASK, getOwner());
}
public void cancelRequest(){
getOtherTrader().getClient().sendPacket(Type.EXCH, "cancel");
getOwner().getClient().sendPacket(Type.EXCH, "cancel");
getOtherTrader().getClient().sendPacket(Type.MSG, getOwner().getName()+" user has declined your request for an item exchange/refining trade.");
setOtherTrader(null);
getOwner().getExchange().setOtherTrader(null);
}
public void acceptRequest(){
getOwner().getClient().sendPacket(Type.EXCH_START, getOtherTrader());
for(ExchangeItem exchangeItem : getOtherTrader().getExchange().getItemList()){
getOwner().getClient().sendPacket(Type.EXCH_INVEN_TO, exchangeItem);
}
getOtherTrader().getClient().sendPacket(Type.EXCH_START, getOwner());
for(ExchangeItem exchangeItem : getOwner().getExchange().getItemList()){
getOtherTrader().getClient().sendPacket(Type.EXCH_INVEN_TO, exchangeItem);
}
}
public void disable(){
setAccepted(false);
getOtherTrader().getExchange().setAccepted(false);
setMoney(0);
getOtherTrader().getExchange().setMoney(0);
getOwner().getClient().sendPacket(Type.EXCH, "disable");
getOtherTrader().getClient().sendPacket(Type.EXCH, "disable");
}
public void tradeConfirmation(){
if(getOtherTrader()==null)
return;
if(getOtherTrader().getExchange().isAccepted()){
change();
return;
}
setAccepted(true);
getOtherTrader().getClient().sendPacket(Type.EXCH, "trade");
}
public void change(){
if(getOtherTrader()==null)
return;
Player otherTrader = getOtherTrader();
Exchange otherTraderExchange = otherTrader.getExchange();
List<ExchangeItem> otherTraderItemList = new Vector<ExchangeItem>(otherTraderExchange.getItemList());
long otherTraderMoney = otherTraderExchange.getMoney();
long money = getMoney();
//reset other trader exchange
otherTraderExchange.setMoney(0);
otherTraderExchange.setAccepted(false);
otherTraderExchange.setOtherTrader(null);
otherTraderExchange.setList(new Vector<ExchangeItem>(getItemList()));
//reset owner exchange
setMoney(0);
setAccepted(false);
setOtherTrader(null);
setList(otherTraderItemList);
if(otherTraderMoney > 0){
otherTrader.setLime(otherTrader.getLime() - otherTraderMoney);
getOwner().setLime(getOwner().getLime() + otherTraderMoney);
}
if(money > 0){
getOwner().setLime(getOwner().getLime() - money);
otherTrader.setLime(otherTrader.getLime() + money);
}
getOwner().getClient().sendPacket(Type.EXCH, "change");
otherTrader.getClient().sendPacket(Type.EXCH, "change");
}
public Player getOtherTrader() {
return otherTrader;
}
public void setOtherTrader(Player otherTrader) {
this.otherTrader = otherTrader;
}
public long getMoney() {
return money;
}
public void setMoney(long money) {
getOtherTrader().getClient().sendPacket(Type.EXCH_MONEY, money);
this.money = money;
}
public void addMoney(long money){
if(getOtherTrader() == null)
return;
if(getOtherTrader().getExchange().isAccepted()){
disable();
return;
}
setMoney(money);
}
public boolean isAccepted() {
return isAccepted;
}
public void setAccepted(boolean isAccepted) {
this.isAccepted = isAccepted;
}
}