Ir para conteúdo
Entre para seguir isso  
Ramza

Colisão de Magias

Recommended Posts

Ramza    11
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.

Editado por Ramza
Correção no code

Compartilhar este post


Link para o post
iuniX    4
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

Compartilhar este post


Link para o post
MaXwEllDeN    13
MaXwEllDeN

@Ramza

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

Compartilhar este post


Link para o post
luigilc    0
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?

Editado por luigilc

Compartilhar este post


Link para o post
Lwkass    1
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 é

Compartilhar este post


Link para o post
dav9shal    1
dav9shal

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

Compartilhar este post


Link para o post
Captha    0
Captha

mt criatividade, scrip ótimo, Parabens, mt bom

Compartilhar este post


Link para o post
luigilc    0
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?

Compartilhar este post


Link para o post
Oneshot    24
Oneshot

Parabéns, rapaz. Um sistema muito interessante.

Compartilhar este post


Link para o post
Ramza    11
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

Compartilhar este post


Link para o post
luigilc    0
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

Compartilhar este post


Link para o post
Ramza    11
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!

Compartilhar este post


Link para o post
luigilc    0
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

Compartilhar este post


Link para o post
Ramza    11
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!

Compartilhar este post


Link para o post
iuniX    4
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.

Compartilhar este post


Link para o post
luigilc    0
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.

Compartilhar este post


Link para o post
Ramza    11
Ramza

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

Abraços!

Compartilhar este post


Link para o post
luigilc    0
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

Editado por luigilc

Compartilhar este post


Link para o post
Ramza    11
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...

Compartilhar este post


Link para o post
Vítor Amaral    1
Vítor Amaral

só tenho duas palavras:

 

fuck yeah

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×