Ir para conteúdo

Featured Replies

Postado
3 horas atrás, kinomoto disse:

funcionou!!! mt obrigado! +rep

tentei usar o transfer e apareceu um erro 

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

Lua Script Error: [Npc interface]
data/npc/scripts/Eva.lua:onCreatureSay
data/npc/scripts/Eva.lua:18: attempt to call field 'getResult' (a nil value)
stack traceback:
        [C]: in function 'getResult'
        data/npc/scripts/Eva.lua:18: in function 'findPlayer'
        data/npc/scripts/Eva.lua:172: in function 'callback'
        data/npc/lib/npcsystem/npchandler.lua:411: in function 'onCreatureSay'
        data/npc/scripts/Eva.lua:9: in function <data/npc/scripts/Eva.lua:9>

 

data/npc/lib/npcsystem/npchandler.lua (coloque o abaixo).

Citar

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

    -- 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
            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 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()
        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 player = Player(cid)
                    local playerName = player and player:getName() or -1
                    local parseInfo = { [TAG_PLAYERNAME] = playerName }
                    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 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_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
 

 

  • Respostas 11
  • Visualizações 841
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local Topic, count, transfer = {}, {}, {} function onCreatureApp

Postado
function doPlayerDepositMoney(cid, amount) 
    if(not doPlayerRemoveMoney(cid, amount)) then
        return false
    end
    doPlayerSetBalance(cid, getPlayerBalance(cid) + amount)
return true
end

Adiciona essa função no seu global.lua

Postado
  • Autor
12 horas atrás, Nightowl disse:

function doPlayerDepositMoney(cid, amount) 
    if(not doPlayerRemoveMoney(cid, amount)) then
        return false
    end
    doPlayerSetBalance(cid, getPlayerBalance(cid) + amount)
return true
end

Adiciona essa função no seu global.lua

 

 

13 horas atrás, ikaroangelo21 disse:

data/npc/lib/npcsystem/npchandler.lua (coloque o abaixo).

 

 

fiz certinho mas ainda não funciona o transfer :( (acho que vou tirar a opção de transfer do npc)

Postado
  • Autor
1 hora atrás, ikaroangelo21 disse:

@kinomoto posta o script do npc EVA por favor.

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
 
local Topic, count, transfer = {}, {}, {}
 
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end
 
local function getCount(s)
        local b, e = s:find('%d+')
        return b and e and math.min(4294967295, tonumber(s:sub(b, e))) or -1
end
 
local function findPlayer(name)
        local q = db.getResult('SELECT name FROM players WHERE name=' .. db.escapeString(name) .. ' LIMIT 1'), nil
        if q:getID() == -1 then
                return
        end
        local r = q:getDataString('name')
        q:free()
        return r
end
 
function greet(cid)
        Topic[cid], count[cid], transfer[cid] = nil, nil, nil
        return true
end
 
function creatureSayCallback(cid, type, msg)
        if not npcHandler:isFocused(cid) then
                return false
        elseif msgcontains(msg, 'balance') then
                npcHandler:say('Your account balance is ' .. getPlayerBalance(cid) .. ' gold.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'deposit') and msgcontains(msg, 'all') then
                if getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        count[cid] = getPlayerMoney(cid)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                end
        elseif msgcontains(msg, 'deposit') then
                if getCount(msg) == 0 then
                        npcHandler:say('You are joking, aren\'t you??', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerMoney(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                                Topic[cid] = 2
                        else
                                npcHandler:say('You do not have enough gold.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerMoney(cid) == 0 then
                        npcHandler:say('You don\'t have any gold with you.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                end
        elseif Topic[cid] == 1 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold it is you would like to deposit.', cid)
                        Topic[cid] = 1
                elseif getPlayerMoney(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Would you really like to deposit ' .. count[cid] .. ' gold?', cid)
                        Topic[cid] = 2
                else
                        npcHandler:say('You do not have enough gold.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 2 then
                if doPlayerRemoveMoney(cid, count[cid]) then
                        doPlayerSetBalance(cid, getPlayerBalance(cid) + count[cid])
                        npcHandler:say('Alright, we have added the amount of ' .. count[cid] .. ' gold to your balance. You can withdraw your money anytime you want to.', cid)
                else
                        npcHandler:say('I am inconsolable, but it seems you have lost your gold. I hope you get it back.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 2 then
                npcHandler:say('As you wish. Is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'withdraw') then
                if getCount(msg) == 0 then
                        npcHandler:say('Sure, you want nothing you get nothing!', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        if getPlayerBalance(cid) >= getCount(msg) then
                                count[cid] = getCount(msg)
                                npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                                Topic[cid] = 4
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                elseif getPlayerBalance(cid) == 0 then
                        npcHandler:say('You don\'t have any money on your bank account.', cid)
                        Topic[cid] = nil
                else
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                end
        elseif Topic[cid] == 3 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me how much gold you would like to withdraw.', cid)
                        Topic[cid] = 3
                elseif getPlayerBalance(cid) >= getCount(msg) then
                        count[cid] = getCount(msg)
                        npcHandler:say('Are you sure you wish to withdraw ' .. count[cid] .. ' gold from your bank account?', cid)
                        Topic[cid] = 4
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif msgcontains(msg, 'yes') and Topic[cid] == 4 then
                if getPlayerBalance(cid) >= count[cid] then
                        doPlayerAddMoney(cid, count[cid])
                        doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                        npcHandler:say('Here you are, ' .. count[cid] .. ' gold. Please let me know if there is something else I can do for you.', cid)
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'no') and Topic[cid] == 4 then
                npcHandler:say('The customer is king! Come back anytime you want to if you wish to withdraw your money.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'transfer') then
                if getCount(msg) == 0 then
                        npcHandler:say('Please think about it. Okay?', cid)
                        Topic[cid] = nil
                elseif getCount(msg) ~= -1 then
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                end
        elseif Topic[cid] == 5 then
                if getCount(msg) == -1 then
                        npcHandler:say('Please tell me the amount of gold you would like to transfer.', cid)
                        Topic[cid] = 5
                else
                        count[cid] = getCount(msg)
                        if getPlayerBalance(cid) >= count[cid] then
                                npcHandler:say('Who would you like to transfer ' .. count[cid] .. ' gold to?', cid)
                                Topic[cid] = 6
                        else
                                npcHandler:say('There is not enough gold on your account.', cid)
                                Topic[cid] = nil
                        end
                end
        elseif Topic[cid] == 6 then
                local v = getPlayerByName(msg)
                if getPlayerBalance(cid) >= count[cid] then
                        if v then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '?', cid)
                                Topic[cid] = 7
                        elseif findPlayer(msg):lower() == msg:lower() then
                                transfer[cid] = msg
                                npcHandler:say('Would you really like to transfer ' .. count[cid] .. ' gold to ' .. findPlayer(msg) .. '?', cid)
                                Topic[cid] = 7
                        else
                                npcHandler:say('This player does not exist.', cid)
                                Topic[cid] = nil
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 7 and msgcontains(msg, 'yes') then
                if getPlayerBalance(cid) >= count[cid] then
                        local v = getPlayerByName(transfer[cid])
                        if v then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                doPlayerSetBalance(v, getPlayerBalance(v) + count[cid])
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. getPlayerName(v) .. '.', cid)
                        elseif findPlayer(transfer[cid]):lower() == transfer[cid]:lower() then
                                doPlayerSetBalance(cid, getPlayerBalance(cid) - count[cid])
                                db.executeQuery('UPDATE players SET balance=balance+' .. count[cid] .. ' WHERE name=' .. db.escapeString(transfer[cid]) .. ' LIMIT 1')
                                npcHandler:say('Very well. You have transferred ' .. count[cid] .. ' gold to ' .. findPlayer(transfer[cid]) .. '.', cid)
                        else
                                npcHandler:say('This player does not exist.', cid)
                        end
                else
                        npcHandler:say('There is not enough gold on your account.', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 7 and msgcontains(msg, 'no') then
                npcHandler:say('Alright, is there something else I can do for you?', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'change gold') then
                npcHandler:say('How many platinum coins would you like to get?', cid)
                Topic[cid] = 8
        elseif Topic[cid] == 8 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your gold coins into ' .. count[cid] .. ' platinum coins?', cid)
                        Topic[cid] = 9
                end
        elseif Topic[cid] == 9 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2148, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough gold coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change platinum') then
                npcHandler:say('Would you like to change your platinum coins into gold or crystal?', cid)
                Topic[cid] = 10
        elseif Topic[cid] == 10 then
                if msgcontains(msg, 'gold') then
                        npcHandler:say('How many platinum coins would you like to change into gold?', cid)
                        Topic[cid] = 11
                elseif msgcontains(msg, 'crystal') then
                        npcHandler:say('How many crystal coins would you like to get?', cid)
                        Topic[cid] = 13
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                        Topic[cid] = nil
                end
        elseif Topic[cid] == 11 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your platinum coins into ' .. count[cid] * 100 .. ' gold coins for you?', cid)
                        Topic[cid] = 12
                end
        elseif Topic[cid] == 12 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2148, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif Topic[cid] == 13 then
                if getCount(msg) < 1 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] * 100 .. ' of your platinum coins into ' .. count[cid] .. ' crystal coins for you?', cid)
                        Topic[cid] = 14
                end
        elseif Topic[cid] == 14 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2152, count[cid] * 100) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2160, count[cid])
                        else
                                npcHandler:say('Sorry, you do not have enough platinum coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change crystal') then
                npcHandler:say('How many crystal coins would you like to change into platinum?', cid)
                Topic[cid] = 15
        elseif Topic[cid] == 15 then
                if getCount(msg) == -1 or getCount(msg) == 0 then
                        npcHandler:say('Hmm, can I help you with something else?', cid)
                        Topic[cid] = nil
                else
                        count[cid] = math.min(500, getCount(msg))
                        npcHandler:say('So you would like me to change ' .. count[cid] .. ' of your crystal coins into ' .. count[cid] * 100 .. ' platinum coins for you?', cid)
                        Topic[cid] = 16
                end
        elseif Topic[cid] == 16 then
                if msgcontains(msg, 'yes') then
                        if doPlayerRemoveItem(cid, 2160, count[cid]) then
                                npcHandler:say('Here you are.', cid)
                                doPlayerAddItem(cid, 2152, count[cid] * 100)
                        else
                                npcHandler:say('Sorry, you do not have enough crystal coins.', cid)
                        end
                else
                        npcHandler:say('Well, can I help you with something else?', cid)
                end
                Topic[cid] = nil
        elseif msgcontains(msg, 'change') then
                npcHandler:say('There are three different coin types in Tibia: 100 gold coins equal 1 platinum coin, 100 platinum coins equal 1 crystal coin. So if you\'d like to change 100 gold into 1 platinum, simply say \'{change gold}\' and then \'1 platinum\'.', cid)
                Topic[cid] = nil
        elseif msgcontains(msg, 'bank') then
                npcHandler:say('We can change money for you. You can also access your bank account.', cid)
                Topic[cid] = nil
        end
        return true
end
 
npcHandler:setCallback(CALLBACK_GREET, greet)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

-- function maded by Gesior--
function getNumber(txt) --return number if its number and is > 0, else return 0
x = string.gsub(txt,"%a","")
x = tonumber(x)
if x ~= nill and x > 0 then
return x
else
return 0
end
end

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo