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

TFS 0.X Allow repeat task - 7.72

potinho

Intermediate OT User
Joined
Oct 11, 2009
Messages
1,397
Solutions
17
Reaction score
148
Location
Brazil
Hello guys,

I have a mod to do task in my server, but players cannot repeat, and i want to alllow players repeat tasks. Anyone can help me?

Task (in mod's, folder)
XML:
<?xml version="1.0" encoding="UTF-8"?>  

<mod name="Simple Task" version="3.0" author="Vodkart" contact="tibiaking.com" enabled="yes">  

<config name="task_func"><![CDATA[


tasktabble = {

["troll"] = {monster_race={"troll","frost troll","furious troll","island troll","swamp troll","troll champion","troll legionnaire"}, storage_start = 200201, storage = 91001,count = 100,exp = 50000,money = 3000},

["goblin"] = {monster_race={"goblin","goblin assassin","goblin leader"}, storage_start = 200202, storage = 91002,count = 200,exp = 70000,money = 3000},

["rotworm"] = {monster_race={"rotworm","carrion worm"}, storage_start = 200203, storage = 91003,count = 100,exp = 100000,money = 10000},

["cyclops"] = {monster_race={"cyclops","cyclops smith","cyclops drone"}, storage_start = 200204, storage = 91004,count = 300,exp = 200000,money = 15000},

["minotaur"] = {monster_race={"minotaur","minotaur archer","minotaur mage","minotaur guard"}, storage_start = 200209, storage = 91009,count = 350,exp = 100000,money = 5000},

["dragon"] = {monster_race={"dragon","dragon lord","frost dragon"}, storage_start = 200214, storage = 91014,count= 300, exp = 850000,money = 15000},

["giant spider"] = {monster_race={"giant spider"}, storage_start = 200215, storage = 91016,count = 500, exp = 500000, money = 15000},

["demon"] = {monster_race={"demon"}, storage_start = 200216, storage = 91017,count = 6666, reward = {{2495,1},{3960,1}}},

["hero"] = {monster_race={"hero"}, storage_start = 200217, storage = 91018,count = 600, exp = 1000000, money = 35000},

["vampire"] = {monster_race={"vampire"}, storage_start = 200218, storage = 91019,count = 500, exp = 400000, money = 30000},

["warlock"] = {monster_race={"warlock"}, storage_start = 200219, storage = 91020,count = 1000, exp = 8000000, money = 200000},

["hydra"] = {monster_race={"hydra"}, storage_start = 200220, storage = 91021,count = 700, exp = 2000000, reward = {{2195,1},{2498,1}}},

["dragon lord"] = {monster_race={"dragon lord"}, storage_start = 200221, storage = 91022,count = 1500, exp = 5000000, money = 150000},

["behemoth"] = {monster_race={"behemoth"}, storage_start = 200222, storage = 91023,count = 700, exp = 7000000, money = 80000},

["black knight"] = {monster_race={"black knight"}, storage_start = 200223, storage = 91024,count = 600, exp = 2000000, money = 80000},

["hero king"] = {monster_race={"hero king"}, storage_start = 200224, storage = 91025,count = 3000, exp = 30000000, money = 500000},

["ferumbras"] = {monster_race={"ferumbras"}, storage_start = 200225, storage = 91026,count = 200, reward = {2469,1}},

["infernus"] = {monster_race={"infernus"}, storage_start = 200226, storage = 91027,count = 100, reward = {2345,5}},

["master warlock"] = {monster_race={"master warlock"}, storage_start = 200227, storage = 91028,count = 3000, exp = 30000000, money = 500000},

}



configbosses_task = {

{race = "cave rat",Playerpos = {x = 189, y = 57, z = 7}, FromPosToPos = {{x = 186, y = 54, z = 7},{x = 193, y = 60, z = 7}},time = 5},

}


function CheckTask(cid)

for k, v in pairs(tasktabble) do

if getPlayerStorageValue(cid,v.storage_start) >= 1 then return true end

end

return false

end

function finisheAllTask(cid)

local config = {

exp = {true,100000},

money = {true,200000},

items ={false,{{2124,2},{2173,1}}},

premium ={true,5}

}

local x = true

for k, v in pairs(tasktabble) do

if tonumber(getPlayerStorageValue(cid,v.storage)) then

x = false

end

end

if x == true then

setPlayerStorageValue(cid, 521456, 0)

local b = getGlobalStorageValue(63005) if b == -1 then b = 1 end

if b < 11 then

setGlobalStorageValue(63005,b+1)

doBroadcastMessage('[Task Mission Complete] '..getCreatureName(cid)..' was the '..b..' to finish the task!.')

doPlayerAddPremiumDays(cid, config.premium[1] == true and config.premium[2] or 0)

doPlayerAddExp(cid, config.exp[1] == true and config.exp[2] or 0)

doPlayerAddMoney(cid, config.money[1] == true and config.money[2] or 0)

if config.items[1] == true then doAddItemsFromList(cid,config.items[2]) end

doItemSetAttribute(doPlayerAddItem(cid, 7369), "name", "trophy "..getCreatureName(cid).." completed all the task.")

end

end

end

function HavePlayerPosition(cid, from, to)

    return isInRange(getPlayerPosition(cid), from, to) and true or false

end

function getRankStorage(cid, value, max, RankName) -- by vodka

local str =""

str = "--[".. (RankName == nil and "RANK STORAGE" or ""..RankName.."") .."]--\n\n"

local query = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = "..value.." ORDER BY cast(value as INTEGER) DESC;")

if (query:getID() ~= -1) then k = 1 repeat if k > max then break end

str = str .. "\n " .. k .. ". "..getPlayerNameByGUID(query:getDataString("player_id")).." - [" .. query:getDataInt("value") .. "]"

k = k + 1 until not query:next() end return doShowTextDialog(cid, 2529, str)

end

function getItemsInContainerById(container, itemid) -- Function By Kydrai

            local items = {}

            if isContainer(container) and getContainerSize(container) > 0 then

                            for slot=0, (getContainerSize(container)-1) do

                                            local item = getContainerItem(container, slot)

                                            if isContainer(item.uid) then

                                                            local itemsbag = getItemsInContainerById(item.uid, itemid)

                                                            for i=0, #itemsbag do

                                                                            table.insert(items, itemsbag[i])

                                                            end

                                            else

                                                            if itemid == item.itemid then

                                                                            table.insert(items, item.uid)

                                                            end

                                            end

                            end

            end

            return items

end

function doPlayerAddItemStacking(cid, itemid, quant) -- by mkalo

    local item = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid)

    local piles = 0

    if #item > 0 then

            for i,x in pairs(item) do

                    if getThing(x).type < 100 then

                            local it = getThing(x)

                            doTransformItem(it.uid, itemid, it.type+quant)

                            if it.type+quant > 100 then

                                    doPlayerAddItem(cid, itemid, it.type+quant-100)

                            end

                    else

                           piles = piles+1

                    end

            end

    else

            return doPlayerAddItem(cid, itemid, quant)

    end

    if piles == #item then

            doPlayerAddItem(cid, itemid, quant)

    end

end

function getItemsFromList(items) -- by vodka

local str = ''

if table.maxn(items) > 0 then

for i = 1, table.maxn(items) do

str = str .. items[i][2] .. ' ' .. getItemNameById(items[i][1])

if i ~= table.maxn(items) then str = str .. ', ' end end end

return str

end

function doAddItemsFromList(cid,items) -- by vodka

if table.maxn(items) > 0 then

for i = 1, table.maxn(items) do

local count = items[i][2]

while count > 0 do

if isItemStackable(items[i][1]) then

doPlayerAddItemStacking(cid, items[i][1], 1)

else

doPlayerAddItem(cid, items[i][1],1)

end

count = count - 1

end

end

end

end

        function pairsByKeys(t, f)

          local a = {}

          for n in pairs(t) do table.insert(a, n) end

          table.sort(a, f)

          local i = 0

          local iter = function ()

                i = i + 1

                if a[i] == nil then return nil

                else return a[i], t[a[i]]

                end

          end

          return iter

        end

]]></config>

<event type="login" name="TaskLogin" event="script"><![CDATA[

function onLogin(cid)

registerCreatureEvent(cid, "KillTask")

return true

end]]></event>    

<event type="kill" name="KillTask" event="script"><![CDATA[

domodlib('task_func')

function onKill(cid, target, lastHit)

if(isMonster(target) == true) then

local n = string.lower(getCreatureName(target))

for race, mob in pairs(tasktabble) do

if getPlayerStorageValue(cid,mob .storage_start) >= 1 then

for i = 1,#mob.monster_race do

if n == mob.monster_race[i] then

local contagem = getPlayerStorageValue(cid, mob.storage)

if (contagem == -1) then contagem = 1 end

if not tonumber(contagem) then return true end

if contagem > mob.count then return true end

if contagem > mob.count then return true end

setPlayerStorageValue(cid, mob.storage, contagem+1)

doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,""..(contagem == mob.count and "Congratulations! You finished the task of "..race.."." or "defeated. Total [" .. contagem .. "/" .. mob.count .. "] " .. race .. ".").."")

end

end

end

end

end

return true

end]]></event>

</mod>

NPC

XML:
<?xml version="1.0"?>

<npc name="Task" script="data/npc/scripts/simple_task.lua" walkinterval="50000" floorchange="0">

<health now="100" max="100"/>

<look type="35" head="100" body="116" legs="121" feet="115" addons="0"/>

<parameters>

<parameter key="message_greet" value="Hello |PLAYERNAME|. Do you want to do a {task}? or {leave} one? you can also {reward} if you finished it! Disponible tasks: Troll, Goblin, Rot, Cyc, Mino, Dragon, GS, Demon, Hero, Vampire, Warlock, Hydra, Behes, Hero King, Ferumbras, Infernus, Master Warlock, BKs and DLs." />

</parameters>

</npc>

NPC Script

Lua:
domodlib('task_func')

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

function creatureSayCallback(cid, type, msg)

if(not npcHandler:isFocused(cid)) then

return false

end

local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid

local msg = string.lower(msg)

if isInArray({"task","tasks","missao","mission"}, msg) then

npcHandler:say("Me diga o nome do monstro que você deseja fazer a task!", cid)

talkState[talkUser] = 1

elseif talkState[talkUser] == 1 then

if tasktabble[msg] then

if CheckTask(cid) ~= true then

local contagem = getPlayerStorageValue(cid, tasktabble[msg].storage)

if (contagem == -1) then contagem = 1 end

if not tonumber(contagem) then npcHandler:say('Desculpe, mas você já terminou a task do '..msg, cid) return true end

setPlayerStorageValue(cid, tasktabble[msg].storage_start, 1)

npcHandler:say("Parabéns, agora você está participando da missão task do "..msg..", falta matar "..string.sub(((contagem)-1)-tasktabble[msg].count, 2).." "..msg, cid)

talkState[talkUser] = 0

else

npcHandler:say('Desculpe, mas você já faz parte de uma task!', cid)

talkState[talkUser] = 0

end

else

npcHandler:say('digite o nome correto da missão task! para mais informações digite {!task}', cid)

talkState[talkUser] = 1

end

elseif isInArray({"receber","reward","recompensa","report","reportar"}, msg) then

if CheckTask(cid) then

for k, v in pairs(tasktabble) do

racetype = k

if getPlayerStorageValue(cid,v.storage_start) >= 1 then

local contagem = getPlayerStorageValue(cid, v.storage)

if (contagem == -1) then contagem = 1 end

if not tonumber(contagem) then npcHandler:say('você só pode receber os items uma única vez!', cid) return true end

if (((contagem)-1) >= v.count) then

for _, check in pairs(configbosses_task) do

if string.lower(check.race) == string.lower(racetype) then

local on = getPlayersOnline()

for i=1, #on do

if HavePlayerPosition(on[i], check.FromPosToPos[1],check.FromPosToPos[2]) then

selfSay('aguarde alguns instantes, tem pessoas fazendo a task.', cid) return true

end

end

doTeleportThing(cid, check.Playerpos)

local function checkArea(cid)

if not isCreature(cid) then return LUA_ERROR end

if HavePlayerPosition(cid, check.FromPosToPos[1],check.FromPosToPos[2]) then

doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))

end

end

addEvent(checkArea, check.time*60*1000, cid)

end

end

local str = ""

if v.exp ~= nil then doPlayerAddExp(cid, v.exp ) str = str.."".. (str == "" and "" or ",") .." "..v.exp.." de exp" end

if v.money ~= nil then doPlayerAddMoney(cid, v.money) str = str.."".. (str == "" and "" or ",") ..""..v.money.." gps" end

if v.reward ~= nil then doAddItemsFromList(cid,v.reward) str = str.."".. (str == "" and "" or ",") ..""..getItemsFromList(v.reward) end

npcHandler:say("Obrigado pela sua ajuda Recompensas: "..(str == "" and "nenhuma" or ""..str.."").." por ter completado a task do "..k, cid)

setPlayerStorageValue(cid, v.storage, "Finished")

setPlayerStorageValue(cid, v.storage_start, 0)

setPlayerStorageValue(cid, 521456, getPlayerStorageValue(cid, 521456) == -1 and 1 or getPlayerStorageValue(cid, 521456)+1)

finisheAllTask(cid)

else

npcHandler:say('Desculpe,mas você só matou '..((contagem)-1)..' de '..v.count..' '..k, cid)

end

end

end

else

npcHandler:say("você não está em nenhuma missão task", cid)

end

elseif isInArray({"sair","leave","exit"}, msg) then

if CheckTask(cid) then

talkState[talkUser] = 2

for k, v in pairs(tasktabble) do

if getPlayerStorageValue(cid,v.storage_start) >= 1 then

storagesair = v.storage_start

local contagem = getPlayerStorageValue(cid, v.storage)

if (contagem == -1) then contagem = 1 end

npcHandler:say('você está participando de uma missão task do '..k..' e já tem '..((contagem)-1)..' '..k..' mortos, deseja mesmo sair?', cid)

end

end

else

npcHandler:say("você não está em nenhuma missão task", cid)

end

elseif msgcontains(msg, 'yes') and talkState[talkUser] == 2 then

setPlayerStorageValue(cid, storagesair, 0)

npcHandler:say("Você foi retirado da task com sucesso!", cid)

elseif msg == "no" then  

selfSay("Tudo bem então", cid)  

talkState[talkUser] = 0  

npcHandler:releaseFocus(cid)  

end

return TRUE

end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)

npcHandler:addModule(FocusModule:new())
 
That code organize makes me sad.

Remove that part:
Lua:
    if not tonumber(contagem) then
        npcHandler:say('Desculpe, mas você já terminou a task do '..msg, cid)
        return true
    end

lol try to not create multiple support requests with same purpose. Try to make more easy to someone help you with a good thread.

 
Last edited:
That code organize makes me sad.

Remove that part:


lol try to not create multiple support requests with same purpose. Try to make more easy to someone help you with a good thread.

Got error:

[13/10/2020 18:32:4] [Error - NpcScript Interface]
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:eek:nCreatureSay
[13/10/2020 18:32:4] Description:
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:175: attempt to perform arithmetic on local 'contagem' (a string value)
[13/10/2020 18:32:4] stack traceback:
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:175: in function 'callback'
[13/10/2020 18:32:4] data/npc/lib/npcsystem/npchandler.lua:363: in function 'onCreatureSay'
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:15: in function <data/npc/scripts/simple_task.lua:15>

And i tried to rollback script, got error too. Im desesperate to fix this, sorry to flood.
 
Got error:

[13/10/2020 18:32:4] [Error - NpcScript Interface]
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:eek:nCreatureSay
[13/10/2020 18:32:4] Description:
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:175: attempt to perform arithmetic on local 'contagem' (a string value)
[13/10/2020 18:32:4] stack traceback:
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:175: in function 'callback'
[13/10/2020 18:32:4] data/npc/lib/npcsystem/npchandler.lua:363: in function 'onCreatureSay'
[13/10/2020 18:32:4] data/npc/scripts/simple_task.lua:15: in function <data/npc/scripts/simple_task.lua:15>

And i tried to rollback script, got error too. Im desesperate to fix this, sorry to flood.

Keep "local contagem=" part. Remove just the part I mentioned before (edited)
 
Keep "local contagem=" part. Remove just the part I mentioned before (edited)
Still got error, prevent i left and start new task, just deleted:
Lua:
if not tonumber(contagem) then

        npcHandler:say('Desculpe, mas você já terminou a task do '..msg, cid)

        return true

    end"


[13/10/2020 18:45:23] [Error - NpcScript Interface]
[13/10/2020 18:45:23] data/npc/scripts/simple_task.lua:eek:nCreatureSay
[13/10/2020 18:45:23] Description:
[13/10/2020 18:45:23] data/npc/scripts/simple_task.lua:49: attempt to perform arithmetic on local 'contagem' (a string value)
[13/10/2020 18:45:23] stack traceback:
[13/10/2020 18:45:23] data/npc/scripts/simple_task.lua:49: in function 'callback'
[13/10/2020 18:45:23] data/npc/lib/npcsystem/npchandler.lua:363: in function 'onCreatureSay'
[13/10/2020 18:45:23] data/npc/scripts/simple_task.lua:15: in function <data/npc/scripts/simple_task.lua:15>
 
Back
Top