Ir para conteúdo
  • 0

task


brendoonh

Pergunta

Boa tarde xTibianos...

 

Estou com um sistema de task, que aparentimente está funcionando até um certo ponto, qnd pedimos a task recebemos normalmente, ai qnd vamos la matar o bixo a task nao conta..

 

LIB:

-- Sistema de Task feito por Leoric (Omega no XTibia) --

taskstg =
{
kills = 3451,
permission = 3452,
killstotal = 3453,
monster = 3454,
stage = 3455,
points = 3456,
}

timeBetweenTasks = 1  -- tempo até poder fazer outra task (24 * 60 * 60 = 24hs)
taskLevel = false -- true se quiser que as tasks sejam feitas por level / false se quiser que elas sejam feitas na ordem
taskMsg = {bool = true, msg = 'Voce acaba de matar monstros suficientes para completar sua task!'} -- bool = false > sem mensagens; bool = true > aviso quando terminar a task
taskEnd = true -- [não tem função no modo Level] se estiver como true, quando o jogador terminar a última task disponível, ele não poderá repeti-la. Se estiver false, ele poderá repetir a última task infinitamente.

taskmonsters =
{
[1] = {'rotworm','carrion worm', killstotal = 270}, -- aqui você deve mudar
[2] = {'bandit','assassin', killstotal = 285},
[3] = {'dwarf','dwarf soldier', killstotal = 300},
[4] = {'amazon','amazons', killstotal = 315},
[5] = {'orc warrior','orc spearman','orc shaman','orc leader','orc berserker','orc warlord','orc rider', killstotal = 330},
[6] = {'elf scout','elf arcanist', killstotal = 345},
[7] = {'tarantula', killstotal = 360},
[8] = {'cyclop','cyclops','cyclops drone','cyclops smith', killstotal = 375},
[9] = {'dwarf guard', killstotal = 390},
[10] = {'beholder','elder beholder','braindeath', killstotal = 405},
[11] = {'pirate buccaneer','pirate corsair','pirate Cutthroat','pirate ghost','pirate marauder','pirate skeleton', killstotal = 425},
[12] = {'crypt shambler', killstotal = 445},
[13] = {'monk','dark monk', killstotal = 465},
[14] = {'dark magician','mad scientist', killstotal = 485},
[15] = {'lizard sentinel','lizard snakecharmer','lizard templar', killstotal = 505},
[16] = {'blue djinn','green djinn','efreet','marid', killstotal = 525},
[17] = {'demon skeleton', killstotal = 545},
[18] = {'mercury blob','death blob','acid blob','slime', killstotal = 565},
[19] = {'necromancer', killstotal = 585},
[20] = {'vampire','vampire bride', killstotal = 605},
[21] = {'bone beast', killstotal = 630},
[22] = {'ice witch', killstotal = 655},
[23] = {'mutated bat', killstotal = 680},
[24] = {'dragon', killstotal = 705},
[25] = {'ancient scarab', killstotal = 730},
[26] = {'frost dragon hatchling', killstotal = 755},
[27] = {'crystal spider', killstotal = 780},
[28] = {'lich', killstotal = 805},
[29] = {'banshee', killstotal = 830},
[30] = {'giant spider', killstotal = 855},
[31] = {'hero', killstotal = 885},
[32] = {'nightmare','nightmare scion', killstotal = 915},
[33] = {'black knight', killstotal = 945},
[34] = {'dragon lord', killstotal = 975},
[35] = {'frost dragon', killstotal = 1005},
[36] = {'hydra', killstotal = 1035},
[37] = {'behemoth', killstotal = 1065},
[38] = {'plaguesmith', killstotal = 1095},
[39] = {'blightwalker', killstotal = 1125},
[40] = {'dark torturer', killstotal = 1155},
[41] = {'hand of cursed fate', killstotal = 1190},
[42] = {'warlock', killstotal = 1225},
[43] = {'infernalist', killstotal = 1260},
[44] = {'phantasm', killstotal = 1295},
[45] = {'grim reaper', killstotal = 1330},
[46] = {'son of verminor', killstotal = 1365},
[47] = {'demon', killstotal = 1400},
[48] = {'hellhound', killstotal = 1435},
[49] = {'undead dragon', killstotal = 1470},
[50] = {'Juggernaut', killstotal = 1500},
[51] = {'ferumbras', killstotal = 80},
[52] = {'verminor','annihilon','latrivan','zoralurk','hellgorak','madareth', killstotal = 60},
[53] = {'orshabaal', killstotal = 40},
[54] = {'ghazbaran','morgaroth', killstotal = 40}
}

taskreward = -- em gps
{
[1] = {money = 3000000,xp = 64000,item = {5940, 5940, 5919, 5809, 5804}, amount = {1,1,1,1,1}},
[2] = {money = 2,xp = 11000}, -- 1 item(2458) será adicionado e nenhum ponto de task
[3] = {money = 3,xp = 12000}, -- aqui serão adicionados 2 itens com id 2458 (se ele for amontoável - stackable) e 5 pontos de task
[4] = {money = 4,xp = 13000},
[5] = {money = 5,xp = 14000},
[6] = {money = 6,xp = 15000},
[7] = {money = 7,xp = 16000},
[8] = {money = 8,xp = 17000},
[9] = {money = 9,xp = 18000},
[10] = {money = 3000000,xp = 19000,item = {8300}, amount = {2}},
[11] = {money = 10,xp = 20000},
[12] = {money = 11,xp = 21000},
[13] = {money = 12,xp = 22000},
[14] = {money = 13,xp = 23000},
[15] = {money = 14,xp = 24000},
[16] = {money = 15,xp = 25000},
[17] = {money = 16,xp = 26000},
[18] = {money = 17,xp = 27000},
[19] = {money = 18,xp = 28000},
[20] = {money = 3000000,xp = 29000,item = {8300}, amount = {3}},
[21] = {money = 20,xp = 30000},
[22] = {money = 21,xp = 31000},
[23] = {money = 22,xp = 32000},
[24] = {money = 23,xp = 33000},
[25] = {money = 24,xp = 34000},
[26] = {money = 25,xp = 35000},
[27] = {money = 26,xp = 36000},
[28] = {money = 27,xp = 37000},
[29] = {money = 28,xp = 38000},
[30] = {money = 29,xp = 39000,item = {5015,8300}, amount = {1,1}},
[31] = {money = 30,xp = 40000},
[32] = {money = 31,xp = 41000},
[33] = {money = 32,xp = 42000},
[34] = {money = 33,xp = 43000},
[35] = {money = 34,xp = 44000},
[36] = {money = 35,xp = 45000},
[37] = {money = 36,xp = 46000},
[38] = {money = 37,xp = 47000},
[39] = {money = 38,xp = 48000},
[40] = {money = 5000000,xp = 49000,item = {8306, 8300}, amount = {1,1}},
[41] = {money = 39,xp = 50000},
[42] = {money = 40,xp = 51000},
[43] = {money = 41,xp = 52000},
[44] = {money = 42,xp = 53000},
[45] = {money = 43,xp = 54000},
[46] = {money = 44,xp = 55000},
[47] = {money = 45,xp = 56000},
[48] = {money = 46,xp = 57000},
[49] = {money = 47,xp = 58000},
[50] = {money = 48,xp = 59000},
[51] = {money = 49,xp = 60000},
[52] = {money = 50,xp = 61000},
[53] = {money = 51,xp = 62000},
[54] = {money = 3000000,xp = 64000,item = {5940, 5940, 5919, 5809, 5804}, amount = {1,1,1,1,1}}
}

function canDoTask(cid)
    local stage = getPlayerStorageValue(cid, taskstg.stage)
    if stage + 1 > #taskmonsters then
        return false
    elseif getPlayerStorageValue(cid,taskstg.permission) <= 0 then
        return true
    elseif getPlayerStorageValue(cid,taskstg.permission) == 1 then
        return false
    elseif getPlayerStorageValue(cid,taskstg.permission) >= os.time(t) then
        return false
    end
    return true
end

function doResetTask(cid)
    setPlayerStorageValue(cid,taskstg.kills,-1)
    setPlayerStorageValue(cid,taskstg.permission,os.time(t) + timeBetweenTasks)
    setPlayerStorageValue(cid,taskstg.killstotal,-1)
    setPlayerStorageValue(cid,taskstg.monster,-1)
    return true
end

function doRewardTask(cid)
    local monster = getPlayerStorageValue(cid,taskstg.monster)
    local reward = taskreward[monster]
    if reward.item then
        for i= 1, #reward.item do
           doPlayerAddItem(cid,reward.item[i],reward.amount[i])
        end
    end
    if reward.points then
        local points = getPlayerStorageValue(cid, taskstg.points)
        if points == -1 then
            setPlayerStorageValue(cid, taskstg.points, 0)
        end
        setPlayerStorageValue(cid, taskstg.points, reward.points + points)
    end
    if monster and reward then
        doPlayerAddMoney(cid,reward.money)        
        doPlayerAddExperience(cid, reward.xp)
    end    
    return true
end

function isSummon(cid) -- baseada na função do Vodkart
    if getCreatureMaster(cid) ~= nil or getCreatureMaster(cid) == true then
        return true
    end
    return false
end

function doCompleteTask(cid)
    doRewardTask(cid)
    doResetTask(cid)
    return true
end

function doStartTask(cid)
    if not taskLevel then
        local stage = getPlayerStorageValue(cid, taskstg.stage)
        if stage <= 0 then
            setPlayerStorageValue(cid, taskstg.monster, 1)
            setPlayerStorageValue(cid, taskstg.killstotal, taskmonsters[1].killstotal)
            setPlayerStorageValue(cid, taskstg.stage, 1)
        else
            setPlayerStorageValue(cid, taskstg.monster, stage+1)
            setPlayerStorageValue(cid, taskstg.killstotal, taskmonsters[stage+1].killstotal)
            if taskEnd or stage < #taskmonsters then
                setPlayerStorageValue(cid, taskstg.stage, stage+1)
            end
        end
        setPlayerStorageValue(cid, taskstg.permission, 1)
        setPlayerStorageValue(cid, taskstg.kills, 0)
        return true
    end
    local lvl = getPlayerLevel(cid)
    if lvl < 20 then
        local killstotal = taskmonsters[1].killstotal
        setPlayerStorageValue(cid,taskstg.monster,1)
        setPlayerStorageValue(cid,taskstg.killstotal,killstotal)
        setPlayerStorageValue(cid,taskstg.permission,1)
    elseif lvl < 50 then
        local killstotal = taskmonsters[2].killstotal
        setPlayerStorageValue(cid,taskstg.monster,2)
        setPlayerStorageValue(cid,taskstg.killstotal,killstotal)
        setPlayerStorageValue(cid,taskstg.permission,1)
    else
        local killstotal = taskmonsters[3].killstotal
        setPlayerStorageValue(cid,taskstg.monster,3)
        setPlayerStorageValue(cid,taskstg.killstotal,killstotal)
        setPlayerStorageValue(cid,taskstg.permission,1)
    end
    setPlayerStorageValue(cid,taskstg.kills,0)
    return true
end

Talkactions:

-- Sistema de Task feito por Leoric (Omega no XTibia) --
function onSay(cid, words, param, channel)
    local monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    if monster == -1 or monster == 0 then
        doPlayerSendTextMessage(cid,27,'Voce nao tem nenhuma task ativa.')
    else
        local left = killstotal - kills
        if left <= 0 then
            doPlayerSendTextMessage(cid,27,'Voce ja matou monstros suficientes para terminar sua task.')
        else
            doPlayerSendTextMessage(cid,27,'Andamento da sua task de '..taskmonsters[monster][1]..'s -> ['..kills..'/'..killstotal..']')
        end
    end
    return true
end

Creatureevents:


-- Sistema de Task feito por Leoric (Omega no XTibia) --
function onKill(cid, target)
    if not isPlayer(cid) then return true end
    if isSummon(target) then return true end
    local monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    if monster ~= -1 and monster ~= 0 then
        if isInArray(taskmonsters[monster],string.lower(getCreatureName(target))) then
            if kills == -1 then
                setPlayerStorageValue(cid,taskstg.kills,1)
            elseif kills + 1 == killstotal and taskMsg.bool == true then
                doPlayerSendTextMessage(cid, 21, taskMsg.msg)
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            else
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            end
        end
    end
    return true
end

AJUDEM PLISSS !!!

UP

Editado por brendoonh
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Cadê o arquivo para fazer contar?

 

Tem que ter um onKill, onDeath ou qualquer outra para fazer a morte do monstro contar...

onde você pegou provavelmente deve ter.

Link para o comentário
Compartilhar em outros sites

  • 0

-- Sistema de Task feito por Leoric (Omega no XTibia) --
function onKill(cid, target)
    if not isPlayer(cid) then return true end
    if isSummon(target) then return true end
    local monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    if monster ~= -1 and monster ~= 0 then
        if isInArray(taskmonsters[monster],string.lower(getCreatureName(target))) then
            if taskstg.kills == -1 then
                setPlayerStorageValue(cid,taskstg.kills,1)
            elseif taskstg.kills + 1 == taskstg.killstotal and taskMsg.bool == true then
                doPlayerSendTextMessage(cid, 21, taskMsg.msg)
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            else
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            end
        end
    end
    return true
end

Esqueceram de colocar taskstg. antes do kills

veja se funciona...

use

 em vez de 
, fica bem melhor para ler.

YKzV7bI.png

/\

Link para o comentário
Compartilhar em outros sites

  • 0

-- Sistema de Task feito por Leoric (Omega no XTibia) --
function onKill(cid, target)
    if not isPlayer(cid) then return true end
    if isSummon(target) then return true end
    local monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    if monster ~= -1 and monster ~= 0 then
        if isInArray(taskmonsters[monster],string.lower(getCreatureName(target))) then
            if taskstg.kills == -1 then
                setPlayerStorageValue(cid,taskstg.kills,1)
            elseif taskstg.kills + 1 == taskstg.killstotal and taskMsg.bool == true then
                doPlayerSendTextMessage(cid, 21, taskMsg.msg)
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            else
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            end
        end
    end
    return true
end

Esqueceram de colocar taskstg. antes do kills

veja se funciona...

use

 em vez de 
, fica bem melhor para ler.

YKzV7bI.png

/\

 

Ok, irei utilizar..

Continua nao contando. Não da nenhum erro na distro. (3.6)

 

A tag é assim mesmo né !?

<event type="kill" name="Tasks" script="taskkill.lua"/>
Editado por brendoonh
Link para o comentário
Compartilhar em outros sites

  • 0

Veja a diferença:

<event type="kill" name="Tasks" script="taskkill.lua"/>

TFS 0.4:

<event type="kill" name="Tasks" event="script" value="taskkill.lua"/>
Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado por me explicar a diferença...

 

Troquei a tag lá e mesmo assim nao conta, olhei novamente na distro, nenhum erro si quer.

 

15hy2x4.png


up


up


up


up

Editado por brendoonh
Link para o comentário
Compartilhar em outros sites

  • 0

Poste seu npc que o erro pode estar nele e substitua o script movements por esse e veja se aparece algum erro no seu char:

-- Sistema de Task feito por Leoric (Omega no XTibia) --
function onKill(cid, target)
    if not isPlayer(cid) then return true end
    if isSummon(target) then return true end
    local monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    if monster ~= -1 and monster ~= 0 then
        if isInArray(taskmonsters[monster],string.lower(getCreatureName(target))) then
            if kills == -1 then
                setPlayerStorageValue(cid,taskstg.kills,1)
            elseif kills + 1 == killstotal and taskMsg.bool == true then
                doPlayerSendTextMessage(cid, 21, taskMsg.msg)
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            else
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            end
        else
doPlayerSendTextMessage(cid, 21, "erro 1")
end
else
doPlayerSendTextMessage(cid, 21, "erro 2")
    end
    return true
end

 

Link para o comentário
Compartilhar em outros sites

  • 0

 

Poste seu npc que o erro pode estar nele e substitua o script movements por esse e veja se aparece algum erro no seu char:

-- Sistema de Task feito por Leoric (Omega no XTibia) --
function onKill(cid, target)
    if not isPlayer(cid) then return true end
    if isSummon(target) then return true end
    local monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    if monster ~= -1 and monster ~= 0 then
        if isInArray(taskmonsters[monster],string.lower(getCreatureName(target))) then
            if kills == -1 then
                setPlayerStorageValue(cid,taskstg.kills,1)
            elseif kills + 1 == killstotal and taskMsg.bool == true then
                doPlayerSendTextMessage(cid, 21, taskMsg.msg)
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            else
                setPlayerStorageValue(cid,taskstg.kills,kills+1)
            end
        else
doPlayerSendTextMessage(cid, 21, "erro 1")
end
else
doPlayerSendTextMessage(cid, 21, "erro 2")
    end
    return true
end

 

 

Creatureevents né? rsrs

 

NPC.lua

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Hunter Boss " script="data/npc/scripts/tasks.lua" walkinterval="0" floorchange="0">
	<health now="100" max="100"/>
	<look type="145" head="114" body="95" legs="76" feet="0" addons="1"/>
	<parameters>
  <parameter key="message_greet" value="Ei, |PLAYERNAME|, quer uma {nova task}, {informacoes} ou {cancelar} uma task? Ou sera que quer {completar} sua task?"/>
  <parameter key="message_farewell" value="Boa sorte em suas aventuras, |PLAYERNAME|."/>
  <parameter key="message_walkaway" value="Tchau..."/>
		<parameter key="module_shop" value="1"/>
		<parameter key="shop_buyable" value="Demon Backpack,10518,100000;"/>
	</parameters>
1</npc>

Script

-- Sistema de Task feito por Leoric (Omega no XTibia) --
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 monster, permission = getPlayerStorageValue(cid,taskstg.monster), getPlayerStorageValue(cid,taskstg.permission)
    local kills, killstotal = getPlayerStorageValue(cid,taskstg.kills), getPlayerStorageValue(cid,taskstg.killstotal)
    
    if msgcontains(msg,'nova task') then
        if monster ~= -1 then
            selfSay('Você já tem uma task em andamento. Termine-a antes de começar outra.',cid)
        elseif getPlayerStorageValue(cid, taskstg.stage) + 1 > #taskmonsters then
            selfSay('Eu não tenho mais tasks para você.',cid)
        elseif not canDoTask(cid) then
            selfSay('Você deve esperar '..math.ceil((permission - os.time(t))/60)..' minutos até poder começar outra task.',cid)
        else
            doStartTask(cid)
            selfSay('Muito bem, utilize {!countkills} para acompanhar o andamento de sua task.',cid)
        end
        talkState[talkUser] = 0
    elseif msgcontains(msg,'completar') then
        if canDoTask(cid) then
            selfSay('Você não tem uma task iniciada ainda... diga {nova task} para começar uma.',cid)
        elseif permission > 1 then
            selfSay('Você não tem uma task ativa... e só poderá começar outra mais tarde.',cid)
        elseif killstotal > 1 and kills >= killstotal then
            selfSay('Parabéns por completar sua task!',cid)
            doCompleteTask(cid)
        else
            selfSay('Você ainda não completou sua task.',cid)
        end
        talkState[talkUser] = 0
    elseif msgcontains(msg,'info') then
        if canDoTask(cid) and (monster == 0 or monster == -1) then
            selfSay('Você pode começar uma task dizendo {nova task}. Assim que disser, uma nova task será atribuída a você dependendo do seu level e você poderá acompanhar seu andamento dizendo {!countkills}.',cid)
        else
            selfSay('Você pode acompanhar sua task pelo comando {!countkills}. Assim que terminar, me avise e você receberá seu prêmio em dinheiro e experiência.',cid)
        end
        talkState[talkUser] = 0
    elseif msgcontains(msg, 'pontos') then
        local pontos = getPlayerStorageValue(cid, taskstg.points) > 0 and getPlayerStorageValue(cid, taskstg.points) or 0
        selfSay('Você tem '.. pontos ..' pontos de task.',cid)
    elseif msgcontains(msg,'cancelar') then
        if monster == 0  or monster == -1 then
            selfSay('Você não tem uma task ativa para cancelar.',cid)
            talkState[talkUser] = 0
        else
            selfSay('Você tem certeza que quer cancelar sua task?',cid)
            talkState[talkUser] = 1
        end
    elseif (msgcontains(msg,'yes') or msgcontains(msg,'sim')) and talkState[talkUser] == 1 then
        selfSay('Muito bem, sua task foi cancelada.',cid)
        doResetTask(cid)
        setPlayerStorageValue(cid,taskstg.permission,-1)
        setPlayerStorageValue(cid, taskstg.stage, getPlayerStorageValue(cid, taskstg.stage)-1)
        talkState[talkUser] = 0
    elseif (msgcontains(msg,'no') or msgcontains(msg,'não')) and talkState[talkUser] == 1 then
        selfSay('Você que sabe, né...',cid)
    end
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

up

up

uppppppppppppppppppppppppppppppppp

up

task

uppppppppppppppppppppppp

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...