diff --git a/src/main/java/constants/id/ItemId.java b/src/main/java/constants/id/ItemId.java index 82044196c2c..e27b8feb40b 100644 --- a/src/main/java/constants/id/ItemId.java +++ b/src/main/java/constants/id/ItemId.java @@ -303,6 +303,7 @@ public static boolean isWeddingRing(int itemId) { public static final int WORLD_TRANSFER = 5401000; public static final int MAPLE_LIFE_B = 5432000; public static final int VICIOUS_HAMMER = 5570000; + public static final int REMOTE_CONTROLLER = 5470000; public static final int NX_CARD_100 = 4031865; public static final int NX_CARD_250 = 4031866; diff --git a/src/main/java/net/server/channel/Channel.java b/src/main/java/net/server/channel/Channel.java index 13a0d22a95d..69fd6389b93 100644 --- a/src/main/java/net/server/channel/Channel.java +++ b/src/main/java/net/server/channel/Channel.java @@ -118,7 +118,8 @@ public final class Channel { private Set ongoingCathedralGuests = null; private long ongoingStartTime; - private final Lock lock = new ReentrantLock(true);; + private final Lock lock = new ReentrantLock(true); + ; private final Lock merchRlock; private final Lock merchWlock; @@ -365,10 +366,15 @@ public Map getHiredMerchants() { } } - public void addHiredMerchant(int chrid, HiredMerchant hm) { + public boolean addHiredMerchant(int chrid, HiredMerchant hm) { merchWlock.lock(); try { + if (hiredMerchants.containsKey(chrid)) { + return false; + } + hiredMerchants.put(chrid, hm); + return true; } finally { merchWlock.unlock(); } diff --git a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java index f8680e757a1..616ef6a5672 100644 --- a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java @@ -265,10 +265,13 @@ public final void handlePacket(InPacket p, Client c) { //c.sendPacket(PacketCreator.getPlayerShopRemoveVisitor(1)); } else if (ItemConstants.isHiredMerchant(itemId)) { HiredMerchant merchant = new HiredMerchant(chr, desc, itemId); - chr.setHiredMerchant(merchant); - c.getWorldServer().registerHiredMerchant(merchant); - chr.getClient().getChannelServer().addHiredMerchant(chr.getId(), merchant); - chr.sendPacket(PacketCreator.getHiredMerchant(chr, merchant, true)); + boolean merchantAdded = chr.getClient().getChannelServer().addHiredMerchant(chr.getId(), merchant); + if (merchantAdded) { + chr.setHiredMerchant(merchant); + c.getWorldServer().registerHiredMerchant(merchant); + chr.sendPacket(PacketCreator.getHiredMerchant(chr, merchant, true)); + System.out.println("new shop creation."); + } } } } else if (mode == Action.INVITE.getCode()) { diff --git a/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java b/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java index c5aff78f62c..2502d7324cb 100644 --- a/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java +++ b/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java @@ -24,6 +24,8 @@ import client.Character; import client.Client; +import client.inventory.InventoryType; +import constants.id.ItemId; import net.AbstractPacketHandler; import net.packet.InPacket; import server.maps.HiredMerchant; @@ -39,6 +41,13 @@ public void handlePacket(InPacket p, Client c) { HiredMerchant hm = getMerchant(c); if (hm != null && hm.isOwner(chr)) { if (hm.getChannel() == chr.getClient().getChannel()) { + boolean isPlayerOnMerchantMap = chr.getMapId() == hm.getMapId(); + if (!isPlayerOnMerchantMap) { + var remoteControl = chr.getInventory(InventoryType.CASH).findById(ItemId.REMOTE_CONTROLLER); + if (remoteControl == null) { + return; + } + } hm.visitShop(chr); } else { c.sendPacket(PacketCreator.remoteChannelChange((byte) (hm.getChannel() - 1)));