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

NPC Grizzly Adams (Killing in the name of... Quest) All tasks, more real-tibia

The script are working here, but i get no answer from npc when i say:


18:27 GOD [129]: cancel
18:27 Grizzly Adams: Cancelling a task will make the count restart. Wich task you want to cancel?
18:27 GOD [129]: giant spider
<no answer>

Edit: Done, i tried "giant spiderS and now worked ! thanks!
 
Last edited:
hi guys.. i read whole script..looks very good.
But the one thing i didnt understand is this..

First of all, you need to add this lib:
Lua:
RANK_NONE = 0
RANK_HUNTSMAN = 1
RANK_RANGER = 2
RANK_BIGGAMEHUNTER = 3
RANK_TROPHYHUNTER = 4
RANK_ELITEHUNTER = 5

Where do i add this. is it in data/lib or in data/npc/lib
And what name should it be on this lua file ?

the rest looks good and easy.
 
You can create a new lib file in data/lib or add it to an existing lib like function.lua.
 
this is the errors i get when i write "task" to this guy. Anyone who knows what to do ?

neno.jpg
 
Code:
function isInArray(array, value, caseSensitive)
     if(caseSensitive == nil or caseSensitive == false) and type(value) == "string" then
         local lowerValue = value:lower()
         for _, _value in ipairs(array) do
             if type(_value) == "string" and lowerValue == _value:lower() then
                 return true
             end
         end
     else
         for _, _value in ipairs(array) do
             if (value == _value) then return true end
         end
     end
     return false
end
 
Code:
function isInArray(array, value, caseSensitive)
     if(caseSensitive == nil or caseSensitive == false) and type(value) == "string" then
         local lowerValue = value:lower()
         for _, _value in ipairs(array) do
             if type(_value) == "string" and lowerValue == _value:lower() then
                 return true
             end
         end
     else
         for _, _value in ipairs(array) do
             if (value == _value) then return true end
         end
     end
     return false
end


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

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 choose = {}
local cancel = {}
local available = {}
function creatureSayCallback(cid, type, msg)

if(not npcHandler:isFocused(cid)) then
return false
end
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE and 0 or cid

if isInArray({"tasks", "task", "mission"}, msg:lower()) then
local can = getTasksByPlayer(cid)
if #can > 0 then
local text = ""
local sep = ", "
table.sort(can, (function(a, b) return (a < b) end))
local t = 0
for _, id in ipairs(can) do
t = t + 1
if t == #can - 1 then
sep = " and "
elseif t == #can then
sep = "."
end
text = text .. "{" .. (tasks[id].name or tasks[id].raceName) .. "}" .. sep
end
selfSay("The current task" .. (#can > 1 and "s" or "") .. " that you can choose " .. (#can > 1 and "are" or "is") .. " " .. text, cid)
talkState[talkUser] = 0
else
selfSay("I don't have any task for you right now.", cid)
end
elseif msg ~= "" and canStartTask(cid, msg) then
if #getPlayerStartedTasks(cid) >= tasksByPlayer then
selfSay("Sorry, but you already started " .. tasksByPlayer .. " tasks.", cid)
return true
end
local task = getTaskByName(msg)
if task and getCreatureStorage(cid, QUESTSTORAGE_BASE + task) > 0 then
return false
end
selfSay("In this task you must defeat " .. tasks[task].killsRequired .. " " .. tasks[task].raceName .. ". Are you sure that you want to start this task?", cid)
choose[cid] = task
talkState[talkUser] = 1
elseif msg:lower() == "yes" and talkState[talkUser] == 1 then
doCreatureSetStorage(cid, QUESTSTORAGE_BASE + choose[cid], 1)
selfSay("Excellent! You can check the status of your task saying report to me.", cid)
choose[cid] = nil
talkState[talkUser] = 0
elseif msg:lower() == "report" then
local started = getPlayerStartedTasks(cid)
local finishedAtLeastOne = false
local finished = 0
if started and #started > 0 then
for _, id in ipairs(started) do
if getCreatureStorage(cid, KILLSSTORAGE_BASE + id) >= tasks[id].killsRequired then
for _, reward in ipairs(tasks[id].rewards) do
print("Rewards loaded")
local deny = false
if reward.storage then
if getCreatureStorage(cid, reward.storage[1]) >= reward.storage[2] then
deny = true
end
end
if isInArray({REWARD_MONEY, "money"}, reward.type:lower()) and not deny then
doPlayerAddMoney(cid, reward.value[1])
elseif isInArray({REWARD_EXP, "exp", "experience"}, reward.type:lower()) and not deny then
doPlayerAddExperience(cid, reward.value[1])
doPlayerSendDefaultCancel(cid, "You gained " .. reward.value[1] .. " experience points.")
elseif isInArray({REWARD_ACHIEVEMENT, "achievement", "ach"}, reward.type:lower()) and not deny then
if doPlayerAddAchievement then
doPlayerAddAchievement(cid, reward.value[1], true)
end
elseif isInArray({REWARD_STORAGE, "storage", "stor"}, reward.type:lower()) and not deny then
doCreatureSetStorage(cid, reward.value[1], reward.value[2])
elseif isInArray({REWARD_POINT, "points", "point"}, reward.type:lower()) and not deny then
doCreatureSetStorage(cid, POINTSSTORAGE, getCreatureStorage(cid, POINTSSTORAGE) + reward.value[1])
elseif isInArray({REWARD_ITEM, "item", "items", "object"}, reward.type:lower()) and not deny then
doPlayerAddItem(cid, reward.value[1], reward.value[2])
end

if reward.storage then
doCreatureSetStorage(cid, reward.storage[1], reward.storage[2])
end
end

if tasks[id].norepeatable then
doCreatureSetStorage(cid, QUESTSTORAGE_BASE + id, 2)
else
doCreatureSetStorage(cid, QUESTSTORAGE_BASE + id, 0)
end
doCreatureSetStorage(cid, KILLSSTORAGE_BASE + id, 0)
if getCreatureStorage(cid, REPEATSTORAGE_BASE + id) < 1 then
doCreatureSetStorage(cid, REPEATSTORAGE_BASE + id, 0)
end
doCreatureSetStorage(cid, REPEATSTORAGE_BASE + id, getCreatureStorage(cid, REPEATSTORAGE_BASE + id) + 1)
finishedAtLeastOne = true
finished = finished + 1
end
end

if not finishedAtLeastOne then
selfSay("You haven't finished any task yet.", cid)
else
selfSay("Awesome! you finished " .. (finished > 1 and "various" or "a") .. " task" .. (finished > 1 and "s" or "") .. ". Talk to me again if you want to start a task.", cid)
end
else
selfSay("You haven't started any task yet.", cid)
end
elseif msg:lower() == "started" then
local started = getPlayerStartedTasks(cid)
if started and #started > 0 then
local text = ""
local sep = ", "
table.sort(started, (function(a, b) return (a < b) end))
local t = 0
for _, id in ipairs(started) do
t = t + 1
if t == #started - 1 then
sep = " and "
elseif t == #started then
sep = "."
end
text = text .. "{" .. (tasks[id].name or tasks[id].raceName) .. "}" .. sep
end

selfSay("The current task" .. (#started > 1 and "s" or "") .. " that you started " .. (#started > 1 and "are" or "is") .. " " .. text, cid)
else
selfSay("You haven't started any task yet.", cid)
end
elseif msg:lower() == "cancel" then
local started = getPlayerStartedTasks(cid)
if started and #started > 0 then
selfSay("Cancelling a task will make the count restart. Wich task you want to cancel?", cid)
talkState[talkUser] = 2
else
selfSay("You haven't started any task yet.", cid)
end
elseif getTaskByName(msg) and talkState[talkUser] == 2 and isInArray(getPlayerStartedTasks(cid), getTaskByName(msg)) then
local task = getTaskByName(msg)
if getCreatureStorage(cid, KILLSSTORAGE_BASE + task) > 0 then
selfSay("You currently killed " .. getCreatureStorage(cid, KILLSSTORAGE_BASE + task) .. "/" .. tasks[task].killsRequired .. " " .. tasks[task].raceName .. ". Cancelling this task will restart the count. Are you sure you want to cancel this task?", cid)
else
selfSay("Are you sure you want to cancel this task?", cid)
end
talkState[talkUser] = 3
cancel[cid] = task
elseif msg:lower() == "yes" and talkState[talkUser] == 3 then
doCreatureSetStorage(cid, QUESTSTORAGE_BASE + cancel[cid], -1)
doCreatureSetStorage(cid, KILLSSTORAGE_BASE + cancel[cid], -1)
selfSay("You have cancelled the task " .. (tasks[cancel[cid]].name or tasks[cancel[cid]].raceName) .. ".", cid)
talkState[talkUser] = 0
elseif isInArray({"points", "rank"}, msg:lower()) then
selfSay("At this time, you have " .. getCreatureStorage(cid, POINTSSTORAGE) .. " Paw & Fur points. You " .. (getPlayerRank(cid) == 5 and "are an Elite Hunter" or getPlayerRank(cid) == 4 and "are a Trophy Hunter" or getPlayerRank(cid) == 3 and "are a Big Game Hunter" or getPlayerRank(cid) == 2 and "are a Ranger" or getPlayerRank(cid) == 1 and "are a Huntsman" or "haven't been ranked yet") .. ".", cid)
talkState[talkUser] = 0
end
end

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

what line do i change / or where do i insert this code =)
 
You can add it in the function lib file in data/lib.
 
Last edited:
Code:
function onKill(cid, target, lastHit)
You can add prints under this to test that's wrong.
Code:
print("test1")
print("test2")
-- etc
Look which ones you get in your console and which not. If you don't get the message you added under function onKill this means the script is not added correct.
Could also be that the function isSummon you have is for a different server, so you can also try to remove that part to see if you get messages then.
 
Code:
function onKill(cid, target, lastHit)
You can add prints under this to test that's wrong.
Code:
print("test1")
print("test2")
-- etc
Look which ones you get in your console and which not. If you don't get the message you added under function onKill this means the script is not added correct.
Could also be that the function isSummon you have is for a different server, so you can also try to remove that part to see if you get messages then.

im using tfs 0.3.7 (crying Damson)
going to test some stuff now.. and if i cant fix it to 8a clock :) Ill be back!!! :) Thx again m8.
 
Code:
function onKill(cid, target, lastHit)
You can add prints under this to test that's wrong.
Code:
print("test1")
print("test2")
-- etc
Look which ones you get in your console and which not. If you don't get the message you added under function onKill this means the script is not added correct.
Could also be that the function isSummon you have is for a different server, so you can also try to remove that part to see if you get messages then.

yupp im back.. and im still stuck att the same place..
i tryed to
print("test1")
like u said and did work. i do see print ("test1") but still not counting the monsters
 
Last edited:
add it on more places and look which message you don't get, like this you can find out where the problem is.
 
my script does not work from here.


if isPlayer(target) or isSummon(target) then return true end
if started and #started > 0 then
for _, id in do
if isInArray(tasks[id].creatures, getCreatureName(target):lower()) then
if getCreatureStorage(cid, KILLSSTORAGE_BASE + id) < 0 then
doCreatureSetStorage(cid, KILLSSTORAGE_BASE + id, 0)
end
if getCreatureStorage(cid, KILLSSTORAGE_BASE + id) < tasks[id].killsRequired then
doCreatureSetStorage(cid, KILLSSTORAGE_BASE + id, getCreatureStorage(cid, KILLSSTORAGE_BASE + id) + 1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, getCreatureStorage(cid, KILLSSTORAGE_BASE + id) .. "/" .. tasks[id].killsRequired .. " " .. tasks[id].raceName .. " already killed.")
end
end
end
end
return true

end
 
Try to remove
Code:
or isSummon(target)
If that is the problem and you added this function, test how this function returns in your server (with print for example: print(isSummon)) and if it correct with the Lua made function.
 
Try to remove
Code:
or isSummon(target)
If that is the problem and you added this function, test how this function returns in your server (with print for example: print(isSummon)) and if it correct with the Lua made function.

i removed
or isSummon(target) and it works now :S WOOOW u are the man... im chocked!!! :D AWSOME.. i can not find words to say how happy u just made me :D
THHHHXXXX =D
 
does anyone know how to make a mission completable 1 time. when im finish with killing lets say hydras. I can take the quest again ?
 
IQ4PRI.jpg

I have this error and dont know how to make :(
 
Back
Top