Ir para conteúdo
  • 0

Ao equipar e dar use no item soul points diminui


Mazynho

Pergunta

Olá galera!

 

Queria saber como posso fazer para ao dar use em um item, que esteja equipado, começar a diminuir o Soul Point do player gradativamente.

 

Ex:

 

Tenho um sword ring, eu equipo ele e depois dou use nele então meu soul point começa diminuir. Soul point = 100, 99, 98, 97, ..., 0

 

O soul point começa a diminuir depois de X tempo.

 

Ex:

Após dar use no item iniciará um tempo de 1 min e 40 segundos, por exemplo, meu soul point é 100 então depois de 2 segundos ele passará de 100 para 99, depois de mais 2 segundos passará para 98, fazendo isso até o soul zerar.

 

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Tenta:

function onUse(cid, item, frompos, item2, topos)
 
local remove_soul = 1    --Quantidade de soul que vai ser retirada de x em x tempo (definido na variável abaixo.)
local remove_time = 2    --A cada x em x tempo que será retirada a quantidade de soul (definida na variável acima.)
local max_time = 100     --Segundos que vai durar a retirada de soul.
 
    function remove_soul(cid, time, count, delay)
        for i = 2, time, delay do
            addEvent(function()
                if isCreature(cid) then
                    doPlayerAddSoul(cid, -count)
                end
            end, i*1000)
        end
    end
    
    remove_soul(cid, max_time, remove_soul, remove_time)
    return true
end

O script tá montado seguindo seu exemplo (100 segundos, removendo soul points a cada 2 segundos).

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

  • 0

Tenta:

function onUse(cid, item, frompos, item2, topos)
 
local remove_soul = 1    --Quantidade de soul que vai ser retirada de x em x tempo (definido na variável abaixo.)
local remove_time = 2    --A cada x em x tempo que será retirada a quantidade de soul (definida na variável acima.)
local max_time = 100     --Segundos que vai durar a retirada de soul.
 
    function remove_soul(cid, time, count, delay)
        for i = 2, time, delay do
            addEvent(function()
                if isCreature(cid) then
                    doPlayerAddSoul(cid, -count)
                end
            end, i*1000)
        end
    end
    
    remove_soul(cid, max_time, remove_soul, remove_time)
    return true
end

O script tá montado seguindo seu exemplo (100 segundos, removendo soul points a cada 2 segundos).

 

 

ta dando um erro na linha 11: attempt to perform arithmetic on upvalue 'count' (a function value)

 

Esse -count desta forma não pega

 

E teria como você colocar para só funcionar se o item estiver equipado em um slot X, por exemplo no slot 8 o slot da bota, se não estiver nesse slot retorne uma msg.

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta:

function onUse(cid, item, frompos, item2, topos)
 
local remove_time = 2    --A cada x em x tempo que será retirada a quantidade de soul.
local max_time = 100     --Segundos que vai durar a retirada de soul.
local slot = 8   --Slot do item.
local id_item = xxx    --ID do item.
    
    if getPlayerSlotItem(cid, slot).itemid ~= id_item then
        return doPlayerSendCancel(cid, "Você deve colocar o item no local correto!")
    end
    
    for i = 2, max_time, remove_time do
        addEvent(function()
            if isCreature(cid) then
                doPlayerAddSoul(cid, -1)    
            end
        end, i*1000)
    end
    return true
end

Está removendo 1 soul point a cada 2 segundos. Se quiser editar essa quantidade, basta ir na linha

doPlayerAddSoul(cid, -1)

E mudar na parte do -1. Se você colocar um número positivo, estará adicionando soul points. Se colocar um negativo (no caso), estará removendo.

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

  • 0

Zipter98 queria min desculpar, não sei se você viu, mas postei aqui que o script não funcionou. Ele funcionou só que eu estava testando com o GOD ai o soul não diminui-a.

 

Teria como você colocar para só poder usar a magia se tiver no minimo 200 de soul.

 

Ao dar use no item mudar outfit do player para X outfit, só precisa mudar o lookType, agora depois que mudar o player tem que ficar impossibilitado de mudar de outfit até que o tempo acabe, e caso o tempo acabe e se ele não mudar de outfit muda automaticamente para o que estava anteriormente.

 

E tem como você depois de dar use ficar impossibilitado de tirar o item do slot enquanto o tempo não acaba?

 

Ou então se ele retirar o item ele para tudo que o script ta fazendo.

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

  • 0

 

fiz aqui rapidinho, tenta:

function onUse(cid, item, frompos, item2, topos)
 
local remove_time = 2    --A cada x em x tempo que será retirada a quantidade de soul.
local max_time = 100     --Segundos que vai durar a retirada de soul.
local min_soul = 200     --Mínimo de soul pra usar o item.
local slot = 8   --Slot do item.
local id_item = xxx    --ID do item.
local outfit = getPlayerSex(cid) == 0 and xxx or yyy   --Troque xxx pelo id da outfit female, e yyy, pela male.
    
    if getPlayerSlotItem(cid, slot).itemid ~= id_item then
        return doPlayerSendCancel(cid, "Você deve colocar o item no local correto!")
    end
    
    if getPlayerSoul(cid) < min_soul then
        return doPlayerSendCancel(cid, "Você precisa ter no mínimo "..min_soul.." soul para poder usar esse item.")
    end
     
    for i = 2, max_time, remove_time do
        if getPlayerSlotItem(cid, slot).itemid ~= id_item then break end
        doSetCreatureOutfit(cid, {lookType = outfit}, -1)
        addEvent(function()
            if not isCreature(cid) then return true end
            doPlayerAddSoul(cid, -1) 
        end, i*1000)
    end
    addEvent(function()
        if not isCreature(cid) then return true end
        doRemoveCondition(cid, CONDITION_OUTFIT)
    end, max_time*1000)
    return true
end

 

Cara valeu msm ficou quase perfeito, só faltou colocar alguma coisa para impedir o player de tirar o item do slot, ou então, se não for possível impedir a retirada do item, então você pode colocar para se o player retirar o outifit dele volta ao normal, o que estava antes dele usar o item, mas o soul ainda continua descendo.

 

E pra ficar melhor você pode colocar um outfit para cada voc, sendo que ainda teria diferença de sexo, e dependendo do lvl ele ganha tal outfit e ele ganharia aumento em determinado skill dependendo da voc

Ex:

Male Druid, Elder druid, LVL 100-150 ganha outfit X1

Female Druid, Elder druid, LVL 100-150 ganha outfit X2

 

Male Knight, Elite knight, LVL 200+ ganha outfit Y1

Female Knight, Elite knight, LVL 200+ ganha outfit Y2

 

Você poderia min ajudar nesse script: http://www.xtibia.com/forum/topic/223783-so-usa-tal-magia-se-tiver-x-item-e-x-storage/

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

  • 0

O de, ao retirar o item parar o script, acho que já sei o que é. To testando aqui, e jaja edito lá, se funcionar.

E sobre a diferença de outfit pra vocation, tentarei também.

Link para o comentário
Compartilhar em outros sites

  • 0

O de, ao retirar o item parar o script, acho que já sei o que é. To testando aqui, e jaja edito lá, se funcionar.

E sobre a diferença de outfit pra vocation, tentarei também.

 

 

Valeu cara, você está sendo de grande ajuda. Muito obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

De nada xD

Sobre o caso de retirar o item do slot, já está corrigido (graças a um amigo meu; vide Akumah). Só vou dar uns ajustes finais, e edito aqui.

Infelizmente, ainda não sou capaz de fazer isso que você pediu sobre as vocations :x

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

  • 0

De nada xD

Sobre o caso de retirar o item do slot, já está corrigido (graças a um amigo meu; vide Akumah).

Poderia informar os IDs das vocations, e suas respectivas outfits (male e female)?

 

Do lvl 100 até o 150

Druid male = 6

Knight male = 8

Sorcerer male = 9

Paladin male = 24

 

De lvl 200 +

Druid male = 17

Knight male = 29

Sorcerer male = 23

Paladin male = 7

 

Do lvl 100 até o 150

Druid female = 66

Knight female = 59

Sorcerer female = 49

Paladin female = 61

 

De lvl 200 +

Druid female = 58

Knight female = 70

Sorcerer female = 78

Paladin female = 64

 

Se você poder colocar para só usar o item se tiver uma storage também seria interessante.

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta:

function onUse(cid, item, frompos, item2, topos)
 
local max_time = 100     --tempo máximo (no caso do seu exemplo, 1min e 40 segundos).
local min_soul = 200     --Mínimo de soul pra usar o item.
local slot = 8   --Slot do item.
local id_item = xxx    --ID do item.
local storage = 410294
local t = {
        [1] = {xxx, xxx, xxx, xxx},      --[id da vocation] = {id da outfit male de lv 100 a 150, female de 100 a 150, male de 200+, female de 200+},
        [2] = {xxx, xxx, xxx, xxx},
        [3] = {xxx, xxx, xxx, xxx},
        [4] = {xxx, xxx, xxx, xxx},
}
 
    if getPlayerSlotItem(cid, slot).itemid ~= id_item then
        return doPlayerSendCancel(cid, "Você deve colocar o item no local correto!")
    end
    
    if getPlayerStorageValue(cid, storage) < 1 then 
        return doPlayerSendCancel(cid, "Você não pode usar esse item.")
    end
    
    if getPlayerSoul(cid) < min_soul then
        return doPlayerSendCancel(cid, "Você precisa ter no mínimo "..min_soul.." soul para poder usar esse item.")
    end
     
    i = 2
    local function doRemoveSoul(cid)
        if i == max_time then return true end
        if not isCreature(cid) then return true end
        if getPlayerSlotItem(cid, slot).itemid ~= id_item then doRemoveCondition(cid, CONDITION_OUTFIT) return true end
        i = i + 2
        doPlayerAddSoul(cid, -1)
        addEvent(doRemoveSoul, 2000, cid)
    end
    
    local d = getPlayerVocation(cid)
    
    doRemoveSoul(cid)
        if getPlayerLevel(cid) >= 100 and getPlayerLevel(cid) <= 150 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][2]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][1]}, -1)
            end
        elseif getPlayerLevel(cid) >= 200 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][4]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][3]}, -1)
            end
        end
    addEvent(function()
        if not isCreature(cid) then return true end
        if getCreatureCondition(cid, CONDITION_OUTFIT) then
            doRemoveCondition(cid, CONDITION_OUTFIT)
        end
    end, max_time*1000)
    return true
end
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

 

Tenta:

function onUse(cid, item, frompos, item2, topos)
 
local max_time = 100     --tempo máximo (no caso do seu exemplo, 1min e 40 segundos).
local min_soul = 200     --Mínimo de soul pra usar o item.
local slot = 8   --Slot do item.
local id_item = xxx    --ID do item.
local storage = 410294
local t = {
        [1] = {xxx, xxx, xxx, xxx},      --[id da vocation] = {id da outfit male de lv 100 a 150, female de 100 a 150, male de 200+, female de 200+},
        [2] = {xxx, xxx, xxx, xxx},
        [3] = {xxx, xxx, xxx, xxx},
        [4] = {xxx, xxx, xxx, xxx},
}
 
    if getPlayerSlotItem(cid, slot).itemid ~= id_item then
        return doPlayerSendCancel(cid, "Você deve colocar o item no local correto!")
    end
    
    if getPlayerStorageValue(cid, storage) < 1 then 
        return doPlayerSendCancel(cid, "Você não pode usar esse item.")
    end
    
    if getPlayerSoul(cid) < min_soul then
        return doPlayerSendCancel(cid, "Você precisa ter no mínimo "..min_soul.." soul para poder usar esse item.")
    end
     
    i = 2
    local function doRemoveSoul(cid)
        if i == max_time then return true end
        if not isCreature(cid) then return true end
        if getPlayerSlotItem(cid, slot).itemid ~= id_item then doRemoveCondition(cid, CONDITION_OUTFIT) return true end
        i = i + 2
        doPlayerAddSoul(cid, -1)
        addEvent(doRemoveSoul, 2000, cid)
    end
    
    local d = getPlayerVocation(cid)
    
    doRemoveSoul(cid)
        if getPlayerLevel(cid) >= 100 and getPlayerLevel(cid) <= 150 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][2]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][1]}, -1)
            end
        elseif getPlayerLevel(cid) >= 200 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][4]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][3]}, -1)
            end
        end
    addEvent(function()
        if not isCreature(cid) then return true end
        if getCreatureCondition(cid, CONDITION_OUTFIT) then
            doRemoveCondition(cid, CONDITION_OUTFIT)
        end
    end, max_time*1000)
    return true
