Jump to content
Sign in to follow this  
Ramza

Colisão de Magias

Recommended Posts

Ramza

Nome: Sistema de Colisão de Magias V. 1.0
Autor: Ramza (Ricardo Ianelli)
Versão Testada: TFS 0.3.6PL1 (8.54)

 

Introdução

 

Olá a todos!

 

Depois de muito insistir, me chamar de lindo, me oferecer um rim, trabalho escravo, video imitando sidney magal, resolvi liberar a versão primitiva do tão misterioso 'Sistema de Colisão de Magias' pro Iunix e alguns outros que me mandavam PM's o tempo todo querendo saber como funcionava o sistema. Pra quem não conhece ainda, eis um video:

 

Caso não carregue o video:

 

Constantemente vinham pessoas me perguntarem como funcionava, se eu precisei mexer nas sources, querendo comprar, isso e aquilo. Dai, eu falava: "Cara, esse sistema é simples, o forte dele foi a criatividade, mas o sistema em si é algo ridículo" e as pessoas ficavam bravas achando que eu tava mentindo, que era tudo história minha, isso e aquilo. Bem, aqui está a prova de que criatividade é a PRINCIPAL ferramenta de qualquer programador, e que um sistema SIMPLES pode se tornar algo aparentemente tão complexo.

 

 

Funcionamento

 

Do ponto de vista do jogador:

O jogador usa uma magia, digamos, exori frigo. No mesmo momento, o inimigo usa um exori vis por exemplo. As magias voam, e se colidem no ar.

 

Do ponto de vista do scripter: (chora Iunix, te falei que era simples KKKK)

Toda magia antes de ser lançada, salva um storage value, e checa se o inimigo tem o mesmo storage. Caso tenha, ao invés de mandar a magia, manda os efeitos pra uma posição calculada entre os dois pontos, e um efeito de colisão. Caso o criador queira melhorar ainda a função (pra ficar como na versão 2.0 do sistema), pode-se fazer uma checagem de força pra saber qual das duas 'vence', fazendo com que ela atinja o oponente. Para melhores resultados, magias usando addEvent são mais usadas, por isso usarei um exemplo dessa forma aqui no tutorial.

 

 

Instalação

 

Na pasta Data, crie um arquivo chamado colisionLIB.lua. Dentro dele, cole isto:

 

function checkColision(cid)   -- Function by Ramza (Ricardo Ianelli)
 if getCreatureTarget(cid) ~= 0 then
    setPlayerStorageValue(cid, 9001, 'casting')
    local ppos, enemy = getCreaturePosition(cid), getCreatureTarget(cid) 
    local epos = getCreaturePosition(enemy)

    if getPlayerStorageValue(enemy, 9001) == 'casting' and getCreatureTarget(enemy) == cid then
       setPlayerStorageValue(enemy, 9001, 'colision')
       setPlayerStorageValue(cid, 9001, 'colision')
       if ppos.x > epos.x and ppos.y > epos.y then
          cpos = {x = ppos.x - ((ppos.x - epos.x) / 2), y = ppos.y - ((ppos.y - epos.y) / 2), z = ppos.z}
       elseif ppos.x > epos.x and ppos.y < epos.y then
          cpos = {x = ppos.x - ((ppos.x - epos.x) / 2), y = epos.y - ((epos.y - ppos.y) / 2), z = ppos.z}
       elseif ppos.x < epos.x and ppos.y < epos.y then
          cpos = {x = epos.x - ((epos.x - ppos.x) / 2), y = epos.y - ((epos.y - ppos.y) / 2), z = ppos.z}
       elseif ppos.x < epos.x and ppos.y > epos.y then
          cpos = {x = epos.x - ((epos.x - ppos.x) / 2), y = ppos.y - ((ppos.y - epos.y) / 2), z = ppos.z}
       end

       doSendDistanceShoot(ppos, cpos, CONST_ANI_ENERGY)
       doSendDistanceShoot(epos, cpos, CONST_ANI_ENERGYBALL)

       local value = math.random(1, 3)
       doSendMagicEffect(cpos, 27+value)              
       return true
    else
       return false
    end
 end

end


 

 

Agora vamos pegar uma magia bem básica como exemplo para teste. Vamos usar a magia energy strike. Abra o arquivo da magia, estará mais ou menos assim:

 

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_ENERGY)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1)

function onCastSpell(cid, var)
   return doCombat(cid, combat, var)
end

 

Vamos modificar um pouco para o nosso sistema. Deixe-a assim:

 

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_ENERGY)
setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1)

local function spell(cid, var)
 if getPlayerStorageValue(cid, 9001) ~= 'colision' then
    doCreatureSay(cid, 'Strike!', TALKTYPE_ORANGE_1)
    setPlayerStorageValue(cid, 9001, nil)
    return doCombat(cid, combat, var)
 end
end

function onCastSpell(cid, var)
   checkColision(cid)
   doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1)
   addEvent(spell, 2000, cid, var) 
end

 

Hora de testar, a hora mais difícil! Bem, pra testar esse sistema você precisa de um amigo pra te ajudar, ou de ferramentas ilegais e agilidade. Vamos tomar como exemplo caso você fosse com um amigo testar. Simplesmente usem exori vis um no outro, e vejam o que acontece :D

 

Comentários

Quem já é mais experiente já deve ter sacado o tanto de possibilidades que isso abre, como fazer com magias mais avançadas, comparar magic level, fazer com que caso o ML de um seja maior que o do outro, ela anule a do inimigo mas a sua ainda acerte, fazer sistemas no estilo 'disputa de kame-hame-has' usando spriters sem ser as do tibia, e muitas outras coisas, só vai depender de você usar a sua CRIATIVIDADE. Esse sistema, apesar de simples, é considerado pra mim um dos meus sistemas mais avançados, pois como dizia o sábio programador: "O verdadeiro gênio não é aquele que usa pilhas, ponteiros, matrizes ou funções complexas, e sim aquele que usa a criatividade." Muita gente ofereceu grana preta nesse sistema já, mas eu postei aqui pra lembrar à todos vocês que o que faz um grande programador não é o quão complexas são as funções que você usa e os codes que você faz, e sim, o quão criativas e inovadoras são suas criações.

 

 

 

É isso ai galera, deixo meu abraço pra todos vocês, qualquer dúvida é só me perguntar, e eu quero que vocês lembrem que o melhor code é sempre, de longe, aquele mais criativo, não importa se tenha 3, 100 ou 10.000 linhas. Lembrem-se disso, sempre.

Abraços, Ramza.

Edited by Ramza
Correção no code

Share this post


Link to post
Share on other sites
iuniX

Finalmente, e é bem parecido com o que eu tinha pensado em fazer. Porem o meu ficaria mais gambiarrado. Como eu te disse por msn, é um sistema unico, com originalidade imensa e com um code até que bem bonito. Realmente merece Exclusivo.

 

Obrigado pela contribuição. Aprovado e Movido

 

 

Depois de muito insistir, me chamar de lindo, me oferecer um rim, trabalho escravo, video imitando sidney magal, resolvi liberar a versão primitiva do tão misterioso 'Sistema de Colisão de Magias' pro Iunix

:what: kkkkkkkkkkkkkkkkk

Share this post


Link to post
Share on other sites
MaXwEllDeN

@Ramza

Perfeito Ramza, gostei muito, realmente da originalidade e da limpeza no código. Perfeito mesmo muita criatividade e qualidade.. REP +

Share this post


Link to post
Share on other sites
luigilc

Um dos scripts mais originais e inovadores q eu jah vi! Parabens, pq vc trealmente merece!

 

Edit: No meu distro deu um erro aki, mas pra arrumar só adicionei um end ali no fim da 1 parte, depois de

     local epos = getCreaturePosition(enemy)

Agr qnd eu uso a spell da erro no console:

[03/09/2011 11:32:18] [Error - Spell Interface] 
[03/09/2011 11:32:18] data/spells/scripts/attack/energy strike.lua:onCastSpell
[03/09/2011 11:32:18] Description: 
[03/09/2011 11:32:18] (luaGetCreatureStorage) Creature not found

[03/09/2011 11:32:19] [Error - Spell Interface] 
[03/09/2011 11:32:19] In a timer event called from: 
[03/09/2011 11:32:19] data/spells/scripts/attack/energy strike.lua:onCastSpell
[03/09/2011 11:32:19] Description: 
[03/09/2011 11:32:19] (luaDoCombat) Combat not found

como arrumar?

Edited by luigilc

Share this post


Link to post
Share on other sites
Lwkass

Criatividade é oque há ein ahuhuahuahuahua

Parabéns, e é como você disse, criatividade é muuuuito mais importante que tamanho do code ou quão complexo ele é

Share this post


Link to post
Share on other sites
dav9shal

Nossa! muito legal! Tenho certeza que algum ATS de HP ja pegou. ^^

Share this post


Link to post
Share on other sites
Captha

mt criatividade, scrip ótimo, Parabens, mt bom

Share this post


Link to post
Share on other sites
luigilc

arrumei um dos erros mas esse n consigo arrumar:

[03/09/2011 12:00:53] [Error - Spell Interface] 
[03/09/2011 12:00:53] data/spells/scripts/attack/energy strike.lua:onCastSpell
[03/09/2011 12:00:53] Description: 
[03/09/2011 12:00:53] (luaGetCreatureStorage) Creature not found

Alguma ajuda?

Share this post


Link to post
Share on other sites
Oneshot

Parabéns, rapaz. Um sistema muito interessante.

Share this post


Link to post
Share on other sites
Ramza
Um dos scripts mais originais e inovadores q eu jah vi! Parabens, pq vc trealmente merece!

 

Edit: No meu distro deu um erro aki, mas pra arrumar só adicionei um end ali no fim da 1 parte, depois de

     local epos = getCreaturePosition(enemy)

Agr qnd eu uso a spell da erro no console:

[03/09/2011 11:32:18] [Error - Spell Interface] 
[03/09/2011 11:32:18] data/spells/scripts/attack/energy strike.lua:onCastSpell
[03/09/2011 11:32:18] Description: 
[03/09/2011 11:32:18] (luaGetCreatureStorage) Creature not found

[03/09/2011 11:32:19] [Error - Spell Interface] 
[03/09/2011 11:32:19] In a timer event called from: 
[03/09/2011 11:32:19] data/spells/scripts/attack/energy strike.lua:onCastSpell
[03/09/2011 11:32:19] Description: 
[03/09/2011 11:32:19] (luaDoCombat) Combat not found

como arrumar?

 

Tira esse end, não é pra por.

Re-instala o code todo, provavelmente você errou em alguma parte :S

Re-testei aqui e funcionou certinho, abraços!

 

 

 

 

@todos

 

Obrigado galera, esse foi um dos meus primeiros sistemas, ver aceitação é um presentão (até rimou) *LOL* AHUEAHUEAHUEA

Share this post


Link to post
Share on other sites
luigilc

opa, vlw Ramza, o problema foi q o meu editor de texto ta bugado e ta desconfigurando qnd eu colo textos com mais de 10? linhas oq vc falo me lembro disso, só tive q arrumar o script pq umas linhas foram pra cima e bagunço td, vlw msm

Share this post


Link to post
Share on other sites
Ramza
opa, vlw Ramza, o problema foi q o meu editor de texto ta bugado e ta desconfigurando qnd eu colo textos com mais de 10? linhas oq vc falo me lembro disso, só tive q arrumar o script pq umas linhas foram pra cima e bagunço td, vlw msm

 

Nada, qualquer problema só falar nego :D

Abração!

 

Obs.: Talvez eu poste ainda hoje uma magia do Zodiac, quem jogou deve se lembrar dela, a temida e 'sem controle', Electrical Discharge.

Abração!

Share this post


Link to post
Share on other sites
luigilc

hmm tem outro pequeno problema, a magia ta sem exhaust, msm eu colocando exhsut pra 3000 no spells.xml

eu uso tfs 0.3.6pl1

Share this post


Link to post
Share on other sites
Ramza

Certeza? A magia em si, eu praticamente não modifiquei. Só adicionei o sistema nela.

Mas, se esse for o caso, pode adicionar ai em cima do check colision um:

 

if getPlayerStorageValue(cid, 9001) == 'casting' then
    return false
end

 

abraços!

Share this post


Link to post
Share on other sites
iuniX

As vezes pode ser porque você esta usando algum GOD, geralmente nos distros os GODs vem com Flag de que não pode ser atacado.

Share this post


Link to post
Share on other sites
luigilc

lol, eu n testo magias com god justamente por cause disso, testei com um amigo meu q é beta-tester la no meu ot, enfim, vou tentar adicionar oq o Ramza falou pra ver se funciona, obg.

Share this post


Link to post
Share on other sites
Ramza

Vê ai se funciona, se não funcionar me avise =)

Abraços!

Share this post


Link to post
Share on other sites
luigilc

Não funcionou n Ramza, agr n tm nem erro n console nem nada, qnd uso a spell nada acontece

 

Edit: Arrumei, eu tive q mudar um poko, ai fiko assim:

local function spell(cid, var)
 if getPlayerStorageValue(cid, 9001) ~= 'colision' then
    doCreatureSay(cid, 'Strike!', TALKTYPE_ORANGE_1)
 end
end

function onCastSpell(cid, var)
   checkColision(cid)
   doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1)
   addEvent(spell, 500, cid, var)
   return doCombat(cid, combat, var)
end

Edited by luigilc

Share this post


Link to post
Share on other sites
Ramza
Não funcionou n Ramza, agr n tm nem erro n console nem nada, qnd uso a spell nada acontece

 

Edit: Arrumei, eu tive q mudar um poko, ai fiko assim:

local function spell(cid, var)
 if getPlayerStorageValue(cid, 9001) ~= 'colision' then
    doCreatureSay(cid, 'Strike!', TALKTYPE_ORANGE_1)
 end
end

function onCastSpell(cid, var)
   checkColision(cid)
   doCreatureSay(cid, 'Energy...', TALKTYPE_ORANGE_1)
   addEvent(spell, 500, cid, var)
   return doCombat(cid, combat, var)
end

 

Luigi, desse jeito ela vai SEMPRE acertar...

Share this post


Link to post
Share on other sites
Vítor Amaral

só tenho duas palavras:

 

fuck yeah

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×