Ir para conteúdo
  • Cadastre-se

(Resolvido)Aol Duração 30 Death


Ir para solução Resolvido por Danihcv,

Posts Recomendados

to precisando de um Aol que funcione durante 30x porexemplo eu to com o Aol,ai morro 1,2,3,4... e meu Loot não cai(a menos que esteje red ou black),ai quando for a 30x q eu morri com o mesmo aol o aol some.

 

Rep+ pra quem ajuda

 

Projeto/Serviços que desenvolvi durante esse Tempo.

[SERVIDOR] - NTO By Madara Rinnegan - Criado em 2014

Link para o post
Compartilhar em outros sites

Vê se assim funciona:

Vá na pasta data/creaturescripts/scripts e veja se tem um arquivo chamado preparedeath.lua se tiver basta substituir seu conteúdo inteiro por este:

local stor = {}

function onDeath(cid, corpse, deathList, lastHitKiller, mostDamageKiller)
if isPlayer(cid) == TRUE then
if (getPlayerSlotItem(cid, 2).itemid == 2173) then
doCreatureSetDropLoot(cid, false)
doPlayerSetLossSkill(cid, false)
doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 10)
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA)
if #stor < 30 then
table.insert(stor, (#stor + 1))
else
table.remove(stor, 30)
table.remove(stor, 29)
table.remove(stor, 28)
table.remove(stor, 27)
table.remove(stor, 26)
table.remove(stor, 25)
table.remove(stor, 24)
table.remove(stor, 23)
table.remove(stor, 22)
table.remove(stor, 21)
table.remove(stor, 20)
table.remove(stor, 19)
table.remove(stor, 18)
table.remove(stor, 17)
table.remove(stor, 16)
table.remove(stor, 15)
table.remove(stor, 14)
table.remove(stor, 13)
table.remove(stor, 12)
table.remove(stor, 11)
table.remove(stor, 10)
table.remove(stor, 9)
table.remove(stor, 8)
table.remove(stor, 7)
table.remove(stor, 6)
table.remove(stor, 5)
table.remove(stor, 4)
table.remove(stor, 3)
table.remove(stor, 2)
table.remove(stor, 1)
end
return TRUE
end
end
return TRUE
end

 

Se não tiver, adicione essa tag ao arquivo creaturescripts.xml:

	<event type="death" name="SkullAmulet" event="script" value="preparedeath.lua"/>

E crie o arquivo preparedeath.lua e coloque o código que eu coloquei aí.

 

 

 

Se funcionar, eu vejo se dá pra simplificar. 

É pq eu não sei se dá pra esvaziar uma table toda. To pesquisando aqui.

 

@Edit:

Independente do resultado do script acima, teste esse tambem:

local stor = {}

function onDeath(cid, corpse, deathList, lastHitKiller, mostDamageKiller)
if isPlayer(cid) == TRUE then
if (getPlayerSlotItem(cid, 2).itemid == 2173) then
doCreatureSetDropLoot(cid, false)
doPlayerSetLossSkill(cid, false)
doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 10)
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA)
if #stor < 30 then
table.insert(stor, (#stor + 1))
else
for k in pairs (t) do
    t[k] = nil
end
end
return TRUE
end
end
return TRUE
end

Obs: Não deixe de testar os dois códigos. O segundo está mais otimizado, por isso será melhor se ele funcionar logo de primeira. Mas se ele não funcionar, teste o primeiro e diga o resultado.

Editado por danihcv (veja o histórico de edições)

Te ajudei?? REP + e ficamos quites... <ahttp://www.tibiaking.com/forum/uploads/emoticons/default_happyy.png' alt=';D'>

Atenciosamente,

Daniel.

Abraços!

Link para o post
Compartilhar em outros sites

irei ver se funciona ja edito aki..

 

--edit--

funciono não ele fica Infinito ja fis meu char morre 40x '-'

Editado por Onepiece (veja o histórico de edições)

 

Projeto/Serviços que desenvolvi durante esse Tempo.

[SERVIDOR] - NTO By Madara Rinnegan - Criado em 2014

Link para o post
Compartilhar em outros sites

Testou os dois scripts?

Dá algum erro na distro?

Editado por danihcv (veja o histórico de edições)

Te ajudei?? REP + e ficamos quites... <ahttp://www.tibiaking.com/forum/uploads/emoticons/default_happyy.png' alt=';D'>

Atenciosamente,

Daniel.

Abraços!

Link para o post
Compartilhar em outros sites

não simplesmente,fica infinito,sem erro sem nada

 

Projeto/Serviços que desenvolvi durante esse Tempo.

[SERVIDOR] - NTO By Madara Rinnegan - Criado em 2014

Link para o post
Compartilhar em outros sites

Nos dois scripts?

Te ajudei?? REP + e ficamos quites... <ahttp://www.tibiaking.com/forum/uploads/emoticons/default_happyy.png' alt=';D'>

Atenciosamente,

Daniel.

Abraços!

Link para o post
Compartilhar em outros sites

Putz... Burrei, acabei de reler o 2° script e vi que eu declarei a table errada, uma table inexistente.

local stor = {}

function onDeath(cid, corpse, deathList, lastHitKiller, mostDamageKiller)
if isPlayer(cid) == TRUE then
if (getPlayerSlotItem(cid, 2).itemid == 2173) then
doCreatureSetDropLoot(cid, false)
doPlayerSetLossSkill(cid, false)
doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 10)
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA)
if #stor < 30 then
table.insert(stor, (#stor + 1))
else
for k in pairs(stor) do
    stor[k] = nil
end
end
end
end
return TRUE
end

Tenta agora.

Editado por danihcv (veja o histórico de edições)

Te ajudei?? REP + e ficamos quites... <ahttp://www.tibiaking.com/forum/uploads/emoticons/default_happyy.png' alt=';D'>

Atenciosamente,

Daniel.

Abraços!

Link para o post
Compartilhar em outros sites

Faz um bom tempo que não scripteio, mas pelo que entendi da sua descrição, isso talvez baste. E eu não sei como esse AoL funciona (não jogo Tibia). Na verdade, só li o código do danihcv e tirei minha conclusão sobre.

Como ele quer que o item tenha 30 cargas, basta usar atributos. Fica mais fácil.

function onDeath(cid, corpse, deathList, lastHitKiller, mostDamageKiller)
    if isPlayer(cid) then
        if getPlayerSlotItem(cid, 2).itemid == 2173 then
            local v = getItemAttribute(getPlayerSlotItem(cid, 2).uid, "charges") or 0
            if v < 29 then  
                doCreatureSetDropLoot(cid, false)
                doPlayerSetLossSkill(cid, false)
                doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 10)
                doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA)
                doItemSetAttribute(getPlayerSlotItem(cid, 2).uid, "charges", v + 1)                
            else
                doRemoveItem(getPlayerSlotItem(cid, 2).uid)
            end
        end
    end
    return true
end

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites

Faz um bom tempo que não scripteio, mas pelo que entendi da sua descrição, isso talvez baste. E eu não sei como esse AoL funciona (não jogo Tibia). Na verdade, só li o código do danihcv e tirei minha conclusão sobre.

Como ele quer que o item tenha 30 cargas, basta usar atributos. Fica mais fácil.

function onDeath(cid, corpse, deathList, lastHitKiller, mostDamageKiller)
    if isPlayer(cid) then
        if getPlayerSlotItem(cid, 2).itemid == 2173 then
            local v = getItemAttribute(getPlayerSlotItem(cid, 2).uid, "charges") or 0
            if v < 29 then  
                doCreatureSetDropLoot(cid, false)
                doPlayerSetLossSkill(cid, false)
                doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 10)
                doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA)
                doItemSetAttribute(getPlayerSlotItem(cid, 2).uid, "charges", v + 1)                
            else
                doRemoveItem(getPlayerSlotItem(cid, 2).uid)
            end
        end
    end
    return true
end

O certo não seria isso ?

 

function onDeath(cid, corpse, deathList, lastHitKiller, mostDamageKiller)
    if isPlayer(cid) then
        if getPlayerSlotItem(cid, 2).itemid == 2173 then
            local v = getItemAttribute(getPlayerSlotItem(cid, 2).uid, "charges") or 0
            if v >= 1 then  
                doCreatureSetDropLoot(cid, false)
                --[[doPlayerSetLossSkill(cid, false) < não precisa pois aol não salva skill]]
                doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 10)
                doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HOLYAREA)
                doItemSetAttribute(getPlayerSlotItem(cid, 2).uid, "charges", v - 1)                
            else
                doRemoveItem(getPlayerSlotItem(cid, 2).uid)
            end
        end
    end
    return true
end
/\ Não sei se estou certo, mas, pode ser uma possibilidade pois não testei nada.

@Edit

Meu deus, odeio quando os Quote buga.

Editado por Snowsz (veja o histórico de edições)
                              _
                          .-'` `}
                  _./)   /       }
                .'o   \ |       }
                '.___.'`.\    {`
                /`\_/  , `.    }                                      ME DA UMA NOZ!
                \=' .-'   _`\  {
                 `'`;/      `,  }
                    _\   @   ;  }
                   /__`;-...'--'

Cluck!

Link para o post
Compartilhar em outros sites
if v < 29 then 

Se as charges do seu AoL forem menores que 29, ou seja, você tiver morrido 29 vezes com ele, você não vai perder items, experiência, ou seja lá o quê você deixa de perder com AoL. Se você colocar como mostrou (v >= 1), o item vai ser removido automaticamente, visto que, caso as charges não sejam maiores ou iguais a 1, é programado para remover o item.

doPlayerSetLossSkill(cid, false)

E sobre essa função: como eu já disse, não faço ideia do quê AoL faz, e me baseei no código do danihcv. Você pode removê-la, se quiser.

doItemSetAttribute(getPlayerSlotItem(cid, 2).uid, "charges", v - 1)

E sobre isso: os atributos tem valor inicial nulo.

Neste código, fiz uma coisinha na variável v para que, no caso do valor do atributo charges ser nulo, o valor adotado seja 0. Setando o valor deste atributo para v - 1, as charges passariam a ser negativas. 

Editado por zipter98 (veja o histórico de edições)

não respondo pms solicitando suporte em programação/scripting

Link para o post
Compartilhar em outros sites
if v < 29 then 

Se as charges do seu AoL forem menores que 29, ou seja, você tiver morrido 29 vezes com ele, você não vai perder items, experiência, ou seja lá o quê você deixa de perder com AoL. Se você colocar como mostrou (v >= 1), o item vai ser removido automaticamente, visto que, caso as charges não sejam maiores ou iguais a 1, é programado para remover o item.

doPlayerSetLossSkill(cid, false)

E sobre essa função: como eu já disse, não faço ideia do quê AoL faz, e me baseei no código do danihcv. Você pode removê-la, se quiser.

doItemSetAttribute(getPlayerSlotItem(cid, 2).uid, "charges", v - 1)

E sobre isso: os atributos tem valor inicial nulo.

Neste código, fiz uma coisinha na variável v para que, no caso do valor do atributo charges ser nulo, o valor adotado seja 0. Setando o valor deste atributo para v - 1, as charges passariam a ser negativas. 

 

O problema é que não testei, e tenho certas batalhas com doItemSetAttribute e getPlayerSlotItem :P, quando tento checar o atributo attack do slot esquerdo da mão do player retorna nil, mesmo com espada, o desgraça...

                              _
                          .-'` `}
                  _./)   /       }
                .'o   \ |       }
                '.___.'`.\    {`
                /`\_/  , `.    }                                      ME DA UMA NOZ!
                \=' .-'   _`\  {
                 `'`;/      `,  }
                    _\   @   ;  }
                   /__`;-...'--'

Cluck!

Link para o post
Compartilhar em outros sites

testei todos os scripts nem um funcionou :'C,e a proposito o meu Servidor é de NTO

 

Projeto/Serviços que desenvolvi durante esse Tempo.

[SERVIDOR] - NTO By Madara Rinnegan - Criado em 2014

Link para o post
Compartilhar em outros sites

Tente:

function onDeath(cid)
    aol = 2173
    slot = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    
    if slot.itemid == aol and getItemAttribute(slot.uid, 'charges') == 1 then
        doRemoveItem(slot.uid)
    end
    
    return true
end

PS: Não se esqueça de registrar o creature event death em login.lua




Se não obtiver sucesso, outro método possível seria por storage:

function onDeath(cid)
    aol = {2173, 30}
    stor = 76543
    slot = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    
    if slot.itemid == aol[1] then
        if getPlayerStorageValue(cid, stor) < 1 then
            setPlayerStorageValue(cid, stor, aol[2] - 1)
        elseif getPlayerStorageValue(cid, stor) == 1 then
            setPlayerStorageValue(cid, stor, -1)
            doRemoveItem(slot.uid)
        else
            setPlayerStorageValue(cid, stor, getPlayerStorageValue(cid, stor) - 1)
        end
    end
    
    return true
end

Novamente: Não se esqueça de registrar o creature event death em login.lua




Certifique-se de que a seguinte tag no seu amulet of loss em items.xml (por precaução):

<attribute key="preventDrop" value="1" />
Editado por Suicide (veja o histórico de edições)

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

Para que essas lenga lengas toda? o.O

 

vai em item.xml e mude isso

	<item id="2173" article="an" name="amulet of loss">
		<attribute key="weight" value="420"/>
		<attribute key="slotType" value="necklace"/>
		<attribute key="preventDrop" value="1"/>
		<attribute key="charges" value="1"/>
	</item>

para isso

	<item id="2173" article="an" name="amulet of loss">
		<attribute key="weight" value="420"/>
		<attribute key="slotType" value="necklace"/>
		<attribute key="preventDrop" value="1"/>
		<attribute key="charges" value="30"/>
	</item>

Te ajudei? Então Rep + ;)

Link para o post
Compartilhar em outros sites

Para que essas lenga lengas toda? o.O


Testei desse modo. As charges bugaram e deixaram o item infinito, por isso não indiquei essas tags.

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

vdd, testei no otx nao bugou, ate que chegou na ultima charge, perdao pelo post

Te ajudei? Então Rep + ;)