end

 

O script funcionou, agora tem uma questão que tem consertar, tipo se você colocar o item no slot e clicar nele varias vezes buga o tempo e, o soul começa a diminuir + rápido. Quanto mais clica mais rápido diminui. Você pode colocar uma condição para só poder da um clique até que o tempo acabe ou então você coloca uma storage para funcionar como um exaust.

 

E tem outra questão quero que se o player retirar o item antes do termino do tempo estipulado, o soul continua descendo só que ele perde o outfit e os atributos que vou citar abaixo:

 

Ao dar use no item ele ganha X pontos de skill dependendo da voc.

 

 

Druid e sorc

Ganha aumento de velocidade de 20 %

Aumento de 10 % no magic level --> Ex: ML 100 + 10% = 110

 

Knight

Ganha aumento de velocidade de 20 %

Aumento de 10 % no Axe

Aumento de 10 % no Club

Aumento de 10 % no Sword

Aumento de 10 % no shield

 

Paladin

Ganha aumento de velocidade de 20 %

Aumento de 10 % no Distance

Aumento de 5 % no shield

 

E esses aumentos só seriam durante o tempo de duração, depois voltaria ao normal e, caso ele retire o item volta ao normal tbm.

 

Você pode fazer para ao dar use no item transformar ele em outro e quando o tempo acabar voltar para o item anterior, lembrando que se o player retirar o item ele volta para o anterior na mesma hora.

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

  • 0

se quiser tentar..

e sobre as skills bônus, acho q só sei fazer a de speed :x

function onUse(cid, item, frompos, item2, topos)
 
local max_time = 100     --tempo máximo (no caso do seu exemplo, 1min e 40 segundos).
local min_soul = 200     --Mínimo de soul pra usar o item.
local slot = 8   --Slot do item.
local id_item = xxx    --ID do item.
local storage = 410294
local t = {
        [1] = {xxx, xxx, xxx, xxx},      --[id da vocation] = {id da outfit male de lv 100 a 150, female de 100 a 150, male de 200+, female de 200+},
        [2] = {xxx, xxx, xxx, xxx},
        [3] = {xxx, xxx, xxx, xxx},
        [4] = {xxx, xxx, xxx, xxx},
}
 
    if getPlayerSlotItem(cid, slot).itemid ~= id_item then
        return doPlayerSendCancel(cid, "Você deve colocar o item no local correto!")
    end
    
    if getPlayerStorageValue(cid, storage) < 1 then 
        return doPlayerSendCancel(cid, "Você não pode usar esse item.")
    end
    
    if getPlayerSoul(cid) < min_soul then
        return doPlayerSendCancel(cid, "Você precisa ter no mínimo "..min_soul.." soul para poder usar esse item.")
    end
    
    if getPlayerStorageValue(cid, 110291) > os.time () then
        return doPlayerSendCancel(cid, "Aguarde "..getPlayerStorageValue(cid, 110291) - os.time ().." segundo(s) para usar este item novamente.")
    end
     
    i = 2
    local function doRemoveSoul(cid)
        if i == max_time then return true end
        if not isCreature(cid) then return true end
        if getPlayerSlotItem(cid, slot).itemid ~= id_item then 
            doRemoveCondition(cid, CONDITION_OUTFIT)
            doRemoveSoul(cid)
            return true
        end
        i = i + 2
        doPlayerAddSoul(cid, -1)
        addEvent(doRemoveSoul, 2000, cid)
    end
    
    local d = getPlayerVocation(cid)
    
    doRemoveSoul(cid)
    setPlayerStorageValue(cid, 110291, os.time () + max_time)
        if getPlayerLevel(cid) >= 100 and getPlayerLevel(cid) <= 150 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][2]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][1]}, -1)
            end
        elseif getPlayerLevel(cid) >= 200 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][4]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][3]}, -1)
            end
        end
    addEvent(function()
        if not isCreature(cid) then return true end
        if getCreatureCondition(cid, CONDITION_OUTFIT) then
            doRemoveCondition(cid, CONDITION_OUTFIT)
        end
    end, max_time*1000)
    return true
end
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

 

se quiser tentar..

e sobre as skills bônus, acho q só sei fazer a de speed :x

function onUse(cid, item, frompos, item2, topos)
 
local max_time = 100     --tempo máximo (no caso do seu exemplo, 1min e 40 segundos).
local min_soul = 200     --Mínimo de soul pra usar o item.
local slot = 8   --Slot do item.
local id_item = xxx    --ID do item.
local storage = 410294
local t = {
        [1] = {xxx, xxx, xxx, xxx},      --[id da vocation] = {id da outfit male de lv 100 a 150, female de 100 a 150, male de 200+, female de 200+},
        [2] = {xxx, xxx, xxx, xxx},
        [3] = {xxx, xxx, xxx, xxx},
        [4] = {xxx, xxx, xxx, xxx},
}
 
    if getPlayerSlotItem(cid, slot).itemid ~= id_item then
        return doPlayerSendCancel(cid, "Você deve colocar o item no local correto!")
    end
    
    if getPlayerStorageValue(cid, storage) < 1 then 
        return doPlayerSendCancel(cid, "Você não pode usar esse item.")
    end
    
    if getPlayerSoul(cid) < min_soul then
        return doPlayerSendCancel(cid, "Você precisa ter no mínimo "..min_soul.." soul para poder usar esse item.")
    end
    
    if getPlayerStorageValue(cid, 110291) > os.time () then
        return doPlayerSendCancel(cid, "Aguarde "..getPlayerStorageValue(cid, 110291) - os.time ().." segundo(s) para usar este item novamente.")
    end
     
    i = 2
    local function doRemoveSoul(cid)
        if i == max_time then return true end
        if not isCreature(cid) then return true end
        if getPlayerSlotItem(cid, slot).itemid ~= id_item then 
            doRemoveCondition(cid, CONDITION_OUTFIT)
            doRemoveSoul(cid)
            return true
        end
        i = i + 2
        doPlayerAddSoul(cid, -1)
        addEvent(doRemoveSoul, 2000, cid)
    end
    
    local d = getPlayerVocation(cid)
    
    doRemoveSoul(cid)
    setPlayerStorageValue(cid, 110291, os.time () + max_time)
        if getPlayerLevel(cid) >= 100 and getPlayerLevel(cid) <= 150 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][2]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][1]}, -1)
            end
        elseif getPlayerLevel(cid) >= 200 then
            if getPlayerSex(cid) == 0 then
                doSetCreatureOutfit(cid, {lookType = t[d][4]}, -1)
            elseif getPlayerSex(cid) == 1 then
                doSetCreatureOutfit(cid, {lookType = t[d][3]}, -1)
            end
        end
    addEvent(function()
        if not isCreature(cid) then return true end
        if getCreatureCondition(cid, CONDITION_OUTFIT) then
            doRemoveCondition(cid, CONDITION_OUTFIT)
        end
    end, max_time*1000)
    return true
end

 

Zipter está funcionando agora a parte de adicionar skill não sei se está pegando. Eu testei e não vi diferença quando a velocidade.

 

Eu tenho um script que vejo todas as informações do player, inclusive sua velocidade.

 

Verifiquei a velocidade do player antes de usar e depois e a velocidade estava a mesma.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...