Ir para conteúdo

Night Wolf

Herói
  • Total de itens

    341
  • Registro em

  • Última visita

  • Dias Ganhos

    18

Histórico de Reputação

  1. Upvote
    Night Wolf deu reputação a Furabio em Colocando Descrição ao comprar ITEM   
    Primeira coisa, quando for pedir ajuda em um script poste ele inteiro, o que os scripters mais odeiam é gente que não faz isso, na maioria da vezes ignoramos tópicos assim.
     
    adicione isso no seu script deve funcionar :
    player = Player(cid) if(param == "super divine staff") then if player:getItemCount(9971) >= 60 then local bag = player:addItem(1997, 1) local item = bag:addItem(8922, 1) item:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "Este item pode ser adquirido através do shopping. Adquirido dia " .. os.date("%d/%m/%Y - %X") .." por ".. player:getName() ..". Serial: ".. player:getGuid() ..".") player:removeItem(9971, 60) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você comprou um super divine staff com sucesso.") player:setStorageValue(11548, os.time()+30) return true else player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Você não possui a quantidade necessária para comprar.") return true end end
  2. Upvote
    Night Wolf deu reputação a othereality em Item que remove luz do personagem   
    Eu sei dizer que a luz do Utevo Lux é uma condição de luz no player que tem uma intensidade e uma duração, se você adicionar uma nova condição de luz ao player ela substitui a anterior, ou seja é possível apagar o Utevo Lux usando isso:
    local condition = createConditionObject(CONDITION_LIGHT) setConditionParam(condition, CONDITION_PARAM_LIGHT_LEVEL, 0) Mas sobre a tocha eu não sei nada
  3. Upvote
    Night Wolf recebeu reputação de chateadoagr em Sistema De Itens Parcel   
    Usa esse script em actions/scripts



    e em actions.xml vc coloca

    <action itemid="id da machete 1;id da machete2" event="script" value="nomequevcbotounoarquivoacima.lua"/>
  4. Upvote
    Night Wolf recebeu reputação de Darkraus em Erro em script (sem erro no distro)   
    sim, e vc tem que criar a condition venom tb.. da mesma forma q vc cria em spells
  5. Upvote
    Night Wolf recebeu reputação de Yan Liima em Bird Hunt - Atire no pássaro.   
    Fala galera, vim compartilhar com vcs um dos sistemas que eu fiz baseado no jogo Bird Hunt e que foi imbutido em alguns servidores famosos, sendo o Korelin um deles.
    Obs: Testado em TFS 0.3.6 mas deve funcionar em TFS 0.4 sem problema

    aqui tem uma pequena imagem demonstrando o sistema sendo utilizado:



    Bom, antes de tudo eu vou ensinar vocês a criar um mapa apropriado pois isso é 90% das dificuldades que os players enfrentam quando tentam adicionar o sistema.

    Inicialmente vc vai precisar criar uma area no seu mapa editor +- parecida com a que eu fiz na imagem abaixo:



    Feito isso vc deverá colocar uniqueid 16480 na porta e actionid 14874 em todos os lugares que o player pode percorrer (da placa pra \/ todos os quadrados verdes deverão conter esse actionid)

    Colocado os ids, vc deverá fazer a sala à prova de bugs, para isso você terá que seguir essas especificações:



    Note que em verde são os lugares que vc deverá colocar protect zone e em roxo os locais onde vc deve colocar no logout zone. Agora perceba que nas posições onde o player irá andar, você vai colocar tanto no logout zone como protect zone, isso pra evitar ele de matar o bixo com spells e pra evitar que ele deslogue durante o mini game. Essa contagem de sqms eu vou explicar mais tarde na configuração do script, mas tenham ela em mente.

    Agora vamos aos scripts:
    Comece criando em data/lib um arquivo chamado 045- Bird Hunt Lib.lua e colocando isso dentro dele:



    Feito isso vá em data/actions/scripts e adicione um arquivo chamado seagul.lua que deverá conter:



    e adicione em actions.xml: <action uniqueid="16480" event="script" value="seagul.lua"/> Agora vá em data/movements/scripts e crie um arquivo chamado seagulmove.lua com o seguinte conteúdo:  
    E adicione as tags em movements.xml:
    <movevent type="StepIn" actionid="14872" event="script" value="seagulmove.lua"/> <movevent type="StepOut" actionid="14872" event="script" value="seagulmove.lua"/> Agora, pra deixar nosso sistema mais real e difícil, altere a velocidade do seagul de 200 pra 300 na pasta data/monsters/Birds/seagull.xml
    eu alterei tb a quantidade de vida q ele começa a fugir pra vida atual dele e fiz outras alterações pra tornar mais difícil, mas isso é com vcs.

    A maioria das coisas tá bem compreensível, com exceção das duas primeiras linhas de actions:
    rangecima = {x = -8, y = -4}, -- distancia em x e y da topos (ate a pos de cima)
    rangebaixo = {x = 0, y = 4}, -- distancia em x e y da topos (ate a pos de baixo)

    é aqui que entra aquela imagem, vc vai considerar a porta (o ponto cinza) como sendo nossa origem, ou seja, o ponto (0,0)
    rangecima é a distancia que eu tenho que percorrer em x e y pra chegar até a ponta de cima < e rangebaixo é a distancia que eu tenho que percorrer em x e y pra chegar até a ponta de baixo. Se vcs mudarem o tamanho da sala, fiquem ligados nisso.
    Obs: algumas pessoas fazem a sala virada pra direita também, nesse caso vc mantém a actions (pode usar inclusive o mesmo arquivo), só tem que alterar o movements pois lá vc define se é direita ou esquerda.

    É isso, espero que tenham gostado. O jogo é só por diversão mas vc pode alterar a função de atirar pra ganhar dinheiro por cada acerto ou então criar um npc que vc te dá X premio dependendo do seu recorde.. podendo esse premio inclusive ser uma key pra uma quest. Usem a imaginação e espero que aproveitem esse sistema.

    Abraços do Lobo.
  6. Upvote
    Night Wolf deu reputação a Skulls em Galeria de ideias   
    Valeu cara! Vou precisar de um cara que saiba client e design logo logo, se o projeto for pra frente. Se animar e manjar, te dou ideia quando isso acontecer! ^^ Possivel precisar de um mapper tb.
     
    @Topic
     
    Mais uma ideiazinha que saiu do atoismo:
    "Joga o player pro alto, vamos beber.. opa, não, pera."
     

  7. Upvote
    Night Wolf recebeu reputação de Darkraus em Erro em script (sem erro no distro)   
    quanto mais atual, mais recursos.. porém TFS 1.2 é MUITO diferente de 0.36... eu uso aqui em casa dois servidores (0.36 e 0.4)
  8. Upvote
    Night Wolf recebeu reputação de Darkraus em Erro em script (sem erro no distro)   
    de cara o erro q se enxerga é vc utilizando a função isPlayer(uid) sem o parâmetro.. vc quer verificar se o inimigo é um player?

    outra coisa.. setPlayerStorageValue(#inimigo, storage, 1) isso daqui não existe pois #inimigo retorna o numero de elementos numa tabela.


  9. Upvote
    Night Wolf recebeu reputação de Darkraus em Erro em script (sem erro no distro)   
    olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:

    local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5) local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)

    isCreature/isPlayer/isMonster verificam se determinado uid é criatura/player/monstro.. o parâmetro é o uid.

    Pra quem executa os callbacks, nós chamamos o uid de cid, mas pode ser muito bem isPlayer(getCreatureTarget(cid).uid)
    -- verifica se assim funciona.. vc só tem que colocar target = "1" na tag do spells.xml

    variantToNumber(var) representa o target.
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2) local escudo = 2520 local storage = 199901 function onCastSpell(cid, var) if isPlayer(variantToNumber(var)) then local slot1 = getPlayerSlotItem(variantToNumber(var), 5) local slot2 = getPlayerSlotItem(variantToNumber(var), 6) if slot1 or slot2 == escudo then setPlayerStorageValue(variantToNumber(var), storage, 1) doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180) end addEvent(function() if isCreature(cid) then setPlayerStorageValue(variantToNumber(var), storage, 0) doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180) end end,4000) end return doCombat(cid, combat, var) end  
  10. Upvote
    Night Wolf recebeu reputação de Darkraus em Erro em script (sem erro no distro)   
    eu tinha explicado ali:
    variantToNumber(var) representa o target.
    ----- o var da spell pode me retornar o uid do target através dessa função variantToNumber(var)

    Tem algumas discussões sobre isso aqui no xt, só procurar o tópico do @@Skulls
  11. Upvote
    Night Wolf deu reputação a Skulls em Instanciando Mapas v1.0   
    Fala galera, tudo bem?
    Semana passada abri uma dúvida perguntando se alguém conhecia algum jeito de players compartilharem o mesmo espaço no mapa sem interagirem entre si, como se fossem duas dimensões separadas. Ninguém soube me dar uma solução que fizesse exatamente isso, porém, o Danihcv me deu uma luz sugerindo que eu fizesse algo próximo de um instanciador de mapa. Ou seja, uma forma de clonar automaticamente um pedaço do mapa desejado sem ter que criar mil vezes no map editor.
    Ainda estou trabalhando na automação do mesmo - pretendo fazer um sistema, sem ser talkaction, que sempre que for necessário ele instancia uma novo espaço para aquele mesmo mapa. Esta é uma primeira versão, feita em talkaction pois achei melhor de trabalhar num primeiro momento e testar todas as funções que eu queria adicionar, ela faz basicamente cópia de uma área do mapa. Pro projeto que eu pensei para esse sistema é suficiente que ele suporte somente mapas do mesmo tamanho e, portanto, foquei em atender esse requisito. Ainda sim, é possível trabalhar com mapas de tamanhos diferentes, desde que eles fiquem em linhas diferentes.
    Vamos lá
     
    Primeiramente, eu fiz um banco de funções que foram utilizadas ou serão úteis mais para frente.
    Em lib, crie um arquivo chamado cloneMap.lua e adicione o código abaixo:
     
     
     
    As funções estão todas funcionando, porém algumas não foram utilizadas nessa versão, ficam de bônus pra vocês.
     
    Depois disso, vá em talkactions.xml adicione a tag:
    <talkaction words="!clonemap" event="script" value="cmap.lua"/> Feito isso, crie dentro de scripts um arquivo chamado cmap.lua e adicione o código abaixo:
     
     
     
     
    Por último, vá em globalevents/scripts e abra o arquivo start.lua.
    Dentro da função onStartup(), antes do return true, adicione as 3 linhas a seguir:
    setGlobalStorageValue(5546, -1) setGlobalStorageValue(5547, -1) setGlobalStorageValue(5548, -1) Pronto.
     
    Agora algumas configurações que você deve fazer de acordo com seu mapa:
     
    emptySpaceBeginPos - É a posição no mapa onde começa a área vazia que você determinou para a criação das instâncias (Canto superior esquerdo da área, ela cresce para direita até o fim do mapa e depois para baixo e se encerra quando o mapa acaba).
     
    Storages - Storages globais onde serão armazenadas os próximos valores X, Y e Z a serem utilizados. (A progressão no eixo z ainda não foi implementada, mas a lógica é a mesma).
     
    safe_dist - É a distância entre os mapas, você pode variar de acordo com a utilização que vai dar ao mapa.
     
    Feito isso, está pronto para utilizar o Instanciador de Mapas V1.0.
     
    Como funciona:
     
    !clonemap CenterX CenterY CenterZ Side Floors
     
    Centers (X, Y e Z) são as coordenadas centrais do seu mapa (e Z é o floor mais baixo do mapa, caso ele seja multi floor, isto é o floor de valor mais alto - ex, se o seu mapa vai de z=7 até z =10, use CenterZ = 10).
     
    Side é a distância entre o centro e uma das bordas (Caso o mapa não seja quadrado, basta usar a maior distância. É possível implementar usando a mesma lógica um SideX e SideY, mas eu não tive tempo de fazê-lo).
     
    Floors é o número de andares que tem o seu mapa, se ele ocupa só um andar floor = 1, 2 floor = 2 e assim por diante.
     
    Bom é isso, espero que gostem e que seja útil para vocês.
    Agora vou empenhar no sistema completo, assim que terminar eu posto a versão 2.0 do instanciador com muito mais recursos.
     
    Algumas Imagens
     
     
     
    OBSERVAÇÃO IMPORTANTE
    Quando você utilizar o comando ingame, esteja longe da área onde o mapa será criado, senão o seu cliente irá debugar. Nada acontece, na verdade, acho que é algum problema do cliente, assim que você abre o tibia novamente tudo se estabiliza, mas é chato ficar re-abrindo então evite isso.\
     
    Grande abraço.
     
    ps: Lembrando, novamente dos Créditos ao Danihcv pela ideia, sem o brainstorm por ele promovido no meu tópico isso não seria possível
  12. Upvote
    Night Wolf deu reputação a Skulls em Luna Event + bonus spell (inspirado no sot#01)   
    Fala galera, tudo bem?

    Então, eu li o sot#01 alguns dias atrás e achei bem legal a história no qual ele gira em torno.
    Tive algumas idéias e, mesmo o evento não tendo acontecido por falta de inscritos, resolvi fazer pra lembrar algumas coisas, afinal tinha uns 7 anos que não mexia com scripts para otserv.

    O resultado, que vou mostrar abaixo, é um evento global (mas que pode muito bem ser adaptado para uma quest ou outra finalidade). Como parte da recompensa do evento, fiz de bonus uma spell baseada na frozenOrb do whitewolf.

    Bom vamos lá.

    O Evento

    Basicamente é um evento estilo aquela brincadeira antiga de criança "dança das cadeiras".
    Como assim?
    Bom, na área do evento o número de espaços vazios vai ser sempre o número de players restantes no evento -1. Isso implica que, em cada turno, pelo menos um player deixará o evento.

    Contexto

    Luna é uma estrela endeusada pelos elfos e muito poderosa. De tempo em tempo ela se desperta todos os players onlines são convocados para tentarem domar a sua ira. Aquele que sobreviver à ira de Luna sem se congelar será capaz de controlar seu poder até o próximo despertar.
     
    editado: Esqueci de avisar que coloquei para ele ignorar o tile central na contagem de tiles livres pois no tile central, do meu mapa, eu coloquei um frozen starlight representando a luna e, a cada round, há uma animação na luna só para ficar bonitinho.
     
    Crie um arquivo chamado lunaevent.lua dentro de scripts e coloque o código abaixo nele:
     
     
     
    Em globalevents.xml coloque a tag:
    <globalevent name="Luna" interval="18000000" script="lunaevent.lua" /> A recompensa do evento é uma souvenir, um frozen starlight com o nome do vencedor do evento e x horas (no caso 5) podendo utilizar o poder de luna.

    Bom, eu criei uma spell para ilustrar o poder de luna e como utilizar o storage que foi preenchido para o vencedor do evento para controlar o uso de uma spell.
     
    Luna Strike
    Primeiramente adicione a tag abaixo em spells.xml:
    <instant name="Luna Strike" words="exori luna" lvl="100" manapercent="5" prem="0" range="6" casterTargetOrDirection="1" blockwalls="1" exhaustion="10000" groups="1,4000" icon="156" needlearn="0" event="script" value="attack/luna strike.lua"> <vocation id="1"/> <vocation id="2"/> <vocation id="3"/> <vocation id="4"/> <vocation id="5"/> <vocation id="6"/> <vocation id="7"/> <vocation id="8"/> </instant> Crie um arquivo chamado luna strike.lua dentro de scripts/attacks e coloque o código abaixo nele:
     
     
     
    Essa magia tem duas peculiaridades:
    1. Ela tem uma chance de 1/15 para cada hit que ela dá de congelar o alvo e tornalo imóvel por 1.8 segundos, o que já está implementado nesse script e já funciona.
    2. Em pvp, isso é, ao atacar um player, ela tem uma chance de 1/18 de liberar a Benção de Luna e tornar o caster imune aos ataques daquele player por 3 segundos (atenção, não são de todos os players da área, somente do player que liberou a benção de luna ao receber um hit).
    Para implementar essa segunda parte, precisamos ir em creature scripts.
    Adicione as tags abaixo a creaturescripts.xml:
    <event type="attack" name="NoAtt" event="script" value="luna.lua"/> <event type="cast" name="NoSpell" event="script" value="luna.lua"/> <event type="target" name="NoTgt" event="script" value="luna.lua"/> Crie um arquivo chamado luna.lua dentro de scripts e coloque o código abaixo nele:
     
     
     
    Pronto, o seu evento está configura e sua magia 'Luna Strike' poderá ser castada pelo último vencedor do mesmo.

    Espero que gostem, os scripts estão comentados e são bem auto-explicativos, mas qualquer dúvida podem me perguntar.
     
    Abraços,
  13. Upvote
    Night Wolf recebeu reputação de gabriel28 em Ajeitar esse NPC.   
    esse script é pra tfs 1.0, o seu é 1.0?
  14. Upvote
    Night Wolf deu reputação a warotserv em Anti Fast-attack Elf Bot   
    Bom... decidi postar agora o script que eu fiz para barrar os botters de fast attack.

    Primeiro, crie um arquivo chamado "antiBot.lua" em "data\creaturescripts\scripts" e nele adicione o seguinte conteúdo:
    -- counts physicals, casts .... [player name : creature cid] playerAttacksMade = {} playerActivateTime = {} playerBlocked = {} function tablelength(T) local count = 0 for _ in pairs(T) do count = count + 1 end return count end function onLogin(cid) if isPlayer(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Loading Anti Bot... done.' ) playerAttacksMade[cid] = {} playerActivateTime[cid] = {} playerBlocked[cid] = false end return true end function onLogout(cid) if isPlayer(cid) then playerAttacksMade[cid] = nil playerActivateTime[cid] = nil playerBlocked[cid] = nil end return true end function onStatsChange(cid, attacker, type, combat, value) local maxAttacks = { 6, --pos 1 6, --pos 2 6, --pos 3 6, --pos 4 7, --pos 5 7, --pos 6 7, --pos 7 7, --pos 8 } if not type == STATSCHANGE_HEALTHLOSS or not type == STATSCHANGE_MANALOSS or not isPlayer(attacker) then return true end if value <= 0 then return true end if playerAttacksMade[attacker][cid] == nil then playerAttacksMade[attacker][cid] = 0 playerActivateTime[attacker][cid] = os.time() end local currentTime = os.time() --TESTE --doPlayerSendTextMessage(attacker, MESSAGE_STATUS_CONSOLE_ORANGE, playerAttacksMade[attacker][cid] .. '________' .. attacker .. '_____' .. cid .. '______' .. currentTime .. '_______' .. playerActivateTime[attacker][cid] ) if currentTime >= playerActivateTime[attacker][cid] then playerActivateTime[attacker][cid] = currentTime + 1 playerAttacksMade[attacker][cid] = 0 else playerAttacksMade[attacker][cid] = playerAttacksMade[attacker][cid] + 1 end if playerAttacksMade[attacker][cid] > maxAttacks[getPlayerVocation(attacker)] then playerBlocked[attacker] = true doBroadcastMessage('O player ' .. getPlayerName(attacker) .. ' esta usando bot de fast attack. O seu ataque foi travado ate que ele relogue.', 21) doShowTextDialog(attacker,1952,"PARE DE USAR ELFBOT! Seu ataque foi bloqueado. Para destravar basta relogar. Obrigado. (Sistema exclusivo do ot)") return FALSE end return TRUE end function onCombat(cid, target) if isPlayer(cid) then if not playerBlocked[cid] then registerCreatureEvent(target, "AntiBot2") else return false end end return true end function onCast(cid, target) if isPlayer(cid) then if playerBlocked[cid] then return false end end return true end e em "creaturescripts.xml", encontrado em "data\creaturescripts" adicione:
    <event type="combat" name="AntiBot1" event="script" value="antiBot.lua"/> <event type="statschange" name="AntiBot2" event="script" value="antiBot.lua"/> <event type="login" name="AntiBot3" event="script" value="antiBot.lua"/> <event type="logout" name="AntiBot4" event="script" value="antiBot.lua"/> <event type="cast" name="AntiBot5" event="script" value="antiBot.lua"/> Agora vou explicar a parte configurável:



    Aqui você vai modificar qual o número máximo de ações de combate (que dão dano) que certa vocação poderá dar. Posição 1 é Sorcerer, 2 é Druid, 3 é Paladin, 4 é Knight e assim por diante....
    Escolha bem esses números! Caso você erre, ele irá ficar detectando erradamente.

    Por exemplo,vamos supor que o knight tenha o fastAttack em 500ms (logo ele executará 2 ataques por segundo) e que sua magia de dano de menor exhaust tenha um exhaust de apenas 600ms, logo o numero maximo de ataques dele por segundo será 4 (cuidado quando spells de dano diferentes puderem ser usadas ao mesmo tempo, daí você terá de acrescentar mais 1 ao número de ataques por segundo. Não se esqueça dos dots

    Por favor, testem e me falem o que acharam.


    Espero que ajude a tirar os botters de seu server.

    P.S.: Não me importo que roubem meus créditos e/ou postem em outros fórums. É bom espalhar esse script uma vez que botters nos servers 8.6 é muito comum.
  15. Upvote
    Night Wolf recebeu reputação de Darkraus em Algumas passivas   
    o começo é dificil e a gente erra em lugares que nunca imaginou que poderia errar, o importante é não desistir porque no próximo vc vai estar 10x mais atento em algo que outrora você havia errado. Com o tempo vc tá 10x mais atento pra qlqer coisa que vc poderia errar e o script sai perfeito ou quase perfeito mesmo antes de vc testar uma única vez.
    A prática leva à perfeição, da mesma forma que não cometemos erros de português por usarmos muito.. assim como português (ou inglês para alguns), Lua é uma linguagem.
  16. Upvote
    Night Wolf recebeu reputação de Darkraus em Algumas passivas   
    getPlayerStorageValue -- pegar o valor de determinado storage.

    O valor padrão pra todos os storages é -1, mas por convenção use sempre <= 0 e >= 1
  17. Upvote
    Night Wolf deu reputação a Kydrai em Monstros se matando   
    Na verdade as storages são utilizadas nas criaturas em geral, tanto que a função original é doCreatureSetStorage/getCreatureStorage (na versão 0.3.6 e 0.4).
    A única diferença de colocar no player é que salva no banco de dados no save, já no monstro/npc não salva quando ele morre ou desaparece.
    E também não tem como uma storage no monstro sobrescrever uma no player, como você disse a storage vai estar vinculada a um uid. No máximo, em alguns casos, você vai precisar checar se a criatura é um monstro, npc ou player nos scripts.
  18. Upvote
    Night Wolf recebeu reputação de SkyLigh em First Itens   
    [3] = {
    --equipment
    {{2389, 5}, {2660, 1}, {8923, 1}, {2456, 1}, {2544, 50}},
    --container
    {{2120, 1}, {2554, 1}, {7618, 1}}


    [iD DA VOCAÇÃO]
    -- equipamentos
    {{itemid, quantidade}}
    --- container [VEM DENTRO DA BP]
    {{itemid, quantidade}}

  19. Upvote
    Night Wolf recebeu reputação de Marco Oliveira em First Itens   
    [3] = {
    --equipment
    {{2389, 5}, {2660, 1}, {8923, 1}, {2456, 1}, {2544, 50}},
    --container
    {{2120, 1}, {2554, 1}, {7618, 1}}


    [iD DA VOCAÇÃO]
    -- equipamentos
    {{itemid, quantidade}}
    --- container [VEM DENTRO DA BP]
    {{itemid, quantidade}}

  20. Upvote
    Night Wolf deu reputação a SkyLigh em First Itens   
    local config = {
    [1] = {
    --equipment
    {{2175, 1}, {2190, 1}, {8819, 1}, {8820, 1}},
    --container
    {{2120, 1}, {2554, 1}, {7620, 1}}
    },
    [2] = {
    --equipment
    {{2175, 1}, {2182, 1}, {8819, 1}, {8820, 1}},
    --container
    {{2120, 1}, {2554, 1}, {7620, 1}}
    },
    [3] = {
    --equipment
    {{2389, 5}, {2660, 1}, {8923, 1}, {2456, 1}, {2544, 50}},
    --container
    {{2120, 1}, {2554, 1}, {7618, 1}}
    },
    [4] = {
    --equipment
    {{2509, 1}, {2465, 1}, {2481, 1}, {2478, 1}},
    --container
    {{8601, 1}, {8602, 1}, {2439, 1}, {2120, 1}, {2554, 1}, {7618, 1}}
    }
    }
     
    function onLogin(cid)
    local player = Player(cid)
    local targetVocation = config[player:getVocation():getId()]
    if not targetVocation then
    return true
    end
     
    if player:getLastLoginSaved() == 0 then
    for i = 1, #targetVocation[1] do
    player:addItem(targetVocation[1][1], targetVocation[1][2])
    end
     
    local backpack = player:addItem(1988)
    for i = 1, #targetVocation[2] do
    backpack:addItem(targetVocation[2][1], targetVocation[2][2])
    end
    end
    return true
    end

     
  21. Upvote
    Night Wolf recebeu reputação de kaleudd em [Spells] Checando Interferências na Trajetória   
    @@Caronte, acho q ele quis dizer estilo o Q da miss fortune no league of legends... qnd vc dá um tiro e mata o bixo o tiro rebate com dobro de dano se tiver alguém atrás (seguindo a direção), ficaria muito legal ter algo nesse sentido tb.
  22. Upvote
    Night Wolf recebeu reputação de Thillys Alves em Spell para TFS 1x, Teleporta Tile   
    local times = 3 --Quantos SQMs o jogador irá se mover. function isWalkable(pos, creature, proj, pz)-- by Nord if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true end local n = not proj and 2 or 2 for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then return false end end end return true end function onCastSpell(cid) local playerPos = getThingPos(cid) for i = 1, times do playerPos:getNextPosition(getCreatureLookDirection(cid)) if not isWalkable(playerPos, i == times, i == times, i == times) then doPlayerSendCancel(cid, "Sorry, destination not possible.") return false end end doTeleportThing(cid, playerPos) return true end  
  23. Upvote
    Night Wolf deu reputação a Skulls em Exori Grab Vis   
    Fala galera, tudo bem?
     
    Venho trazer pra vocês uma nova magia que fiz. Ela é basicamente um puxão que da um pouco de dano.
     
    Gif
     
     
     
    Em spells.xml coloque essa tag:
    <instant name="Energy Grab" words="exori grab vis" needtarget="1" lvl="40" mana="20" prem="1" range="5" blockwalls="1" exhaustion="2000" groups="1,2000" icon="122" needlearn="0" event="script" value="attack/energy grab.lua"> <vocation id="3"/> <vocation id="7"/> </instant> Em scripts/attack crie um arquivo chamado energy grab.lua e coloque o conteúdo abaixo:
    local grab_time = 350 local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) function onTargetCreature(cid, target) addEvent(executeGrab, grab_time, cid, target) end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") function executeGrab(cid, target, param) d = param or -1 if not isPlayer(cid) then return false end if not isCreature(target) then return false end local cpos, ppos = getCreaturePosition(target), getCreaturePosition(cid) local dir = getDirectionTo2(cpos, ppos) if d == -1 then doSendDistanceShoot(cpos, ppos, CONST_ANI_ENERGYBALL) end if getDistanceBetween(cpos, ppos) > 1 then doMoveCreature(target, dir) end if (d > 1 or d == -1) then addEvent(executeGrab, 30, cid, target, getDistanceBetween(cpos, ppos)) end return true end function performCombat(cid, combat, var) return doCombat(cid, combat, var) end function onCastSpell(cid, var) return doCombat(cid, combat, setSpellTarget(cid, var)) end Para funcionar corretamente, isso é puxando quem estiver na frente da magia e nao o target inicial é necessário que você utilize o sistema disponibilizado por mim neste tópico: http://www.xtibia.com/forum/topic/239458-spells-checando-interferencias-na-trajetoria/ Caso contrário, troque a linha return doCombat(cid, combat, setSpellTarget(cid, var)) por return doCombat(cid, combat, var). Bom, é isso. Espero que gostem. Abraços,
  24. Upvote
    Night Wolf deu reputação a Skulls em [Spells] Checando Interferências na Trajetória   
    Boa noite galera, tudo bem?
     
    Venho compartilhar com vocês hoje um sisteminha que desenvolvi para as magias do tipo "shoot'. Foi feito inicialmente para funcionar com magias que usam a posição do mouse como referência e adaptei para cipclientes poderem usar em runas e magias de tiro.
     
    O funcionamento do sistema é simples: Ao usar uma runa ou castar uma magia "shoot" com esse sistema criaturas e objetos no caminho irão interferir na trajetória, isto é, receberão o combate no lugar do alvo inicial.
     
    Ilustrativo:
     
     
     
    Bom, vamos ao que interessa.
     
    Vá em data/lib/ e crie um novo arquivo chamado spellsLib.lua (pode-se utilizar também o arquivo spells.lua contido em data/spells/lib).
     
    Dentro dele inclua as seguintes funções:
     
    IsWalkable (by Nord)

    GetPositionsAround (by Skulls)
     
    CheckInterceptions (by Skulls)
     
     
     
    SetSpellTarget (by Skulls)
     
     
     
    Feito isso, está tudo configurado. Basta agora adicionar às magias que você queira.
    Abra o .lua da magia, por exemplo death strike.lua.
    Lá você terá, entre outras coisas, a função onCastSpell como abaixo:
    function onCastSpell(cid, var) return doCombat(cid, combat, var) end Substitua isso por:
    local range = 5 function onCastSpell(cid, var) if getCreatureTarget(cid) == 0 then doPlayerSendCancel(cid, "Please choose a target.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false end if getDistanceBetween(getPlayerPosition(cid), getCreaturePosition(getCreatureTarget(cid))) > range then doPlayerSendCancel(cid, "Target is not reachable.") doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) return false endreturn doCombat(cid, combat, setSpellTarget(cid, var)) end Retire qualquer tag que esteja relacionada a target (needtarget, casterTargetOrDirection, etc) Pronto, a sua magia "Exori Mort" será parada por criaturas ou obstáculos (qualquer item que não seja móvel). Bom é isso, espero que gostem. Queria agradecer ao @@nightwolf e ao @Caronte pelas ajudas tentando entender alguns parâmetros e me dando algumas luzes. Ao @@nightwolf, ainda, um agradecimento especial pela maravilhosa lib dele *-*. Abraços,  
    Um exemplo de magia que utiliza esse sistema: http://www.xtibia.com/forum/topic/239460-exori-grab-vis/

    @@Daniel, na verdade move pra mim pra Downloads Spells, acho que seria mais correto.
  25. Upvote
    Night Wolf deu reputação a Skulls em Galeria de ideias   
    Ot client buga o hideHealth, to tentando reaolver isso. Lobo nao sei o tile, te mando chegando em casa amanhã.
    @Up
     
    Invisibilidade funcionando no OTC:


    Dark binding da morgana (LOL)

     
    Ai ele mata o bicho entao nao mostra, mas fica disparando efeitos no alvo por 3 segundos e ele fica imovel nesse tempo.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...