Ramza 11 #1 Posted September 3, 2011 (edited) 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 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 February 4, 2013 by Ramza Correção no code 1 grilo13 reacted to this Share this post Link to post
iuniX 4 #2 Posted September 3, 2011 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
MaXwEllDeN 13 #3 Posted September 3, 2011 @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
luigilc 0 #4 Posted September 3, 2011 (edited) 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 September 3, 2011 by luigilc Share this post Link to post
Lwkass 1 #5 Posted September 3, 2011 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
dav9shal 1 #6 Posted September 3, 2011 Nossa! muito legal! Tenho certeza que algum ATS de HP ja pegou. ^^ Share this post Link to post
Captha 0 #7 Posted September 3, 2011 mt criatividade, scrip ótimo, Parabens, mt bom Share this post Link to post
luigilc 0 #8 Posted September 3, 2011 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
Oneshot 24 #9 Posted September 3, 2011 Parabéns, rapaz. Um sistema muito interessante. Share this post Link to post
Ramza 11 #10 Posted September 3, 2011 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
luigilc 0 #11 Posted September 3, 2011 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
Ramza 11 #12 Posted September 3, 2011 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 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
luigilc 0 #13 Posted September 3, 2011 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
Ramza 11 #14 Posted September 3, 2011 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
iuniX 4 #15 Posted September 3, 2011 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
luigilc 0 #16 Posted September 3, 2011 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
Ramza 11 #17 Posted September 3, 2011 Vê ai se funciona, se não funcionar me avise =) Abraços! Share this post Link to post
luigilc 0 #18 Posted September 4, 2011 (edited) 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 September 4, 2011 by luigilc Share this post Link to post
Ramza 11 #19 Posted September 4, 2011 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
Vítor Amaral 1 #20 Posted September 4, 2011 só tenho duas palavras: fuck yeah Share this post Link to post