Ir para conteúdo
  • Cadastre-se

axebruno

Membro
  • Total de itens

    65
  • Registro em

  • Última visita

Posts postados por axebruno

  1. Meus npc nao respondem, todos estao nos lugares corretos e etc, porem quando falo com os npcs todos dao algum tipo de erro.

    [1:15:51.563] [Error - NpcScript Interface]
    [1:15:51.566] data/npc/scripts/boat_vip.lua:onCreatureSay
    [1:15:51.567] Description:
    [1:15:51.570] data/npc/lib/npcsystem/npchandler.lua:558: attempt to call global 'getDistanceTo' (a nil value)
    [1:15:51.571] stack traceback:
    [1:15:51.573]   data/npc/lib/npcsystem/npchandler.lua:558: in function 'isInRange'
    [1:15:51.577]   data/npc/lib/npcsystem/npchandler.lua:381: in function 'onCreatureSay'
    [1:15:51.582]   data/npc/scripts/boat_vip.lua:10: in function <data/npc/scripts/boat_vip.lua:10>



    NPCCHANDLER.LUA
     

    -- Advanced NPC System (Created by Jiddo),
    -- Modified by TheForgottenServer Team.

    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]     = 'Welcome, |PLAYERNAME|! I have been expecting you.',
                [MESSAGE_FAREWELL]     = 'Good bye, |PLAYERNAME|!',
                [MESSAGE_BUY]         = 'Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?',
                [MESSAGE_ONBUY]     = 'It was a pleasure doing business with you.',
                [MESSAGE_BOUGHT]     = 'Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
                [MESSAGE_SELL]         = 'Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?',
                [MESSAGE_ONSELL]     = 'Thank you for this |ITEMNAME|, |PLAYERNAME| gold.',
                [MESSAGE_SOLD]         = 'Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.',
                [MESSAGE_MISSINGMONEY]    = 'Sorry, you don\'t have enough money.',
                [MESSAGE_NEEDMONEY]     = 'You do not have enough money.',
                [MESSAGE_MISSINGITEM]     = 'You don\'t even have that item, |PLAYERNAME|!',
                [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]     = 'Next, please!',
                [MESSAGE_WALKAWAY]     = 'How rude!',
                [MESSAGE_DECLINE]    = 'Not good enough, is it... ?',
                [MESSAGE_SENDTRADE]    = 'Here\'s my offer, |PLAYERNAME|. Don\'t you like it?',
                [MESSAGE_NOSHOP]    = 'Sorry, I\'m not offering anything.',
                [MESSAGE_ONCLOSESHOP]    = 'Thank you, come back when you want something more.',
                [MESSAGE_ALREADYFOCUSED]= '|PLAYERNAME|! I am already talking to you...',
                [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 = getDistanceTo(cid) or -1
            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
     

     

  2. boa noite, nao sei qual area correta entao por favor movam para la, obrigado!

    meu servidor esta dando debug, por exemplo, fiz uma conta com varios chares,

    eu logo o knight nao da debug, logo paladin nao da debug, porem se logar o druid ou sorcerer, da debug,
    so que o estranho e que eu fiz outra conta com apenas um druid, e consigo logar normalmente, so comeca dar debug se eu criar mais de 1 char na mesma acc, e um desses chares

    for druid ou sorcerer, caso alguem logue um druid q tenha mais de 1 char na acc, todos q estao perto tomam debug, alguem sabe como arrumar? 
    obrigado desde ja!!!

    meu servidor e Mysql - Gesrior.

    versao 8.60

     

     

  3. salve galera, estou colocando um novo gold no servidor special coin, aquele blue eye....

    peguei um script aqui no tibiaking, e adicionei no meu certinho,

    fui fazer o teste comprei 1 item de 5kk pela alavanca, ele está comprando normalmente, remove 5 special coins e pego o item,

    porem tem um bug, ele está transformando de crystal coin para special coin mas nao esta de special coin para crystal.. alguem pode me ajudar?

    vou postar tudo aqui em baixo!

     

    changegold.lua

    local coins = {
        [2148] = {
            to = 2152, effect = 210
        },
        [2152] = {
            from = 2148, to = 2160, effect = 130
        },
        [2160] = {
            from = 2152, to = 10559, effect = 65
        },
        [10559] = {
            from = 2160, effect = 198
        }
    }

    function onUse(cid, item, fromPosition, itemEx, toPosition)
        if(getPlayerFlagValue(cid, PLAYERFLAG_CANNOTPICKUPITEM)) then
            return false
        end

        local coin = coins[item.itemid]
        if(not coin) then
            return false
        end

        if(coin.to ~= nil and item.type == ITEMCOUNT_MAX) then
            doChangeTypeItem(item.uid, item.type - item.type)
            doPlayerAddItem(cid, coin.to, 1)
            doSendAnimatedText(fromPosition, "+ $$$", coins[coin.to].effect)
        elseif(coin.from ~= nil) then
            doChangeTypeItem(item.uid, item.type - 1)
            doPlayerAddItem(cid, coin.from, ITEMCOUNT_MAX)
            doSendAnimatedText(fromPosition, "- $$$", coins[coin.from].effect)
        end

        return true
    end

     

     

     

  4. boa tarde não sei se criei na area certa, caso esteja errado por favor mova-o!

    fiz um npc, para vender itens vips enquanto estou ajeitando meu servidor, porém
    meu npc esta com todos os itens quando eu falo "hi, trade"

    mas coloco para comprar e o npc não vende o item! e nem cobra o dinheiro!

    5 minutos atrás, axebruno disse:

    boa tarde não sei se criei na area certa, caso esteja errado por favor mova-o!

    fiz um npc, para vender itens vips enquanto estou ajeitando meu servidor, porém
    meu npc esta com todos os itens quando eu falo "hi, trade"

    mas coloco para comprar e o npc não vende o item! e nem cobra o dinheiro!

    quando eu compro ele mostra no tfs do servidor
    shopmodule.onbuy - item not found on shopitems list

  5. accountManager = "yes"
        namelockManager = "no"
        newPlayerChooseVoc = "yes"
        newPlayerSpawnPosX = 160
        newPlayerSpawnPosY = 54
        newPlayerSpawnPosZ = 7
        newPlayerTownId = 1
        newPlayerLevel = 8
        newPlayerMagicLevel = 0
        generateAccountNumber = "no"


    redSkullLength = 180 * 60 * 1000
    blackSkullLength = 240 * 60 * 1000
    dailyFragsToRedSkull = 10
    weeklyFragsToRedSkull = 100
    monthlyFragsToRedSkull = 300
    dailyFragsToBlackSkull = 20
    weeklyFragsToBlackSkull = 120
    monthlyFragsToBlackSkull = 480
    dailyFragsToBanishment = 0
    weeklyFragsToBanishment = 0
    monthlyFragsToBanishment = 0
    blackSkulledDeathHealth = 40
    blackSkulledDeathMana = 0
    useBlackSkull = true
    useFragHandler = true
    advancedFragList = false

    notationsToBan = 3
    warningsToFinalBan = 1
    warningsToDeletion = 5
    banLength = 3 * 24 * 60 * 60
    killsBanLength = 1 * 24 * 60 * 60
    finalBanLength = 5 * 24 * 60 * 60
    ipBanishmentLength = 9999 * 24 * 60 * 60
    broadcastBanishments = false
    maxViolationCommentSize = 200
    violationNameReportActionType = 2
    autoBanishUnknownBytes = false

    worldType = "open"
    protectionLevel = 100
    pvpTileIgnoreLevelAndVocationProtection = true
    pzLocked = 30 * 1000
    huntingDuration = 45 * 1000
    criticalHitChance = 7
    criticalHitMultiplier = 1
    displayCriticalHitNotify = false
    removeWeaponAmmunition = false
    removeWeaponCharges = false
    removeRuneCharges = "false"
    whiteSkullTime = 2 * 60 * 1000
    noDamageToSameLookfeet = false
    showHealingDamage = false
    showHealingDamageForMonsters = false
    fieldOwnershipDuration = 5 * 1000
    stopAttackingAtExit = false
    oldConditionAccuracy = false
    loginProtectionPeriod = 0 * 1000
    deathLostPercent = 10
    stairhopDelay = 0 * 1000
    pushCreatureDelay = 0 * 500
    deathContainerId = 1987
    gainExperienceColor = 18
    addManaSpentInPvPZone = true
    squareColor = 0
    allowFightback = true

    worldId = 0
    ip = "127.0.0.1"
    bindOnlyConfiguredIpAddress = false
    loginPort = 7171
    gamePort = 7172
    adminPort = 7171
    statusPort = 7171
    loginTries = 10
    retryTimeout = 2 * 1000
    loginTimeout = 5 * 1000
    maxPlayers = 1000
    motd = "*Bem Vindo ao Hardbaiak.*"
    displayOnOrOffAtCharlist = true
    onePlayerOnlinePerAccount = false
    allowClones = false
    serverName = "Hardbaiak"
    loginMessage = "Bem-Vindo ao Hardbaiak Server!"
    statusTimeout = 10 * 100
    replaceKickOnLogin = true
    forceSlowConnectionsToDisconnect = false
    loginOnlyWithLoginServer = false
    premiumPlayerSkipWaitList = false

    sqlType = "mysql"
    sqlHost = "localhost"
    sqlPort = 3306
    sqlUser = "root"
    sqlPass = ""
    sqlDatabase = "database"
    sqlFile = "forgottenserver.s3db"
    sqlKeepAlive = 0
    mysqlReadTimeout = 5000
    mysqlWriteTimeout = 5000
    encryptionType = "sha1"

    deathListEnabled = true
    deathListRequiredTime = 1 * 60 * 1000
    deathAssistCount = 19
    maxDeathRecords = 5

    ingameGuildManagement = true
    levelToFormGuild = 100
    premiumDaysToFormGuild = 0
    guildNameMinLength = 4
    guildNameMaxLength = 20

    highscoreDisplayPlayers = 100
    updateHighscoresAfterMinutes = 2

    buyableAndSellableHouses = true
    houseNeedPremium = false
    bedsRequirePremium = false
    levelToBuyHouse = 100
    housesPerAccount = 1
    houseRentAsPrice = false
    housePriceAsRent = false
    housePriceEachSquare = 10000
    houseRentPeriod = "weekly"
    houseCleanOld = 0
    guildHalls = false

    timeBetweenActions = 200
    timeBetweenExActions = 1000
    checkCorpseOwner = false
    hotkeyAimbotEnabled = true
    maximumDoorLevel = 500

    mapName = "Baiak Yurots.otbm"
    mapAuthor = "Maracaot"
    randomizeTiles = true
    useHouseDataStorage = false
    storeTrash = true
    cleanProtectedZones = true
    mailboxDisabledTowns = "-1"

    defaultPriority = "high"
    niceLevel = 5
    coresUsed = "-1"
    optimizeDatabaseAtStartup = true
    removePremiumOnInit = true
    confirmOutdatedVersion = false

    maxMessageBuffer = 10
    bufferMutedOnSpellFailure = false

    dataDirectory = "data/"
    allowChangeOutfit = true
    allowChangeColors = true
    allowChangeAddons = true
    disableOutfitsForPrivilegedPlayers = false
    bankSystem = true
    saveGlobalStorage = true
    displaySkillLevelOnAdvance = false
    spellNameInsteadOfWords = false
    emoteSpells = true
    promptExceptionTracerErrorBox = true
    storePlayerDirection = false
    monsterLootMessage = 3
    monsterLootMessageType = 25
    separateViplistPerCharacter = false

    ghostModeInvisibleEffect = true
    ghostModeSpellEffects = true

    idleWarningTime = 1 * 60 * 1000
    idleKickTime = 2 * 60 * 1000
    expireReportsAfterReads = 1
    playerQueryDeepness = 2
    maxItemsPerPZTile = 0
    maxItemsPerHouseTile = 0

    freePremium = true
    premiumForPromotion = false

    blessingOnlyPremium = false
    blessingReductionBase = 30
    blessingReductionDecreament = 5
    eachBlessReduction = 8

    experienceStages = true
    rateExperience = 250
    rateExperienceFromPlayers = 0
    rateSkill = 100
    rateMagic = 80
    rateLoot = 7
    rateSpawn = 4

    rateMonsterHealth = 1.0
    rateMonsterMana = 1.0
    rateMonsterAttack = 1.0
    rateMonsterDefense = 1.0

    minLevelThresholdForKilledPlayer = 0.9
    maxLevelThresholdForKilledPlayer = 1.1

    rateStaminaLoss = 0
    rateStaminaGain = 10
    rateStaminaThresholdGain = 12
    staminaRatingLimitTop = 40 * 60
    staminaRatingLimitBottom = 14 * 60
    rateStaminaAboveNormal = 1.0
    rateStaminaUnderNormal = 1.0
    staminaThresholdOnlyPremium = false

    experienceShareRadiusX = 30
    experienceShareRadiusY = 30
    experienceShareRadiusZ = 1
    experienceShareLevelDifference = 2 / 3
    extraPartyExperienceLimit = 20
    extraPartyExperiencePercent = 5
    experienceShareActivity = 2 * 60 * 1000

    globalSaveEnabled = false
    globalSaveHour = 24
    shutdownAtGlobalSave = true
    cleanMapAtGlobalSave = false

    deSpawnRange = 2
    deSpawnRadius = 50

    maxPlayerSummons = 2
    teleportAllSummons = false
    teleportPlayerSummons = false

    ownerName = "Hardbaiak World OT Server"
    ownerEmail = ""
    url = "
    location = "Brazil"
    displayGamemastersWithOnlineCommand = false

    adminLogsEnabled = true
    displayPlayersLogging = true
    prefixChannelLogs = ""
    runFile = ""
    outLogName = ""
    errorLogName = ""
    truncateLogsOnStartup = false
     

  6. oque eu preciso fazer para encaixar as distro, e abrir o otserver, as pastas estao separadas e sem o inicializador

    na pasta ddl e executaveis, eu abro o theotxserver, porem mostra um erro, de imcompatibilidade com o windows.

    Sem título.png

    meu sistema e win 7, 32 bits

  7. obrigado, funciona como dinheiro, mas tem um problema, ele nao esta trocando quando tem 100 crystal coins para gold nugget, e nem de gold nugget para crystal coins.

    ta dando you cannot use this objective.

    na verdade, nao está trocando nenhum, nem de gold para platinum, nem de platinum para crystal, nem de crystal para gold nugget.

  8. boa tarde, meu servidor tem sistema donate, porem a pessoal clica la em doaçao, coloca o valor desejado, preenche tudo no pagueseguro e quando paga da operaçao cancelada, como concerto isso?

    ja alterei o status da minha conta para vendedor.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo