Ir para conteúdo
  • 0
potinho

Scripting Repetir Task (TFS 0.4)

Pergunta

potinho    4
potinho

Descreva em algumas palavras a base utilizada. (Nome do servidor / Nome do cliente / Nome do website / etc.).

The OTX Server Version: (2.100 - 6000) - Codename: (FINAL) Versão 7.72

Qual é a sua pergunta?

Tenho um npc de task, porém ele deixa fazer as tasks somente uma vez, gostaria de permitir que os players repetissem as tasks, como fazer? Seguem Scripts

MOD

 

Spoiler

<?xml version="1.0" encoding="UTF-8"?>  

<mod name="Simple Task" version="3.0" author="Vodkart" contact="************.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)

                                                            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[2] .. ' ' .. getItemNameById(items[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[2]

while count > 0 do

if isItemStackable(items[1]) then

doPlayerAddItemStacking(cid, items[1], 1)

else

doPlayerAddItem(cid, items[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 == nil then return nil

                else return a, t[a]

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

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())

 

Compartilhar este post


Link para o post

3 respostass a esta questão

Recommended Posts

  • 0
grilo13    60
grilo13

Não sei o que tem na lib task_func, mas acho que alterando essa linha dá pra fazer ela novamente

setPlayerStorageValue(cid, v.storage_start, 0)

Alterando o valor pra -1 ou 1

Compartilhar este post


Link para o post
  • 0
potinho    4
potinho

Quando eu entrego a task ele me da o premio, quando eu vou repetir ele diz que já estou em uma task e dá esse erro na console do servidor:

 

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

Compartilhar este post


Link para o post
  • 0
underewar    32
underewar

@potinho Este sistema se baseia em não pode repetir a task para entregar o item ao jogador, seria mais facil você solicitar um código novo na area de scripts.

Uma alteração dessa é muito mais trabalhosa do que criar um código novo.

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×