• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Players can't buy runes with bps

Zaul

I'm The Devil Scripter
Joined
May 13, 2012
Messages
233
Reaction score
4
I don't know how to fix this one :(

They rightclick and choose buy with backpacks!

But they only the runes!

xodet.lua

PHP:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

function onCreatureAppear(cid)				npcHandler:onCreatureAppear(cid)			end
function onCreatureDisappear(cid) 			npcHandler:onCreatureDisappear(cid)			end
function onCreatureSay(cid, type, msg)			npcHandler:onCreatureSay(cid, type, msg)		end
function onThink()					npcHandler:onThink()					end

local shopModule = ShopModule:new()
npcHandler:addModule(shopModule)

shopModule:addBuyableItem({'spellbook'}, 2175, 150, 'spellbook')
shopModule:addBuyableItem({'magic lightwand'}, 2163, 400, 'magic lightwand')

shopModule:addBuyableItem({'small health'}, 8704, 20, 1, 'small health potion')
shopModule:addBuyableItem({'health potion'}, 7618, 45, 1, 'health potion')
shopModule:addBuyableItem({'mana potion'}, 7620, 50, 1, 'mana potion')
shopModule:addBuyableItem({'strong health'}, 7588, 100, 1, 'strong health potion')
shopModule:addBuyableItem({'strong mana'}, 7589, 80, 1, 'strong mana potion')
shopModule:addBuyableItem({'great health'}, 7591, 190, 1, 'great health potion')
shopModule:addBuyableItem({'great mana'}, 7590, 120, 1, 'great mana potion')
shopModule:addBuyableItem({'great spirit'}, 8472, 190, 1, 'great spirit potion')
shopModule:addBuyableItem({'ultimate health'}, 8473, 310, 1, 'ultimate health potion')
shopModule:addBuyableItem({'antidote potion'}, 8474, 50, 1, 'antidote potion')

shopModule:addSellableItem({'normal potion flask', 'normal flask'}, 7636, 5, 'empty small potion flask')
shopModule:addSellableItem({'strong potion flask', 'strong flask'}, 7634, 10, 'empty strong potion flask')
shopModule:addSellableItem({'great potion flask', 'great flask'}, 7635, 15, 'empty great potion flask')

shopModule:addBuyableItemContainer({'bp blank'}, 1998, 2260, 220, 1, 'backpack of blank runes')
shopModule:addBuyableItemContainer({'bp animate dead'}, 1998, 2316, 7520, 1, 'backpack of animate dead runes')
shopModule:addBuyableItemContainer({'bp antidote'}, 2003, 2266, 1320, 1, 'backpack of antidote runes')
shopModule:addBuyableItemContainer({'bp avalanche'}, 2002, 2274, 3620, 4, 'backpack of avalanche runes')
shopModule:addBuyableItemContainer({'bp chameleon'}, 1998, 2291, 4220, 1, 'backpack of chameleon runes')
shopModule:addBuyableItemContainer({'bp convince creature'}, 1998, 2290, 1620, 1, 'backpack of convince creature runes')
shopModule:addBuyableItemContainer({'bp desintegrate'}, 2001, 2310, 1620, 3, 'backpack of desintegrate runes')
shopModule:addBuyableItemContainer({'bp destroy field'}, 2003, 2261, 920, 3,  'backpack of destroy fields')
shopModule:addBuyableItemContainer({'bp energy bomb'}, 2003, 2262, 6520, 2, 'backpack of energy bomb runes')
shopModule:addBuyableItemContainer({'bp energy field'}, 1998, 2277, 2320, 3, 'backpack of energy fields')
shopModule:addBuyableItemContainer({'bp energy wall'}, 2002, 2279, 6820, 4, 'backpack of energy wall runes')
shopModule:addBuyableItemContainer({'bp explosion'}, 2001, 2313, 3820, 6, 'backpack of explosion runes')
shopModule:addBuyableItemContainer({'bp fire bomb'}, 2000, 2305, 4720, 2, 'backpack of fire bomb runes')
shopModule:addBuyableItemContainer({'bp fire field'}, 2000, 2301, 1720, 3,  'backpack of fire field runes')
shopModule:addBuyableItemContainer({'bp fire wall'}, 2000, 2303, 4920, 4, 'backpack of fire wall runes')
shopModule:addBuyableItemContainer({'bp fireball'}, 2000, 2302, 3020, 5,  'backpack of fire balls')
shopModule:addBuyableItemContainer({'bp great fireball'}, 2000, 2304, 3620, 4, 'backpack of great fireball runes')
shopModule:addBuyableItemContainer({'bp heavy magic missile'}, 2001, 2311, 2420, 10, 'backpack of heavy magic missile runes')
shopModule:addBuyableItemContainer({'bp holy missile'}, 1999, 2295, 1600, 5, 'backpack of holy missile runes')
shopModule:addBuyableItemContainer({'bp icicle'}, 2002, 2271, 3020, 5, 'backpack of icicle runes')
shopModule:addBuyableItemContainer({'bp intense healing'}, 2003, 2265, 1920, 1, 'backpack of intense healing runes')
shopModule:addBuyableItemContainer({'bp light magic missile'}, 1998, 2287, 820, 10, 'backpack of light magic missile runes')
shopModule:addBuyableItemContainer({'bp magic wall'}, 1999, 2293, 7020, 3, 'backpack of magic wall runes')
shopModule:addBuyableItemContainer({'bp paralyze'}, 2002, 2278, 13350, 1, 'backpack of paralyze runes')
shopModule:addBuyableItemContainer({'bp poison bomb'}, 1998, 2286, 3420, 2, 'backpack of poison bomb runes')
shopModule:addBuyableItemContainer({'bp poison field'}, 1998, 2285, 1320, 3,  'backpack of poison field runes')
shopModule:addBuyableItemContainer({'bp poison wall'}, 1998, 2289, 4220, 4, 'backpack of poison wall runes')
shopModule:addBuyableItemContainer({'bp soulfire'}, 2000, 2308, 2820, 3, 'backpack of soulfire runes')
shopModule:addBuyableItemContainer({'bp stalagmite'}, 1998, 2292, 2400, 10, 'backpack of stalagmite runes')
shopModule:addBuyableItemContainer({'bp stone shower'}, 1999, 2288, 3020, 4, 'backpack of stoneshower runes')
shopModule:addBuyableItemContainer({'bp sudden death'}, 2003, 2268, 6520, 3, 'backpack of sudden death runes')
shopModule:addBuyableItemContainer({'bp thunderstorm'}, 1999, 2315, 3020, 4, 'backpack of thunderstorm runes')
shopModule:addBuyableItemContainer({'bp ultimate healing'}, 2002, 2273, 3520, 3, 'backpack of ultimate healing runes')
shopModule:addBuyableItemContainer({'bp wild growth'}, 2002, 2269, 6420, 2, 'backpack of wild growth runes')

shopModule:addBuyableItem({'blank rune'}, 2260, 10, 1, 'blank rune')
shopModule:addBuyableItem({'animate dead'}, 2316, 375, 1, 'animate dead rune')
shopModule:addBuyableItem({'antidote'}, 2266, 65, 1, 'antidote rune')
shopModule:addBuyableItem({'avalanche'}, 2274, 180, 4, 'avalanche rune')
shopModule:addBuyableItem({'chameleon'}, 2291, 210, 1, 'chameleon rune')
shopModule:addBuyableItem({'convince creature'}, 2290, 80, 1, 'convince creature rune')
shopModule:addBuyableItem({'desintegrate'}, 2310, 80, 3, 'desintegrate rune')
shopModule:addBuyableItem({'destroy field'}, 2261, 45, 3,  'destroy field')
shopModule:addBuyableItem({'energy bomb'}, 2262, 325, 2, 'energy bomb rune')
shopModule:addBuyableItem({'energy field'}, 2277, 115, 3, 'energy field')
shopModule:addBuyableItem({'energy wall'}, 2279, 340, 4, 'energy wall rune')
shopModule:addBuyableItem({'explosion'}, 2313, 190, 6, 'explosion rune')
shopModule:addBuyableItem({'fire bomb'}, 2305, 235, 2, 'fire bomb rune')
shopModule:addBuyableItem({'fire field'}, 2301, 85, 3,  'fire field rune')
shopModule:addBuyableItem({'fire wall'}, 2303, 245, 4, 'fire wall rune')
shopModule:addBuyableItem({'fireball'}, 2302, 150, 5,  'fire ball')
shopModule:addBuyableItem({'great fireball'}, 2304, 180, 4, 'great fireball rune')
shopModule:addBuyableItem({'heavy magic missile'}, 2311, 120, 10, 'heavy magic missile rune')
shopModule:addBuyableItem({'holy missile missile'}, 2295, 80, 5, 'holy missile rune')
shopModule:addBuyableItem({'icicle'}, 2271, 150, 5, 'icicle rune')
shopModule:addBuyableItem({'intense healing'}, 2265, 95, 1, 'intense healing rune')
shopModule:addBuyableItem({'light magic missile'}, 2287, 40, 10, 'light magic missile rune')
shopModule:addBuyableItem({'magic wall'}, 2293, 350, 3, 'magic wall rune')
shopModule:addBuyableItem({'paralyze'}, 2278, 700, 1, 'paralyze rune')
shopModule:addBuyableItem({'poison bomb'}, 2286, 170, 2, 'poison bomb rune')
shopModule:addBuyableItem({'poison field'}, 2285, 65, 3,  'poison field')
shopModule:addBuyableItem({'poison wall'}, 2289, 210, 4, 'poison wall rune')
shopModule:addBuyableItem({'soulfire'}, 2308, 140, 3, 'soulfire rune')
shopModule:addBuyableItem({'stalagmite'}, 2292, 120, 10, 'stalagmite rune')
shopModule:addBuyableItem({'stone shower'}, 2288, 150, 4, 'stoneshower rune')
shopModule:addBuyableItem({'sudden death'}, 2268, 100, 3, 'sudden death rune')
shopModule:addBuyableItem({'thunderstorm'}, 2315, 150, 4, 'thunderstorm rune')
shopModule:addBuyableItem({'ultimate healing'}, 2273, 175, 3, 'ultimate healing rune')
shopModule:addBuyableItem({'wild growth'}, 2269, 320, 2, 'wild growth rune')

shopModule:addBuyableItemContainer({'bp slhp'}, 2000, 8704, 400, 1, 'backpack of small health potions')
shopModule:addBuyableItemContainer({'bp hp'}, 2000, 7618, 900, 1, 'backpack of health potions')
shopModule:addBuyableItemContainer({'bp mp'}, 2001, 7620, 1000, 1, 'backpack of mana potions')
shopModule:addBuyableItemContainer({'bp shp'}, 2000, 7588, 2000, 1, 'backpack of strong health potions')
shopModule:addBuyableItemContainer({'bp smp'}, 2001, 7589, 1600, 1, 'backpack of strong mana potions')
shopModule:addBuyableItemContainer({'bp ghp'}, 2000, 7591, 3800, 1, 'backpack of great health potions')
shopModule:addBuyableItemContainer({'bp gmp'}, 2001, 7590, 2400, 1, 'backpack of great mana potions')
shopModule:addBuyableItemContainer({'bp gsp'}, 1999, 8472, 3800, 1, 'backpack of great spirit potions')
shopModule:addBuyableItemContainer({'bp uhp'}, 2000, 8473, 6200, 1, 'backpack of ultimate health potions')
shopModule:addBuyableItemContainer({'bp ap'}, 2002, 8474, 2000, 1, 'backpack of antidote potions')

shopModule:addBuyableItem({'wand of vortex', 'vortex'}, 2190, 500, 1, 'wand of vortex')
shopModule:addBuyableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 1000, 1, 'wand of dragonbreath')
shopModule:addBuyableItem({'wand of decay', 'decay'}, 2188, 5000, 1, 'wand of decay')
shopModule:addBuyableItem({'wand of draconia', 'draconia'}, 8921, 7500, 1, 'wand of draconia')
shopModule:addBuyableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 10000, 1, 'wand of cosmic energy')
shopModule:addBuyableItem({'wand of inferno', 'inferno'}, 2187, 15000, 1, 'wand of inferno')
shopModule:addBuyableItem({'wand of starstorm', 'starstorm'}, 8920, 18000, 1, 'wand of starstorm')
shopModule:addBuyableItem({'wand of voodoo', 'voodoo'}, 8922, 22000, 1, 'wand of voodoo')

shopModule:addBuyableItem({'snakebite rod', 'snakebite'}, 2182, 500, 1, 'snakebite rod')
shopModule:addBuyableItem({'moonlight rod', 'moonlight'}, 2186, 1000, 1, 'moonlight rod')
shopModule:addBuyableItem({'necrotic rod', 'necrotic'}, 2185, 5000, 1, 'necrotic rod')
shopModule:addBuyableItem({'northwind rod', 'northwind'}, 8911, 7500, 1, 'northwind rod')
shopModule:addBuyableItem({'terra rod', 'terra'}, 2181, 10000, 1, 'terra rod')
shopModule:addBuyableItem({'hailstorm rod', 'hailstorm'}, 2183, 15000, 1, 'hailstorm rod')
shopModule:addBuyableItem({'springsprout rod', 'springsprout'}, 8912, 18000, 1, 'springsprout rod')
shopModule:addBuyableItem({'underworld rod', 'underworld'}, 8910, 22000, 1, 'underworld rod')

shopModule:addSellableItem({'wand of vortex', 'vortex'}, 2190, 250, 'wand of vortex')
shopModule:addSellableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 500, 'wand of dragonbreath')
shopModule:addSellableItem({'wand of decay', 'decay'}, 2188, 2500, 'wand of decay')
shopModule:addSellableItem({'wand of draconia', 'draconia'}, 8921, 3750, 'wand of draconia')
shopModule:addSellableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 5000, 'wand of cosmic energy')
shopModule:addSellableItem({'wand of inferno', 'inferno'},2187, 7500, 'wand of inferno')
shopModule:addSellableItem({'wand of starstorm', 'starstorm'}, 8920, 9000, 'wand of starstorm')
shopModule:addSellableItem({'wand of voodoo', 'voodoo'}, 8922, 11000, 'wand of voodoo')

shopModule:addSellableItem({'snakebite rod', 'snakebite'}, 2182, 250,'snakebite rod')
shopModule:addSellableItem({'moonlight rod', 'moonlight'}, 2186, 500, 'moonlight rod')
shopModule:addSellableItem({'necrotic rod', 'necrotic'}, 2185, 2500, 'necrotic rod')
shopModule:addSellableItem({'northwind rod', 'northwind'}, 8911, 3750, 'northwind rod')
shopModule:addSellableItem({'terra rod', 'terra'}, 2181, 5000, 'terra rod')
shopModule:addSellableItem({'hailstorm rod', 'hailstorm'}, 2183, 7500, 'hailstorm rod')
shopModule:addSellableItem({'springsprout rod', 'springsprout'}, 8912, 9000, 'springsprout rod')
shopModule:addSellableItem({'underworld rod', 'underworld'}, 8910, 11000, 'underworld rod')

local items = {[1] = 2190, [2] = 2182, [5] = 2190, [6] = 2182}
function creatureSayCallback(cid, type, msg)
	if(not npcHandler:isFocused(cid)) then
		return false
	end

	local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
	if(msgcontains(msg, 'first rod') or msgcontains(msg, 'first wand')) then
		if(isSorcerer(cid) or isDruid(cid)) then
			if(getPlayerStorageValue(cid, 30002) <= 0) then
				selfSay('So you ask me for a {' .. getItemNameById(items[getPlayerVocation(cid)]) .. '} to begin your advanture?', cid)
				talkState[talkUser] = 1
			else
				selfSay('What? I have already gave you one {' .. getItemNameById(items[getPlayerVocation(cid)]) .. '}!', cid)
			end
		else
			selfSay('Sorry, you aren\'t a druid either a sorcerer.', cid)
		end
	elseif(msgcontains(msg, 'yes')) then
		if(talkState[talkUser] == 1) then
			doPlayerAddItem(cid, items[getPlayerVocation(cid)], 1)
			selfSay('Here you are young adept, take care yourself.', cid)
			setPlayerStorageValue(cid, 30002, 1)
		end
		talkState[talkUser] = 0
	elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser])) then
		selfSay('Ok then.', cid)
		talkState[talkUser] = 0
	end

	return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

lib/npc.lua

PHP:
function selfIdle()
	following = false
	attacking = false

	selfAttackCreature(0)
	target = 0
end

function selfSayChannel(cid, message)
	return selfSay(message, cid, false)
end

function selfMoveToCreature(id)
	if(not id or id == 0) then
		return
	end

	local t = getCreaturePosition(id)
	if(not t.x or t.x == nil) then
		return
	end

	selfMoveTo(t.x, t.y, t.z)
	return
end

function getNpcDistanceToCreature(id)
	if(not id or id == 0) then
		selfIdle()
		return nil
	end

	local c = getCreaturePosition(id)
	if(not c.x or c.x == 0) then
		return nil
	end

	local s = getCreaturePosition(getNpcId())
	if(not s.x or s.x == 0 or s.z ~= c.z) then
		return nil
	end

	return math.max(math.abs(s.x - c.x), math.abs(s.y - c.y))
end

function doMessageCheck(message, keyword)
	if(type(keyword) == "table") then
		return table.isStrIn(keyword, message)
	end

	local a, b = message:lower():find(keyword:lower())
	if(a ~= nil and b ~= nil) then
		return true
	end

	return false
end

function doNpcSellItem(cid, itemid, amount, subType, ignoreCap, inBackpacks, backpack)
	local amount = amount or 1
	local subType = subType or 1
	local ignoreCap = ignoreCap and true or false

	local item = 0
	if(isItemStackable(itemid)) then
		item = doCreateItemEx(itemid, amount)
		if(doPlayerAddItemEx(cid, item, ignoreCap) ~= RETURNVALUE_NOERROR) then
			return 0, 0
		end

		return amount, 0
	end

	local a = 0
	if(inBackpacks) then
		local container = doCreateItemEx(backpack, 1)
		local b = 1
		for i = 1, amount do
			item = doAddContainerItem(container, itemid, subType)
			if(itemid == ITEM_PARCEL) then
				doAddContainerItem(item, ITEM_LABEL)
			end

			if(isInArray({(getContainerCapById(backpack) * b), amount}, i)) then
				if(doPlayerAddItemEx(cid, container, ignoreCap) ~= RETURNVALUE_NOERROR) then
					b = b - 1
					break
				end

				a = i
				if(amount > i) then
					container = doCreateItemEx(backpack, 1)
					b = b + 1
				end
			end
		end

		return a, b
	end

	for i = 1, amount do
		item = doCreateItemEx(itemid, subType)
		if(itemid == ITEM_PARCEL) then
			doAddContainerItem(item, ITEM_LABEL)
		end

		if(doPlayerAddItemEx(cid, item, ignoreCap) ~= RETURNVALUE_NOERROR) then
			break
		end

		a = i
	end

	return a, 0
end

function doRemoveItemIdFromPos (id, n, position)
	local thing = getThingFromPos({x = position.x, y = position.y, z = position.z, stackpos = 1})
	if(thing.itemid == id) then
		doRemoveItem(thing.uid, n)
		return true
	end

	return false
end

function getNpcName()
	return getCreatureName(getNpcId())
end

function getNpcPos()
	return getCreaturePosition(getNpcId())
end

function selfGetPosition()
	local t = getNpcPos()
	return t.x, t.y, t.z
end

msgcontains = doMessageCheck
moveToPosition = selfMoveTo
moveToCreature = selfMoveToCreature
selfMoveToPosition = selfMoveTo
selfGotoIdle = selfIdle
isPlayerPremiumCallback = isPremium
doPosRemoveItem = doRemoveItemIdFromPos
doNpcBuyItem = doPlayerRemoveItem
doNpcSetCreatureFocus = selfFocus
getNpcCid = getNpcId
getDistanceTo = getNpcDistanceToCreature
getDistanceToCreature = getNpcDistanceToCreature

if not eventDelayedSay then eventDelayedSay = {} end
 
local func = function(pars)
        if isCreature(pars.cid) == TRUE and isPlayer(pars.pcid) == TRUE then
                doCreatureSay(pars.cid, pars.text, pars.type, false, pars.pcid, getCreaturePosition(pars.cid))
        end
end
 
function doCreatureSayWithDelay(cid, text, type, delay, e, pcid)
        if isCreature(cid) == TRUE and isPlayer(pcid) == TRUE then
                e.event = addEvent(func, delay < 1 and 1000 or delay, {cid=cid, text=text, type=type, e=e, pcid=pcid})
        end
end
 
function cancelNPCTalk(events)
        for i = 1, #events do
                stopEvent(events[i].event)
        end
        events = nil
end
 
function doNPCTalkALot(msgs, interval, pcid)
        if eventDelayedSay[pcid] then
                cancelNPCTalk(eventDelayedSay[pcid])
        end
        if isPlayer(pcid) == TRUE then
                eventDelayedSay[pcid] = {}
                local ret = {}
                for i = 1, #msgs do
                        eventDelayedSay[pcid][i] = {}
                        doCreatureSayWithDelay(getNpcCid(), msgs[i], TALKTYPE_PRIVATE_NP, ((i-1) * (interval or 10000)) + 1000, eventDelayedSay[pcid][i], pcid)
                        table.insert(ret, eventDelayedSay[pcid][i])
                end
                return(ret)
        end
end
        function customCallbackOnBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks, shopWindow)
                local shopItem, npcHandler = nil, NpcHandler
                for _, item in ipairs(shopWindow) do
                        if not item.subType then
                                item.subType = (isItemFluidContainer(item.id) == TRUE or isItemStackable(item.id) == TRUE) and 0 or 1
                        end
                        if(item.id == itemid and (item.subType == subType)) then
                                shopItem = item
                                break
                        end
                end
 
                if(shopItem == nil) then
                        print("[ShopModule.onBuy] Item not found on shopItems list")
                        return false
                end
 
                if(shopItem.buy < 0) then
                        print("[ShopModule.onSell] Attempt to purchase an item which is only sellable")
                        return false
                end
 
                local backpack, totalCost = 1988, amount * shopItem.buy
                if(inBackpacks) then
                        totalCost = isItemStackable(itemid) == TRUE and totalCost + 20 or totalCost + (math.max(1, math.floor(amount / getContainerCapById(backpack))) * 20)
                end
 
                if(getPlayerMoney(cid) < totalCost) then
                        doPlayerSendCancel(cid, npcHandler:parseMessage(npcHandler:getMessage(MESSAGE_NEEDMONEY), {[TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = totalCost, [TAG_ITEMNAME] = shopItem.name}))
                        return false
                end
 
                local subType = shopItem.subType or isItemFluidContainer(itemid) == TRUE and 0 or 1
                local a, b = doNpcSellItem(cid, itemid, amount, subType, ignoreCap, inBackpacks, backpack)
                if(a < amount) then
                        local msgId = MESSAGE_NEEDMORESPACE
                        if(a == 0) then
                                msgId = MESSAGE_NEEDSPACE
                        end
 
                        doPlayerSendCancel(cid, npcHandler:parseMessage(npcHandler:getMessage(msgId), {[TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = totalCost, [TAG_ITEMNAME] = shopItem.name, [TAG_ITEMCOUNT] = a}))
 
                        if(a > 0) then
                                doPlayerRemoveMoney(cid, ((a * shopItem.buy) + (b * 20)))
                                return true
                        end
 
                        return false
                end
                doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, npcHandler:parseMessage(npcHandler:getMessage(MESSAGE_BOUGHT), {[TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = totalCost, [TAG_ITEMNAME] = shopItem.name}))
                doPlayerRemoveMoney(cid, totalCost)
 
                return true
        end
       
        function customCallbackOnSell(cid, itemid, subType, amount, ignoreCap, inBackpacks, shopWindow)
                local shopItem, npcHandler, subType = nil, NpcHandler, subType or 0
                for _, item in ipairs(shopWindow) do
                        item.subType = not item.subType and 0 or item.subType
                        if(item.id == itemid and (isItemFluidContainer(itemid) == FALSE or isItemFluidContainer(itemid) == TRUE and item.subType == subType)) then
                                shopItem = item
                                break
                        end
                end
 
                if(shopItem == nil) then
                        print("[ShopModule.onBuy] Item not found on shopItems list")
                        return false
                end
 
                if(shopItem.sell < 0) then
                        print("[ShopModule.onSell] Attempt to sell an item which is only buyable")
                        return false
                end
 
                if(doPlayerRemoveItem(cid, itemid, amount, isItemFluidContainer(itemid) == TRUE and subType or isItemStackable(itemid) == TRUE and amount or 1) == TRUE) then
                        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, npcHandler:parseMessage(npcHandler:getMessage(MESSAGE_SOLD), {[TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = amount * shopItem.sell, [TAG_ITEMNAME] = shopItem.name}))
                        doPlayerAddMoney(cid, amount * shopItem.sell)
 
                        return true
                end
                doPlayerSendCancel(cid, npcHandler:parseMessage(npcHandler:getMessage(MESSAGE_NEEDITEM), {[TAG_PLAYERNAME] = getPlayerName(cid), [TAG_ITEMCOUNT] = amount, [TAG_TOTALCOST] = amount * shopItem.sell, [TAG_ITEMNAME] = shopItem.name}))
 
                return false
        end

modules.lua
http://pastebin.com/tDfyGJYn
 
Last edited:
npc.lua
Code:
function doNpcSellItem(cid, itemid, amount, subType, ignoreCap, inBackpacks, backpack)
	amount = amount or 1
	subType = subType or 1
	ignoreCap = false

	local item = 0
	if(isItemStackable(itemid)) then
		if(inBackpacks) then
			item = doCreateItemEx(backpack)
			for i = 1, 20 do
				doAddContainerItem(item, itemid, amount)
			end
			amount = amount * 20
		else
			item = doCreateItemEx(itemid, amount)
		end
		if(doPlayerAddItemEx(cid, item, ignoreCap) ~= RETURNVALUE_NOERROR) then
			return 0, 0
		end

		return amount, 0
	end

	local a = 0
	if(inBackpacks) then
		local container = doCreateItemEx(backpack)
		local b = 1
		for i = 1, amount do
			item = doAddContainerItem(container, itemid, subType)

			if(isInArray({(getContainerCapById(backpack) * b), amount}, i)) then
				if(doPlayerAddItemEx(cid, container, ignoreCap) ~= RETURNVALUE_NOERROR) then
					b = b - 1
					break
				end

				a = i
				if(amount > i) then
					container = doCreateItemEx(backpack)
					b = b + 1
				end
			end
		end

		return a, b
	end

	for i = 1, amount do
		item = doCreateItemEx(itemid, subType)

		if(doPlayerAddItemEx(cid, item, ignoreCap) ~= RETURNVALUE_NOERROR) then
			break
		end

		a = i
	end

	return a, 0
end
modules.lua
Code:
	-- Callback onBuy() function. If you wish, you can change certain Npc to use your onBuy().
	function ShopModule:callbackOnBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks)
		if(exhaustion.check(cid, 182829))then
			doPlayerSendCancel(cid, "You need to wait a bit before you'll be able to purcharse next item.");
			return false;
		end
		
		local shopItem = nil
		for _, item in ipairs(self.npcHandler.shopItems) do
			if(item.id == itemid and item.subType == subType) then
				shopItem = item
				break
			end
		end

		if(shopItem == nil) then
			print("[ShopModule.onBuy]", "Item not found on shopItems list")
			return false
		end

		if(shopItem.buy == -1) then
			print("[ShopModule.onSell]", "Attempt to purchase an item which only sellable")
			return false
		end
		exhaustion.set(cid,182829,1);
		local backpack, totalCost = 1988, amount * shopItem.buy
		if(inBackpacks) then
			if getItemInfo(itemid).stackable then
				totalCost = totalCost * 20 + 20
			else
				totalCost = totalCost + math.max(1, math.floor(amount / getContainerCapById(backpack))) * 20
			end
		end

		local parseInfo = {
			[TAG_PLAYERNAME] = getPlayerName(cid),
			[TAG_ITEMCOUNT] = amount,
			[TAG_TOTALCOST] = totalCost,
			[TAG_ITEMNAME] = shopItem.name
		}

		if(getPlayerMoney(cid) < totalCost) then
			local msg = self.npcHandler:getMessage(MESSAGE_NEEDMONEY)
			doPlayerSendCancel(cid, self.npcHandler:parseMessage(msg, parseInfo))
			return false
		end

		subType = shopItem.subType or 1
		local a, b = doNpcSellItem(cid, itemid, amount, subType, ignoreCap, inBackpacks, backpack)
		if(a < amount) then
			local msg = self.npcHandler:getMessage(a == 0 and MESSAGE_NEEDSPACE or MESSAGE_NEEDMORESPACE)
			parseInfo[TAG_ITEMCOUNT] = a

			doPlayerSendCancel(cid, self.npcHandler:parseMessage(msg, parseInfo))
			if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
				self.npcHandler.talkStart[cid] = os.time()
			else
				self.npcHandler.talkStart = os.time()
			end

			if(a > 0) then
				doPlayerRemoveMoney(cid, a * shopItem.buy + b * 20)
				return true
			end

			return false
		elseif a > amount then
			parseInfo[TAG_ITEMCOUNT] = a
			parseInfo[TAG_TOTALCOST] = a * shopItem.buy + 20
			totalCost = parseInfo[TAG_TOTALCOST]
		end

		local msg = self.npcHandler:getMessage(MESSAGE_BOUGHT)
		doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, self.npcHandler:parseMessage(msg, parseInfo))

		doPlayerRemoveMoney(cid, totalCost)
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			self.npcHandler.talkStart[cid] = os.time()
		else
			self.npcHandler.talkStart = os.time()
		end

		return true
	end
 
Lua:
shopModule:addBuyableItemContainer({'bp slhp'}, 2000, 8704, 400, 1, 'backpack of small health potions')
shopModule:addBuyableItemContainer({'bp hp'}, 2000, 7618, 900, 1, 'backpack of health potions')
shopModule:addBuyableItemContainer({'bp mp'}, 2001, 7620, 1000, 1, 'backpack of mana potions')
shopModule:addBuyableItemContainer({'bp shp'}, 2000, 7588, 2000, 1, 'backpack of strong health potions')
shopModule:addBuyableItemContainer({'bp smp'}, 2001, 7589, 1600, 1, 'backpack of strong mana potions')
shopModule:addBuyableItemContainer({'bp ghp'}, 2000, 7591, 3800, 1, 'backpack of great health potions')
shopModule:addBuyableItemContainer({'bp gmp'}, 2001, 7590, 2400, 1, 'backpack of great mana potions')
shopModule:addBuyableItemContainer({'bp gsp'}, 1999, 8472, 3800, 1, 'backpack of great spirit potions')
shopModule:addBuyableItemContainer({'bp uhp'}, 2000, 8473, 6200, 1, 'backpack of ultimate health potions')
shopModule:addBuyableItemContainer({'bp ap'}, 2002, 8474, 2000, 1, 'backpack of antidote potions')

u can buy bps of runes by saying bp xx
 
Back
Top