package net.riixo.wcore.objects; import net.riixo.wcore.basic.*; import org.bukkit.entity.*; import org.bukkit.inventory.*; import org.bukkit.*; import net.riixo.wcore.utils.*; import org.bukkit.scheduler.*; import org.bukkit.plugin.*; import java.util.*; public class Trade { private Main plugin; private Player tradeRequester; private Player tradeAccepter; private Inventory requesterInventory; private Inventory accepterInventory; private ItemStack[] requesterTradeRequestItems; private ItemStack[] accepterTradeRequestItems; private boolean countdownInProgress; private boolean tradeAccepted; private boolean requesterReady; private boolean accepterReady; private boolean tradeReady; private boolean cancelled; private int countdown; public Trade(final Main plugin, final Player tradeRequester, final Player tradeAccepter) { this.tradeRequester = null; this.tradeAccepter = null; this.requesterInventory = null; this.accepterInventory = null; this.requesterTradeRequestItems = new ItemStack[0]; this.accepterTradeRequestItems = new ItemStack[0]; this.countdownInProgress = false; this.tradeAccepted = false; this.requesterReady = false; this.accepterReady = false; this.tradeReady = false; this.cancelled = false; this.countdown = -1; this.plugin = plugin; this.tradeRequester = tradeRequester; this.tradeAccepter = tradeAccepter; ChatUtil.sendMsg(tradeRequester, "&8>> &aWymiana wyslana do gracza &7" + tradeAccepter.getName()); ChatUtil.sendMsg(tradeAccepter, "&8>> &aGracz &7" + tradeRequester.getName() + " &azaprosil cie do wymiany, masz 15 sekund by akceptowac &7/wymiana akceptuj&a."); this.startTimeOutCounter(); } public void openTrade() { if (!this.isCancelled()) { if (this.tradeRequester.isOnline() && this.tradeAccepter.isOnline() && this.tradeRequester.getLocation().distance(this.tradeAccepter.getLocation()) <= 10.0) { final String invName = ChatUtil.fixColor("&8>>&aTy &8>>&cOn"); final Inventory inv = Bukkit.createInventory((InventoryHolder)null, 45, invName); final ItemStack divider = TradeUtil.getItem(Material.IRON_FENCE, 1, 0, " "); final ItemStack declineTrade = TradeUtil.getItem(Material.MAGMA_CREAM, 1, 0, ChatUtil.fixColor("&cKliknij, aby anulowac!")); final ItemStack acceptTrade = TradeUtil.getItem(Material.SLIME_BALL, 1, 0, ChatUtil.fixColor("&aKliknij, aby akceptowac!")); final ItemStack notReady = TradeUtil.getItem(Material.INK_SACK, 1, 8, ChatUtil.fixColor("&cNie gotowy")); inv.setItem(4, divider); inv.setItem(13, divider); inv.setItem(22, divider); inv.setItem(31, divider); inv.setItem(40, divider); inv.setItem(36, acceptTrade); inv.setItem(37, declineTrade); inv.setItem(39, notReady); inv.setItem(44, notReady); (this.requesterInventory = Bukkit.createInventory((InventoryHolder)null, 45, invName)).setContents(inv.getContents()); (this.accepterInventory = Bukkit.createInventory((InventoryHolder)null, 45, invName)).setContents(inv.getContents()); this.tradeRequester.openInventory(this.requesterInventory); this.tradeAccepter.openInventory(this.accepterInventory); } else { this.cancelTrade(true); } } } public void closeTrade() { if (this.tradeRequester.isOnline() && this.tradeRequester.getOpenInventory() != null && this.tradeRequester.getOpenInventory().getTopInventory() != null) { this.tradeRequester.closeInventory(); this.tradeRequester.updateInventory(); } if (this.tradeAccepter.isOnline() && this.tradeAccepter.getOpenInventory() != null && this.tradeAccepter.getOpenInventory().getTopInventory() != null) { this.tradeAccepter.closeInventory(); this.tradeAccepter.updateInventory(); } } public void startTimeOutCounter() { new BukkitRunnable() { int seconds = 0; public void run() { if (!Trade.this.isCancelled()) { if (this.seconds < 15) { if (!Trade.this.tradeRequester.isOnline() || !Trade.this.tradeAccepter.isOnline() || !Trade.this.tradeRequester.getWorld().getName().equalsIgnoreCase(Trade.this.tradeAccepter.getWorld().getName()) || Trade.this.tradeRequester.getLocation().distance(Trade.this.tradeAccepter.getLocation()) > 10.0) { Trade.this.cancelTrade(true); this.cancel(); } if (Trade.this.isTradeAccepted()) { this.cancel(); } } else { Trade.this.cancelTrade(true); this.cancel(); } ++this.seconds; } else { this.cancel(); } } }.runTaskTimer((Plugin)this.plugin, 20L, 20L); } public void startReadyCounter() { this.countdownInProgress = true; this.countdown = 5; new BukkitRunnable() { int seconds = 0; public void run() { if (!Trade.this.isCancelled()) { Trade.this.updateOpenTrade(); if (this.seconds < 5) { if (!Trade.this.tradeRequester.isOnline() || !Trade.this.tradeAccepter.isOnline() || !Trade.this.hasTradeWindowOpen(Trade.this.tradeRequester) || !Trade.this.hasTradeWindowOpen(Trade.this.tradeAccepter)) { Trade.this.cancelTrade(true); this.cancel(); } } else { Trade.this.cancelTrade(false); this.cancel(); } final Trade this$2; final Trade this$0 = this$2 = Trade.this; Trade.access$3(this$2, this$2.countdown - 1); ++this.seconds; } else { this.cancel(); } } }.runTaskTimer((Plugin)this.plugin, 20L, 20L); } public boolean isCountdownInProgress() { return this.countdownInProgress; } public void giveItemsFromTrade() { final ItemStack[] empty = new ItemStack[0]; this.tradeRequester.getInventory().addItem(this.getAccepterTradeRequestItems()); this.setAccepterTradeRequestItems(empty); this.tradeAccepter.getInventory().addItem(this.getRequesterTradeRequestItems()); this.setRequesterTradeRequestItems(empty); } public void returnItems() { final ItemStack[] empty = new ItemStack[0]; this.tradeRequester.getInventory().addItem(this.getRequesterTradeRequestItems()); this.setRequesterTradeRequestItems(empty); this.tradeAccepter.getInventory().addItem(this.getAccepterTradeRequestItems()); this.setAccepterTradeRequestItems(empty); } public boolean hasTradeWindowOpen(final Player p) { boolean open = false; if (p.getOpenInventory() != null) { final Inventory inv = p.getOpenInventory().getTopInventory(); if (inv.getSize() == 45 && inv.getTitle().contains(ChatUtil.fixColor("&8>>&aTy &8>>&cOn"))) { open = true; } } return open; } public void updateOpenTrade() { if (!this.isCancelled()) { if (this.tradeRequester.isOnline() && this.tradeAccepter.isOnline() && this.tradeRequester.getLocation().distance(this.tradeAccepter.getLocation()) <= 10.0) { this.setRequesterTradeRequestItems(Main.tradeManager.getItemsRequester(this.getRequester())); this.setAccepterTradeRequestItems(Main.tradeManager.getItemsAccepter(this.getAccepter())); final String invName = ChatUtil.fixColor("&8>>&aTy &8>>&cOn"); final Inventory inv = Bukkit.createInventory((InventoryHolder)null, 45, invName); int dividerCountdown = 1; if (this.countdown > 0) { dividerCountdown = this.countdown; } final ItemStack divider = TradeUtil.getItem(Material.IRON_FENCE, dividerCountdown, 0, " ", null); final ItemStack declineTrade = TradeUtil.getItem(Material.MAGMA_CREAM, 1, 0, ChatUtil.fixColor("&cKliknij, aby anulowac!")); final ItemStack acceptTrade = TradeUtil.getItem(Material.SLIME_BALL, 1, 0, ChatUtil.fixColor("&aKliknij, aby akceptowac!")); final ItemStack ready = TradeUtil.getItem(Material.INK_SACK, 1, 10, ChatUtil.fixColor("&aGotowy")); final ItemStack notReady = TradeUtil.getItem(Material.INK_SACK, 1, 8, ChatUtil.fixColor("&cNie gotowy")); inv.setItem(4, divider); inv.setItem(13, divider); inv.setItem(22, divider); inv.setItem(31, divider); inv.setItem(40, divider); inv.setItem(36, acceptTrade); inv.setItem(37, declineTrade); inv.setItem(39, notReady); inv.setItem(44, notReady); Inventory requesterInventory = Bukkit.createInventory((InventoryHolder)null, 45, invName); requesterInventory.setContents(inv.getContents()); requesterInventory = Main.tradeManager.setItemsLeft(requesterInventory, this.getRequesterTradeRequestItems()); requesterInventory = Main.tradeManager.setItemsRight(requesterInventory, this.getAccepterTradeRequestItems()); Inventory accepterInventory = Bukkit.createInventory((InventoryHolder)null, 45, invName); accepterInventory.setContents(inv.getContents()); accepterInventory = Main.tradeManager.setItemsLeft(accepterInventory, this.getAccepterTradeRequestItems()); accepterInventory = Main.tradeManager.setItemsRight(accepterInventory, this.getRequesterTradeRequestItems()); if (this.isRequesterReady()) { requesterInventory.setItem(39, ready); accepterInventory.setItem(44, ready); } if (this.isAccepterReady()) { requesterInventory.setItem(44, ready); accepterInventory.setItem(39, ready); } this.tradeRequester.getOpenInventory().getTopInventory().setContents(requesterInventory.getContents()); this.tradeAccepter.getOpenInventory().getTopInventory().setContents(accepterInventory.getContents()); } else { this.cancelTrade(true); } } } public void setRequesterTradeRequestItems(final ItemStack[] items) { this.requesterTradeRequestItems = items; } public ItemStack[] getRequesterTradeRequestItems() { return this.requesterTradeRequestItems; } public void setAccepterTradeRequestItems(final ItemStack[] items) { this.accepterTradeRequestItems = items; } public ItemStack[] getAccepterTradeRequestItems() { return this.accepterTradeRequestItems; } public void setTradeAccepted(final boolean bool) { ChatUtil.sendMsg(this.tradeRequester, "&8>> &aWymiana zostala akceptowana!"); ChatUtil.sendMsg(this.tradeAccepter, "&8>> &aWymiana zostala akceptowana!"); this.openTrade(); this.tradeAccepted = bool; } public boolean isTradeAccepted() { return this.tradeAccepted; } public void setRequesterReady(final boolean bool) { this.requesterReady = bool; this.updateOpenTrade(); if (this.isRequesterReady() && this.isAccepterReady() && !this.isCountdownInProgress()) { this.startReadyCounter(); } } public boolean isRequesterReady() { return this.requesterReady; } public void setAccepterReady(final boolean bool) { this.accepterReady = bool; this.updateOpenTrade(); if (this.isRequesterReady() && this.isAccepterReady() && !this.isCountdownInProgress()) { this.startReadyCounter(); } } public boolean isAccepterReady() { return this.accepterReady; } public void setTradeReady(final boolean bool) { this.tradeReady = bool; } public boolean isTradeReady() { return this.tradeReady; } public void cancelTrade(final boolean cancelled) { this.cancelled = true; if (cancelled) { this.returnItems(); this.closeTrade(); if (this.tradeRequester.getLocation().distance(this.tradeAccepter.getLocation()) > 10.0) { if (this.tradeRequester.isOnline()) { ChatUtil.sendMsg(this.tradeRequester, "&8>> &cJestes za daleko od gracza, minimalna odleglosc to 10 metrow!"); } if (this.tradeAccepter.isOnline()) { ChatUtil.sendMsg(this.tradeAccepter, "&8>> &cJestes za daleko od gracza, minimalna odleglosc to 10 metrow!"); } } if (this.tradeRequester.isOnline()) { ChatUtil.sendMsg(this.tradeRequester, "&8>> &cWymiana zostala anulowana!"); } if (this.tradeAccepter.isOnline()) { ChatUtil.sendMsg(this.tradeAccepter, "&8>> &cWymiana zostala anulowana!"); } } else { this.giveItemsFromTrade(); this.closeTrade(); if (this.tradeRequester.isOnline()) { ChatUtil.sendMsg(this.tradeRequester, "&8>> &aWymiana zostala zakonczona sukcesem!"); } if (this.tradeAccepter.isOnline()) { ChatUtil.sendMsg(this.tradeAccepter, "&8>> &aWymiana zostala zakonczona sukcesem!"); } } this.countdownInProgress = false; Main.tradeManager.removeTrade(this); } public boolean isCancelled() { return this.cancelled; } public Player getRequester() { return this.tradeRequester; } public Player getAccepter() { return this.tradeAccepter; } static /* synthetic */ void access$3(final Trade trade, final int countdown) { trade.countdown = countdown; } }