Ir para conteúdo

Tadelho

Membro
  • Registro em

  • Última visita

Solutions

  1. Tadelho's post in (Resolvido)Sistema de Dodge sem item was marked as the answer   
    @Guilherme HP , vou te dar uma ideia adaptando um script que uso no meu servidor.
     
    Crie um creaturescript chamado "playerdodge.lua", por exemplo. (o nome você escolhe). Nele, vamos montar um script que, sempre que o jogador for receber um dano, fará uma verificação afim de anular ou não o dano recebido. O script ficaria mais ou menos como:
     
    local dodgechance = 20 -- chance em % do sistema dodge funcionar local multiplier = 0 -- valor pelo qual o dano será multiplicado function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS then if isPlayer(attacker) or isCreature(attacker) then if dodgechance >= math.random (0, 100) then value = math.ceil(value*multiplier) doTargetCombatHealth(attacker, cid, combat, -value, -value, 255) doSendAnimatedText(getCreaturePos(cid), "Dodge", 19) return false end end end return true end Explicando o script: a variável "dodgechance" determinará em quantos % das vezes o golpe cairá na condição de ser anulado. Fiz em base centesimal (baseado em uma divisão por 100), mas isso pode ser mudado conforme o gosto do usuário.
     
    A variável "multiplier" dirá por quanto o dano que seria recebido será multiplicado, isto é, se deixarmos o valor em "1", o dano será recebido integralmente. Para o valor "2", receberíamos o dano em dobro. Como queremos anular o dano por completo, vamos multiplicar por "0".
     
    A seguir, a função onStatsChange fará a verificação sempre que houver uma alteração no status do personagem; no caso, sempre que ele perca vida, para que possamos anular o dano vindo de criaturas e jogadores e tenhamos o resultado que você pediu. Dentro dela temos a verificação matemática da chance, a atualização do dano e a aplicação do mesmo. Ao final, a mensagem também está configurada como "Dodge", mas você pode alterar se quiser.
    --
    Feito isso, você deverá registrar esse creatuerscript em todos os players. Faremos da seguinte maneira: no creaturescripts.xml, adicione o evento para que seja reconhecido.
     
    <event type="statschange" name="playerdodge" event="script" value="playerdodge.lua"/>  
    Obs: preencha em "value" o nome do arquivo.lua que você escolhe lá em cima.
     
    Agora basta registrar o evento nos jogadores. Há algumas formas de fazer isso, uma fácil é registrar todos os players assim que fizerem o login.
    Ainda na pasta creaturescripts/scripts, vá em login.lua e dentro da função onLogin(cid) adicione o código; 
    registerCreatureEvent(cid, "playerdodge") Obs: o nome entre aspas deverá ser o mesmo nome que você colocou como valor de "name" no arquivo creaturescripts.xml.
     
    Pronto, está feito.
  2. Tadelho's post in (Resolvido)Ajudar a colocar porcentagem nesse script! was marked as the answer   
    Sim, eu entendi isso. O problema é que com essa disposição de 50%-30%-10%, em 10% das vezes não acontecerá do jogador ganhar qualquer um dos itens listados. Mesmo que o sorteio dos itens seja independente, ainda há o risco também de nenhum dos itens ser sorteado, então eu assumi que ele simplesmente perderá em 10% das vezes. @leozincorsair 
     
    Sorteio para ganhar um item ou outro, 1° script.
    Sorteio independente de cada item, 2° script.
    -- CONFIGURAÇÕES -- PR = {11413, 11414, 11467} -- ID dos itens que será sorteado. money = {9970, 'Royal Coins'} -- ID do crystal coin e nome. count = 50 -- Quantidade de dinheiro. cast = "[Cassino]" function onUse(cid, item, fromPosition, itemEx, toPosition) local chance = math.random(1,100) local CB = { doSendAnimatedText, doSendMagicEffect, doPlayerAddItem, doPlayerRemoveItem} if not CB[4](cid, money[1], count) then doPlayerSendCancel(cid, "Você precisa de "..count.." "..money[2].." pra apostar.") CB[2](getThingPos(cid), CONST_ME_POFF) else if chance <= 50 then CB[3](cid, PR[1], 2) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[1]).."", 22) elseif chance > 50 and <= 80 then CB[3](cid, PR[2], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[2]).."", 22) elseif chance > 80 and <= 90 then CB[3](cid, PR[3], 1) doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[3]).."", 22) elseif chance > 90 then doBroadcastMessage(""..cast.." Você perdeu sua aposta.", 22) return TRUE end return TRUE end -- CONFIGURAÇÕES -- PR = {11413, 11414, 11467} -- ID dos itens que será sorteado. money = {9970, 'Royal Coins'} -- ID do crystal coin e nome. count = 50 -- Quantidade de dinheiro. cast = "[Cassino]"  function onUse(cid, item, fromPosition, itemEx, toPosition) local chance1, chance2, chance3 = math.random(1,100) local CB = { doSendAnimatedText, doSendMagicEffect, doPlayerAddItem, doPlayerRemoveItem} if not CB[4](cid, money[1], count) then     doPlayerSendCancel(cid, "Você precisa de "..count.." "..money[2].." pra apostar.")                        CB[2](getThingPos(cid), CONST_ME_POFF) else     if chance1 <= 50 then     CB[3](cid, PR[1], 2)     doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[1]).."", 22)     end     if chance2 <= 30 then     CB[3](cid, PR[2], 1)     doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[2]).."", 22)     end     if chance3  <= 10 then     CB[3](cid, PR[3], 1)     doBroadcastMessage(""..cast.." Você Obteve um "..getItemNameById(PR[3]).."", 22)     end         if chance1 > 50 and chance2 > 30 and chance3 > 10 then     doBroadcastMessage(""..cast.." Você perdeu sua aposta.", 22)     end return TRUE end return TRUE end
  3. Tadelho's post in (Resolvido)GlobalStorages ou Storage para players was marked as the answer   
    @Vodkart , exatamente. Só descobri isso porque executei um serversave, até então eu não tinha recebido qualquer mensagem de erro.
     
    Consegui resolver, aparentemente! Eu simplesmente adicionei a coluna "world_id" na tabela "global_storage" e agora está funcionando. Fechei e abri o servidor e agora o script original funciona da maneira esperada e novos jogadores não ativam mais o script. O evento ocorre apenas uma vez!
     
    Ficou assim:


     
     
    Obrigado a todos que deram atenção ao tópico! O problema não era no script, mas sim no meu database.
     
    Obs: eu coloquei o valor padrão do world_id como "0" porque este é valor configurado no meu config.lua. Se alguém que estiver lendo isso utilizar um valor diferente, terá de adaptar.
  4. Tadelho's post in (Resolvido)DOUBLE HIT NA ARMA was marked as the answer   
    @OmegaZero 
    Cara, eu não sei qual a versão de servidor que você está utilizando. Eu vou te fazer aqui um script para TFS 0.4.0, é bem simples.
     
    Crie um arquivo .lua na pasta ...weapons/scripts (escolha o nome do arquivo, ex: "script.lua")
     
    Dentro do arquivo insira o seguinte código:
     
     
    Explicando o script: toda vez que você atacar com a arma, ele irá sortear um número de 1 a 100. Se este número for maior que a chance que você determinou, o ataque ocorrerá normalmente. Se for menor, a arma fará um ataque adicional 500 milissegundos depois do primeiro (ataque duplo).
     
    Agora vá em weapons.xml e registre este script na arma que você quer que tenha esse comportamento. Ex: 
     
    Obs: melee id = o ID number da arma que você quer.
     
    Para TFS 0.4.0 é isso. Se você estiver usando outra versão, não saberei ajudar.

Informação Importante

Confirmação de Termo