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

Npc problem OTX 3

armyman

Member
Joined
Feb 15, 2014
Messages
318
Reaction score
13
I got this error in console when i talk with him.

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/aldee.lua:onCreatureSay
data/npc/scripts/aldee.lua:12: attempt to call method 'AddFocus' (a nil value)
stack traceback:
        [C]: in function 'AddFocus'
        data/npc/scripts/aldee.lua:12: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/aldee.lua:7: in function <data/npc/scripts/aldee.lua:7>

NPC Script
Lua:
local keywordHandler = KeywordHandler:new()
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
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 AlDeeBehaviour (cid, type, msg)

npcHandler:AddFocus({"hi", "hello"}, "Hello, hello, |PLAYERNAME|! Please come in, look, and buy!", 0, cid, msg)
npcHandler:AddQueue({"hi", "hello"}, "I'll be with you in a moment, |PLAYERNAME|.", 0, cid, msg)
npcHandler:RemoveFocus({"bye", "farewell"}, "Bye, bye.", 0, cid, msg)

  if(not npcHandler:isFocused(cid)) then
     return 0
  end
        if(msgcontains(msg, 'pick') or msgcontains(msg, 'small axe')) then
                npcHandler:say("Picks are hard to come by. I trade them only for high quality small axes. Do you want to trade?",cid)
                npcHandler:doTopic(cid, 1)
        elseif(msgcontains(msg, "yes")) and (npcHandler.Topic == 1) then
                if doPlayerRemoveItem(cid,2559,1) == TRUE then 
                        doPlayerAddItem(cid,2553,1)
                        npcHandler:say("Splendid! Here take your pickaxe.",cid)
                        npcHandler:doTopic(cid, 0)
                else
                        npcHandler:say("Sorry, I am looking for a SMALL axe.", cid)
                        npcHandler:doTopic(cid, 0)
                end
        elseif(npcHandler.Topic == 1) then
                npcHandler:say("Well, then not.", cid)
                npcHandler:doTopic(cid, 0)
        end

local keywords = {
["how are you"] = {response = "I am fine. I'm so glad to have you here as my customer."},
["sell"] = {response = "I sell much. Just read the blackboards for my awesome wares or just ask me."},
["job"] = {response = "I am a merchant. What can I do for you?"},
["name"] = {response = "My name is Al Dee, but you can call me Al. Do you want to buy something?"},
["time"] = {response = "It is about "..getTime()..". I am so sorry, I have no watches to sell. Do you want to buy something else?"},
["help"] = {response = "I sell stuff to prices that low, that all other merchants would mock at my stupidity."},
["monster"] = {response = "If you want to challenge the monsters, you need some weapons and armor I sell. You need them definitely!"},
["dungeon"] = {response = "If you want to explore the dungeons, you have to equip yourself with the vital stuff I am selling. It's vital in the deepest sense of the word."},
["sewer"] = {response = "Oh, our sewer system is very primitive; so primitive it's overrun by rats. But the stuff I sell is save from them. Do you want to buy some of it?"},
["king"] = {response = "The king encouraged salesmen to travel here, but only I dared to take the risk, and a risk it was!"},
["dallheim"] = {response = "Some call him a hero."},
["bug"] = {response = "Bugs plague this isle, but my wares are bugfree, totally bugfree."},
["stuff"] = {response = "I sell equipment of all kinds, all kind available on this isle. Just ask me about my wares if you are interested."},
["tibia"] = {response = "One day I will return to the continent as a rich, a very rich man!"},
["thais"] = {response = "Thais is a crowded town."},
["wares"] = {response = "I sell weapons, shields, armor, helmets, and equipment. For what do you want to ask?"},
["offer"] = {response = "I sell weapons, shields, armor, helmets, and equipment. For what do you want to ask?"},
["weapon"] = {response = "I sell spears, rapiers, sabres, daggers, hand axes, axes, and short swords. Just tell me what you want to buy."},
["armor"] = {response = "I sell jackets, coats, doublets, leather armor, and leather legs. Just tell me what you want to buy."},
["helmet"] = {response = "I sell leather helmets, studded helmets, and chain helmets. Just tell me what you want to buy."},
["shield"] = {response = "I sell wooden shields and studded shields. Just tell me what you want to buy."},
["equipment"] = {response = "I sell torches, bags, scrolls, shovels, picks, backpacks, sickles, scythes, ropes and fishing rods. Just tell me what you want to buy."},
["do you sell"] = {response = "What do you need? I sell weapons, armor, helmets, shields, and equipment."},
["do you have"] = {response = "What do you need? I sell weapons, armor, helmets, shields, and equipment."},
["club"] = {response = "I don't buy this garbage!"},
}
  for v in pairs(keywords) do
    if (msgcontains(msg, v)) then
        npcHandler:say(keywords[v].response, cid)
        npcHandler:doTopic(cid, 0)
    end
  end
  return 1
end

------BUYABLE_ITEMS-----

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

shopModule:addBuyableItem({'spear'},               2389, 10)
shopModule:addBuyableItem({'rapier'},            2384, 15)
shopModule:addBuyableItem({'sabre'},            2385, 25)
shopModule:addBuyableItem({'dagger'},            2379, 5)
shopModule:addBuyableItem({'sickle'},            2405, 8)
shopModule:addBuyableItem({'hand axe'},            2380, 8)
shopModule:addBuyableItem({'axe'},            2386, 20)
shopModule:addBuyableItem({'short sword'},        2406, 30)
shopModule:addBuyableItem({'jacket'},            2650, 10)
shopModule:addBuyableItem({'coat'},            2651, 8)
shopModule:addBuyableItem({'doublet'},            2485, 16)
shopModule:addBuyableItem({'leather armor'},        2467, 25)
shopModule:addBuyableItem({'leather legs'},        2649, 10)
shopModule:addBuyableItem({'leather helmet'},        2461, 12)
shopModule:addBuyableItem({'studded helmet'},        2482, 63)
shopModule:addBuyableItem({'chain helmet'},        2458, 52)
shopModule:addBuyableItem({'wooden shield'},        2512, 15)
shopModule:addBuyableItem({'studded shield'},        2526, 50)

shopModule:addBuyableItem({'torch'},        2050, 2)
shopModule:addBuyableItem({'bag'},        1987, 4)
shopModule:addBuyableItem({'scroll'},        1949, 5)
shopModule:addBuyableItem({'shovel'},        2554, 10)
shopModule:addBuyableItem({'backpack'},        1988, 10)
shopModule:addBuyableItem({'scythe'},        2550, 12)
shopModule:addBuyableItem({'rope'},        2120, 50)
shopModule:addBuyableItem({'rod'},           2580, 150)

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, AlDeeBehaviour)
 
No it's impossible. Delet servorr!

Jokes a side, open up npchandler.lua and look for addFocus and see how it's spelled.
 
Lua:
-- Advanced NPC System by Jiddo

if NpcHandler == nil then
    -- Constant talkdelay behaviors.
    TALKDELAY_NONE = 0 -- No talkdelay. Npc will reply immedeatly.
    TALKDELAY_ONTHINK = 1 -- Talkdelay handled through the onThink callback function. (Default)
    TALKDELAY_EVENT = 2 -- Not yet implemented

    -- Currently applied talkdelay behavior. TALKDELAY_ONTHINK is default.
    NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK

    -- Constant indexes for defining default messages.
    MESSAGE_GREET = 1 -- When the player greets the npc.
    MESSAGE_FAREWELL = 2 -- When the player unGreets the npc.
    MESSAGE_BUY = 3 -- When the npc asks the player if he wants to buy something.
    MESSAGE_ONBUY = 4 -- When the player successfully buys something via talk.
    MESSAGE_BOUGHT = 5 -- When the player bought something through the shop window.
    MESSAGE_SELL = 6 -- When the npc asks the player if he wants to sell something.
    MESSAGE_ONSELL = 7 -- When the player successfully sells something via talk.
    MESSAGE_SOLD = 8 -- When the player sold something through the shop window.
    MESSAGE_MISSINGMONEY = 9 -- When the player does not have enough money.
    MESSAGE_NEEDMONEY = 10 -- Same as above, used for shop window.
    MESSAGE_MISSINGITEM = 11 -- When the player is trying to sell an item he does not have.
    MESSAGE_NEEDITEM = 12 -- Same as above, used for shop window.
    MESSAGE_NEEDSPACE = 13 -- When the player don't have any space to buy an item
    MESSAGE_NEEDMORESPACE = 14 -- When the player has some space to buy an item, but not enough space
    MESSAGE_IDLETIMEOUT = 15 -- When the player has been idle for longer then idleTime allows.
    MESSAGE_WALKAWAY = 16 -- When the player walks out of the talkRadius of the npc.
    MESSAGE_DECLINE = 17 -- When the player says no to something.
    MESSAGE_SENDTRADE = 18 -- When the npc sends the trade window to the player
    MESSAGE_NOSHOP = 19 -- When the npc's shop is requested but he doesn't have any
    MESSAGE_ONCLOSESHOP = 20 -- When the player closes the npc's shop window
    MESSAGE_ALREADYFOCUSED = 21 -- When the player already has the focus of this npc.
    MESSAGE_WALKAWAY_MALE = 22 -- When a male player walks out of the talkRadius of the npc.
    MESSAGE_WALKAWAY_FEMALE = 23 -- When a female player walks out of the talkRadius of the npc.

    -- Constant indexes for callback functions. These are also used for module callback ids.
    CALLBACK_CREATURE_APPEAR = 1
    CALLBACK_CREATURE_DISAPPEAR    = 2
    CALLBACK_CREATURE_SAY = 3
    CALLBACK_ONTHINK = 4
    CALLBACK_GREET = 5
    CALLBACK_FAREWELL = 6
    CALLBACK_MESSAGE_DEFAULT = 7
    CALLBACK_PLAYER_ENDTRADE = 8
    CALLBACK_PLAYER_CLOSECHANNEL = 9
    CALLBACK_ONBUY = 10
    CALLBACK_ONSELL = 11
    CALLBACK_ONADDFOCUS = 18
    CALLBACK_ONRELEASEFOCUS = 19
    CALLBACK_ONTRADEREQUEST = 20

    -- Addidional module callback ids
    CALLBACK_MODULE_INIT = 12
    CALLBACK_MODULE_RESET = 13

    -- Constant strings defining the keywords to replace in the default messages.
    TAG_PLAYERNAME = "|PLAYERNAME|"
    TAG_ITEMCOUNT = "|ITEMCOUNT|"
    TAG_TOTALCOST = "|TOTALCOST|"
    TAG_ITEMNAME = "|ITEMNAME|"
    TAG_TRAVELCOST = "|TRAVELCOST|"

    NpcHandler = {
        keywordHandler = nil,
        focuses = nil,
        talkStart = nil,
        idleTime = 120,
        talkRadius = 3,
        talkDelayTime = 1, -- Seconds to delay outgoing messages.
        talkDelay = nil,
        callbackFunctions = nil,
        modules = nil,
        shopItems = nil, -- They must be here since ShopModule uses 'static' functions
        eventSay = nil,
        eventDelayedSay = nil,
        topic = nil,
        messages = {
            -- These are the default replies of all npcs. They can/should be changed individually for each npc.
            [MESSAGE_GREET] = "Greetings, |PLAYERNAME|.",
            [MESSAGE_FAREWELL] = "Good bye, |PLAYERNAME|.",
            [MESSAGE_BUY] = "Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?",
            [MESSAGE_ONBUY] = "Here you are.",
            [MESSAGE_BOUGHT] = "Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.",
            [MESSAGE_SELL] = "Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?",
            [MESSAGE_ONSELL] = "Here you are, |TOTALCOST| gold.",
            [MESSAGE_SOLD] = "Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.",
            [MESSAGE_MISSINGMONEY] = "You don't have enough money.",
            [MESSAGE_NEEDMONEY] = "You don't have enough money.",
            [MESSAGE_MISSINGITEM] = "You don't have so many.",
            [MESSAGE_NEEDITEM] = "You do not have this object.",
            [MESSAGE_NEEDSPACE] = "You do not have enough capacity.",
            [MESSAGE_NEEDMORESPACE] = "You do not have enough capacity for all items.",
            [MESSAGE_IDLETIMEOUT] = "Good bye.",
            [MESSAGE_WALKAWAY] = "Good bye.",
            [MESSAGE_DECLINE] = "Then not.",
            [MESSAGE_SENDTRADE] = "Of course, just browse through my wares.",
            [MESSAGE_NOSHOP] = "Sorry, I'm not offering anything.",
            [MESSAGE_ONCLOSESHOP] = "Thank you, come back whenever you're in need of something else.",
            [MESSAGE_ALREADYFOCUSED] = "|PLAYERNAME|, I am already talking to you.",
            [MESSAGE_WALKAWAY_MALE] = "Good bye.",
            [MESSAGE_WALKAWAY_FEMALE] = "Good bye."
        }
    }

    -- Creates a new NpcHandler with an empty callbackFunction stack.
    function NpcHandler:new(keywordHandler)
        local obj = {}
        obj.callbackFunctions = {}
        obj.modules = {}
        obj.eventSay = {}
        obj.eventDelayedSay = {}
        obj.topic = {}
        obj.focuses = {}
        obj.talkStart = {}
        obj.talkDelay = {}
        obj.keywordHandler = keywordHandler
        obj.messages = {}
        obj.shopItems = {}

        setmetatable(obj.messages, self.messages)
        self.messages.__index = self.messages

        setmetatable(obj, self)
        self.__index = self
        return obj
    end

    -- Re-defines the maximum idle time allowed for a player when talking to this npc.
    function NpcHandler:setMaxIdleTime(newTime)
        self.idleTime = newTime
    end

    -- Attaches a new keyword handler to this npchandler
    function NpcHandler:setKeywordHandler(newHandler)
        self.keywordHandler = newHandler
    end

    -- Function used to change the focus of this npc.
    function NpcHandler:addFocus(newFocus)
        if self:isFocused(newFocus) then
            return
        end

        self.focuses[#self.focuses + 1] = newFocus
        self.topic[newFocus] = 0
        local callback = self:getCallback(CALLBACK_ONADDFOCUS)
        if callback == nil or callback(newFocus) then
            self:processModuleCallback(CALLBACK_ONADDFOCUS, newFocus)
        end
        self:updateFocus()
    end

    -- Function used to verify if npc is focused to certain player
    function NpcHandler:isFocused(focus)
        for k,v in pairs(self.focuses) do
            if v == focus then
                return true
            end
        end
        return false
    end

    -- This function should be called on each onThink and makes sure the npc faces the player it is talking to.
    --    Should also be called whenever a new player is focused.
    function NpcHandler:updateFocus()
        for pos, focus in pairs(self.focuses) do
            if focus ~= nil then
                doNpcSetCreatureFocus(focus)
                return
            end
        end
        doNpcSetCreatureFocus(0)
    end

    -- Used when the npc should un-focus the player.
    function NpcHandler:releaseFocus(focus)
        if shop_cost[focus] ~= nil then
            shop_amount[focus] = nil
            shop_cost[focus] = nil
            shop_rlname[focus] = nil
            shop_itemid[focus] = nil
            shop_container[focus] = nil
            shop_npcuid[focus] = nil
            shop_eventtype[focus] = nil
            shop_subtype[focus] = nil
            shop_destination[focus] = nil
            shop_premium[focus] = nil
        end

        if self.eventDelayedSay[focus] then
            self:cancelNPCTalk(self.eventDelayedSay[focus])
        end

        if not self:isFocused(focus) then
            return
        end

        local pos = nil
        for k,v in pairs(self.focuses) do
            if v == focus then
                pos = k
            end
        end
        self.focuses[pos] = nil

        self.eventSay[focus] = nil
        self.eventDelayedSay[focus] = nil
        self.talkStart[focus] = nil
        self.topic[focus] = nil

        local callback = self:getCallback(CALLBACK_ONRELEASEFOCUS)
        if callback == nil or callback(focus) then
            self:processModuleCallback(CALLBACK_ONRELEASEFOCUS, focus)
        end

        if Player(focus) ~= nil then
            self:updateFocus()
        end
    end

    -- Returns the callback function with the specified id or nil if no such callback function exists.
    function NpcHandler:getCallback(id)
        local ret = nil
        if self.callbackFunctions ~= nil then
            ret = self.callbackFunctions[id]
        end
        return ret
    end

    -- Changes the callback function for the given id to callback.
    function NpcHandler:setCallback(id, callback)
        if self.callbackFunctions ~= nil then
            self.callbackFunctions[id] = callback
        end
    end

    -- Adds a module to this npchandler and inits it.
    function NpcHandler:addModule(module)
        if self.modules ~= nil then
            self.modules[#self.modules + 1] = module
            module:init(self)
        end
    end

    -- Calls the callback function represented by id for all modules added to this npchandler with the given arguments.
    function NpcHandler:processModuleCallback(id, ...)
        local ret = true
        for i, module in pairs(self.modules) do
            local tmpRet = true
            if id == CALLBACK_CREATURE_APPEAR and module.callbackOnCreatureAppear ~= nil then
                tmpRet = module:callbackOnCreatureAppear(...)
            elseif id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil then
                tmpRet = module:callbackOnCreatureDisappear(...)
            elseif id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil then
                tmpRet = module:callbackOnCreatureSay(...)
            elseif id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil then
                tmpRet = module:callbackOnPlayerEndTrade(...)
            elseif id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil then
                tmpRet = module:callbackOnPlayerCloseChannel(...)
            elseif id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil then
                tmpRet = module:callbackOnBuy(...)
            elseif id == CALLBACK_ONSELL and module.callbackOnSell ~= nil then
                tmpRet = module:callbackOnSell(...)
            elseif id == CALLBACK_ONTRADEREQUEST and module.callbackOnTradeRequest ~= nil then
                tmpRet = module:callbackOnTradeRequest(...)
            elseif id == CALLBACK_ONADDFOCUS and module.callbackOnAddFocus ~= nil then
                tmpRet = module:callbackOnAddFocus(...)
            elseif id == CALLBACK_ONRELEASEFOCUS and module.callbackOnReleaseFocus ~= nil then
                tmpRet = module:callbackOnReleaseFocus(...)
            elseif id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil then
                tmpRet = module:callbackOnThink(...)
            elseif id == CALLBACK_GREET and module.callbackOnGreet ~= nil then
                tmpRet = module:callbackOnGreet(...)
            elseif id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil then
                tmpRet = module:callbackOnFarewell(...)
            elseif id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil then
                tmpRet = module:callbackOnMessageDefault(...)
            elseif id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil then
                tmpRet = module:callbackOnModuleReset(...)
            end
            if not tmpRet then
                ret = false
                break
            end
        end
        return ret
    end

    -- Returns the message represented by id.
    function NpcHandler:getMessage(id)
        local ret = nil
        if self.messages ~= nil then
            ret = self.messages[id]
        end
        return ret
    end

    -- Changes the default response message with the specified id to newMessage.
    function NpcHandler:setMessage(id, newMessage)
        if self.messages ~= nil then
            self.messages[id] = newMessage
        end
    end

    -- Translates all message tags found in msg using parseInfo
    function NpcHandler:parseMessage(msg, parseInfo)
        local ret = msg
        for search, replace in pairs(parseInfo) do
            ret = string.gsub(ret, search, replace)
        end
        return ret
    end

    -- Makes sure the npc un-focuses the currently focused player
    function NpcHandler:unGreet(cid)
        if not self:isFocused(cid) then
            return
        end

        local callback = self:getCallback(CALLBACK_FAREWELL)
        if callback == nil or callback() then
            if self:processModuleCallback(CALLBACK_FAREWELL) then
                local msg = self:getMessage(MESSAGE_FAREWELL)
                local player = Player(cid)
                local playerName = player and player:getName() or -1
                local parseInfo = { [TAG_PLAYERNAME] = playerName }
                self:resetNpc(cid)
                msg = self:parseMessage(msg, parseInfo)
                self:say(msg, cid, true)
                self:releaseFocus(cid)
            end
        end
    end

    -- Greets a new player.
    function NpcHandler:greet(cid)
        if cid ~= 0 then
            local callback = self:getCallback(CALLBACK_GREET)
            if callback == nil or callback(cid) then
                if self:processModuleCallback(CALLBACK_GREET, cid) then
                    local msg = self:getMessage(MESSAGE_GREET)
                    local player = Player(cid)
                    local playerName = player and player:getName() or -1
                    local parseInfo = { [TAG_PLAYERNAME] = playerName }
                    msg = self:parseMessage(msg, parseInfo)
                    self:say(msg, cid, true)
                else
                    return
                end
            else
                return
            end
        end
        self:addFocus(cid)
    end

    -- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback.
    function NpcHandler:onCreatureAppear(creature)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_CREATURE_APPEAR)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_CREATURE_APPEAR, cid) then
                --
            end
        end
    end

    -- Handles onCreatureDisappear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_DISAPPEAR callback.
    function NpcHandler:onCreatureDisappear(creature)
        local cid = creature:getId()
        if getNpcCid() == cid then
            return
        end

        local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid) then
                if self:isFocused(cid) then
                    self:unGreet(cid)
                end
            end
        end
    end

    -- Handles onCreatureSay events. If you with to handle this yourself, please use the CALLBACK_CREATURE_SAY callback.
    function NpcHandler:onCreatureSay(creature, msgtype, msg)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_CREATURE_SAY)
        if callback == nil or callback(cid, msgtype, msg) then
            if self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, msgtype, msg) then
                if not self:isInRange(cid) then
                    return
                end

                if self.keywordHandler ~= nil then
                    if self:isFocused(cid) or not self:isFocused(cid) then
                        local ret = self.keywordHandler:processMessage(cid, msg)
                        if not ret then
                            local callback = self:getCallback(CALLBACK_MESSAGE_DEFAULT)
                            if callback ~= nil and callback(cid, msgtype, msg) then
                                self.talkStart[cid] = os.time()
                            end
                        else
                            self.talkStart[cid] = os.time()
                        end
                    end
                end
            end
        end
    end

    -- Handles onBuy events. If you wish to handle this yourself, use the CALLBACK_ONBUY callback.
    function NpcHandler:onBuy(creature, itemid, subType, amount, ignoreCap, inBackpacks)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_ONBUY)
        if callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks) then
            if self:processModuleCallback(CALLBACK_ONBUY, cid, itemid, subType, amount, ignoreCap, inBackpacks) then
                --
            end
        end
    end

    -- Handles onSell events. If you wish to handle this yourself, use the CALLBACK_ONSELL callback.
    function NpcHandler:onSell(creature, itemid, subType, amount, ignoreCap, inBackpacks)
        local cid = creature:getId()
        local callback = self:getCallback(CALLBACK_ONSELL)
        if callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks) then
            if self:processModuleCallback(CALLBACK_ONSELL, cid, itemid, subType, amount, ignoreCap, inBackpacks) then
                --
            end
        end
    end

    -- Handles onTradeRequest events. If you wish to handle this yourself, use the CALLBACK_ONTRADEREQUEST callback.
    function NpcHandler:onTradeRequest(cid)
        local callback = self:getCallback(CALLBACK_ONTRADEREQUEST)
        if callback == nil or callback(cid) then
            if self:processModuleCallback(CALLBACK_ONTRADEREQUEST, cid) then
                return true
            end
        end
        return false
    end

    -- Handles onThink events. If you wish to handle this yourself, please use the CALLBACK_ONTHINK callback.
    function NpcHandler:onThink()
        local callback = self:getCallback(CALLBACK_ONTHINK)
        if callback == nil or callback() then
            if NPCHANDLER_TALKDELAY == TALKDELAY_ONTHINK then
                for cid, talkDelay in pairs(self.talkDelay) do
                    if talkDelay.time ~= nil and talkDelay.message ~= nil and os.time() >= talkDelay.time then
                        selfSay(talkDelay.message, cid, talkDelay.publicize and true or false)
                        self.talkDelay[cid] = nil
                    end
                end
            end

            if self:processModuleCallback(CALLBACK_ONTHINK) then
                for pos, focus in pairs(self.focuses) do
                    if focus ~= nil then
                        if not self:isInRange(focus) then
                            self:onWalkAway(focus)
                        elseif self.talkStart[focus] ~= nil and (os.time() - self.talkStart[focus]) > self.idleTime then
                            self:unGreet(focus)
                        else
                            self:updateFocus()
                        end
                    end
                end
            end
        end
    end

    -- Tries to greet the player with the given cid.
    function NpcHandler:onGreet(cid)
        if self:isInRange(cid) then
            if not self:isFocused(cid) then
                self:greet(cid)
                return
            end
        end
    end

    -- Simply calls the underlying unGreet function.
    function NpcHandler:onFarewell(cid)
        self:unGreet(cid)
    end

    -- Should be called on this npc's focus if the distance to focus is greater then talkRadius.
    function NpcHandler:onWalkAway(cid)
        if self:isFocused(cid) then
            local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR)
            if callback == nil or callback() then
                if self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid) then
                    local msg = self:getMessage(MESSAGE_WALKAWAY)

                    local player = Player(cid)
                    local playerName = player and player:getName() or -1
                    local playerSex = player and player:getSex() or 0

                    local parseInfo = { [TAG_PLAYERNAME] = playerName }
                    local message = self:parseMessage(msg, parseInfo)

                    local msg_male = self:getMessage(MESSAGE_WALKAWAY_MALE)
                    local message_male = self:parseMessage(msg_male, parseInfo)
                    local msg_female = self:getMessage(MESSAGE_WALKAWAY_FEMALE)
                    local message_female = self:parseMessage(msg_female, parseInfo)
                    if message_female ~= message_male then
                        if playerSex == PLAYERSEX_FEMALE then
                            selfSay(message_female)
                        else
                            selfSay(message_male)
                        end
                    elseif message ~= "" then
                        selfSay(message)
                    end
                    self:resetNpc(cid)
                    self:releaseFocus(cid)
                end
            end
        end
    end

    -- Returns true if cid is within the talkRadius of this npc.
    function NpcHandler:isInRange(cid)
        local distance = Player(cid) ~= nil and getDistanceTo(cid) or -1
        if distance == -1 then
            return false
        end

        return distance <= self.talkRadius
    end

    -- Resets the npc into its initial state (in regard of the keywordhandler).
    --    All modules are also receiving a reset call through their callbackOnModuleReset function.
    function NpcHandler:resetNpc(cid)
        if self:processModuleCallback(CALLBACK_MODULE_RESET) then
            self.keywordHandler:reset(cid)
        end
    end

    function NpcHandler:cancelNPCTalk(events)
        for aux = 1, #events do
            stopEvent(events[aux].event)
        end
        events = nil
    end

    function NpcHandler:doNPCTalkALot(msgs, interval, pcid)
        if self.eventDelayedSay[pcid] then
            self:cancelNPCTalk(self.eventDelayedSay[pcid])
        end

        self.eventDelayedSay[pcid] = {}
        local ret = {}
        for aux = 1, #msgs do
            self.eventDelayedSay[pcid][aux] = {}
            doCreatureSayWithDelay(getNpcCid(), msgs[aux], TALKTYPE_SAY, ((aux-1) * (interval or 4000)) + 700, self.eventDelayedSay[pcid][aux], pcid)
            ret[#ret + 1] = self.eventDelayedSay[pcid][aux]
        end
        return(ret)
    end

    -- Makes the npc represented by this instance of NpcHandler say something.
    --    This implements the currently set type of talkdelay.
    --    shallDelay is a boolean value. If it is false, the message is not delayed. Default value is true.
    function NpcHandler:say(message, focus, publicize, shallDelay, delay)
        if type(message) == "table" then
            return self:doNPCTalkALot(message, delay or 6000, focus)
        end

        if self.eventDelayedSay[focus] then
            self:cancelNPCTalk(self.eventDelayedSay[focus])
        end

        local shallDelay = not shallDelay and true or shallDelay
        if NPCHANDLER_TALKDELAY == TALKDELAY_NONE or shallDelay == false then
            selfSay(message, focus, publicize and true or false)
            return
        end

        stopEvent(self.eventSay[focus])
        self.eventSay[focus] = addEvent(function(npcId, message, focusId)
            local npc = Npc(npcId)
            if npc == nil then
                return
            end
            local player = Player(focusId)
            if player then
                npc:say(message:gsub("|PLAYERNAME|", player:getName()), TALKTYPE_SAY)
            end
        end, self.talkDelayTime * 1000, Npc():getId(), message, focus)
    end
end
 
like he said change it to addFocus in your npc file
shows that the function is indeed addFocus and not AddFocus
hyYy7sW.png
 
Now, u say hi, the npc talk "bye,bye. "

and i got this error in console

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/aldee.lua:onCreatureSay
data/npc/scripts/aldee.lua:13: attempt to call method 'AddQueue' (a nil value)
stack traceback:
        [C]: in function 'AddQueue'
        data/npc/scripts/aldee.lua:13: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/aldee.lua:7: in function <data/npc/scripts/aldee.lua:7>
 
Now, u say hi, the npc talk "bye,bye. "

and i got this error in console

Code:
Lua Script Error: [Npc interface]
data/npc/scripts/aldee.lua:onCreatureSay
data/npc/scripts/aldee.lua:13: attempt to call method 'AddQueue' (a nil value)
stack traceback:
        [C]: in function 'AddQueue'
        data/npc/scripts/aldee.lua:13: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:401: in function 'onCreatureSay'
        data/npc/scripts/aldee.lua:7: in function <data/npc/scripts/aldee.lua:7>
same thing
AddQueue to addQueue
 
there isn't the addQueue or addQueue on npchandler

I got other npc script and npc.xml of other server, now work without errors
 
Last edited by a moderator:
For anyone who stumbles upon this thread..
When you get a line like this
Code:
.../aldee.lua:13: attempt to call method 'AddQueue' (a nil value)
Where it says '(a nil value)', this means that the thing being called in a nil value.

A nil value, means that it does not exist.

More often then not, it's a simply a case of mispelling the function name.
Sometimes though, it may be a missing or renamed function is your server.

In the case above, it was a spelling mistake the first time, and then missing or renamed functions for the other two.
Lua:
npcHandler:AddFocus
npcHandler:addFocus -- correct

npcHandler:addQueue
-- this function is not in the server or is differently named

npcHandler:removeFocus
-- this function is not in the server or is differently named
 
Last edited:
Back
Top