From d35969dea5a8e97e362d2a9a7badac0098debc65 Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 9 Sep 2021 22:22:34 +0200 Subject: [PATCH] Rename and clean up MapleHiredMerchant --- src/main/java/client/Character.java | 8 +- .../processor/npc/FredrickProcessor.java | 4 +- src/main/java/net/server/channel/Channel.java | 10 +- .../channel/handlers/OwlWarpHandler.java | 4 +- .../handlers/PlayerInteractionHandler.java | 24 +-- .../channel/handlers/RemoteStoreHandler.java | 6 +- src/main/java/net/server/world/World.java | 24 +-- ...eHiredMerchant.java => HiredMerchant.java} | 180 +++++++++--------- src/main/java/tools/PacketCreator.java | 16 +- 9 files changed, 142 insertions(+), 134 deletions(-) rename src/main/java/server/maps/{MapleHiredMerchant.java => HiredMerchant.java} (91%) diff --git a/src/main/java/client/Character.java b/src/main/java/client/Character.java index 9c19201f55..6c2949ce7c 100644 --- a/src/main/java/client/Character.java +++ b/src/main/java/client/Character.java @@ -151,7 +151,7 @@ public class Character extends AbstractCharacterObject { private int merchantmeso; private BuddyList buddylist; private EventInstanceManager eventInstance = null; - private MapleHiredMerchant hiredMerchant = null; + private HiredMerchant hiredMerchant = null; private Client client; private GuildCharacter mgc = null; private PartyCharacter mpc = null; @@ -5032,7 +5032,7 @@ public class Character extends AbstractCharacterObject { return hair; } - public MapleHiredMerchant getHiredMerchant() { + public HiredMerchant getHiredMerchant() { return hiredMerchant; } @@ -5575,7 +5575,7 @@ public class Character extends AbstractCharacterObject { } public void closeHiredMerchant(boolean closeMerchant) { - MapleHiredMerchant merchant = this.getHiredMerchant(); + HiredMerchant merchant = this.getHiredMerchant(); if (merchant == null) { return; } @@ -8997,7 +8997,7 @@ public class Character extends AbstractCharacterObject { } } - public void setHiredMerchant(MapleHiredMerchant merchant) { + public void setHiredMerchant(HiredMerchant merchant) { this.hiredMerchant = merchant; } diff --git a/src/main/java/client/processor/npc/FredrickProcessor.java b/src/main/java/client/processor/npc/FredrickProcessor.java index b6d872ebdf..0a2c9195c8 100644 --- a/src/main/java/client/processor/npc/FredrickProcessor.java +++ b/src/main/java/client/processor/npc/FredrickProcessor.java @@ -33,7 +33,7 @@ import client.inventory.manipulator.InventoryManipulator; import net.server.Server; import net.server.world.World; import server.MapleItemInformationProvider; -import server.maps.MapleHiredMerchant; +import server.maps.HiredMerchant; import tools.DatabaseConnection; import tools.FilePrinter; import tools.PacketCreator; @@ -282,7 +282,7 @@ public class FredrickProcessor { chr.withdrawMerchantMesos(); if (deleteFredrickItems(chr.getId())) { - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if(merchant != null) merchant.clearItems(); diff --git a/src/main/java/net/server/channel/Channel.java b/src/main/java/net/server/channel/Channel.java index 777ef54b61..7dc55b97dc 100644 --- a/src/main/java/net/server/channel/Channel.java +++ b/src/main/java/net/server/channel/Channel.java @@ -70,7 +70,7 @@ public final class Channel { private MapleMapManager mapManager; private EventScriptManager eventSM; private ServicesManager services; - private Map hiredMerchants = new HashMap<>(); + private Map hiredMerchants = new HashMap<>(); private final Map storedVars = new HashMap<>(); private Set playersAway = new HashSet<>(); private Map expeditions = new HashMap<>(); @@ -228,7 +228,7 @@ public final class Channel { private void closeAllMerchants() { try { - List merchs; + List merchs; merchWlock.lock(); try { @@ -238,7 +238,7 @@ public final class Channel { merchWlock.unlock(); } - for (MapleHiredMerchant merch : merchs) { + for (HiredMerchant merch : merchs) { merch.forceClose(); } } catch (Exception e) { @@ -352,7 +352,7 @@ public final class Channel { } } - public Map getHiredMerchants() { + public Map getHiredMerchants() { merchRlock.lock(); try { return Collections.unmodifiableMap(hiredMerchants); @@ -361,7 +361,7 @@ public final class Channel { } } - public void addHiredMerchant(int chrid, MapleHiredMerchant hm) { + public void addHiredMerchant(int chrid, HiredMerchant hm) { merchWlock.lock(); try { hiredMerchants.put(chrid, hm); diff --git a/src/main/java/net/server/channel/handlers/OwlWarpHandler.java b/src/main/java/net/server/channel/handlers/OwlWarpHandler.java index 3f1b449e1d..6d087e526e 100644 --- a/src/main/java/net/server/channel/handlers/OwlWarpHandler.java +++ b/src/main/java/net/server/channel/handlers/OwlWarpHandler.java @@ -23,7 +23,7 @@ import client.Client; import constants.game.GameConstants; import net.AbstractPacketHandler; import net.packet.InPacket; -import server.maps.MapleHiredMerchant; +import server.maps.HiredMerchant; import server.maps.MaplePlayerShop; import tools.PacketCreator; @@ -42,7 +42,7 @@ public final class OwlWarpHandler extends AbstractPacketHandler { return; } - MapleHiredMerchant hm = c.getWorldServer().getHiredMerchant(ownerid); // if both hired merchant and player shop is on the same map + HiredMerchant hm = c.getWorldServer().getHiredMerchant(ownerid); // if both hired merchant and player shop is on the same map MaplePlayerShop ps; if(hm == null || hm.getMapId() != mapid || !hm.hasItem(c.getPlayer().getOwlSearch())) { ps = c.getWorldServer().getPlayerShop(ownerid); diff --git a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java index 9dcb60cf4b..3fa10169e3 100644 --- a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java @@ -252,7 +252,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.getWorldServer().registerPlayerShop(shop); //c.sendPacket(PacketCreator.getPlayerShopRemoveVisitor(1)); } else if (ItemConstants.isHiredMerchant(itemId)) { - MapleHiredMerchant merchant = new MapleHiredMerchant(chr, desc, itemId); + HiredMerchant merchant = new HiredMerchant(chr, desc, itemId); chr.setHiredMerchant(merchant); c.getWorldServer().registerHiredMerchant(merchant); chr.getClient().getChannelServer().addHiredMerchant(chr.getId(), merchant); @@ -308,13 +308,13 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } else { chr.sendPacket(PacketCreator.getMiniRoomError(22)); } - } else if (ob instanceof MapleHiredMerchant && chr.getHiredMerchant() == null) { - MapleHiredMerchant merchant = (MapleHiredMerchant) ob; + } else if (ob instanceof HiredMerchant && chr.getHiredMerchant() == null) { + HiredMerchant merchant = (HiredMerchant) ob; merchant.visitShop(chr); } } } else if (mode == Action.CHAT.getCode()) { // chat lol - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (chr.getTrade() != null) { chr.getTrade().chat(p.readString()); } else if (chr.getPlayerShop() != null) { //mini game @@ -359,7 +359,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } MaplePlayerShop shop = chr.getPlayerShop(); - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isOwner(chr)) { if(YamlConfig.config.server.USE_ERASE_PERMIT_ON_OPENSHOP) { try { @@ -601,7 +601,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { MaplePlayerShopItem shopItem = new MaplePlayerShopItem(sellItem, bundles, price); MaplePlayerShop shop = chr.getPlayerShop(); - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isOwner(chr)) { if (shop.isOpen() || !shop.addItem(shopItem)) { // thanks Vcoc for pointing an exploit with unlimited shop slots c.sendPacket(PacketCreator.serverNotice(1, "You can't sell it anymore.")); @@ -667,12 +667,12 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { shop.takeItemBack(slot, chr); } } else if (mode == Action.MERCHANT_MESO.getCode()) { - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (merchant == null) return; merchant.withdrawMesos(chr); } else if (mode == Action.MERCHANT_ORGANIZE.getCode()) { - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (merchant == null || !merchant.isOwner(chr)) return; merchant.withdrawMesos(chr); @@ -696,7 +696,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { return; } MaplePlayerShop shop = chr.getPlayerShop(); - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isVisitor(chr)) { if (shop.buy(c, itemid, quantity)) { shop.broadcast(PacketCreator.getPlayerShopItemUpdate(shop)); @@ -708,7 +708,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } else if (mode == Action.TAKE_ITEM_BACK.getCode()) { if (isTradeOpen(chr)) return; - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (merchant != null && merchant.isOwner(chr)) { if (merchant.isOpen()) { c.sendPacket(PacketCreator.serverNotice(1, "You can't take it with the store open.")); @@ -728,14 +728,14 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } else if (mode == Action.CLOSE_MERCHANT.getCode()) { if (isTradeOpen(chr)) return; - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if (merchant != null) { merchant.closeOwnerMerchant(chr); } } else if (mode == Action.MAINTENANCE_OFF.getCode()) { if (isTradeOpen(chr)) return; - MapleHiredMerchant merchant = chr.getHiredMerchant(); + HiredMerchant merchant = chr.getHiredMerchant(); if(merchant != null) { if (merchant.isOwner(chr)) { if (merchant.getItems().isEmpty()) { diff --git a/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java b/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java index 6fa18f9bf5..37924a9318 100644 --- a/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java +++ b/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java @@ -26,7 +26,7 @@ import client.Character; import client.Client; import net.AbstractPacketHandler; import net.packet.InPacket; -import server.maps.MapleHiredMerchant; +import server.maps.HiredMerchant; import tools.PacketCreator; /** @@ -37,7 +37,7 @@ public class RemoteStoreHandler extends AbstractPacketHandler { @Override public void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); - MapleHiredMerchant hm = getMerchant(c); + HiredMerchant hm = getMerchant(c); if (hm != null && hm.isOwner(chr)) { if (hm.getChannel() == chr.getClient().getChannel()) { hm.visitShop(chr); @@ -51,7 +51,7 @@ public class RemoteStoreHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); } - private static MapleHiredMerchant getMerchant(Client c) { + private static HiredMerchant getMerchant(Client c) { if (c.getPlayer().hasMerchant()) { return c.getWorldServer().getHiredMerchant(c.getPlayer().getId()); } diff --git a/src/main/java/net/server/world/World.java b/src/main/java/net/server/world/World.java index b95a0ed5d3..1a98b674d9 100644 --- a/src/main/java/net/server/world/World.java +++ b/src/main/java/net/server/world/World.java @@ -132,7 +132,7 @@ public class World { private Map activePlayerShops = new LinkedHashMap<>(); private MonitoredReentrantLock activeMerchantsLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_MERCHS, true); - private Map> activeMerchants = new LinkedHashMap<>(); + private Map> activeMerchants = new LinkedHashMap<>(); private ScheduledFuture merchantSchedule; private long merchantUpdate; @@ -1555,7 +1555,7 @@ public class World { } } - public void registerHiredMerchant(MapleHiredMerchant hm) { + public void registerHiredMerchant(HiredMerchant hm) { activeMerchantsLock.lock(); try { int initProc; @@ -1568,7 +1568,7 @@ public class World { } } - public void unregisterHiredMerchant(MapleHiredMerchant hm) { + public void unregisterHiredMerchant(HiredMerchant hm) { activeMerchantsLock.lock(); try { activeMerchants.remove(hm.getOwnerId()); @@ -1578,15 +1578,15 @@ public class World { } public void runHiredMerchantSchedule() { - Map> deployedMerchants; + Map> deployedMerchants; activeMerchantsLock.lock(); try { merchantUpdate = Server.getInstance().getCurrentTime(); deployedMerchants = new LinkedHashMap<>(activeMerchants); - for(Map.Entry> dm: deployedMerchants.entrySet()) { + for(Map.Entry> dm: deployedMerchants.entrySet()) { int timeOn = dm.getValue().getRight(); - MapleHiredMerchant hm = dm.getValue().getLeft(); + HiredMerchant hm = dm.getValue().getLeft(); if(timeOn <= 144) { // 1440 minutes == 24hrs activeMerchants.put(hm.getOwnerId(), new Pair<>(dm.getValue().getLeft(), timeOn + 1)); @@ -1602,12 +1602,12 @@ public class World { } } - public List getActiveMerchants() { - List hmList = new ArrayList<>(); + public List getActiveMerchants() { + List hmList = new ArrayList<>(); activeMerchantsLock.lock(); try { - for(Pair hmp : activeMerchants.values()) { - MapleHiredMerchant hm = hmp.getLeft(); + for(Pair hmp : activeMerchants.values()) { + HiredMerchant hm = hmp.getLeft(); if(hm.isOpen()) { hmList.add(hm); } @@ -1619,7 +1619,7 @@ public class World { } } - public MapleHiredMerchant getHiredMerchant(int ownerid) { + public HiredMerchant getHiredMerchant(int ownerid) { activeMerchantsLock.lock(); try { if(activeMerchants.containsKey(ownerid)) { @@ -1816,7 +1816,7 @@ public class World { public List> getAvailableItemBundles(int itemid) { List> hmsAvailable = new ArrayList<>(); - for (MapleHiredMerchant hm : getActiveMerchants()) { + for (HiredMerchant hm : getActiveMerchants()) { List itemBundles = hm.sendAvailableBundles(itemid); for(MaplePlayerShopItem mpsi : itemBundles) { diff --git a/src/main/java/server/maps/MapleHiredMerchant.java b/src/main/java/server/maps/HiredMerchant.java similarity index 91% rename from src/main/java/server/maps/MapleHiredMerchant.java rename to src/main/java/server/maps/HiredMerchant.java index cad0173ba5..afc44f2f00 100644 --- a/src/main/java/server/maps/MapleHiredMerchant.java +++ b/src/main/java/server/maps/HiredMerchant.java @@ -53,26 +53,28 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; /** - * * @author XoticStory * @author Ronan - concurrency protection */ -public class MapleHiredMerchant extends AbstractMapObject { - private int ownerId, itemId, mesos = 0; - private int channel, world; - private long start; +public class HiredMerchant extends AbstractMapObject { + private final int ownerId; + private final int itemId; + private final int mesos = 0; + private final int channel; + private final int world; + private final long start; private String ownerName = ""; private String description = ""; - private Character[] visitors = new Character[3]; + private final Character[] visitors = new Character[3]; private final List items = new LinkedList<>(); - private List> messages = new LinkedList<>(); - private List sold = new LinkedList<>(); - private AtomicBoolean open = new AtomicBoolean(); + private final List> messages = new LinkedList<>(); + private final List sold = new LinkedList<>(); + private final AtomicBoolean open = new AtomicBoolean(); private boolean published = false; private MapleMap map; - private Lock visitorLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.VISITOR_MERCH, true); + private final Lock visitorLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.VISITOR_MERCH, true); - public MapleHiredMerchant(final Character owner, String desc, int itemId) { + public HiredMerchant(final Character owner, String desc, int itemId) { this.setPosition(owner.getPosition()); this.start = System.currentTimeMillis(); this.ownerId = owner.getId(); @@ -92,7 +94,7 @@ public class MapleHiredMerchant extends AbstractMapObject { visitorLock.unlock(); } } - + private void broadcastToVisitors(Packet packet) { for (Character visitor : visitors) { if (visitor != null) { @@ -114,13 +116,13 @@ public class MapleHiredMerchant extends AbstractMapObject { } else { count = (byte) (visitors.length + 1); } - + return new byte[]{count, (byte) (visitors.length + 1)}; } finally { visitorLock.unlock(); } } - + public boolean addVisitor(Character visitor) { visitorLock.lock(); try { @@ -129,10 +131,10 @@ public class MapleHiredMerchant extends AbstractMapObject { visitors[i] = visitor; broadcastToVisitors(PacketCreator.hiredMerchantVisitorAdd(visitor, i + 1)); this.getMap().broadcastMessage(PacketCreator.updateHiredMerchantBox(this)); - + return true; } - + return false; } finally { visitorLock.unlock(); @@ -164,10 +166,10 @@ public class MapleHiredMerchant extends AbstractMapObject { visitorLock.unlock(); } } - + private int getVisitorSlot(Character visitor) { for (int i = 0; i < 3; i++) { - if (visitors[i] != null && visitors[i].getId() == visitor.getId()){ + if (visitors[i] != null && visitors[i].getId() == visitor.getId()) { return i; } } @@ -179,23 +181,23 @@ public class MapleHiredMerchant extends AbstractMapObject { try { for (int i = 0; i < 3; i++) { Character visitor = visitors[i]; - + if (visitor != null) { visitor.setHiredMerchant(null); - + visitor.sendPacket(PacketCreator.leaveHiredMerchant(i + 1, 0x11)); visitor.sendPacket(PacketCreator.hiredMerchantMaintenanceMessage()); - + visitors[i] = null; } } - + this.getMap().broadcastMessage(PacketCreator.updateHiredMerchantBox(this)); } finally { visitorLock.unlock(); } } - + private void removeOwner(Character owner) { if (owner.getHiredMerchant() == this) { owner.sendPacket(PacketCreator.hiredMerchantOwnerLeave()); @@ -211,57 +213,57 @@ public class MapleHiredMerchant extends AbstractMapObject { } } } - + public void takeItemBack(int slot, Character chr) { synchronized (items) { MaplePlayerShopItem shopItem = items.get(slot); - if(shopItem.isExist()) { + if (shopItem.isExist()) { if (shopItem.getBundles() > 0) { Item iitem = shopItem.getItem().copy(); iitem.setQuantity((short) (shopItem.getItem().getQuantity() * shopItem.getBundles())); - + if (!Inventory.checkSpot(chr, iitem)) { chr.sendPacket(PacketCreator.serverNotice(1, "Have a slot available on your inventory to claim back the item.")); chr.sendPacket(PacketCreator.enableActions()); return; } - + InventoryManipulator.addFromDrop(chr.getClient(), iitem, true); } - + removeFromSlot(slot); chr.sendPacket(PacketCreator.updateHiredMerchant(this, chr)); } - + if (YamlConfig.config.server.USE_ENFORCE_MERCHANT_SAVE) { chr.saveCharToDB(false); } } } - + private static boolean canBuy(Client c, Item newItem) { // thanks xiaokelvin (Conrad) for noticing a leaked test code here return InventoryManipulator.checkSpace(c, newItem.getItemId(), newItem.getQuantity(), newItem.getOwner()) && InventoryManipulator.addFromDrop(c, newItem, false); } - + private int getQuantityLeft(int itemid) { synchronized (items) { int count = 0; - + for (MaplePlayerShopItem mpsi : items) { if (mpsi.getItem().getItemId() == itemid) { count += (mpsi.getBundles() * mpsi.getItem().getQuantity()); } } - + return count; } } - + public void buy(Client c, int item, short quantity) { synchronized (items) { MaplePlayerShopItem pItem = items.get(item); Item newItem = pItem.getItem().copy(); - + newItem.setQuantity((short) ((pItem.getItem().getQuantity() * quantity))); if (quantity < 1 || !pItem.isExist() || pItem.getBundles() < quantity) { c.sendPacket(PacketCreator.enableActions()); @@ -270,28 +272,28 @@ public class MapleHiredMerchant extends AbstractMapObject { c.sendPacket(PacketCreator.enableActions()); return; } - + KarmaManipulator.toggleKarmaFlagToUntradeable(newItem); - + int price = (int) Math.min((float) pItem.getPrice() * quantity, Integer.MAX_VALUE); if (c.getPlayer().getMeso() >= price) { if (canBuy(c, newItem)) { c.getPlayer().gainMeso(-price, false); price -= MapleTrade.getFee(price); // thanks BHB for pointing out trade fees not applying here - + synchronized (sold) { sold.add(new SoldItem(c.getPlayer().getName(), pItem.getItem().getItemId(), newItem.getQuantity(), price)); } - + pItem.setBundles((short) (pItem.getBundles() - quantity)); if (pItem.getBundles() < 1) { pItem.setDoesExist(false); } - - if(YamlConfig.config.server.USE_ANNOUNCE_SHOPITEMSOLD) { // idea thanks to Vcoc + + if (YamlConfig.config.server.USE_ANNOUNCE_SHOPITEMSOLD) { // idea thanks to Vcoc announceItemSold(newItem, price, getQuantityLeft(pItem.getItem().getItemId())); } - + Character owner = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterByName(ownerName); if (owner != null) { owner.addMerchantMesos(price); @@ -307,7 +309,7 @@ public class MapleHiredMerchant extends AbstractMapObject { } } merchantMesos += price; - + try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET MerchantMesos = ? WHERE id = ?", PreparedStatement.RETURN_GENERATED_KEYS)) { ps.setInt(1, (int) Math.min(merchantMesos, Integer.MAX_VALUE)); ps.setInt(2, ownerId); @@ -334,12 +336,12 @@ public class MapleHiredMerchant extends AbstractMapObject { } } } - + private void announceItemSold(Item item, int mesos, int inStore) { String qtyStr = (item.getQuantity() > 1) ? " x " + item.getQuantity() : ""; - + Character player = Server.getInstance().getWorld(world).getPlayerStorage().getCharacterById(ownerId); - if(player != null && player.isLoggedinWorld()) { + if (player != null && player.isLoggedinWorld()) { player.dropMessage(6, "[Hired Merchant] Item '" + MapleItemInformationProvider.getInstance().getName(item.getItemId()) + "'" + qtyStr + " has been sold for " + mesos + " mesos. (" + inStore + " left)"); } } @@ -391,12 +393,12 @@ public class MapleHiredMerchant extends AbstractMapObject { } public void closeOwnerMerchant(Character chr) { - if(this.isOwner(chr)) { + if (this.isOwner(chr)) { this.closeShop(chr.getClient(), false); chr.setHasMerchant(false); } } - + private void closeShop(Client c, boolean timeout) { map.removeMapObject(this); map.broadcastMessage(PacketCreator.removeHiredMerchantBox(ownerId)); @@ -454,7 +456,7 @@ public class MapleHiredMerchant extends AbstractMapObject { Server.getInstance().getWorld(world).unregisterHiredMerchant(this); } - + public synchronized void visitShop(Character chr) { visitorLock.lock(); try { @@ -481,7 +483,7 @@ public class MapleHiredMerchant extends AbstractMapObject { public String getOwner() { return ownerName; } - + public void clearItems() { synchronized (items) { items.clear(); @@ -500,8 +502,10 @@ public class MapleHiredMerchant extends AbstractMapObject { visitorLock.lock(); try { Character[] copy = new Character[3]; - for(int i = 0; i < visitors.length; i++) copy[i] = visitors[i]; - + for (int i = 0; i < visitors.length; i++) { + copy[i] = visitors[i]; + } + return copy; } finally { visitorLock.unlock(); @@ -513,34 +517,36 @@ public class MapleHiredMerchant extends AbstractMapObject { return Collections.unmodifiableList(items); } } - + public boolean hasItem(int itemid) { - for(MaplePlayerShopItem mpsi : getItems()) { - if(mpsi.getItem().getItemId() == itemid && mpsi.isExist() && mpsi.getBundles() > 0) { + for (MaplePlayerShopItem mpsi : getItems()) { + if (mpsi.getItem().getItemId() == itemid && mpsi.isExist() && mpsi.getBundles() > 0) { return true; } } - + return false; } public boolean addItem(MaplePlayerShopItem item) { synchronized (items) { - if (items.size() >= 16) return false; - + if (items.size() >= 16) { + return false; + } + items.add(item); return true; } } public void clearInexistentItems() { - synchronized(items) { + synchronized (items) { for (int i = items.size() - 1; i >= 0; i--) { if (!items.get(i).isExist()) { items.remove(i); } } - + try { this.saveItems(false); } catch (SQLException ex) { @@ -548,17 +554,17 @@ public class MapleHiredMerchant extends AbstractMapObject { } } } - + private void removeFromSlot(int slot) { items.remove(slot); - + try { this.saveItems(false); } catch (SQLException ex) { ex.printStackTrace(); } } - + private int getFreeSlot() { for (int i = 0; i < 3; i++) { if (visitors[i] == null) { @@ -571,11 +577,11 @@ public class MapleHiredMerchant extends AbstractMapObject { public void setDescription(String description) { this.description = description; } - + public boolean isPublished() { return published; } - + public boolean isOpen() { return open.get(); } @@ -592,29 +598,31 @@ public class MapleHiredMerchant extends AbstractMapObject { public boolean isOwner(Character chr) { return chr.getId() == ownerId; } - + public void sendMessage(Character chr, String msg) { String message = chr.getName() + " : " + msg; byte slot = (byte) (getVisitorSlot(chr) + 1); - + synchronized (messages) { messages.add(new Pair<>(message, slot)); } broadcastToVisitorsThreadsafe(PacketCreator.hiredMerchantChat(message, slot)); } - + public List sendAvailableBundles(int itemid) { List list = new LinkedList<>(); List all = new ArrayList<>(); - - if(!open.get()) return list; - + + if (!open.get()) { + return list; + } + synchronized (items) { all.addAll(items); } - - for(MaplePlayerShopItem mpsi : all) { - if(mpsi.getItem().getItemId() == itemid && mpsi.getBundles() > 0 && mpsi.isExist()) { + + for (MaplePlayerShopItem mpsi : all) { + if (mpsi.getItem().getItemId() == itemid && mpsi.getBundles() > 0 && mpsi.isExist()) { list.add(mpsi); } } @@ -628,7 +636,7 @@ public class MapleHiredMerchant extends AbstractMapObject { for (MaplePlayerShopItem pItems : getItems()) { Item newItem = pItems.getItem(); short newBundle = pItems.getBundles(); - + if (shutdown) { //is "shutdown" really necessary? newItem.setQuantity(pItems.getItem().getQuantity()); } else { @@ -643,7 +651,7 @@ public class MapleHiredMerchant extends AbstractMapObject { try (Connection con = DatabaseConnection.getConnection()) { ItemFactory.MERCHANT.saveItems(itemsWithType, bundles, this.ownerId, con); } - + FredrickProcessor.insertFredrickLog(this.ownerId); } @@ -651,14 +659,14 @@ public class MapleHiredMerchant extends AbstractMapObject { List> li = new ArrayList<>(); for (MaplePlayerShopItem item : items) { Item it = item.getItem().copy(); - it.setQuantity((short)(it.getQuantity() * item.getBundles())); - + it.setQuantity((short) (it.getQuantity() * item.getBundles())); + li.add(new Pair<>(it, it.getInventoryType())); } - + return Inventory.checkSpotsAndOwnership(chr, li); } - + public int getChannel() { return channel; } @@ -667,7 +675,7 @@ public class MapleHiredMerchant extends AbstractMapObject { double openTime = (System.currentTimeMillis() - start) / 60000; openTime /= 1440; // heuristics since engineered method to count time here is unknown openTime *= 1318; - + return (int) Math.ceil(openTime); } @@ -676,12 +684,12 @@ public class MapleHiredMerchant extends AbstractMapObject { messages.clear(); } } - + public List> getMessages() { synchronized (messages) { List> msgList = new LinkedList<>(); msgList.addAll(messages); - + return msgList; } } @@ -689,7 +697,7 @@ public class MapleHiredMerchant extends AbstractMapObject { public int getMapId() { return map.getId(); } - + public MapleMap getMap() { return map; } @@ -708,10 +716,10 @@ public class MapleHiredMerchant extends AbstractMapObject { public MapleMapObjectType getType() { return MapleMapObjectType.HIRED_MERCHANT; } - + @Override public void sendDestroyData(Client client) {} - + @Override public void sendSpawnData(Client client) { client.sendPacket(PacketCreator.spawnHiredMerchantBox(this)); diff --git a/src/main/java/tools/PacketCreator.java b/src/main/java/tools/PacketCreator.java index 8c738d1080..d4f5a1c1df 100644 --- a/src/main/java/tools/PacketCreator.java +++ b/src/main/java/tools/PacketCreator.java @@ -2156,7 +2156,7 @@ public class PacketCreator { p.writeByte(joinable); } - private static void updateHiredMerchantBoxInfo(OutPacket p, MapleHiredMerchant hm) { + private static void updateHiredMerchantBoxInfo(OutPacket p, HiredMerchant hm) { byte[] roomInfo = hm.getShopRoomInfo(); p.writeByte(5); @@ -2166,7 +2166,7 @@ public class PacketCreator { p.writeBytes(roomInfo); // visitor capacity here, thanks GabrielSin } - public static Packet updateHiredMerchantBox(MapleHiredMerchant hm) { + public static Packet updateHiredMerchantBox(HiredMerchant hm) { final OutPacket p = OutPacket.create(SendOpcode.UPDATE_HIRED_MERCHANT); p.writeInt(hm.getOwnerId()); updateHiredMerchantBoxInfo(p, hm); @@ -5028,7 +5028,7 @@ public class PacketCreator { p.writeInt(owner.getId()); p.writeByte(owner.getClient().getChannel() - 1); } else { - MapleHiredMerchant hm = (MapleHiredMerchant) mo; + HiredMerchant hm = (HiredMerchant) mo; p.writeString(hm.getOwner()); p.writeInt(hm.getMapId()); @@ -5080,7 +5080,7 @@ public class PacketCreator { * 0x12 = FKING POPUP LOL */ - public static Packet getHiredMerchant(Character chr, MapleHiredMerchant hm, boolean firstTime) {//Thanks Dustin + public static Packet getHiredMerchant(Character chr, HiredMerchant hm, boolean firstTime) {//Thanks Dustin final OutPacket p = OutPacket.create(SendOpcode.PLAYER_INTERACTION); p.writeByte(PlayerInteractionHandler.Action.ROOM.getCode()); p.writeByte(0x05); @@ -5114,9 +5114,9 @@ public class PacketCreator { p.writeShort(0); p.writeShort(hm.getTimeOpen()); p.writeByte(firstTime ? 1 : 0); - List sold = hm.getSold(); + List sold = hm.getSold(); p.writeByte(sold.size()); - for (MapleHiredMerchant.SoldItem s : sold) { + for (HiredMerchant.SoldItem s : sold) { p.writeInt(s.getItemId()); p.writeShort(s.getQuantity()); p.writeInt(s.getMesos()); @@ -5141,7 +5141,7 @@ public class PacketCreator { return p; } - public static Packet updateHiredMerchant(MapleHiredMerchant hm, Character chr) { + public static Packet updateHiredMerchant(HiredMerchant hm, Character chr) { final OutPacket p = OutPacket.create(SendOpcode.PLAYER_INTERACTION); p.writeByte(PlayerInteractionHandler.Action.UPDATE_MERCHANT.getCode()); p.writeInt(hm.isOwner(chr) ? chr.getMerchantMeso() : chr.getMeso()); @@ -5212,7 +5212,7 @@ public class PacketCreator { return p; } - public static Packet spawnHiredMerchantBox(MapleHiredMerchant hm) { + public static Packet spawnHiredMerchantBox(HiredMerchant hm) { final OutPacket p = OutPacket.create(SendOpcode.SPAWN_HIRED_MERCHANT); p.writeInt(hm.getOwnerId()); p.writeInt(hm.getItemId());