Ir para conteúdo

Pesquisar na Comunidade

Mostrando resultados para as tags ''spells''.

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Fóruns

  • xTibia - Notícias e Suporte
    • Regras
    • Noticias
    • Soluções
    • Projetos Patrocinados
    • Tutoriais para Iniciantes
    • Imprensa
  • OTServ
    • Notícias e Debates
    • OTServlist
    • Downloads
    • Recursos
    • Suporte
    • Pedidos
    • Show-Off
    • Tutoriais
  • OFF-Topic
    • Barzinho do Éks
    • Design
    • Informática

Encontrar resultados em...

Encontrar resultados que contenham...


Data de Criação

  • Início

    FIM


Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Data de Registro

  • Início

    FIM


Grupo


Sou

  1. local function kb1(cid) setPlayerStorageValue(cid,555010,0) end function onCastSpell(cid, var) local waittime = 60 -- Tempo de exhaustion local storage = 3030707 local Tile1 = {x = 1226, y = 1134, z = 8} -- onde o player sera teleportado local Tile2 = {x = 1226, y = 1133, z = 8} -- onde o player target teleportado local from1,to1 = {x=967, y=1018, z=7},{x=984, y=1048, z=7} -- KONOHA TRAINER local from2,to2 = {x=967, y=1030, z=6},{x=984, y=1048, z=6} -- KONOHA TRAINER local from3,to3 = {x=967, y=1030, z=5},{x=984, y=1048, z=5} -- KONOHA TRAINER local from4,to4 = {x=1148, y=735, z=7},{x=1163, y=755, z=7} -- YUKIGAKURE TRAINER local from5,to5 = {x=1148, y=735, z=6},{x=1163, y=755, z=6} -- YUKIGAKURE TRAINER local from6,to6 = {x=1148, y=735, z=5},{x=1163, y=755, z=5} -- YUKIGAKURE TRAINER local from7,to7 = {x=424, y=802, z=8},{x=438, y=826, z=8} -- SUNA TRAINER local from8,to8 = {x=424, y=802, z=9},{x=438, y=826, z=9} -- SUNA TRAINER local from9,to9 = {x=424, y=802, z=10},{x=438, y=826, z=10} -- SUNA TRAINER local from10,to10 = {x=1290, y=482, z=7},{x=1309, y=491, z=7} -- VILA TAKUMI TRAINER local from11,to11 = {x=1290, y=482, z=6},{x=1309, y=491, z=6} -- VILA TAKUMI TRAINER local from12,to12 = {x=1290, y=482, z=5},{x=1309, y=491, z=5} -- VILA TAKUMI TRAINER local from13,to13 = {x=1862, y=185, z=7},{x=2045, y=1123, z=7} -- CASTELO WAR local from14,to14 = {x=1862, y=185, z=6},{x=2045, y=1123, z=6} -- CASTELO WAR local from15,to15 = {x=1862, y=185, z=5},{x=2045, y=1123, z=5} -- CASTELO WAR local from16,to16 = {x=1955, y=244, z=10},{x=1968, y=278, z=10} -- CASTELO XP BONUS local from17,to17 = {x = 953, y = 1018, z = 7},{x = 984, y = 1042, z = 7 } -- AREA DE INVASAO local from18,to18 = {x = 762, y = 170, z = 12},{x = 1241, y = 439, z = 12} -- KAMUI local from19,to19 = {x = 762, y = 170, z = 12},{x = 1241, y = 439, z = 11} -- KAMUI local master = getCreatureMaster(cid) local pos = getCreaturePosition(cid) local target = getCreatureTarget(cid) local targetpos = getCreaturePosition(target) local time = 10 -- tempo para voltar em segundos local exceptions = {'Crystal Vilarejo', 'aegis', 'god anderson'} if exhaustion.check(cid, storage) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Aguarde " .. exhaustion.get(cid, storage) .. " segundos para usar a spell novamente.") return false end if isInRange(pos, from1, to1) or isInRange(pos, from2, to2) or isInRange(pos, from3, to3) or isInRange(pos, from4, to4) or isInRange(pos, from5, to5) or isInRange(pos, from6, to6) or isInRange(pos, from7, to7) or isInRange(pos, from8, to8) or isInRange(pos, from9, to9) or isInRange(pos, from10, to10) or isInRange(pos, from11, to11) or isInRange(pos, from12, to12) or isInRange(pos, from13, to13) or isInRange(pos, from14, to14) or isInRange(pos, from15, to15) or isInRange(pos, from16, to16) or isInRange(pos, from17, to17) or isInRange(pos, from18, to18) or isInRange(pos, from19, to19) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce nao pode usar o Mundo aqui!") return TRUE end local function Teleport_Playerout(cid) doTeleportThing(cid, pos) end local function Teleport_Targetout(target) doTeleportThing(target, targetpos) end local function Teleport_Targetin(target) doTeleportThing(target, Tile2) end setPlayerStorageValue (cid, 555010, 1) if isPlayer(target) then exhaustion.set(cid, storage, waittime) doSendMagicEffect(targetpos, 10) addEvent(Teleport_Targetout, time*1000, target) addEvent(Teleport_Targetin, 0, target) doCreatureSay(cid, "Taimu rain Sharingan", TALKTYPE_MONSTER) if getPlayerStorageValue(cid, 555010) > 0 then for j = 1, 1 do addEvent(function() if isCreature(cid) then kb1(cid) end end, 10000 + ((j-1) * 1)) end end else doPlayerSendCancel(cid, "Voce so pode usar esta magia em players!") end end
  2. Fala galera, tudo certo com vocês? Estou tentando implementar um sistema que a princípio parece simples (e deve ser mesmo), mas que está me tirando o sono hahaha A ideia é a do título mesmo, ao matar um monstro o player tem a chance de aprender uma determinada spell. Dei uma pesquisada, criei um script, entretanto ele não funciona (e não da erro no log do servidor) Alguém poderia me dar um help? Provavelmente devo estar escrevendo o código errado, faz tempo que não sei o que é programação :v Desde já obrigado!
  3. Olá, estou usando como base o server PokeNumb. Minha dúvida é: os cooldowns das spells dos pokemons estão diminuindo enquanto os pokemons estão dentro das balls. Gostaria que diminuísse somente quando o pokemons está pra fora. Alguém sabe onde posso mudar isso?
  4. [21/04/2023 17:21:09] [Error - Spell Interface] [21/04/2023 17:21:09] data/spells/scripts/ps/Multi-Punch.lua:onCastSpell [21/04/2023 17:21:09] Description: [21/04/2023 17:21:09] (luaGetPlayerSlotItem) Player not found [21/04/2023 17:21:14] [Error - Spell Interface] [21/04/2023 17:21:14] data/spells/scripts/ps/Multi-Punch.lua:onCastSpell [21/04/2023 17:21:14] Description: [21/04/2023 17:21:14] (luaGetPlayerSlotItem) Player not found pokemon moves.lua
  5. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, 136) setCombatParam(combat1, COMBAT_PARAM_DISTANCEEFFECT, 141) function tsubi(cid, level, maglevel) local min = -(level * 2.0+ maglevel * 4 +50) local max = -(level * 2.0+ maglevel * 4.5 +50) return min, max end setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "tsubi") local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, 136) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 141) function tsubi1(cid, level, maglevel) local min = -(level * 2.0+ maglevel * 4 +50) local max = -(level * 2.0+ maglevel * 4.5 +50) return min, max end setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "tsubi1") local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, 136) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, 141) function tsubi1(cid, level, maglevel) local min = -(level * 2.0+ maglevel * 4 +50) local max = -(level * 2.0+ maglevel * 4.5 +50) return min, max end setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "tsubi1") local combat4 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, 136) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, 141) function tsubi1(cid, level, maglevel) local min = -(level * 2.0+ maglevel * 4 +50) local max = -(level * 2.0+ maglevel * 4.5 +50) return min, max end setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "tsubi1") local combat5 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, 136) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, 141) function tsubi1(cid, level, maglevel) local min = -(level * 2.0+ maglevel * 4 +50) local max = -(level * 2.0+ maglevel * 4.5 +50) return min, max end setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "tsubi1") local function onCastSpell1(parameters) doCombat(parameters.cid, parameters.combat1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, parameters.combat2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, parameters.combat3, parameters.var) end local function onCastSpell4(parameters) doCombat(parameters.cid, parameters.combat4, parameters.var) end local function onCastSpell5(parameters) doCombat(parameters.cid, parameters.combat5, parameters.var) end function onCastSpell(cid, var) local parameters = { cid = cid, var = var, combat1 = combat1, combat2 = combat2, combat3 = combat3, combat4 = combat4, combat5 = combat5 } addEvent(onCastSpell1, 0, parameters) addEvent(onCastSpell2, 200, parameters) addEvent(onCastSpell3, 400, parameters) addEvent(onCastSpell3, 500, parameters) addEvent(onCastSpell3, 600, parameters) return true end Como os efeitos são desproporcionais no meu serve algumas sprtis saem erradas, gostaria de ter o controle da position delas!
  6. Ta estranho, olha só o tamanho da área da magia, e quando o player usa, não aparece animação nenhuma, só da o dano sem a animação, OBS é uma magia de área tipo um exevo gran mas flam, porém a ideia dessa magia é um monte de assassin stars saírem do corpo do usuário e se espalharem pela área, para vcs terem uma noção exata do que quero que aconteça é spo pegar o God do server de vocês e escrever o comando /x 18 vcs notarão que sairá um monte de assassins dele, ESSA É A IDEIA DESSA MAGIA,mas isso não está acontecendo, alguém por favor pode me ajudar a desvendar esse mistério??? REP+ local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_REDSTAR) function onGetFormulaValues(cid, level, Skill, factor) damage_min = (Skill * 6 + level * 1.5) * 1 damage_max = (Skill * 6 + level * 1.5) * 1.2 return - math.max(damage_min, damage_max), - math.min(damage_min, damage_max) end combat_arr = { {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1,}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0,}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0,}, } local combat_area = createCombatArea(combat_arr) setCombatArea(combat, combat_area) setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") function onCastSpell(cid, var) return doCombat(cid, combat, var) end Dica uma coisa que talvez funcione é criar um evento por fora que gere a animação, pois o dano já funciona certo, só a animação que não aparece, pessoal me ajudem se puder to precisando muito desse script REP+ l
  7. Evollutions

    Magia stun

    Ola pessoal, estou precisando de um script de spell, já testei alguns e todos deram erro. Meu servidor é um baiak 10.90, tfs 1.0 Queria uma magia que funcionasse como stun (incapacitar) durante x segundos, e que o target incapacitado não consiga andar nem usar magias/runas. E se não for muito trabalho, uma variação da mesma spell, mas em área (na mesma área do exori). Edit: esqueci de dizer que tem que ter CD de 1 min Obrigado desde já!
  8. Galera baixei a base do pokeRoxy aqui e os pokemon selvagem nao esta dando dano nas spells somento nos ataq basico alguem sabe resolver?
  9. Sistema Jinchuuriki De Servidores de Naruto. Selar um dos monstros e ser seu jinchuuriki , usando a magia só quando o Monstro estiver com 20% ou menos de vida. A Magia tem a range de 1 sqm, ou seja, você tem que usar a magia colado no monstro e Apenas um jogador conseguira selar o Monstro e ser seu jinchuuriki. Após selar um dos monstros você será o jinchuuriki dela por 10 dias, caso selar um outro Monstro você perdera a anterior e ficara com a nova e o tempo será renovado! Em data/spells/script crie um arquivo chamado Jinchuuriki.lua local storagecool = 89758local storagemob = 89759local tempo = 10 * 24 * 60 * 60 -- 10 diaslocal mobs = { ["kurama"] = 1, ["hachibi"] = 2, ["demon"] = 3, -- sempre letra minuscula e o numero q ele representa}function onCastSpell(cid, var) local target = variantToNumber(var) if target and isMonster(target) then if getCreatureHealth(target) <= math.floor(0.2 * getCreatureMaxHealth(target)) then if getCreatureName(target) and mobs[getCreatureName(target):lower()] then doPlayerSetStorageValue(cid, storagecool, os.time() + tempo) doPlayerSetStorageValue(cid, storagemob, mobs[getCreatureName(target):lower()]) doSendMagicEffect(getPlayerPosition(cid), 13) -- efeito no player doSendMagicEffect(getPlayerPosition(target), 13) -- efeito no monstro doRemoveCreature(target) doPlayerSendCancel(cid, "Você selou a criatura!") else doPlayerSendCancel(cid, "Essa criatura nao pode ser selada.") end else doPlayerSendCancel(cid, "O monstro precisa ter menos de 20% de vida para ser selado.") end else doPlayerSendCancel(cid, "Spell somente pode ser usada em monstros.") endreturn trueend Em spells.xml <instant name="Selar Bijuu" words="Selar Bijuu" lvl="200" mana="20000" prem="1" range="1" needtarget="1" blockwalls="1" exhaustion="1000" needlearn="0" event="script" value="Jinchuuriki.lua"> <vocation id="1-10"/> </instant> Vantagens de ser um Jinchuuriki: Buff Especial que voce domina ela. data/spells/ Hachibi.lua local tempo = 60 -- tempo em segundoslocal effect = {134} -- effect no playerlocal exausted = 1 -- em minutoslocal points = 60 -- quantos ira aumentar os skillslocal outfit = {lookType = 350}-- outfit que ira darlocal combat = createCombatObject()setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0)local condition = createConditionObject(CONDITION_ATTRIBUTES)setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000)setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVEL, points)setConditionParam(condition, CONDITION_PARAM_SKILL_FIST, points)setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, points)setConditionParam(condition, CONDITION_PARAM_SKILL_AXE, points)setConditionParam(condition, CONDITION_PARAM_SKILL_CLUB, points)setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCE, points)setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELD, points)setCombatCondition(combat, condition)local condition = createConditionObject(CONDITION_OUTFIT)setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000)addOutfitCondition(condition, outfit)setCombatCondition(combat, condition)function Magica(cid) if isCreature(cid) then for i=1, #effect do local position = {x=getCreaturePosition(cid).x, y=getCreaturePosition(cid).y, z=getCreaturePosition(cid).z} doSendMagicEffect(position, effect) end endendfunction onCastSpell(cid, var) if getPlayerStorageValue(cid, 91546) ~= 2 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Voce nao eh um jinchuriki da Hachibi!") return false elseif getPlayerStorageValue(cid, 17456)-os.time() > 1 then local seetime = getPlayerStorageValue(cid, 17456)-os.time() local minutes, seconds = math.floor(seetime/60), math.floor(seetime%60) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Aguarde "..minutes.." minuto(s) e "..seconds.." segundo(s) para usar novamente!") return false end setPlayerStorageValue(cid, 17456, exausted*60+os.time()) doCombat(cid, combat, var) local tempo2 = 0 while (tempo2 <= (tempo*1000)) do addEvent(Magica, tempo2, cid) tempo2 = tempo2 + 300 end return trueend
  10. Este script carrega Spells.xml quando solicitado pelo usuário no painel admin, e cria um arquivo php salvando todas as magias em arrays. Ele tem opções de classificação exatamente como a página do Tibia. Ele funciona com ambas as distribuições 0.2 e 0.3. Preview: Vamos ao tutorial: Configuração: engine/function/general.php Em ?> Adicione function build_spells($xml, $display_groups) { $t_count = 0; $rune = array(); $string = '<?php'."\n".'#Generated spells file from admin panel'."\n".'#Edit at your own risk!'; $string .= "\n".'$show_spells_groups = '.($display_groups ? 'true' : 'false').';'."\n".'$spells = array('; foreach($xml as $key => $value) { if($value['lvl']) { if($key == 'rune') { if($display_groups) { if($value['group'] == NULL) { echo '<span style="color:orange;font-weight:bold">WARNING: Group not found at spell "'.$value['name'].'", set to "Attack".</span><br>'; } $rune[(string)$value['name']] = ($value['group'] == NULL) ? 'Attack' : $value['group']; } continue; } $t_count++; $string .= "\n\t".'array('; if($display_groups) { $string .= "\n\t\t".'"group" => '; { if($value['function'] == 'conjureRune') { $string .= '\''.ucfirst($rune[(string)$value['name']]).'\''; } else { if($value['group'] == NULL) { echo '<span style="color:orange;font-weight:bold">WARNING: Group not found at spell "'.$value['name'].'", set to "Attack".</span><br>'; } $string .= '\''.ucfirst(($value['group'] == NULL) ? 'Attack' : $value['group']).'\''; } } $string .= ','; } $string .= "\n\t\t".'"type" => '; if(config('TFSVersion') == 'TFS_02') { $string .= (($value['function'] == 'conjureRune') ? '\'Rune\'' : '\'Instant\''); } if(config('TFSVersion') == 'TFS_03') { $string .= (($value['value'] == 'conjureRune') ? '\'Rune\'' : '\'Instant\''); } $string .= ','; $string .= "\n\t\t".'"name" => "'.$value['name'].'",'; $string .= "\n\t\t".'"words" => \''.$value['words'].'\','; $string .= "\n\t\t".'"level" => '.$value['lvl'].','; $string .= "\n\t\t".'"mana" => '; $string .= (($value['mana'] == NULL) or ($value['mana'] == '')) ? '\'Var.\'' : $value['mana']; $string .= ','; $string .= "\n\t\t".'"premium" => '; if($value['prem']) { $string .= ($value['prem'] == 1) ? '\'yes\'' : '\'no\''; } else { $string .= '\'no\''; } $string .= ','; $vocs = array(); $string .= "\n\t\t".'"vocation" => array('; foreach($value->vocation as $vocation) { if(config('TFSVersion') == 'TFS_02') { $vocs[] = '\''.$vocation[0]['name'].'\''; } elseif(config('TFSVersion') == 'TFS_03') { if(strpos($vocation[0]['id'], ';') !== FALSE) { $array = explode(';', $vocation[0]['id']); foreach($array as $voc) { $vocs[] = '\''.vocation_id_to_name($voc).'\''; } } else { $vocs[] = '\''.vocation_id_to_name((int)$vocation[0]['id']).'\''; } } } if(count($vocs) < 1) foreach(config('vocations') as $id => $name) if($id > 0) $vocs[] = '\''.$name.'\''; $string .= implode(', ',$vocs).')'."\n\t".'),'; } } $string .= "\n".'); ?>'; echo('Loaded '. $t_count .' spells!<br>'); echo 'File "spell.php" '.(file_exists('spell.php') ? 'updated' : 'created').'!<br>'; $file = fopen('spell.php', 'w'); fwrite($file, $string); fclose($file); } admin.php Antes </ul> <?php include 'layout/overall/footer.php'; ?> Adicione <li> <b>Update spells from file:</b><br> <?php if (!isset($_POST['action'])) { $_POST['action'] = 'undefine'; } if ($_POST['action'] == 'upload') { $xml = $_FILES['file']; $_POST['action'] = 'undefine'; if($xml['tmp_name']) { if($xml['name'] == 'spells.xml') { $groups = (isset($_POST['show_groups']) && $_POST['show_groups'] == 'yes') ? true : false; echo 'Successfully fetched spells.xml!<br>'; echo 'Using temporal file: '. $_FILES['file']['tmp_name'] .'<br>'; build_spells(simplexml_load_file($xml['tmp_name']), $groups); } else { echo '<span style="color:red;font-weight:bold">ERROR: File "spells.xml" not found.</span>'; } } else { echo '<span style="color:red;font-weight:bold">ERROR: Upload failed.</span>'; } } ?> <form enctype='multipart/form-data' method='POST'> <input type='checkbox' name='show_groups' value='yes'> Show spells groups (Only for TFS 0.2.9+)<br> <input type='hidden' name='action' value='upload' /> <input type='file' name='file' /> <input type='submit' value='Submit' /> </form> </li> Crie o arquivo Spell.php e adicione dentro: <?php require_once 'engine/init.php'; include 'layout/overall/header.php'; echo '<h1>Spells</h1>'; if(file_exists('spell.php')) { require_once 'spell.php'; ?> <table> <tr class="yellow"> <td><b>Name</b></td> <?php if($show_spells_groups) echo '<td><b>Group</b></td>'; ?> <td><b>Type</b></td> <td><b>Exp Lvl</b></td> <td><b>Mana</b></td> <td><b>Premium</b></td> </span> </tr> <?php @$sort = $_REQUEST['sort']; if(!isset($sort)) $sort = 'name'; @$vocation = $_REQUEST['vocation']; if(!isset($vocation)) $vocation = 'vall'; if($show_spells_groups) { @$group = $_REQUEST['_group']; if(!isset($group)) $group = 'gall'; } @$type = $_REQUEST['_type']; if(!isset($type)) $type = 'tall'; @$premium = $_REQUEST['_premium']; if(!isset($premium)) $premium = 'pall'; $order = array(); foreach($spells as $key => $row) { $order[$key] = $row[$sort]; } array_multisort($order, SORT_ASC, $spells); foreach($spells as $spell) { if($vocation != 'vall') { if(!in_array($vocation, $spell['vocation'])) continue; } if($show_spells_groups && $group != 'gall') { if($spell['group'] != $group) continue; } if($type != 'tall') { if($spell['type'] != $type) continue; } if($premium != 'pall') { if($spell['premium'] != $premium) continue; } ?> <tr> <td><?php echo '<b>'.$spell['name'].'</b> ('.$spell['words'].')'; ?></td> <?php if($show_spells_groups) echo '<td>'.$spell['group'].'</td>'; ?> <td><?php echo $spell['type']; ?></td> <td><?php echo $spell['level']; ?></td> <td><?php echo $spell['mana']; ?></td> <td><?php echo $spell['premium']; ?></td> </tr> <?php } echo '</table>'; ?> <form action='spells.php' method='post'> <table> <tr class="yellow"> <td colspan=4><b>Spell Search</b></td></tr> <tr class="yellow"> <?php if($show_spells_groups) { echo'<td width=25%><b>vocation</b></td> <td width=25%><b>group</b></td> <td width=25%><b>type</b></td> <td width=25%><b>premium</b></td>';} else { echo'<td width=40%><b>vocation</b></td> <td width=30%><b>type</b></td> <td width=30%><b>premium</b></td>';}?> </tr> <tr> <td valign='top'> <input type='radio' name='vocation' value='vall' checked> all<br> <?php foreach(config('vocations') as $id => $vocation) { if($id > 0) { echo "<input type='radio' name='vocation' value='".$vocation."'> ".$vocation."<br>"; } } ?> </td> <?php if($show_spells_groups) echo" <td valign='top'> <input type='radio' name='_group' value='gall' checked> all<br> <input type='radio' name='_group' value='Attack'> attack<br> <input type='radio' name='_group' value='Healing'> healing<br> <input type='radio' name='_group' value='Support'> support</td>"; ?> <td valign='top'> <input type='radio' name='_type' value='tall' checked> all<br> <input type='radio' name='_type' value='Instant'> instant<br> <input type='radio' name='_type' value='Rune'> rune </td> <td valign='top'> <input type='radio' name='_premium' value='pall' checked> all<br> <input type='radio' name='_premium' value='no'> no<br> <input type='radio' name='_premium' value='yes'> yes </td> </tr> <tr> <td>sort by: <select name='sort'> <option value='name' selected>name <option value='words'>words <?php if($show_spells_groups) echo "<option value='group' >group"; ?> <option value='type' >type <option value='level' >exp lvl <option value='mana' >mana <option value='premium' >premium </select> </td> <td colspan='3'> <input type='submit' name='submit'> </td> </tr> </table> </form> <?php } else { echo 'This page has not been configured yet.'; }; include 'layout/overall/footer.php'; ?> Depois Adicionar o link da página ao seu layout layout padrão: /layout/menu.php Adicione na lista de páginas: <li><a href="spells.php">Spells</a></li> Fim do Tutorial ? Eu não posso garantir que ele vai trabalhar com todas as distros TFS. Lembre-se que você pode editar seu arquivo spell.php, principalmente necessário se você usar spells personalizadas. Créditos: cbrm(otland)
  11. Pessoal estava procurando, e até tentei fazer um buff que mudasse a vocação do personagem, e voltasse a anterior quando o buff acabar, e se conseguirem tbm que ele aumente a quantidade de hp e mp. mas so em mudar a vocação pra mim tá ótimo Buff que uso: tfs 0.3.6 local outfit = {lookType = 399} -- Roupa que ira transformar no caso seu corpo ficara em choque local tempo = 12000 * 1000 -- Tempo, nesse caso esta 60 segundos Lembrando que 1000 = 1 segundo local ml = 5 -- quantos ira aumentar o skill de ML local skillfist = 10 -- quantos ira aumentar o skill de Fist local skillsword = 0 -- quantos ira aumentar o skill de Sword local skillaxe = 0 -- quantos ira aumentar o skill de Axe local skillclub = 0 -- quantos ira aumentar o skill de Club local skilldistance = 0 -- quantos ira aumentar o skill de Distance local skillshield = 10 -- quantos ira aumentar o skill de Shield local health = 0 -- A cada 1 segundo quantos aumentar de vida local mana = 55 local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, 42) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVEL, ml) setConditionParam(condition, CONDITION_PARAM_SKILL_FIST, skillfist) setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, skillsword) setConditionParam(condition, CONDITION_PARAM_SKILL_AXE, skillaxe) setConditionParam(condition, CONDITION_PARAM_SKILL_CLUB, skillclub) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCE, skilldistance) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELD, skillshield) setConditionParam(condition, CONDITION_PARAM_OUTFIT, outfit) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_SPEED, 100) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_REGENERATION) setConditionParam(condition, CONDITION_PARAM_SUBID, 1) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo) setConditionParam(condition, CONDITION_PARAM_HEALTHGAIN, health) setConditionParam(condition, CONDITION_PARAM_HEALTHTICKS, 1000) setConditionParam(condition, CONDITION_PARAM_MANAGAIN, mana) setConditionParam(condition, CONDITION_PARAM_MANATICKS, 1000) setCombatCondition(combat, condition) local sys = createConditionObject(CONDITION_OUTFIT) setConditionParam(sys, CONDITION_PARAM_TICKS, tempo) addOutfitCondition(sys, outfit) setCombatCondition(combat, sys) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
  12. Eae galerinha do xtibia, vim aqui hoje para ensinar uma coisa simples, mas que muitos nao sabem, e queriam aprender de uma forma bem facil. Vou ensinar á criar spells básicas de damage, de area, e alvo unico... Primeiro, irei ensinar uma de alvo unico. Vá em data/spells/scripts copie um arquivo .lua e renomeie para o que desejar: Verde: é o tipo do dano, seja physical, fire, earth, ice, energy, lifedrain, manadrain, etc... setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 22) Vermelho: é o numero do efeito que irá até o alvo, voce pode escolher usando o comando "/x" setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -120.2, 1, -125.2, 1) Roxo: é o dano minimo, e maximo da spell. Baseado no level. doSendMagicEffect(position1, 196) Azul claro: Efeito que vai dar no target, quando o efeito "22" bater nele, voce pode escolher pelo comando "/z" E agora, vamos colocar sua spell no spells.xml: <instant name="Nome da spell" words="Nome da spell" lvl="Level necessario" mana="mana que ira gastar" aggressive="1" range="7" blockwalls="1" needtarget="1" exhaustion="1500" needlearn="0" event="script" value="Nome do arquivo.lua"> <vocation id="id da vocaçao"/> Agressive: se for para dar dano coloque "1" se nao for apra dano coloque "0" Blockwalls: se o jutsu pode atravessar paredes coloque "0", se nao atravessar coloque "1" Needtarget: se precisa estar atacando coloque "1" se nao, coloque "0" Exhaustion: Tempo de exalst, 1500 = 1,5 segundos. Bem, fazendo tudo isso certinho, sua spell estará pronta, agora vou explicar uma spell simples de area. ---------------------------------------------------------------------------------------------- Copie qualquer arquivo, e renomeie para o que desejar. Vou utilizar um script bem simples que eu criei agora, só para demonstraçao. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, 214) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -93.5, 1, -106.5, 1) arr1 = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } local area1 = createCombatArea(arr1) setCombatArea(combat1, area1) local function onCastSpell1(parameters) return isPlayer(parameters.cid) and doCombat(parameters.cid, combat1, parameters.var) end function onCastSpell(cid, var) local position1 = {x=getCreaturePosition(cid).x+2, y=getCreaturePosition(cid).y, z=getCreaturePosition(cid).z} local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 100, parameters) return TRUE end setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) Essa parte, como expliquei na spell anterior, apenas mude o tipo de dano, á seu gosto. setCombatParam(combat1, COMBAT_PARAM_EFFECT, 214) Aqui, voce muda o efeito, que está o numero 214, voce pode modificar, vendo os numeros pelo comando "/z" setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -93.5, 1, -106.5, 1) Aqui, voce escolhe dano minimo e máximo, baseado no level. arr1 = { {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0} } Essa seria a area da spell, os numeros: 3: local onde o player que executou a spell irá estar. (sempre no meio) 1: local onde sairá a spell, ou seja, onde ira sair o efeito, e ira dar dano. 0: nao sairá nada Agora, vamos coloca a tag da spell em spells.xml: <instant name="Nome da spell" words="Nome da spell" lvl="level necessario" needtarget="0" mana="mana que ira gastar" aggressive="1" exhaustion="1600" needlearn="0" event="script" value="Nome do arquivo.lua"> <vocation id="id da vocaçao"/> O resto ja expliquei na spell anterior. Bem galera, por enquanto é isso, muito simples né.. Estou aceitando criticas e dicas para o topico, que eu estarei editando... e, em breve farei um tutorial mais aprofundado .... Se gostou nao esqueça de deixar seu rep
  13. Olá galera do XTibia , tudo tranquilo ? Bom , gostaria de pedir a vocês , um NPC que adicionasse uma spell ao player , e mudasse a outfit do mesmo. Exemplo : Bom , é isso galera ^.^ Desde já muito obrigado XD
  14. Esta spell ao ser utilizada pelo player teleporta ele para sua cidade com um delay para se teleportar. spells.xml <instant name="Konoha teleport" words="Konoha teleport" lvl="1" mana="0" prem="1" aggressive="0" selftarget="1" exhaustion="10000" needlearn="0" event="script" value="citytp.lua"> </instant> citytp.lua function onCastSpell(cid, var) local waittime = 15.0 -- Tempo de exhaustion local storage = 115518 local function doTeleport(cid, count) if (not isPlayer(cid)) then return true end doSendAnimatedText(getCreaturePosition(cid), (10 - count).."s", COLOR_ORANGE) doSendMagicEffect(getCreaturePosition(cid), 54) if (count == 10) then return doCreatureSetNoMove(cid, false) and doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) else addEvent(doTeleport, 1000, cid, count + 1) end return true end if (not isPlayerPzLocked(cid)) then if (not getCreatureCondition(cid, 1024)) then return doCreatureSetNoMove(cid, true) and doTeleport(cid, 0) else doPlayerSendTextMessage(cid,MESSAGE_STATUS_SMALL,"You cannot use this command while you are infight.") return false end else doPlayerSendTextMessage(cid,MESSAGE_STATUS_SMALL,"You cannot use this command while you are pz locked.") return false end end
  15. Gostaria de fazer um pepido, acho q o nome e ''Aura System'', pois bem entei ne um ot server hj e ao falar !aura on ficando o efeito da death rodando intorno no char. Sera que alguem q tenha esse script possa disponibiliazar ?
  16. Salve comunidade, estou com um problema em duas magias que possuem a função addEvent. Caso algum programador queira me ajudar, ficarei grato. Versão 10.96, TFS 1.2 Spells:
  17. Entao gente, queria saber se alguem poder colocar paralizy nesse script de spells atk -- SpellCreator generated. -- =============== COMBAT VARS =============== -- Areas/Combat for 0ms local combat0_Brush = createCombatObject() setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatArea(combat0_Brush,createCombatArea({{0, 1, 1, 1, 0}, {1, 1, 1, 1, 1}, {1, 1, 3, 1, 1}, {1, 1, 1, 1, 1}, {0, 1, 1, 1, 0}})) function getDmg_Brush(cid, level, maglevel) return (3000)*-1,(8000)*-1 end setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush") local dfcombat0_Brush = {CONST_ANI_EXPLOSION,0,0,0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1,1,2,0,2,-1,2,-1,-2,0,-2,1,-2,-2,0,-2,1,2,1,2,0,2,-1,-2,-1} -- =============== CORE FUNCTIONS =============== local function RunPart(c,cid,var,dirList,dirEmitPos) -- Part if (isCreature(cid)) then doCombat(cid, c, var) if (dirList ~= nil) then -- Emit distance effects local i = 2; while (i < #dirList) do doSendDistanceShoot(dirEmitPos,{x=dirEmitPos.x-dirList,y=dirEmitPos.y-dirList[i+1],z=dirEmitPos.z},dirList[1]) i = i + 2 end end end end function onCastSpell(cid, var) local startPos = getCreaturePosition(cid) RunPart(combat0_Brush,cid,var,dfcombat0_Brush,startPos) return true end
  18. GALERA ALGUÉM MANJA DE PASSIVA no meu serve pelo que vi nos xml config.lua ele ja tem mais quando ligo o game não pega .....nao sei fazer pega
  19. Olá Pessoal, Estou precisando da Ajuda De vocês! seus lindos Preciso de uma Magia que recupere Mana. Uma quantia minima e uma máxima. Porém que essa recuperação seja com o player Parado,com um efeito contínuo e se movimentar-se ou entrar em Battle, a magia Para. Já vi parecidos com DBO e tudo mais, mas não consegui Migrar. PS: A Magia não recupera a mana instantaneamente, e sim por TICKS. Obrigado Pessoal! <3
  20. Eae pessoal, no meu projeto de dragon ball como poucos conhecem, eu estou tentando utilizar o estilo de spells com troca de outfit, como mostra o gif abaixo. Acham que vale a pena?
  21. 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.
  22. Olá xTibianos, eu tenho uma dúvida pequena, queria saber se existe alguma função onde o player fica parado quando executa a spell/talkaction, e que esse tempo seja configurável, existe algo assim?
  23. Script : Spells e versao 8.54 Pokemon Dash Advanced (1.0) Sou nivel medio de experience Bom... Eu ja tenho as Mega evolucaos 100% (so de 15 pokemons) mais falta 1 error aqui que Nao sei como faz vai na imagem e vei o ataque que tem Charizard para poder faz Mega Despois ele tranforma O que eu quero faz e do que o ataque que eu vo usar Colocar esse imagem
  24. Script : Spells e versao 8.54 Pokemon Dash Advanced (1.0) Sou nivel medio de experience
  25. Boa tarde pessoal, tudo bem? Hoje resolvi fazer um tutorial sobre dois recursos muito simples e úteis na hora de criar magias diferentes, inovadoras e divertidas. Motivação Eu nunca soube fazer spells direito, achava chato e monótono, portanto nunca procurei saber mais. Essa semana, acabei fazendo um evento que a recompensa era uma magia, então quis fazer algo diferente e bonito, que fugisse um pouco do padrão (dê uma olhada em: http://www.xtibia.com/forum/topic/238734-luna-event-bonus-spell-inspirado-no-sot-01/#entry1680858). Só que, na minha busca por aprender mais sobre as spells, eu vi que é um tanto nebuloso a parte de dano e de callbacks. Os tutoriais os utilizam nos scripts demonstrativos mas falam pouco a respeito. Li muito, descobri algumas coisas no empirismo e outras nas sources do TFS e me senti motivado a reunir tudo que encontrei em um tutorial. Importante: Este não é um tutorial que vai ensinar a criar uma spell, existem milhares com esse objetivo aqui no fórum e na internet em geral. O foco aqui é estudar dois recursos que podem tornar o processo criativo de spells muito mais interessante, divertido e único, abrindo possibilidades diferentes do que simplesmente uma magia que solta um efeito e dá dano. Bom, chega de mimimi e vamos ao que interessa. Conceitos Vamos começar definindo nossos dois objetos de estudo. Fórmulas, como o próprio nome já define, são expressões matemáticas usadas para representar algum valor. No nosso caso, as fórmulas de dano das magias são expressões matemáticas que sintetizam e representam o dano da nossa magia. Callbacks são, traduzindo ao pé da letra, funções que ligam de volta. Definindo melhor, são funções que disparam ações quando determinado evento/acontecimento ocorre. Isso é, elas nos dão um retorno a um evento ou chamad. Exemplos: addEvent, é um callback muito útil que dispara com o tempo chamando uma função; onDeath é um callback que dispara quando determinada criatura morre. Uma vez entendido teoricamente o que vamos estudar, mãos a obra. Entendendo Fórmulas O controle das fórmulas de dano das spells é feito pela função setCombatFormula, cuja chamada default é mostrada abaixo: setCombatFormula(combat, formulaType, min_a, min_b, max_a, max_b, min_lvl, max_lvl, min_mlvl, max_mlvl, min_dmg, max_dmg) Combat é o objeto combate em questão, normalmente ele é instanciado no inicio dos arquivos de spells como local combat = createCombatObject(). É esse objeto que controla, a partir de seus parâmetros, toda a dinâmica das spells: efeitos, dano, área, etc. Min_a e Max_a são múltiplicadores das fórmulas de dano máximo e mínimo Min_b e Max_b são números base das fórmulas de dano máximo e mínimo Min_lvl e Max_lvl são ponderadores do level na fórmula de dano máximo e mínimo baseado em ML, dividem o lvl do player. Min_mlvl e Max_mlvl são ponderadores do magic level na fórmula de dano máximo e mínimo baseado em ML, multiplicam o ml do player. Min_dmg e Max_dmg são os limites do dano máximo e mínimo, o menor dano possível é min_dmg e o maior dano possível é max_dmg. formulaType são os diferentes tipos de fórmulas que podem ser usados, isso é, formas diferentes de como os parâmetros de dano que foram passado serão utilizados. Existem três tipos relevantes de fórmulas, existe um quarto chamado undefined ou 0. Porém nele todos os parâmetros são zero. São eles: COMBAT_FORMULA_LEVELMAGIC ou 1 Essa é a fórmula mais completa das três, utiliza de todos os parâmetros para definir o dano máximo e mínimo. Basicamente, a fórmula de dano é Dano mínimo = ((player_level / min_lvl + player_mlvl) * min_mlvl) * min_a + min_b) Dano máximo = ((player_level / max_lvl + player_mlvl * max_mlvl) * max_a + max_b) Se dano mínimo > min_dmg, então dano mínimo = min_dmg Se dano máximo > max_dmg, então dano máximo = max_dmg Considerações importantes, o valor final de dano máximo e dano mínimo deve ser negativo, o mesmo vale para os valores de min_dmg e max_dmg. Portanto, para evitar confusão vai uma dica simples: Sempre coloque min_a, min_b, max_a, max_b, min_dmg e max_dmg negativos e o restante positivo. COMBAT_FORMULA_SKILL ou 2 Mais simples que o anterior, só utiliza em seu cálculo os parâmetros min_b, max_a e max_b. Leva em consideração, como veremos, level, arma e skill (referente à arma que ele estiver empunhando) do player. Min_dmg não serve para esse caso, mas max_dmg ainda vale como no anterior. Dano mínimo = min_b Dano máximo = Dano_Calculado * max_a + max_b Se dano máximo > max_dmg, então dano máximo = max_dmg Aqui Dano_Calculado é o calculo do seu dano com a sua arma, levando em conta seu level e skills. Novamente, o valor final dos danos deve ser negativo. Aqui, use todes os valores negativos e não terá problemas. COMBAT_FORMULA_DAMAGE ou 3 A mais simples das três, leva em consideração somente min_b, que será o dano mínimo e max_b, que será o dano máximo. Para não ter problemas, use valores negativos. A respeito das fórmulas é isso. São as três fórmulas pré-definidas e seus funcionamentos. Callbacks Nosso estudo sobre callbacks vai se basear na função setCombatCallback que faz o controle dos callbacks dos objetos de combate. A seguir, a declaração da função setCombatCallback: setCombatCallback(combat, callbackType, “nome da funcao”) Vamos explicar primeiro o que essa função faz. Ela adiciona ao objeto combat especificado uma função como retorno a um determinado tipo de evento. Cada tipo de callback é referente a um evento e espera da função que você passou como parâmetro alguns parâmetros. Por exemplo, queremos adicionar um callback do tipo X com a função de retorno functionX, sabendo que callbacks do tipo x esperam funções que recebam x1, x2 e x3 como parâmetro. Então temos que definir a função functionX e criar a chamada do callback: function functionX(x1, x2, x3) code end setCombatCallback(combat, X, “functionX”) Acredito que tenham entendido um pouco do funcionamento, agora vou explicar cada tipo de callback. Temos quatro tipos, mostrados a seguir: CALLBACK_PARAM_LEVELMAGICVALUE ou 1 Esse callback é definido para disparar quando o dano é aplicado. Não consegui descobrir exatamente em que momento ele é chamado, mas, quando definido, toda vez que sua magia causa dano ele vai disparar a função para a qual foi programado. Ele é utilizado para reprogramar a forma como o dano vai ser calculado. A grande sacada aqui é que você pode definir as formulas de dano como você bem entender (levando em conta level e ml) e melhor se encaixar ao seu propósito. Esse callback espera funções que recebam os parâmetros: cid, level, maglevel e um retorno com os valores máximos e mínimos de dano. Uma definição para esse callback seria: function functionX(cid, level, maglevel) min = -maglevel*1.1 + level max = -maglevel*2.2 + level*1.1 return min, max end setCombatCallback(combat, CALLBACK_PARAM_LEVELMAGICVALUE, “functionX”) CALLBACK_PARAM_SKILLVALUE ou 2 Similar ao anterior, porém danos com base em skills, esse callback é definido para disparar quando o dano é aplicado. Não consegui descobrir exatamente em que momento ele é chamado, mas, quando definido, toda vez que sua magia causa dano ele vai disparar a função para a qual foi programado. Ele é utilizado para reprogramar a forma como o dano vai ser calculado. A grande sacada aqui é que você pode definir as formulas de dano como você bem entender (levando em conta skills, level, ataque da arma e modo de ataque) e melhor se encaixar ao seu propósito. Esse callback espera funções que recebam os parâmetros: formulaBySkill(cid, level, skill, attack, p, factor) e um retorno com os valores máximos e mínimos de dano. Uma definição para esse callback seria: function functionX (cid, level, skill, attack, factor) min = -(1.2 * (attack * (skill + 5.8) / 25 + (level - 1) / 10) / factor) max = -(2 * (attack * (skill + 5.8) / 25 + (level - 1) / 10) / factor) return min, max end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, “functionX”) Observação importante: no servidor que eu tenho aqui, por algum motivo sobrenatural desconhecido, tem um parâmetro nulo extra entre attack e factor. Então, se você tentar usar isso no seu servidor e der erro “factor attempt to call nil value” ou algo do tipo use isso: function functionX (cid, level, skill, attack, vazio, factor) Nos sources que eu olhei esse parâmetro não existe, não achei nada a respeito dele e ele é sempre 0. Se alguém souber o que ele significa, se ele significar algo, comente ai. CALLBACK_PARAM_TARGETTILE ou 3 Esse callback é definido para disparar quando a magia atinge cada um dos tiles definidos em sua área. Ele pode ter uma diversidade de aplicações, que envolvem customizar efeitos e ações da magia de acordo com o tile que ela atinge. Vai depender da sua criatividade, mas há um leque infinito de coisas que podem ser feitas. Exemplo: Se uma área de neve for atingida por uma magia de fogo, ela descongela e vira um tile de terra ou pedra; se em um dos tiles que a magia acertar houver um item, esse item vai para a bp do player; em determinado tipo de terreno a magia dá um dano extra; e por ai vai. Esse callback espera funções que recebam os parâmetros: cid e tile. Uma definição para esse callback seria: function onTargetTile(cid, tile) addEvent(doSendMagicEffect, x*350, tile, config.effects.hit) End setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile") CALLBACK_PARAM_TARGETCREATURE ou 4 Esse callback é parecido com o anterior. Ele é definido para disparar quando a magia atinge um criatura dentro da área de atuação dela. Ele pode ter uma diversidade de aplicações, que envolvem customizar efeitos e ações da magia de acordo com o tipo de criatura (diferentes monstros, se é player ou não, etc) que ela atinge. Vai depender da sua criatividade, mas há um leque infinito de coisas que podem ser feitas. Exemplo: Se um fire elemental for atingido por uma magia de fogo a vida dele aumenta ou um novo fire elemental surge; se o alvo da magia for um player há um dano adicional; se um monstro for atingido por essa magia ele é convencido e passa ate ajudar; e por ai vai Em uma magia como a que eu fiz para o evento luna, por exemplo, que dá vários hits ao longo de uma execução dela, cada hit dispara esse callback. Uma aplicação seria, então, a cada hit há uma chance de congelar e imobilizar o player. Esse callback espera funções que recebam os parâmetros: cid e target. Uma definição para esse callback seria: function onTargetCreature(cid, target) local chance = math.random(1, 18) if getGlobalStorageValue(5545) == -1 and isPlayer(target) and chance == 1 then registerCreatureEvent(target, "NoAtt") registerCreatureEvent(target, "NoSpell") registerCreatureEvent(target, "NoTgt") setGlobalStorageValue(config.storages.event, 1) addEvent(setGlobalStorageValue, 3000, 5545, -1) end chance = math.random(1, 15) if chance == 1 then doSendMagicEffect(getCreaturePosition(target), config.effects.hit) doCreatureSetNoMove(target, true) doSetItemOutfit(target, config.frozen_humans[math.random(1, #config.frozen_humans)], 1500) addEvent(backToMovement, 1800, target) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") Bom gente, foi isso o que consegui coletar, entender e aprender sobre as fórmulas de dano e callbacks das magias. Qualquer coisa que queiram acrescentar ou corrigir, fiquem a vontade para comentar. Espero que gostem. Abraços,
×
×
  • Criar Novo...