• 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 error console npc

pablobion

Member
Joined
Aug 31, 2016
Messages
39
Solutions
1
Reaction score
5
I used OTX2 (Tfs 0.3.7) and not working this script

[2/10/2018 1:52:52] [Error - NpcScript Interface]
[2/10/2018 1:52:52] data/npc/scripts/simple_task.lua:eek:nCreatureSay
[2/10/2018 1:52:52] Description:
[2/10/2018 1:52:52] data/lib/100-shortcut.lua:260: attempt to index a boolean value
[2/10/2018 1:52:52] stack traceback:
[2/10/2018 1:52:52] data/lib/100-shortcut.lua:260: in function 'getItemNameById'
[2/10/2018 1:52:52] data/npc/scripts/simple_task.lua:120: in function 'callback'
[2/10/2018 1:52:53] data/npc/lib/npcsystem/npchandler.lua:363: in function 'onCreatureSay'
[2/10/2018 1:52:53] data/npc/scripts/simple_task.lua:9: in function <data/npc/scripts/simple_task.lua:9>










local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}

-- OTServ event handling functions start
function onCreatureAppear(cid) npcHandler:eek:nCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:eek:nCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:eek:nCreatureSay(cid, type, msg) end
function onThink() npcHandler:eek:nThink() end

-------------------------------- EXTERN CONFIG --------------------------------
local config = {
levelcollect = 30, --- level pra poder fazer tasks do tipo collect
time = 8 * 60 * 60, --- tempo que vc vai ficar sem poder falar com ele caso abandone uma task (em segundos)
bonus = 1.2, --- bonus de exp/gold caso a task escolhida seja random (1.2 = 20% a mais)
multiplicator = 1 --- multiplicador de exp/gold/skills (coloque de acordo com a necessidade do seu server)
}

local easy = {
[1] = "Goblin",
[2] = "Troll",
[3] = "Rotworm",
[4] = "Dwarf",
[5] = "Amazon",
[6] = "Elf",
[7] = "Wolf",
[8] = "Orc",
[9] = "Minotaur"
}

local eacollect = {
[1] = {id = 5880, count = 20}, -- iron ore
[2] = {id = 5902, count = 15}, -- honeycomb
[3] = {id = 5878, count = 10}, -- minotaur leather
[4] = {id = 5890, count = 20}, -- chicken feather
[5] = {id = 5894, count = 15}, -- bat wing
[6] = {id = 5896, count = 10}, -- bear pawn
[7] = {id = 5897, count = 20}, -- wolf pawn
[8] = {id = 5921, count = 15}, -- heaven blossom
[9] = {id = 3956, count = 10} -- elephant tusk
}


local medium = {
[1] = "Cyclops",
[2] = "Ghoul",
[3] = "Dragon",
[4] = "Mammoth",
[5] = "Vampire",
[6] = "Fire Devil",
[7] = "Fire Elemental",
[8] = "Valkyrie",
[9] = "Monk"
}

local medcollect = {
[1] = {id = 5876, count = 35}, -- lizard leather
[2] = {id = 5678, count = 30}, -- tortoise egg
[3] = {id = 5898, count = 25}, -- beholder eye
[4] = {id = 5899, count = 35}, -- turtle shell
[5] = {id = 2229, count = 30}, -- skull
[6] = {id = 5877, count = 25}, -- dragon leather
[7] = {id = 5920, count = 30} -- dragon scale
}

local hard = {
[1] = "Giant Spider",
[2] = "Dragon Lord",
[3] = "Grim Reaper",
[4] = "Demon",
[5] = "Crystal Spider",
[6] = "Demon Skeleton",
[7] = "Juggernaut",
[8] = "Destroyer",
[9] = "Hand of Cursed Fate"
}

local hardcollect = {
[1] = {id = 5882, count = 50}, -- red dragon scale
[2] = {id = 5948, count = 45}, -- red dragon leather
[3] = {id = 5930, count = 40}, -- behemoth claw
[4] = {id = 5879, count = 50}, -- giant spider silk
[5] = {id = 5954, count = 45}, -- demon horn
[6] = {id = 6500, count = 40}, -- demoniac essence
[7] = {id = 5944, count = 45}, -- soul orb
}

local storages = {
name = 95672,
count = 95673,
maxcount = 95674,
difficult = 95675,
length = 95676,
delay = 95677,
type = 95678,
}
-------------------------------- END OF EXTERN CONFIG --------------------------------
function creatureSayCallback(cid, type, msg)
if (not npcHandler:isFocused(cid)) then
return false
end
local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid
-------------------------------- INTERN CONFIG CAN BE DONE HERE --------------------------
local short = 0 + (math.random(1,3) * 50) -- quantidade de monstros no curto
local median = 100 + (math.random(1,3) * 50) -- quantidade de monstros no mediano
local long = 200 + (math.random(1,3) * 100) -- quantidade de monstros no longo

local gold = 1000 * ((getPlayerStorageValue(cid, storages.length)) + (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator
local experience = ((getExperienceForLevel(getPlayerLevel(cid) + 1) - getExperienceForLevel(getPlayerLevel(cid))) / 100) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult))) * config.multiplicator
-------------------------------- END OF INTERN CONFIG --------------------------

local type = getPlayerStorageValue(cid, storages.type)
if (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) <= 0 then
if getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 1 then
talkState[talkUser] = 6
selfSay('Your task is to kill {'..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s}. Hurry with this or you want to {give up}?!', cid)
elseif getPlayerStorageValue(cid, storages.maxcount) > 3 and getPlayerStorageValue(cid, storages.type) == 2 then
talkState[talkUser] = 6
selfSay('Your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Hurry with this or you want to {give up}?!', cid)
else
talkState[talkUser] = 1
selfSay('I have two types of tasks, you want to {kill} monsters or to {collect} some items for me? You can also let me choose a {random} one for you, garanting a final bonus in your reward.', cid)
end
elseif (msgcontains(msg, 'kill') and talkState[talkUser] == 1) then
talkState[talkUser] = 2
setPlayerStorageValue(cid, storages.type, 1)
selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid)
elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) >= config.levelcollect) then
talkState[talkUser] = 2
setPlayerStorageValue(cid, storages.type, 2)
selfSay('I have all kinds of tasks, you want a {easy}, {medium} or are you up to a {hard} one?', cid)
elseif (msgcontains(msg, 'collect') and talkState[talkUser] == 1 and getPlayerLevel(cid) < config.levelcollect) then
talkState[talkUser] = 1
selfSay('You can only do collect tasks once you reach level '..config.levelcollect..'.', cid)
------- difficult ---------
elseif (msgcontains(msg, 'random') and talkState[talkUser] == 1) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.type, math.random(1,2))
setPlayerStorageValue(cid, storages.difficult, math.random(2,4) * config.bonus)
setPlayerStorageValue(cid, storages.length, math.random(2,4) * config.bonus)
elseif (msgcontains(msg, 'hard') and talkState[talkUser] == 2) then
talkState[talkUser] = 3
selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid)
setPlayerStorageValue(cid, storages.difficult, 4)
elseif (msgcontains(msg, 'medium') and talkState[talkUser] == 2) then
talkState[talkUser] = 3
selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid)
setPlayerStorageValue(cid, storages.difficult, 3)
elseif (msgcontains(msg, 'easy') and talkState[talkUser] == 2) then
talkState[talkUser] = 3
selfSay('I have all kinds of tasks, you want a {short}, {median} or are you up to a {long} one?.', cid)
setPlayerStorageValue(cid, storages.difficult, 2)
------- bye ---------
elseif (msgcontains(msg, 'no')) and isInArray({1, 6, 7}, talkState[talkUser]) then
talkState[talkUser] = 0
selfSay('Clearly you are not ready. We can talk later...', cid)
------- length ---------
elseif (msgcontains(msg, 'short') and talkState[talkUser] == 3) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.length, 2)
elseif (msgcontains(msg, 'median') and talkState[talkUser] == 3) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.length, 3)
elseif (msgcontains(msg, 'long') and talkState[talkUser] == 3) then
talkState[talkUser] = 4
selfSay('Are you sure about this?', cid)
setPlayerStorageValue(cid, storages.length, 4)
----------- give up option -----------
elseif (msgcontains(msg, 'give up') and talkState[talkUser] == 6) then
selfSay('Are you saying that you want to give up this task? I will not give you any other task in the next '.. (config.time/3600) ..' hour(s).', cid)
talkState[talkUser] = 7
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 7) then
selfSay('Since you will not help me, get out of here.', cid)
setPlayerStorageValue(cid, storages.maxcount, 0)
setPlayerStorageValue(cid, storages.delay, os.time() + config.time)
talkState[talkUser] = 0
-----------------------
------- checking ---------
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 4) then
local length = getPlayerStorageValue(cid, storages.length)
local difficult = getPlayerStorageValue(cid, storages.difficult)
if type == 1 then
if length == 2 then
setPlayerStorageValue(cid, storages.maxcount, short)
elseif length == 3 then
setPlayerStorageValue(cid, storages.maxcount, median)
else
setPlayerStorageValue(cid, storages.maxcount, long)
end
if difficult == 2 then
setPlayerStorageValue(cid, storages.name, easy[math.random(1, #easy)])
elseif difficult == 3 then
setPlayerStorageValue(cid, storages.name, medium[math.random(1, #medium)])
else
setPlayerStorageValue(cid, storages.name, hard[math.random(1, #hard)])
end
setPlayerStorageValue(cid, storages.count, 0)
talkState[talkUser] = 0
selfSay('OK then.. your task is to kill '..getPlayerStorageValue(cid, storages.maxcount)..' '..getPlayerStorageValue(cid, storages.name)..'s. Do not spare any monster!', cid)
elseif type == 2 then
if length == 2 then
setPlayerStorageValue(cid, storages.maxcount, eacollect[math.random(1, #eacollect)].count)
elseif length == 3 then
setPlayerStorageValue(cid, storages.maxcount, medcollect[math.random(1, #medcollect)].count)
else
setPlayerStorageValue(cid, storages.maxcount, hardcollect[math.random(1, #hardcollect)].count)
end
if difficult == 2 then
setPlayerStorageValue(cid, storages.name, eacollect[math.random(1, #eacollect)].id)
elseif difficult == 3 then
setPlayerStorageValue(cid, storages.name, medcollect[math.random(1, #medcollect)].id)
else
setPlayerStorageValue(cid, storages.name, hardcollect[math.random(1, #hardcollect)].id)
end
setPlayerStorageValue(cid, storages.count, 0)
talkState[talkUser] = 0
selfSay('OK then.. your task is to collect {'.. getPlayerStorageValue(cid, storages.maxcount)..' '.. getItemNameById(getPlayerStorageValue(cid, storages.name)) ..'s}. Bring me the proof that you made it!', cid)
end
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 4) then
talkState[talkUser] = 0
selfSay('Ok, come back when you have the guts.', cid)
------- reward ---------
elseif msgcontains(msg, 'reward') then
if type == 1 then
if getPlayerStorageValue(cid, storages.count) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then
selfSay('You finished the quest, now you want to receive your reward in {gold}, {trainning} or in {experience}?', cid)
talkState[talkUser] = 5
else
selfSay('There is no reward for those who did not complete a challenge.', cid)
talkState[talkUser] = 0
end
elseif type == 2 then
if getPlayerItemCount(cid, getPlayerStorageValue(cid, storages.name)) >= getPlayerStorageValue(cid, storages.maxcount) and getPlayerStorageValue(cid, storages.maxcount) > 3 then
selfSay('You finished the quest, now you want to receive your reward in {gold}, {trainning} or in {experience}?', cid)
talkState[talkUser] = 5
else
selfSay('There is no reward for those who did not complete a challenge.', cid)
talkState[talkUser] = 0
end
else
selfSay('There is no reward for those who did not complete a challenge.', cid)
talkState[talkUser] = 0
end
---------- checking rewards ---------------
elseif (msgcontains(msg, 'gold') and talkState[talkUser] == 5 ) then
if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then
for k, v in pairs(storages) do
setPlayerStorageValue(cid, v, 0)
end
doPlayerAddMoney(cid, gold)
talkState[talkUser] = 0
selfSay('Thanks for your help, here is your prize..', cid)
else
selfSay('Something went wrong..', cid)
end
elseif (msgcontains(msg, 'experience') and talkState[talkUser] == 5) then
if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then
for k, v in pairs(storages) do
setPlayerStorageValue(cid, v, 0)
end
doPlayerAddExperience(cid, experience)
talkState[talkUser] = 0
selfSay('Thanks for your help, here is your prize..', cid)
else
selfSay('Something went wrong..', cid)
end
elseif (msgcontains(msg, 'trainning') and talkState[talkUser] == 5) then
talkState[talkUser] = 8
selfSay('Which skill you want to train with me? choose between {axe}, {distance}, {club}, {sword} and {shield}', cid)
----------------------- SKILL REWARD -----------------------
elseif (SKILL_IDS[msg] and talkState[talkUser] == 8) then
if (type == 1) or (doPlayerRemoveItem(cid, getPlayerStorageValue(cid, storages.name), getPlayerStorageValue(cid, storages.maxcount)) and type == 2) then
-- a divisao por 3000 foi porque cada ponto de skill try equivale a 30 tries de skill e nos naturalmente dividimos por 100. 1/30 * 1/100 = 1/3000
local qnt = math.ceil(getPlayerRequiredSkillTries(cid, SKILL_IDS[msg], getPlayerSkillLevel(cid, SKILL_IDS[msg]) + 1)/3000) * ((getPlayerStorageValue(cid, storages.length)) * (getPlayerStorageValue(cid, storages.difficult)) * config.multiplicator)
for k, v in pairs(storages) do
setPlayerStorageValue(cid, v, 0)
end
doPlayerAddSkillTry(cid, SKILL_IDS[msg], qnt)
doSendMagicEffect(getCreaturePosition(cid), 39)
talkState[talkUser] = 0
selfSay('Thanks for your help, here is your prize..', cid)
else
selfSay('Something went wrong..', cid)
end
----------------------- msg when blocked --------------
elseif (msgcontains(msg, 'task') or msgcontains(msg, 'challenge')) and (getPlayerStorageValue(cid, storages.delay) - os.time()) > 0 then
talkState[talkUser] = 0
selfSay('I can not trust you since you failed in the last job. You will have to wait until I feel that I can trust you again..', cid)
end
return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Back
Top