• 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!

Lua Problem with NPC Esrik

Ancore

New Member
Joined
Jul 6, 2012
Messages
216
Reaction score
1
I want that Esrik buys all zaoan items and I want that you dont need tomes to sell him.

Esrik.lua
Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local Topic = {}

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

function creatureSayCallback(cid, type, msg)
	local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
	if (msgcontains(msg, "hello") or msgcontains(msg, "hi")) and (not npcHandler:isFocused(cid)) then
		npcHandler:say("Hello, ".. getCreatureName(cid) .." and welcome to my little forge.", cid, TRUE)
		npcHandler:addFocus(cid)
	elseif(not npcHandler:isFocused(cid)) then
		return false
	elseif msgcontains(msg, "bye") or msgcontains(msg, "farewell") then
		npcHandler:say("Bye.", cid, TRUE)
		npcHandler:releaseFocus(cid)
	elseif msgcontains(msg, "trade") then
		local items = {
			{name="axe", id=2386, buy=20, sell=7},
			{name="battle hammer", id=2417, buy=350},
			{name="brass armor", id=2465, buy=450, sell=150},
			{name="chain armor", id=2464, buy=200, sell=70},
			{name="chain helmet", id=2458, buy=52, sell=17},
			{name="chain legs", id=2648, buy=80, sell=25},
			{name="dagger", id=2351, buy=5},
			{name="hand axe", id=2380, buy=8, sell=4},
			{name="leather armor", id=2467, buy=35, sell=12},
			{name="leather helmet", id=2461, buy=12},
			{name="mace", id=2398, buy=90, sell=30},
			{name="rapier", id=2384, buy=15, sell=5},
			{name="sabre", id=2385, buy=35, sell=12},
			{name="spear", id=2389, buy=10, sell=3},
			{name="steel shield", id=2509, buy=240, sell=80},
			{name="sword", id=2376, buy=85, sell=25},
			{name="throwing knife", id=2410, buy=25},
			{name="wooden shield", id=2512, buy=15, sell=3},
			{name="battle axe", id=2378, sell=80},
			{name="battle shield", id=2513, sell=95},
			{name="halberd", id=2381, sell=400},
			{name="morning star", id=2394, sell=90},
			{name="plate armor", id=2463, sell=400},
			{name="steel helmet", id=2457, sell=190},
			{name="two handed sword", id=2377, sell=450},
			{name="warmaster's wristguards", id=11316, sell=200},
			{name="lizard weapon rack kit", id=11120, buy=500},
			 {name="twin hooks", id=11303, buy=1100, sell=500},
			 {name="zaoan halberd", id=11317, buy=1200, sell=500},
			 {name="bone shoulderplate", id=11315, sell=150},
			 {name="broken halberd", id=11329, sell=100},
			 {name="cursed shoulder spikes", id=11321, sell=320},
			 {name="drachaku", id=11302, sell=10000},
			 {name="drakinata", id=11299, sell=10000},
			 {name="draken boots", id=12621, sell=40000},
			 {name="guardian boots", id=11234, sell=35000},
			 {name="high guard's shoulderplates", id=11327, sell=130},
			 {name="legionnaire flags", id=11328, sell=500},
			 {name="sais", id=11300, sell=16500},
			 {name="spiked iron ball", id=11319, sell=100},
			 {name="trashed draken boots", id=12607, sell=40000},
			 {name="twiceslicer", id=12574, sell=28000},
			 {name="wailing widow's necklace", id=11323, sell=3000},
			 {name="zaoan armor", id=11295, sell=14000},
			 {name="zaoan helmet", id=11296, sell=45000},
			 {name="zaoan legs", id=11298, sell=14000},
			 {name="zaoan shoes", id=11297, sell=5000},
			 {name="zaoan sword", id=11301, sell=30000},
			 {name="zaogun's shoulderplates", id=11325, sell=150},
			 }
			 
		openShopWindow(cid, items,
			function(cid, itemid, subType, amount, ignoreCap, inBackpacks)
				customCallbackOnSell(cid, itemid, subType, amount, ignoreCap, inBackpacks, items)
			end,
			function(cid, itemid, subType, amount, ignoreCap, inBackpacks)
				customCallbackOnBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks, items)
			end
		)
		npcHandler:say("Of course, just browse through my wares.", cid)
	end
	return TRUE
end

npcHandler:setMessage(MESSAGE_WALKAWAY, "Bye.")
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)

I have no error in console when I create the NPC. The error comes when I try to sell him an item. When I click "sell", the console say:
Code:
[Error - NpcScript Interface]
(Unknown script file)
Description:
data/npc/scripts/Esrik.lua:79: attempt to call global 'customCallbackOnSell' (a nil value)
stack traceback:
        data/npc/scripts/Esrik.lua:79: in function <data/npc/scripts/Esrik.lua:78>

What should I do?

Help!

- - - Updated - - -

BUMP!
 
Add this in somewhere on your data\npc\lib\npc.lua (i dont know if work..) is old script
Lua:
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
		error("[ShopModule.onBuy]", "Item not found on shopItems list")
		return false
	end
 
	if(shopItem.buy < 0) then
		error("[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
		error("[ShopModule.onBuy]", "Item not found on shopItems list")
		return false
	end
 
	if(shopItem.sell < 0) then
		error("[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
 
Why do you need a custom callback? Can't you just use the default one if you do not have the custom code anyway?
 
Back
Top Bottom