def handle(world_session, socket, reader):
        if len(reader.data) >= 22:  # Avoid handling empty buy item packet.
            vendor_guid, item, bag_guid, slot, count = unpack(
                '<QIQ2B', reader.data[:22])
            if vendor_guid > 0:
                if count <= 0:
                    count = 1

                vendor_npc = MapManager.get_surrounding_unit_by_guid(
                    world_session.player_mgr, vendor_guid)

                vendor_data, session = WorldDatabaseManager.creature_get_vendor_data_by_item(
                    vendor_npc.entry, item)

                if vendor_data:
                    item_template = vendor_data.item_template
                    session.close()

                    total_cost = item_template.buy_price * count
                    real_count = count if item_template.buy_count == 1 else item_template.buy_count

                    if world_session.player_mgr.coinage < total_cost:
                        world_session.player_mgr.inventory.send_buy_error(
                            BuyResults.BUY_ERR_NOT_ENOUGH_MONEY, item,
                            vendor_guid, real_count)
                        return 0

                    if 0 < vendor_data.maxcount < count:  # I should be checking here for current count too
                        world_session.player_mgr.inventory.send_buy_error(
                            BuyResults.BUY_ERR_ITEM_SOLD_OUT, item,
                            vendor_guid, real_count)
                        return 0

                    bag_slot = world_session.player_mgr.inventory.get_container_slot_by_guid(
                        bag_guid)
                    if world_session.player_mgr.inventory.add_item_to_slot(
                            dest_bag_slot=bag_slot,
                            dest_slot=slot,
                            item_template=item_template,
                            count=real_count):
                        world_session.player_mgr.mod_money(total_cost * -1)
                        # vendor_npc.send_inventory_list(world_session)
                else:
                    world_session.player_mgr.inventory.send_buy_error(
                        BuyResults.BUY_ERR_CANT_FIND_ITEM, item, vendor_guid)

        return 0
Example #2
0
    def handle(world_session, socket, reader):
        if len(reader.data) >= 13:  # Avoid handling empty buy item packet
            vendor_guid, item, count = unpack('<QIB', reader.data[:13])

            if 0 < vendor_guid == world_session.player_mgr.current_selection:
                if count <= 0:
                    count = 1

                vendor_npc = GridManager.get_surrounding_unit_by_guid(
                    world_session.player_mgr, vendor_guid)
                vendor_data, session = WorldDatabaseManager.creature_get_vendor_data_by_item(
                    vendor_npc.entry, item)

                if vendor_data:
                    item_template = vendor_data.item_template
                    session.close()

                    total_cost = item_template.buy_price * count

                    if world_session.player_mgr.coinage < total_cost:
                        world_session.player_mgr.inventory.send_buy_error(
                            BuyResults.BUY_ERR_NOT_ENOUGH_MONEY, item,
                            vendor_guid)
                        return 0

                    if 0 < vendor_data.maxcount < count:  # I should be checking here for current count too
                        world_session.player_mgr.inventory.send_buy_error(
                            BuyResults.BUY_ERR_ITEM_SOLD_OUT, item,
                            vendor_guid)
                        return 0

                    if world_session.player_mgr.inventory.add_item(
                            item_template=item_template,
                            count=count,
                            handle_error=False):
                        world_session.player_mgr.mod_money(total_cost * -1)
                        #vendor_npc.send_inventory_list(world_session)
                    else:
                        world_session.player_mgr.inventory.send_buy_error(
                            BuyResults.BUY_ERR_CANT_CARRY_MORE, item,
                            vendor_guid)
                else:
                    world_session.player_mgr.inventory.send_buy_error(
                        BuyResults.BUY_ERR_CANT_FIND_ITEM, item, vendor_guid)

        return 0