@Test public void failedTransaction2() throws ExecutionException, InterruptedException { Stage stage = createStage(); Bank bank = Actor.getReference(Bank.class, "jimmy"); Inventory inventory = Actor.getReference(Inventory.class, "jimmy"); Store store = Actor.getReference(Store.class, "all"); bank.increment(15).join(); fakeSync.put("proceed", "ok"); // this item is invalid but the bank balance is decreased first. store.buyItem(bank, inventory, "candy", 10).join(); store.buyItem(bank, inventory, "chocolate", 1).join(); try { store.buyItem(bank, inventory, "ice cream", 50).join(); fail("expecting an exception"); } catch (CompletionException ex) { System.out.println(ex.getCause().getMessage()); } // the bank credits must be restored. eventually(() -> assertEquals((Integer) 4, bank.getBalance().join())); // no items were given eventually(() -> assertEquals(2, inventory.getItems().join().size())); dumpMessages(); }
public int getItemCount() { int counter = 0; for (Item i : items.getItems()) { if (i == null) { continue; } else { counter++; } } return counter; }
/** * Checks if the player is standning on an item. * * @param x & @param y The position of the player. * @return The Item the player is standing on. */ public Item standOnItem(float x, float y) { for (Item i : items.getItems()) { int[] j = i.getPos(); if ((j[0] <= x + 5) && (j[0] >= x - 5) && (j[1] <= y + 5) && (j[1] >= y - 5)) { items.removeItem(i); Game.lootName = i.getName(); return i; } } return null; }
/** * Renders the room. * * @throws SlickException */ public void renderRoom() throws SlickException { map.render(-(int) player.getPlayerPos()[0] + 320, -(int) player.getPlayerPos()[1] + 320); for (Monster m : monsters) { if (m == null) { continue; } m.renderMonster(); } for (Item j : items.getItems()) { j.renderItem(player); } }
@Test public void successfulTransaction() throws ExecutionException, InterruptedException { Stage stage = createStage(); Bank bank = Actor.getReference(Bank.class, "jimmy"); Inventory inventory = Actor.getReference(Inventory.class, "jimmy"); Store store = Actor.getReference(Store.class, "all"); bank.increment(15).join(); // this allows the store to proceed without blocking fakeSync.put("proceed", "ok"); store.buyItem(bank, inventory, "candy", 10).join(); // the balance was decreased assertEquals((Integer) 5, bank.getBalance().join()); // got the item assertTrue(inventory.getItems().join().get(0).startsWith("candy:")); Thread.sleep(1000); dumpMessages(); }
@Test public void failedTransaction() throws ExecutionException, InterruptedException { Stage stage = createStage(); Bank bank = Actor.getReference(Bank.class, "jimmy"); Inventory inventory = Actor.getReference(Inventory.class, "jimmy"); Store store = Actor.getReference(Store.class, "all"); bank.increment(15).join(); fakeSync.put("proceed", "fail"); // this item is invalid but the bank balance is decreased first. expectException(() -> store.buyItem(bank, inventory, "ice cream", 10).join()); // the bank credits must be restored. eventually(() -> assertEquals((Integer) 15, bank.getBalance().join())); // no items were given assertEquals(0, inventory.getItems().join().size()); dumpMessages(); }
private void initItems() throws SlickException { Item[] i = (Item[]) items.getItems().toArray(new Item[0]); int pX = (int) player.getPlayerPos()[0]; int pY = (int) player.getPlayerPos()[1]; for (int j = 0; j < i.length; j++) { int x = random.nextInt(mapWidth - 64) + 32; int y = random.nextInt(mapHeight - 64) + 32; if (!isBlocked(x, y) && !isBlocked(x + 24, y + 24) && !isBlocked(x + 24, y) && !isBlocked(x, y + 24)) { if (!(pX - x < 100) || !(pY - y < 100) || !(pX - x > -100) || !(pY - y > -100)) { i[j].setPosition(x, y); } else { j--; continue; } } else { j--; continue; } i[j].initItem(); } }
public void handlePacket(Packet p, IoSession session) throws Exception { Player player = (Player) session.getAttachment(); int pID = ((RSCPacket) p).getID(); Player affectedPlayer; if (busy(player)) { affectedPlayer = player.getWishToTrade(); unsetOptions(player); unsetOptions(affectedPlayer); return; } switch (pID) { case 166: // Sending trade request affectedPlayer = world.getPlayer(p.readShort()); if (affectedPlayer == null) return; if (affectedPlayer.isTrading()) { player.getActionSender().sendMessage("That person is already trading"); return; } if (affectedPlayer == null || affectedPlayer.isDueling() || !player.withinRange(affectedPlayer, 8) || player.isTrading() || player.tradeDuelThrottling()) { unsetOptions(player); return; } if (player == null) { Logger.println("Player is null affectedplayer is: " + affectedPlayer.getUsername()); } if (affectedPlayer == player) { player.setSuspiciousPlayer(true); Logger.println("Warning: " + player.getUsername() + " tried to trade to himself."); unsetOptions(player); return; } if (!new PathGenerator( player.getX(), player.getY(), affectedPlayer.getX(), affectedPlayer.getY()) .isValid()) { player.getActionSender().sendMessage("you can't reach this person"); unsetOptions(player); return; } if ((affectedPlayer.getPrivacySetting(2) && !affectedPlayer.isFriendsWith(player.getUsernameHash())) || affectedPlayer.isIgnoring(player.getUsernameHash())) { player.getActionSender().sendMessage("This player has trade requests blocked."); return; } player.setWishToTrade(affectedPlayer); player .getActionSender() .sendMessage( affectedPlayer.isTrading() ? affectedPlayer.getUsername() + " is already in a trade" : "Sending trade request"); affectedPlayer .getActionSender() .sendMessage(player.getUsername() + " wishes to trade with you"); if (!player.isTrading() && affectedPlayer.getWishToTrade() != null && affectedPlayer.getWishToTrade().equals(player) && !affectedPlayer.isTrading()) { player.setTrading(true); player.resetPath(); player.resetAllExceptTrading(); affectedPlayer.setTrading(true); affectedPlayer.resetPath(); affectedPlayer.resetAllExceptTrading(); player.getActionSender().sendTradeWindowOpen(); affectedPlayer.getActionSender().sendTradeWindowOpen(); world.addEntryToSnapshots( new Activity( player.getUsername(), player.getUsername() + " sent trade request " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); } break; case 211: // Trade accepted affectedPlayer = player.getWishToTrade(); if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading()) { // This // shouldn't // happen player.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } player.setTradeOfferAccepted(true); player.getActionSender().sendTradeAcceptUpdate(); affectedPlayer.getActionSender().sendTradeAcceptUpdate(); if (affectedPlayer.isTradeOfferAccepted()) { player.getActionSender().sendTradeAccept(); affectedPlayer.getActionSender().sendTradeAccept(); } world.addEntryToSnapshots( new Activity( player.getUsername(), player.getUsername() + " accepted trade " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); break; case 53: // Confirm accepted affectedPlayer = player.getWishToTrade(); if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading() || !player.isTradeOfferAccepted() || !affectedPlayer.isTradeOfferAccepted()) { // This // shouldn't // happen player.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } player.setTradeConfirmAccepted(true); if (affectedPlayer.isTradeConfirmAccepted()) { world.addEntryToSnapshots( new Activity( player.getUsername(), player.getUsername() + " finished trade " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); ArrayList<InvItem> myOffer = player.getTradeOffer(); ArrayList<InvItem> theirOffer = affectedPlayer.getTradeOffer(); int myRequiredSlots = player.getInventory().getRequiredSlots(theirOffer); int myAvailableSlots = (30 - player.getInventory().size()) + player.getInventory().getFreedSlots(myOffer); int theirRequiredSlots = affectedPlayer.getInventory().getRequiredSlots(myOffer); int theirAvailableSlots = (30 - affectedPlayer.getInventory().size()) + affectedPlayer.getInventory().getFreedSlots(theirOffer); if (theirRequiredSlots > theirAvailableSlots) { player .getActionSender() .sendMessage("The other player does not have room to accept your items."); affectedPlayer .getActionSender() .sendMessage("You do not have room in your inventory to hold those items."); unsetOptions(player); unsetOptions(affectedPlayer); return; } if (myRequiredSlots > myAvailableSlots) { player .getActionSender() .sendMessage("You do not have room in your inventory to hold those items."); affectedPlayer .getActionSender() .sendMessage("The other player does not have room to accept your items."); unsetOptions(player); unsetOptions(affectedPlayer); return; } for (InvItem item : myOffer) { InvItem affectedItem = player.getInventory().get(item); if (affectedItem == null) { player.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } if (item.getDef().isMembers() && !World.isMembers()) { player .getActionSender() .sendMessage("This feature is only avaliable on a members server"); unsetOptions(player); unsetOptions(affectedPlayer); return; } if (affectedItem.isWielded()) { affectedItem.setWield(false); player.updateWornItems( affectedItem.getWieldableDef().getWieldPos(), player .getPlayerAppearance() .getSprite(affectedItem.getWieldableDef().getWieldPos())); } player.getInventory().remove(item); } for (InvItem item : theirOffer) { InvItem affectedItem = affectedPlayer.getInventory().get(item); if (affectedItem == null) { affectedPlayer.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } if (item.getDef().isMembers() && !World.isMembers()) { player .getActionSender() .sendMessage("This feature is only avaliable on a members server"); unsetOptions(player); unsetOptions(affectedPlayer); return; } if (affectedItem.isWielded()) { affectedItem.setWield(false); affectedPlayer.updateWornItems( affectedItem.getWieldableDef().getWieldPos(), affectedPlayer .getPlayerAppearance() .getSprite(affectedItem.getWieldableDef().getWieldPos())); } affectedPlayer.getInventory().remove(item); } MiscPacketBuilder loginServer = Instance.getServer().getLoginConnector().getActionSender(); long playerhash = DataConversions.usernameToHash(player.getUsername()); long affectedPlayerhash = DataConversions.usernameToHash(affectedPlayer.getUsername()); for (InvItem item : myOffer) { affectedPlayer.getInventory().add(item); } for (InvItem item : theirOffer) { player.getInventory().add(item); } boolean senddata = false; for (InvItem item : myOffer) { loginServer.tradeLog( playerhash, affectedPlayerhash, item.getID(), item.getAmount(), player.getX(), player.getY(), 1); if (item.getAmount() > 10000000 || Formulae.isRareItem(item.getID())) senddata = true; } if (senddata) DBConnection.getReport() .submitDupeData(DataConversions.hashToUsername(playerhash), playerhash); senddata = false; for (InvItem item : theirOffer) { loginServer.tradeLog( affectedPlayerhash, playerhash, item.getID(), item.getAmount(), player.getX(), player.getY(), 1); if (item.getAmount() > 10000000 || Formulae.isRareItem(item.getID())) senddata = true; } if (senddata) DBConnection.getReport() .submitDupeData( DataConversions.hashToUsername(affectedPlayerhash), affectedPlayerhash); player.getActionSender().sendInventory(); player.getActionSender().sendEquipmentStats(); Long now = System.currentTimeMillis(); player.save(); player.setLastSaveTime(now); affectedPlayer.save(); affectedPlayer.setLastSaveTime(now); player.getActionSender().sendMessage("Trade completed."); affectedPlayer.getActionSender().sendInventory(); affectedPlayer.getActionSender().sendEquipmentStats(); affectedPlayer.getActionSender().sendMessage("Trade completed."); unsetOptions(player); unsetOptions(affectedPlayer); World.getWar().handleCapeWield(player); World.getWar().handleCapeWield(affectedPlayer); } break; case 216: // Trade declined affectedPlayer = player.getWishToTrade(); if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading()) { // This // shouldn't // happen player.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } affectedPlayer .getActionSender() .sendMessage(player.getUsername() + " has declined the trade."); unsetOptions(player); unsetOptions(affectedPlayer); break; case 70: // Receive offered item data affectedPlayer = player.getWishToTrade(); if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading() || (player.isTradeOfferAccepted() && affectedPlayer.isTradeOfferAccepted()) || player.isTradeConfirmAccepted() || affectedPlayer.isTradeConfirmAccepted()) { // This // shouldn't // happen player.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } player.setTradeOfferAccepted(false); player.setTradeConfirmAccepted(false); affectedPlayer.setTradeOfferAccepted(false); affectedPlayer.setTradeConfirmAccepted(false); // player.getActionSender().sendTradeAcceptUpdate(); // affectedPlayer.getActionSender().sendTradeAcceptUpdate(); Inventory tradeOffer = new Inventory(); player.resetTradeOffer(); int count = (int) p.readByte(); for (int slot = 0; slot < count; slot++) { InvItem tItem = new InvItem(p.readShort(), p.readInt()); if (tItem.getAmount() < 1) { player.setSuspiciousPlayer(true); player.setRequiresOfferUpdate(true); continue; } ItemDef def = tItem.getDef(); if (!def.canTrade() && !player.isMod()) { player .getActionSender() .sendMessage(def.getName() + " cannot be traded with other players"); player.setRequiresOfferUpdate(true); continue; } tradeOffer.add(tItem); } for (InvItem item : tradeOffer.getItems()) { if (tradeOffer.countId(item.getID()) > player.getInventory().countId(item.getID())) { player.setSuspiciousPlayer(true); unsetOptions(player); unsetOptions(affectedPlayer); return; } player.addToTradeOffer(item); } player.setRequiresOfferUpdate(true); break; } }