Link para o post
Compartilhar em outros sites

 

Tente:

function onDeath(cid)
    aol = 2173
    slot = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    
    if slot.itemid == aol and getItemAttribute(slot.uid, 'charges') == 1 then
        doRemoveItem(slot.uid)
    end
    
    return true
end

PS: Não se esqueça de registrar o creature event death em login.lua

Se não obtiver sucesso, outro método possível seria por storage:

function onDeath(cid)
    aol = {2173, 30}
    stor = 76543
    slot = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    
    if slot.itemid == aol[1] then
        if getPlayerStorageValue(cid, stor) < 1 then
            setPlayerStorageValue(cid, stor, aol[2] - 1)
        elseif getPlayerStorageValue(cid, stor) == 1 then
            setPlayerStorageValue(cid, stor, -1)
            doRemoveItem(slot.uid)
        else
            setPlayerStorageValue(cid, stor, getPlayerStorageValue(cid, stor) - 1)
        end
    end
    
    return true
end

Novamente: Não se esqueça de registrar o creature event death em login.lua

Certifique-se de que a seguinte tag no seu amulet of loss em items.xml (por precaução):

<attribute key="preventDrop" value="1" />

poderia me manda a tag que eu preciso coloca na login.xml? é q to meio confuso com essa parada

 

--edit--

uma coisa que estou esquecendo de menciona e espero q esteje fazendo certo se caso estive augo errado me corrigem pfv

 

na items.xml colokei assim a tag

 

    <item id="2138" article="a" name="jashin amulet">
        <attribute key="description" value="Nao deixa perder items a menos que esteja redskull." />
        <attribute key="weight" value="5200" />
        <attribute key="armor" value="3" />
        <attribute key="slotType" value="necklace" />
        <attribute key="preventDrop" value="2" />
    </item>

na creaturescript.xml colokei assim

<event type="death" name="SkullAmulet" event="script" value="preparedeath.lua"/>

e em login.lua colokei assim

registerCreatureEvent(cid, "SkullAmulet") 

se caso augo estivér errado ou se falta augo porfavor ajuda ae é que essa Jam de 30 de duração é realmente importante para oque estou fazendo.

Editado por Onepiece (veja o histórico de edições)

 

Projeto/Serviços que desenvolvi durante esse Tempo.

[SERVIDOR] - NTO By Madara Rinnegan - Criado em 2014

Link para o post
Compartilhar em outros sites
poderia me manda a tag que eu preciso coloca na login.xml? é q to meio confuso com essa parada

 

Relaxa. Mas não é uma tag, é uma função e o arquivo é com extensão Lua.

Remova qualquer outro creaturescript de aol e faça o seguinte:

amuletofloss.lua (data\creaturescripts\scripts):

function onDeath(cid)
    aol = {2173, 30}
    stor = 76543
    slot = getPlayerSlotItem(cid, CONST_SLOT_NECKLACE)
    
    if slot.itemid == aol[1] then
        if getPlayerStorageValue(cid, stor) < 1 then
            setPlayerStorageValue(cid, stor, aol[2] - 1)
        elseif getPlayerStorageValue(cid, stor) == 1 then
            setPlayerStorageValue(cid, stor, -1)
            doRemoveItem(slot.uid)
        else
            setPlayerStorageValue(cid, stor, getPlayerStorageValue(cid, stor) - 1)
        end
    end
    
    return true
end

Tag - creaturescripts.xml (data\creaturescripts):

<event type="death" name="AmuletOfLoss" event="script" value="amuletofloss.lua"/>

Registre o creature event em login.lua (data\creaturescripts\scripts):

registerCreatureEvent(cid, "AmuletOfLoss")
Editado por Suicide (veja o histórico de edições)

The corrupt fear us.

The honest support us.

The heroic join us.

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo