• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua [NPC] Oracle

WeslleyKiyo

New Member
Joined
Feb 17, 2017
Messages
5
Reaction score
0
Version: Otx 2.8 (8.60 tfs 0.3.7)

I have a error in the distro, however, I do not know how to solve it :(

Code:
[Warning - The Oracle] NpcSystem:
oracle - Call without any npcHandler instance.

UXH1Zxc.png

The NPC does not teleport the player and keeps repeating the city to choose.

I am using this script (because through the config, it sends the items to the Depot of the character):

Lua:
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

function onCreatureAppear(cid)              npcHandler:onCreatureAppear(cid)            end
function onCreatureDisappear(cid)           npcHandler:onCreatureDisappear(cid)         end
function onCreatureSay(cid, type, msg)      npcHandler:onCreatureSay(cid, type, msg)    end
function onThink()                          npcHandler:onThink()                        end
function onPlayerEndTrade(cid)              npcHandler:onPlayerEndTrade(cid)            end
function onPlayerCloseChannel(cid)          npcHandler:onPlayerCloseChannel(cid)        end


--///////////////////////////START SCRIPT(oracle)///////////////////////////--
function oracle(cid, message, keywords, parameters, node)
    local npcHandler = parameters.npcHandler
    if(npcHandler == nil) then
        print('[Warning - ' .. getCreatureName(getNpcId()) .. '] NpcSystem:', 'oracle - Call without any npcHandler instance.')
        return false
    end

    if(not npcHandler:isFocused(cid)) then
        return false
    end

    local cityNode, vocationNode = node:getParent():getParent(), node:getParent()
    local params = {
        ['vocation'] = vocationNode:getParameters().vocation,
        ['town'] = cityNode:getParameters().town,
        ['premium'] = cityNode:getParameters().premium or false,
        ['items'] = vocationNode:getParameters().items or nil
    }

    if(params['town'] ~= nil and params['vocation'] ~= nil) then
        if(getPlayerLevel(cid) < parameters.level) then
            npcHandler:say('You must first reach level {' .. parameters.level .. '}!', cid)
        elseif(getPlayerVocation(cid) > 0) then
            npcHandler:say('Sorry, you already have a vocation!', cid)
        elseif(params['premium'] and not isPremium(cid)) then
            npcHandler:say('Sorry, this town is reserved only for premium players!', cid)
        else
            doPlayerSetVocation(cid, params['vocation'])
            doPlayerSetTown(cid, params['town'])
            if(params['items'] ~= nil) then
                local parcel, time = doCreateItemEx(2595), os.time()
                local label, target = doAddContainerItem(parcel, 2599), getCreatureName(cid)

                doItemSetAttribute(label, "text", target .. "\n" .. getTownName(params['town']))
                doItemSetAttribute(label, "date", time)
                doItemSetAttribute(label, "writer", getCreatureName(getNpcId()))

                for _, item in ipairs(params['items']) do
                    if(type(item[2]) == 'string') then
                        local tmp = doCreateItemEx(item[1])

                        doItemSetAttribute(tmp, "text", item[2])
                        doItemSetAttribute(tmp, "date", time)
                        doItemSetAttribute(tmp, "writer", getCreatureName(getNpcId()))

                        doAddContainerItemEx(parcel, tmp)
                    else
                        doAddContainerItem(parcel, item[1], item[2] or 1)
                    end
                end

                doPlayerSendMailByName(target, parcel, params['town'])
            end

            local tmp, temple = getThingPosition(cid), getTownTemplePosition(params['town'])
            npcHandler:say('SO BE IT!', cid)
            doTeleportThing(cid, temple)

            doSendMagicEffect(tmp, CONST_ME_POFF)
            doSendMagicEffect(temple, CONST_ME_TELEPORT)
        end
    else
        npcHandler:resetNpc(cid)
        error('Player: ' .. getCreatureName(cid) .. ', Params: ' .. table.serialize(params))
    end
    return true
end

function greetCallback(cid)
local player = Player(cid)

    if(getPlayerLevel(cid) == getConfigValue('rookLevelToLeaveRook')) then
        return true
    elseif(getPlayerLevel(cid) < getConfigValue('rookLevelToLeaveRook')) then
        npcHandler:say('COME BACK WHEN YOU GROW UP, CHILD!')
        npcHandler:resetNpc(cid)
        return false
    elseif(getPlayerLevel(cid) > getConfigValue('rookLevelToLeaveRook')) then
        npcHandler:say(player:getName() .. ', I CAN\'T LET YOU LEAVE - YOU ARE TOO STRONG ALREADY! YOU CAN ONLY LEAVE WITH LEVEL 9 OR LOWER.')
        npcHandler:resetNpc(cid)
        return false
    end
end

local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook')})
local noNode = KeywordNode:new({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, moveup = 1, text = 'Then what vocation do you want to become?'})

local node1 = keywordHandler:addKeyword({'yes'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'What city do you wish to live in? {Thais}, {Carlin}, {Venore}, {Kazordoon} or {Ab\'Dendriel}?'})
    local node2 = node1:addChildKeyword({'thais'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, town = 2, text = 'Thais, eh? So what vocation do you wish to become? {Sorcerer}, {druid}, {paladin} or {knight}?'})
        local node3 = node2:addChildKeyword({'sorcerer'}, StdModule.say, {npcHandler = npcHandler, vocation = 1, items = {{2190,1},{7620,1},{7618,1}}, onlyFocus = true, text = 'So, you wish to be a powerful magician? Are you sure about that? This decision is irreversible!'})
            node3:addChildKeywordNode(yesNode)
            node3:addChildKeywordNode(noNode)
        node3 = node2:addChildKeyword({'druid'}, StdModule.say, {npcHandler = npcHandler, vocation = 2, items = {{2182,1},{7620,1},{7618,1}}, onlyFocus = true, text = 'Are you sure that a druid is what you wish to become? This decision is irreversible!'})
            node3:addChildKeywordNode(yesNode)
            node3:addChildKeywordNode(noNode)
        node3 = node2:addChildKeyword({'paladin'}, StdModule.say, {npcHandler = npcHandler, vocation = 3, items = {{2389,5},{7620,1},{7618,1}}, onlyFocus = true, text = 'A ranged marksman. Are you sure? This decision is irreversible!'})
            node3:addChildKeywordNode(yesNode)
            node3:addChildKeywordNode(noNode)
        node3 = node2:addChildKeyword({'knight'}, StdModule.say, {npcHandler = npcHandler, vocation = 4, items = {{8602,1},{2439,1},{8601,1},{7620,1},{7618,1}}, onlyFocus = true, text = 'A mighty warrior. Is that your final decision? This decision is irreversible!'})
            node3:addChildKeywordNode(yesNode)
            node3:addChildKeywordNode(noNode)
keywordHandler:addKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Then come back when you are ready.'})

--///////////////////////////END SCRIPT(oracle)///////////////////////////--

npcHandler:setCallback(CALLBACK_GREET, greetCallback)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Last edited by a moderator:
Solution
Try to replace
Lua:
local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook')})
With:
Lua:
local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook'), npcHandler = npcHandler})
Try to replace
Lua:
local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook')})
With:
Lua:
local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook'), npcHandler = npcHandler})
 
Solution
Try to replace
Lua:
local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook')})
With:
Lua:
local yesNode = KeywordNode:new({'yes'}, oracle, {level = getConfigValue('rookLevelToLeaveRook'), npcHandler = npcHandler})

Good, very good! Its Work' Thxx!!!!
 
Back
Top