[Looking for fix] Merchant Set Up D/C = Lose Items

Results 1 to 5 of 5
  1. #1
    Account Upgraded | Title Enabled! PrinceReborn is offline
    MemberRank
    Jul 2008 Join Date
    United KingdomLocation
    261Posts

    [Looking for fix] Merchant Set Up D/C = Lose Items

    I don't really expect much by posting this but I would REALLY appreciate any help at all which could help me figure out a fix for this...

    I am using odinms xiuzsource v0.62.
    If a player is in the process of setting up a merchant, if the player D/C's, any items that have been places in the merchant will be lost.
    I have seen a similar fix for lithium base but I am unsure how to modify the code to work for me.
    This probably happens to regular stores also.
    A fix like what happens in trades would be perfect. If you put an item in trade and get d/c'd a message box appears saying the trade was cancelled and items are put back in the inventory before you d/c.

    I'm prety sure a change needs to be made in this part of playerinteractionmanager.java:

    Code:
    } else if (mode == Action.SET_ITEMS.getCode()) {            MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
                MapleInventoryType ivType = MapleInventoryType.getByType(slea.readByte());
                IItem item = c.getPlayer().getInventory(ivType).getItem((byte) slea.readShort());
                long checkq = slea.readShort();
                short quantity = (short)(int)checkq;
                byte targetSlot = slea.readByte();
                if (c.getPlayer().getTrade() != null && item != null) {
                    if (checkq > 4000) {
                        AutobanManager.getInstance().autoban(c, "XSource| PE while in trade.");
                    }
                    if ((quantity <= item.getQuantity() && quantity >= 0) || ii.isThrowingStar(item.getItemId()) || ii.isBullet(item.getItemId())) {
                        if (!c.getChannelServer().allowUndroppablesDrop() && ii.isDropRestricted(item.getItemId())) {
                            c.getSession().write(MaplePacketCreator.enableActions());
                            return;
                        }
                        IItem tradeItem = item.copy();
                        if (ii.isThrowingStar(item.getItemId()) || ii.isBullet(item.getItemId())) {
                            tradeItem.setQuantity(item.getQuantity());
                            MapleInventoryManipulator.removeFromSlot(c, ivType, item.getPosition(), item.getQuantity(), true);
                        } else {
                            tradeItem.setQuantity(quantity);
                            MapleInventoryManipulator.removeFromSlot(c, ivType, item.getPosition(), quantity, true);
                        }
                        tradeItem.setPosition(targetSlot);
                        c.getPlayer().getTrade().addItem(tradeItem);
                        return;
                    }
                }
            } else if (mode == Action.CONFIRM.getCode()) {
                MapleTrade.completeTrade(c.getPlayer());
            } else if (mode == Action.ADD_ITEM.getCode() || mode == Action.PUT_ITEM.getCode()) {
                MapleInventoryType type = MapleInventoryType.getByType(slea.readByte());
                byte slot = (byte) slea.readShort();
                short bundles = slea.readShort();
                short perBundle = slea.readShort();
                int price = slea.readInt();
                IItem ivItem = c.getPlayer().getInventory(type).getItem(slot);
                IItem sellItem = ivItem.copy();
                sellItem.setQuantity(perBundle);
                MaplePlayerShopItem item = new MaplePlayerShopItem(sellItem, bundles, price);
                IPlayerInteractionManager shop = c.getPlayer().getInteraction();
                long checkquantity = bundles * perBundle;
                int checkiquantity = bundles * perBundle;
                short checksmquantity = (short)(bundles * perBundle);
                if (shop != null && shop.isOwner(c.getPlayer())) {
                    if (ivItem != null && ivItem.getQuantity() >= bundles * perBundle) {
                        if (price < 0) {
                            AutobanManager.getInstance().autoban(c, "XSource| PE adding a negative priced item.");
                            return;
                        }
                        if (bundles <= 0 || perBundle <= 0 || checkquantity > 20000 || checksmquantity < 0 || checkiquantity < 0 || checkiquantity > 20000) {
                            AutobanManager.getInstance().autoban(c, "XSource| PE Player Shop item: " + sellItem.getItemId());
                            return;
                        }
                        if (bundles > 10 || perBundle > 4000) return;
                        MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance();
                        if (ii.isThrowingStar(ivItem.getItemId()) || ii.isBullet(ivItem.getItemId())) {
                            MapleInventoryManipulator.removeFromSlot(c, type, slot, ivItem.getQuantity(), true);
                        } else {
                            MapleInventoryManipulator.removeFromSlot(c, type, slot, (short) (bundles * perBundle), true);
                        }
                        shop.addItem(item);
                        c.getSession().write(MaplePacketCreator.shopItemUpdate(shop));
                    }
                }
            } else if (mode == Action.BUY.getCode() || mode == Action.MERCHANT_BUY.getCode()) {
                int item = slea.readByte();
                short quantity = slea.readShort();
                IPlayerInteractionManager shop = c.getPlayer().getInteraction();
                shop.buy(c, item, quantity);
                shop.broadcast(MaplePacketCreator.shopItemUpdate(shop), true);
            } else if (mode == Action.TAKE_ITEM_BACK.getCode() || mode == Action.REMOVE_ITEM.getCode()) {
                int slot = slea.readShort();
                IPlayerInteractionManager shop = c.getPlayer().getInteraction();
                if (shop != null && shop.isOwner(c.getPlayer())) {
                    MaplePlayerShopItem item = shop.getItems().get(slot);
                    if (item.getBundles() > 0) {
                        IItem iitem = item.getItem();
                        iitem.setQuantity(item.getBundles());
                        MapleInventoryManipulator.addFromDrop(c, iitem);
                    }
                    shop.removeFromSlot(slot);
                    c.getSession().write(MaplePacketCreator.shopItemUpdate(shop));
                }
            } else if (mode == Action.CLOSE_MERCHANT.getCode()) {
                IPlayerInteractionManager merchant = c.getPlayer().getInteraction();
                if (merchant != null && merchant.getShopType() == 1 && merchant.isOwner(c.getPlayer())) {
                    boolean save = false;
                    for (MaplePlayerShopItem items : merchant.getItems()) {
                        if (items.getBundles() > 0) {
                            IItem item = items.getItem();
                            item.setQuantity((short) (items.getBundles() * item.getQuantity()));
                            if (MapleInventoryManipulator.addFromDrop(c, item)) {
                                items.setBundles((short) 0);
                            } else {
                                save = true;
                                break;
                            }
                        }
                    }
                    c.getSession().write(MaplePacketCreator.shopErrorMessage(0x10, 0));
                    merchant.closeShop(save);
                    c.getPlayer().setInteraction(null);
                    c.getPlayer().setHasMerchant(false);
                }
            } else if (mode == Action.MAINTENANCE_OFF.getCode()) {
                HiredMerchant merchant = (HiredMerchant) c.getPlayer().getInteraction();
                if (merchant != null && merchant.isOwner(c.getPlayer())) {
                    merchant.setOpen(true);
                    merchant.tempItemsUpdate();
                }
            } else if (mode == Action.BAN_PLAYER.getCode()) {
                IPlayerInteractionManager imps = c.getPlayer().getInteraction();
                if (imps != null && imps.isOwner(c.getPlayer())) {
                    ((MaplePlayerShop) imps).banPlayer(slea.readMapleAsciiString());
                }
            } else if (mode == Action.MERCHANT_ORGANIZE.getCode()) {
                IPlayerInteractionManager imps = c.getPlayer().getInteraction();
                for (int i = 0; i < imps.getItems().size(); i++) {
                    if (imps.getItems().get(i).getBundles() == 0) {
                        imps.removeFromSlot(i);
                    }
                }
                c.getSession().write(MaplePacketCreator.shopItemUpdate(imps));
            }
        }
    }


  2. #2
    Account Upgraded | Title Enabled! PrinceReborn is offline
    MemberRank
    Jul 2008 Join Date
    United KingdomLocation
    261Posts

    Re: [Looking for fix] Merchant Set Up D/C = Lose Items

    Bump............ this is quite a bad bug that I'd like any hints/tips/guidance on...

  3. #3
    Account Upgraded | Title Enabled! snow202 is offline
    MemberRank
    Dec 2011 Join Date
    213Posts

    Re: [Looking for fix] Merchant Set Up D/C = Lose Items


  4. #4
    Account Upgraded | Title Enabled! Joakim432710 is offline
    MemberRank
    Oct 2008 Join Date
    222Posts

    Re: [Looking for fix] Merchant Set Up D/C = Lose Items

    Search in the forum, you're probably the 5th or 6th posting this.

  5. #5
    Account Upgraded | Title Enabled! PrinceReborn is offline
    MemberRank
    Jul 2008 Join Date
    United KingdomLocation
    261Posts

    Re: [Looking for fix] Merchant Set Up D/C = Lose Items

    I have searched and searched an can only find fixes for lithium! I'm using odinms...



Advertisement