swashed
Member
- Joined
- Jul 9, 2023
- Messages
- 74
- Reaction score
- 8
Hi,
I’m using a script I found here for an NPC that handles tasks. Everything works great except for when the player says “bye” or walks away.
On the original client, the client crashes.
On OTClient, it doesn’t crash, but the NPC “blinks” like he’s reloading right there on the spot.
I’m hoping somebody out here has seen this before.
This is the script I'm using:
I'm linking the thread because it's a few files being used.
would ungreet fix this
I’m using a script I found here for an NPC that handles tasks. Everything works great except for when the player says “bye” or walks away.
On the original client, the client crashes.
On OTClient, it doesn’t crash, but the NPC “blinks” like he’s reloading right there on the spot.
I’m hoping somebody out here has seen this before.
Post automatically merged:
Post automatically merged:
This is the script I'm using:
CreatureEvent - KillingInTheNameOF (task system) for OTHIRE 7.72
Original script: https://otland.net/threads/grizzly-adams-killing-in-the-name-of-quest-all-tasks-more-real-tibia.159150/ Credits: Darkhous for the scripts I just addaped it to OTHIRE creaturescripts.xml killtask.lua function onKill(cid, target, lastHit) local started =...
otland.net
I'm linking the thread because it's a few files being used.
Post automatically merged:
Lua:
dofile(getDataDir() .. 'npc/scripts/lib/greeting.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
print("Loaded npc modules")
local choose = {}
local cancel = {}
local available = {}
print("loaded some variables")
function creatureSayCallback(cid, type, msg)
print("creaturesaycallback")
if(npcHandler.focus ~= cid) then
print("focus lost")
return false
end
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE and 0 or cid
print("talkuser")
--Player asks about task
if isInArray({"tasks", "task", "mission"}, msg:lower()) then
print("TRACE 0001")
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)
talk_state = 0
else
selfSay("I don't have any task for you right now.")
end
elseif msg ~= "" and canStartTask(cid, msg) then
if #getPlayerStartedTasks(cid) >= tasksByPlayer then
selfSay("Sorry, but you already started " .. tasksByPlayer .. " tasks.")
return true
end
--Set new task
local task = getTaskByName(msg)
if task and getPlayerStorageValue(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?")
choose[cid] = task
talk_state = 1
elseif msg:lower() == "yes" and talk_state == 1 then
setPlayerStorageValue(cid, QUESTSTORAGE_BASE + choose[cid], 1)
selfSay("Excellent! You can check the status of your task by saying reward to me, or if you want to leave your task.")
choose[cid] = nil
talk_state = 0
elseif msg:lower() == "reward" then
local started = getPlayerStartedTasks(cid)
local finishedAtLeastOne = false
local finished = 0
if started and #started > 0 then
for _, id in ipairs(started) do
--Give player their reward for completing task
if getPlayerStorageValue(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 getPlayerStorageValue(cid, reward.storage[1]) >= reward.storage[2] then
deny = true
end
end
--Reward types
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
doPlayerAddExp(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
setPlayerStorageValue(cid, reward.value[1], reward.value[2])
elseif isInArray({REWARD_POINT, "points", "point"}, reward.type:lower()) and not deny then
setPlayerStorageValue(cid, POINTSSTORAGE, getPlayerStorageValue(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
setPlayerStorageValue(cid, reward.storage[1], reward.storage[2])
end
end
if tasks[id].norepeatable then
setPlayerStorageValue(cid, QUESTSTORAGE_BASE + id, 2)
else
setPlayerStorageValue(cid, QUESTSTORAGE_BASE + id, 0)
end
setPlayerStorageValue(cid, KILLSSTORAGE_BASE + id, 0)
if getPlayerStorageValue(cid, REPEATSTORAGE_BASE + id) < 1 then
setPlayerStorageValue(cid, REPEATSTORAGE_BASE + id, 0)
end
setPlayerStorageValue(cid, REPEATSTORAGE_BASE + id, getPlayerStorageValue(cid, REPEATSTORAGE_BASE + id) + 1)
finishedAtLeastOne = true
finished = finished + 1
end
end
if not finishedAtLeastOne then
selfSay("You haven't completed any task yet.")
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.")
end
else
selfSay("You haven't started any task yet.")
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)
else
selfSay("You haven't started any task yet.")
end
--Leave task
elseif msg:lower() == "leave" then
local started = getPlayerStartedTasks(cid)
if started and #started > 0 then
selfSay("Cancelling a task will remove all progress. Are you sure you want to leave your current task?")
talk_state = 2
else
selfSay("You haven't started any task yet.")
end
--get player to name the task they want to cancel
elseif getTaskByName(msg) and talk_state == 2 and isInArray(getPlayerStartedTasks(cid), getTaskByName(msg)) then
local task = getTaskByName(msg)
if getPlayerStorageValue(cid, KILLSSTORAGE_BASE + task) > 0 then
selfSay("You currently killed " .. getPlayerStorageValue(cid, KILLSSTORAGE_BASE + task) .. "/" .. tasks[task].killsRequired .. " " .. tasks[task].raceName .. ". Cancelling this task lose all progress. Are you sure you want to cancel this task?")
else
selfSay("Are you sure you want to cancel this task?")
end
talk_state = 3
cancel[cid] = task
elseif msg:lower() == "yes" and talk_state == 3 then
setPlayerStorageValue(cid, QUESTSTORAGE_BASE + cancel[cid], -1)
setPlayerStorageValue(cid, KILLSSTORAGE_BASE + cancel[cid], -1)
selfSay("You have cancelled the task " .. (tasks[cancel[cid]].name or tasks[cancel[cid]].raceName) .. ".")
talk_state = 0
--Ask about point gained
elseif isInArray({"points", "rank"}, msg:lower()) then
selfSay("At this time, you have " .. getPlayerStorageValue(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") .. ".")
talk_state = 0
end
print("TRACE 0002 - end")
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Post automatically merged:
would ungreet fix this
Last edited: