Ir para conteúdo
  • Cadastre-se

(Resolvido)[AJUDA] npchandler.lua:394


Ir para solução Resolvido por Yan Liima,

Posts Recomendados

Meu painel de logs recebe constantemente a mensagem a baixo, estou usando TFS 1.0 10.82 direto do painel da OTPANEL (thornia)

 

Alguem poderia fornecer uma sugestão?  

 

 

Lua Script Error: [Npc interface] 
data/npc/scripts/default.lua:onCreatureSay 
data/npc/lib/npcsystem/npchandler.lua:394: attempt to index local 'creature' (a number value) 
stack traceback: 
[C]: in function '__index' 
data/npc/lib/npcsystem/npchandler.lua:394: in function 'onCreatureSay' 
data/npc/scripts/default.lua:7: in function 

-- 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|"
 
        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
 
        -- Attackes 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
                        table.remove(shop_amount, focus)
                        table.remove(shop_cost, focus)
                        table.remove(shop_rlname, focus)
                        table.remove(shop_itemid, focus)
                        table.remove(shop_container, focus)
                        table.remove(shop_npcuid, focus)
                        table.remove(shop_eventtype, focus)
                        table.remove(shop_subtype, focus)
                        table.remove(shop_destination, focus)
                        table.remove(shop_premium, focus)
                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
                table.remove(self.focuses, pos)
 
                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
                        closeShopWindow(focus) --Even if it can not exist, we need to prevent it.
                        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 parseInfo = { [TAG_PLAYERNAME] = Player(cid):getName() }
                                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 parseInfo = { [TAG_PLAYERNAME] = Player(cid):getName() }
                                        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()
                if cid == getNpcCid() and next(self.shopItems) ~= nil then
                        local npc = Npc()
                        local speechBubble = npc:getSpeechBubble()
                        if speechBubble == 3 then
                                npc:setSpeechBubble(4)
                        else
                                npc:setSpeechBubble(2)
                        end
                end
 
                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) and msgtype == TALKTYPE_PRIVATE_PN 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 onPlayerEndTrade events. If you wish to handle this yourself, use the CALLBACK_PLAYER_ENDTRADE callback.
        function NpcHandler:onPlayerEndTrade(creature)
                local cid = creature:getId()
                local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE)
                if callback == nil or callback(cid) then
                        if self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, msgtype, msg) then
                                if self:isFocused(cid) then
                                        local parseInfo = { [TAG_PLAYERNAME] = Player(cid):getName() }
                                        local msg = self:parseMessage(self:getMessage(MESSAGE_ONCLOSESHOP), parseInfo)
                                        self:say(msg, cid)
                                end
                        end
                end
        end
 
        -- Handles onPlayerCloseChannel events. If you wish to handle this yourself, use the CALLBACK_PLAYER_CLOSECHANNEL callback.
        function NpcHandler:onPlayerCloseChannel(creature)
                local cid = creature:getId()
                local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL)
                if callback == nil or callback(cid) then
                        if self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, msgtype, msg) then
                                if self:isFocused(cid) then
                                        self:unGreet(cid)
                                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 playerName = Player(cid):getName()
                                        if not playerName then
                                                playerName = -1
                                        end
 
                                        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 Player(cid):getSex() == 0 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_PRIVATE_NP, ((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, TALKTYPE_PRIVATE_NP, false, player, npc:getPosition())
                        end
                end, self.talkDelayTime * 1000, Npc():getId(), message, focus)
        end
end

Link para o post
Compartilhar em outros sites
  • Solução

vai em \data\npc\lib\npcsystem

 

abra o npchandler.lua e cole isto dentro

-- Advanced NPC System (Created by Jiddo),
-- Modificado por Yan Liima - Night

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 conversation behaviors.
	CONVERSATION_DEFAULT = 0 -- Conversation through default window, like it was before 8.2 update.
	CONVERSATION_PRIVATE = 1 -- Conversation through NPCs chat window, as of 8.2 update. (Default)
		--Small Note: Private conversations also means the NPC will use multi-focus system.

	-- Currently applied conversation behavior. CONVERSATION_PRIVATE is default.
	NPCHANDLER_CONVBEHAVIOR = CONVERSATION_PRIVATE

	-- 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_PLACEDINQUEUE		= 22 -- When the player has been placed in the costumer queue.

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

	-- 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_QUEUESIZE = '|QUEUESIZE|'

	NpcHandler = {
		keywordHandler = nil,
		focuses = nil,
		talkStart = nil,
		idleTime = 300,
		talkRadius = 3,
		talkDelayTime = 1, -- Seconds to delay outgoing messages.
		queue = nil,
		talkDelay = nil,
		callbackFunctions = nil,
		modules = nil,
		shopItems = nil, -- They must be here since ShopModule uses "static" functions
		messages = {
			-- These are the default replies of all npcs. They can/should be changed individually for each npc.
			[MESSAGE_GREET] 	= 'Bem vindo, |PLAYERNAME|! Eu estive esperando voce!',
			[MESSAGE_FAREWELL] 	= 'Adeus, |PLAYERNAME|!',
			[MESSAGE_BUY] 		= 'Voce deseja comprar |ITEMCOUNT| |ITEMNAME| por |TOTALCOST| gold coins?',
			[MESSAGE_ONBUY] 	= 'Adeus, volte quando quiser.',
			[MESSAGE_BOUGHT] 	= 'Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
			[MESSAGE_SELL] 		= 'Voce deseja vender |ITEMCOUNT| |ITEMNAME| por |TOTALCOST| gold coins?',
			[MESSAGE_ONSELL] 	= 'Thank you for this |ITEMNAME|, |PLAYERNAME| gold.',
			[MESSAGE_SOLD]	 	= 'Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
			[MESSAGE_MISSINGMONEY]	= 'Desculpe, voce não tem nenhum dinheiro.',
			[MESSAGE_NEEDMONEY] 	= 'Voce não tem dinheiro suficiente.',
			[MESSAGE_MISSINGITEM] 	= 'You don\'t even have that item, |PLAYERNAME|!',
			[MESSAGE_NEEDITEM]	= 'Voce não tem este objeto.',
			[MESSAGE_NEEDSPACE]	= 'Voce não tem cap suficiente.',
			[MESSAGE_NEEDMORESPACE]	= 'Voce não tem capacidade para todos os itens.',
			[MESSAGE_IDLETIMEOUT] 	= 'Próximo, por favor!',
			[MESSAGE_WALKAWAY] 	= 'Até mais!',
			[MESSAGE_DECLINE]	= 'Not good enough, is it... ?',
			[MESSAGE_SENDTRADE]	= 'Essa é minha oferta, |PLAYERNAME|. Deseja algo?',
			[MESSAGE_NOSHOP]	= 'Desculpe, eu não comercializo nada.',
			[MESSAGE_ONCLOSESHOP]	= 'Obrigado, volte sempre que precisar.',
			[MESSAGE_ALREADYFOCUSED]= '|PLAYERNAME|! Já estou falando com voce...',
			[MESSAGE_PLACEDINQUEUE] = '|PLAYERNAME|, please wait for your turn. There are |QUEUESIZE| customers before you.'
		}
	}

	-- Creates a new NpcHandler with an empty callbackFunction stack.
	function NpcHandler:new(keywordHandler)
		local obj = {}
		obj.callbackFunctions = {}
		obj.modules = {}
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			obj.focuses = {}
			obj.talkStart = {}
		else
			obj.queue = Queue:new(obj)
			obj.focuses = 0
			obj.talkStart = 0
		end
		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

	-- Attackes 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(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			if(self:isFocused(newFocus)) then
				return
			end

			table.insert(self.focuses, newFocus)
		else
			self.focuses = newFocus
		end

		self:updateFocus()
	end
	NpcHandler.changeFocus = NpcHandler.addFocus --"changeFocus" looks better for CONVERSATION_DEFAULT

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

			return false
		end

		return (self.focuses == focus)
	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()
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			for pos, focus in pairs(self.focuses) do
				if(focus ~= nil) then
					doNpcSetCreatureFocus(focus)
					return
				end
			end

			doNpcSetCreatureFocus(0)
		else
			doNpcSetCreatureFocus(self.focuses)
		end
	end

	-- Used when the npc should un-focus the player.
	function NpcHandler:releaseFocus(focus)
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			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
			table.remove(self.focuses, pos)
			self.talkStart[focus] = nil
			closeShopWindow(focus) --Even if it can not exist, we need to prevent it.
			self:updateFocus()
		else
			closeShopWindow(focus)
			self:changeFocus(0)
		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 or module == nil) then
			return false
		end

		module:init(self)
		if(module.parseParameters ~= nil) then
			module:parseParameters()
		end

		table.insert(self.modules, module)
		return true
	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(unpack(arg))
			elseif(id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil) then
				tmpRet = module:callbackOnCreatureDisappear(unpack(arg))
			elseif(id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil) then
				tmpRet = module:callbackOnCreatureSay(unpack(arg))
			elseif(id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil) then
				tmpRet = module:callbackOnPlayerEndTrade(unpack(arg))
			elseif(id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil) then
				tmpRet = module:callbackOnPlayerCloseChannel(unpack(arg))
			elseif(id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil) then
				tmpRet = module:callbackOnBuy(unpack(arg))
			elseif(id == CALLBACK_ONSELL and module.callbackOnSell ~= nil) then
				tmpRet = module:callbackOnSell(unpack(arg))
			elseif(id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil) then
				tmpRet = module:callbackOnThink(unpack(arg))
			elseif(id == CALLBACK_GREET and module.callbackOnGreet ~= nil) then
				tmpRet = module:callbackOnGreet(unpack(arg))
			elseif(id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil) then
				tmpRet = module:callbackOnFarewell(unpack(arg))
			elseif(id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil) then
				tmpRet = module:callbackOnMessageDefault(unpack(arg))
			elseif(id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil) then
				tmpRet = module:callbackOnModuleReset(unpack(arg))
			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(cid)) then
			if(self:processModuleCallback(CALLBACK_FAREWELL)) then
				if(self.queue == nil or not self.queue:greetNext()) then
					local msg = self:getMessage(MESSAGE_FAREWELL)
					local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
					msg = self:parseMessage(msg, parseInfo)

					self:say(msg, cid)
					self:releaseFocus(cid)
					self:say(msg)
				end
			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 parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) }
					msg = self:parseMessage(msg, parseInfo)

					self:say(msg)
					self:addFocus(cid)
					self:say(msg, cid)
				end
			end
		end
	end

	-- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback.
	function NpcHandler:onCreatureAppear(cid)
		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(cid)
		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(cid, class, msg)
		local callback = self:getCallback(CALLBACK_CREATURE_SAY)
		if(callback == nil or callback(cid, class, msg)) then
			if(self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, class, msg)) then
				if(not self:isInRange(cid)) then
					return
				end

				if(self.keywordHandler ~= nil) then
					if((self:isFocused(cid) and (class == TALKTYPE_PRIVATE_PN or NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT)) 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, class, msg)) then
								if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
									self.talkStart[cid] = os.time()
								else
									self.talkStart = os.time()
								end
							end
						else
							if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
								self.talkStart[cid] = os.time()
							else
								self.talkStart = os.time()
							end
						end
					end
				end
			end
		end
	end

	-- Handles onPlayerEndTrade events. If you wish to handle this yourself, use the CALLBACK_PLAYER_ENDTRADE callback.
	function NpcHandler:onPlayerEndTrade(cid)
		local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, class, msg)) then
				if(self:isFocused(cid)) then
					local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
					local msg = self:parseMessage(self:getMessage(MESSAGE_ONCLOSESHOP), parseInfo)
					self:say(msg, cid)
				end
			end
		end
	end

	-- Handles onPlayerCloseChannel events. If you wish to handle this yourself, use the CALLBACK_PLAYER_CLOSECHANNEL callback.
	function NpcHandler:onPlayerCloseChannel(cid)
		local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL)
		if(callback == nil or callback(cid)) then
			if(self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, class, msg)) then
				if(self:isFocused(cid)) then
					self:unGreet(cid)
				end
			end
		end
	end

	-- Handles onBuy events. If you wish to handle this yourself, use the CALLBACK_ONBUY callback.
	function NpcHandler:onBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks)
		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(cid, itemid, subType, amount, ignoreCap, inBackpacks)
		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 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
				if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) 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)
							self.talkDelay[cid] = nil
						end
					end
				elseif(self.talkDelay.time ~= nil and self.talkDelay.message ~= nil and os.time() >= self.talkDelay.time) then
					selfSay(self.talkDelay.message)
					self.talkDelay.time = nil
					self.talkDelay.message = nil
				end
			end

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

	-- Tries to greet the player with the given cid.
	function NpcHandler:onGreet(cid)
		if(self:isInRange(cid)) then
			if(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE) then
				if(not self:isFocused(cid)) then
					self:greet(cid)
					return
				end
			elseif(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT) then
				if(self.focuses == 0) then
					self:greet(cid)
				elseif(self.focuses == cid) then
					local msg = self:getMessage(MESSAGE_ALREADYFOCUSED)
					local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) }
					msg = self:parseMessage(msg, parseInfo)
					self:say(msg)
				else
					if(not self.queue:isInQueue(cid)) then
						self.queue:push(cid)
					end

					local msg = self:getMessage(MESSAGE_PLACEDINQUEUE)
					local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid), [TAG_QUEUESIZE] = self.queue:getSize() }
					msg = self:parseMessage(msg, parseInfo)
					self:say(msg)
				end
			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(cid)) then
				if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then
					if(self.queue == nil or not self.queue:greetNext()) then
						local msg = self:getMessage(MESSAGE_WALKAWAY)
						local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) }
						msg = self:parseMessage(msg, parseInfo)

						self:say(msg, cid)
						self:releaseFocus(cid)
						self:say(msg)
					end
				end
			end
		end
	end

	-- Returns true if cid is within the talkRadius of this npc.
	function NpcHandler:isInRange(cid)
		local distance = getDistanceBetween(getCreaturePosition(getNpcCid()), getCreaturePosition(cid))
		if(distance == -1) then
			return false
		end
 
		return (distance <= self.talkRadius)
	end

	-- Resets the npc into it's initial state (in regard of the keyrodhandler).
	--	All modules are also receiving a reset call through their callbackOnModuleReset function.
	function NpcHandler:resetNpc()
		if(self:processModuleCallback(CALLBACK_MODULE_RESET)) then
			self.keywordHandler:reset()
		end
	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 false.
	function NpcHandler:say(message, focus, shallDelay)
		local shallDelay = shallDelay or false
		if(NPCHANDLER_TALKDELAY == TALKDELAY_NONE or not shallDelay) then
			if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
				selfSay(message, focus)
				return
			else
				selfSay(message)
				return
			end
		end

		-- TODO: Add an event handling method for delayed messages
		if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then
			self.talkDelay[focus] = {
				message = message,
				time = os.time() + self.talkDelayTime,
			}
		else
			self.talkDelay = {
				message = message,
				time = os.time() + self.talkDelayTime
			}
		end
	end
end

 

Depois abra npcsystem.lua e cole isto:

-- Advanced NPC System (Created by Jiddo),
-- Modificado por Yan Liima - Night

if(NpcSystem == nil) then
	-- Loads the underlying classes of the npcsystem.
	dofile(getDataDir() .. 'npc/lib/npcsystem/keywordhandler.lua')
	dofile(getDataDir() .. 'npc/lib/npcsystem/queue.lua')
	dofile(getDataDir() .. 'npc/lib/npcsystem/npchandler.lua')
	dofile(getDataDir() .. 'npc/lib/npcsystem/modules.lua')

	-- Global npc constants:

	-- Keyword nestling behavior. For more information look at the top of keywordhandler.lua
	KEYWORD_BEHAVIOR = BEHAVIOR_NORMAL_EXTENDED

	-- Greeting and unGreeting keywords. For more information look at the top of modules.lua
	FOCUS_GREETWORDS = {'hi', 'hello', 'hey'}
	FOCUS_FAREWELLWORDS = {'bye', 'farewell', 'cya'}

	-- The word for requesting trade window. For more information look at the top of modules.lua
	SHOP_TRADEREQUEST = {'offer', 'trade'}

	-- The word for accepting/declining an offer. CAN ONLY CONTAIN ONE FIELD! For more information look at the top of modules.lua
	SHOP_YESWORD = {'yes'}
	SHOP_NOWORD = {'no'}

	-- Pattern used to get the amount of an item a player wants to buy/sell.
	PATTERN_COUNT = '%d+'

	-- Talkdelay behavior. For more information, look at the top of npchandler.lua.
	NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK

	-- Conversation behavior. For more information, look at the top of npchandler.lua.
	NPCHANDLER_CONVBEHAVIOR = CONVERSATION_PRIVATE

	-- Constant strings defining the keywords to replace in the default messages.
	--	For more information, look at the top of npchandler.lua...
	TAG_PLAYERNAME = '|PLAYERNAME|'
	TAG_ITEMCOUNT = '|ITEMCOUNT|'
	TAG_TOTALCOST = '|TOTALCOST|'
	TAG_ITEMNAME = '|ITEMNAME|'
	TAG_QUEUESIZE = '|QUEUESIZE|'

	NpcSystem = {}

	-- Gets an npcparameter with the specified key. Returns nil if no such parameter is found.
	function NpcSystem.getParameter(key)
		local ret = getNpcParameter(tostring(key))
		if((type(ret) == 'number' and ret == 0) or ret == nil) then
			return nil
		else
			return ret
		end
	end

	-- Parses all known parameters for the npc. Also parses parseable modules.
	function NpcSystem.parseParameters(npcHandler)
		local ret = NpcSystem.getParameter('idletime')
		if(ret ~= nil) then
			npcHandler.idleTime = tonumber(ret)
		end
		local ret = NpcSystem.getParameter('talkradius')
		if(ret ~= nil) then
			npcHandler.talkRadius = tonumber(ret)
		end
		local ret = NpcSystem.getParameter('message_greet')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_GREET, ret)
		end
		local ret = NpcSystem.getParameter('message_farewell')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_FAREWELL, ret)
		end
		local ret = NpcSystem.getParameter('message_decline')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_DECLINE, ret)
		end
		local ret = NpcSystem.getParameter('message_needmorespace')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_NEEDMORESPACE, ret)
		end
		local ret = NpcSystem.getParameter('message_needspace')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_NEEDSPACE, ret)
		end
		local ret = NpcSystem.getParameter('message_sendtrade')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_SENDTRADE, ret)
		end
		local ret = NpcSystem.getParameter('message_noshop')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_NOSHOP, ret)
		end
		local ret = NpcSystem.getParameter('message_oncloseshop')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_ONCLOSESHOP, ret)
		end
		local ret = NpcSystem.getParameter('message_onbuy')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_ONBUY, ret)
		end
		local ret = NpcSystem.getParameter('message_onsell')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_ONSELL, ret)
		end
		local ret = NpcSystem.getParameter('message_missingmoney')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_MISSINGMONEY, ret)
		end
		local ret = NpcSystem.getParameter('message_needmoney')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_NEEDMONEY, ret)
		end
		local ret = NpcSystem.getParameter('message_missingitem')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_MISSINGITEM, ret)
		end
		local ret = NpcSystem.getParameter('message_needitem')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_NEEDITEM, ret)
		end
		local ret = NpcSystem.getParameter('message_idletimeout')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_IDLETIMEOUT, ret)
		end
		local ret = NpcSystem.getParameter('message_walkaway')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_WALKAWAY, ret)
		end
		local ret = NpcSystem.getParameter('message_alreadyfocused')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_ALREADYFOCUSED, ret)
		end
		local ret = NpcSystem.getParameter('message_placedinqueue')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_PLACEDINQUEUE, ret)
		end
		local ret = NpcSystem.getParameter('message_buy')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_BUY, ret)
		end
		local ret = NpcSystem.getParameter('message_sell')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_SELL, ret)
		end
		local ret = NpcSystem.getParameter('message_bought')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_BOUGHT, ret)
		end
		local ret = NpcSystem.getParameter('message_sold')
		if(ret ~= nil) then
			npcHandler:setMessage(MESSAGE_SOLD, ret)
		end

		-- Parse modules.
		for parameter, module in pairs(Modules.parseableModules) do
			local ret = NpcSystem.getParameter(parameter)
			if(ret ~= nil) then
				local number = tonumber(ret)
				if(number ~= nil and number ~= 0) then
					npcHandler:addModule(module:new())
				end
			end
		end
	end
end

 

Editado por Yan Liima (veja o histórico de edições)

════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═══╗

Te Ajudei? Rep + e ficamos Quits

166420979_logoyanliimaornight.png.33f822b8970081a5b3646e85dbfd5934.png

Precisando de ajuda?

discord.png.1ecd188791d0141f74d99db371a2e0a4.png.890d5a38d7bcde75543c72b624a65de1.pngDiscord: Yan Liima #3702

Programador Júnior de LUA, PHP e JavaScript

Juntos somos lendas, separados somos Mitos!

╚══════════════════════════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═════════════════════════════╝

Link para o post
Compartilhar em outros sites

xD

════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═══╗

Te Ajudei? Rep + e ficamos Quits

166420979_logoyanliimaornight.png.33f822b8970081a5b3646e85dbfd5934.png

Precisando de ajuda?

discord.png.1ecd188791d0141f74d99db371a2e0a4.png.890d5a38d7bcde75543c72b624a65de1.pngDiscord: Yan Liima #3702

Programador Júnior de LUA, PHP e JavaScript

Juntos somos lendas, separados somos Mitos!

╚══════════════════════════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═════════════════════════════╝

Link para o post
Compartilhar em outros sites

Bom, começou a aparecer esse erro novamente com o NPCHANDLER, 
Poderia me orientar onde esta o erro para localizar o problema amigão??

KRAZUK.LUA
http://pastebin.com/E03JYxg8
 

NPCHANDLER.LUA
http://pastebin.com/viQrwUap

 

ERRO

 

Lua Script Error: [Npc interface] 
data/npc/scripts/Emperor Kruzak.lua:onCreatureSay 
data/npc/scripts/Emperor Kruzak.lua:19: attempt to index global 'Topic' (a nil value) 
stack traceback: 
[C]: in function '__newindex' 
data/npc/scripts/Emperor Kruzak.lua:19: in function 'callback' 
data/npc/lib/npcsystem/npchandler.lua:410: in function 'onCreatureSay' 
data/npc/scripts/Emperor Kruzak.lua:8: in function 

 

Link para o post
Compartilhar em outros sites
  • 1 month later...
Em 05/12/2015 12:32:17, alexmoretoni disse:

Bom, começou a aparecer esse erro novamente com o NPCHANDLER, 
Poderia me orientar onde esta o erro para localizar o problema amigão??

KRAZUK.LUA
http://pastebin.com/E03JYxg8
 

NPCHANDLER.LUA
http://pastebin.com/viQrwUap

 

ERRO

 

Lua Script Error: [Npc interface] 
data/npc/scripts/Emperor Kruzak.lua:onCreatureSay 
data/npc/scripts/Emperor Kruzak.lua:19: attempt to index global 'Topic' (a nil value) 
stack traceback: 
[C]: in function '__newindex' 
data/npc/scripts/Emperor Kruzak.lua:19: in function 'callback' 
data/npc/lib/npcsystem/npchandler.lua:410: in function 'onCreatureSay' 
data/npc/scripts/Emperor Kruzak.lua:8: in function 

 

Não sei se ja resolveu, vou deixar uns links aqui que talvez te ajude:

 

http://www.tibiaking.com/forum/topic/11492-resolvido-d%C3%BAvida-dist%C3%A2ncia-do-npc/

 

https://github.com/ninjalulz/FORGOTTENSERVER-ORTS/blob/master/data/npc/lib/npcsystem/npchandler.lua

 

https://otland.net/threads/can-someone-tell-me-what-this-means.129762/#post1255954

 

https://otland.net/threads/cant-talk-to-npc.168734/#post1631363

 

 

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo