Rename and clean up MapleHiredMerchant

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