Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 01/12/16 em todas áreas

  1. Ola galera , vim convida-los a entrar em meu servidor Baiak 10.90, o servidor está em teste ainda, pois o mesmo foi adaptado para TFS 1.2 e estou resolvendo aqueles bugs etc.. A distro já está rodando a mais de 800h sem cair. Este Servidor será disponibilizado (Source + datapack) aqui no xtibia depois do término da Fase Open do servidor. Site: www.johtera.com Atenciosamente [Admin]Insanity^A
    3 pontos
  2. Olá, Editado, ops não vi que tinha um efeito, estou no celular. Basta substituir: doTeleportThing(cid, townpos) doSendMagicEffect(getPlayerPosition(cid), 10) Por addEvent(function() doTeleportThing(cid, townpos) doSendMagicEffect(getPlayerPosition(cid), 10) end, Tempo, cid, townpos) Abraços,
    3 pontos
  3. 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,
    2 pontos
  4. Manin se não me engano esse erro é por calsa do diretório. vai na pasta htdoc dentro do xampp e vai na pasta config e entra no config.php (eu abro ele com o dev c++, não sei com quais outros abri talvez o blocod e notas msm ou o notepad). Na 3ª linha vai ta: $config['site']['serverPath'] = "C:/Users/Usuario/Desktop/Meu Tibia/server/"; Onde ta o C:/user dentro dos parenteses vc cola o seu diretório q vc vai cola ( é o que está circulado na imagem. Após colar o diretório nos parenteses vc vai mudar as barras de \ para / e no fina vc tbm coloca mais uma / igual está no meu acima (não o da imagem). acho q é isso posta se deu certo ^^.
    2 pontos
  5. O código acima irá funcionar e servir o propósito, porém uma boa prática quando trabalhamos com functions no addEvent é re-checar os parâmetros que iremos utilizar do callback. Em outras palavras, se vamos utilizar o cid na function, temos que checar se ele ainda existe quando o addEvent for chamado. addEvent(function() if isCreature(cid) then doTeleportThing(cid, townpos) doSendMagicEffect(getPlayerPosition(cid), 10) end end, 5 * 1000, cid, townpos) -- 5 * 1000 representa 5 segundos ate teleportar.
    2 pontos
  6. Conteúdo: Imagens Mapa não incluso Downloads: Removendo Bugs de itens (como order, fishing, etc) Sistemas feitos para o PDE: Tutoriais feitos para o PDE: Bugs reportados:
    1 ponto
  7. Bluester

    [Client] Pokémon DUB

    Olá mais uma vez XTibianos, dessa vez, venho trazer à vocês um presentinho de natal que muitos me pediram... Trago o Client do Pokémon DUB ( Sim, aquele projeto que parou de repente ). Bom, não tenho muito o que dizer, aqui está um print: ( breve postarei mais, to sem tempo ) Além desses módulos que contém na imagem, tem uma interface bem bonita e também tem vários outros módulos que o pessoal já deve ter visto, só que a maioria necessita de OPCodes e um conhecimento em Clients para ativar. Link de Download: Bom, é só isso, até mais pessoal ! Créditos: Eu; Overllord; Jeff ( PDUB ).
    1 ponto
  8. Global Full [CLIENTS COMPATÍVEIS] 10 e 11.5. [BUGS E DOWNLOAD] BAIXEM E REPORTEM EM: OTXGlobal Full [FEATURES] NEW DEPOT, NEW SPAWN, NEW CAST SYSTEM, NEW NPC SYSTEM VIA BANK BALANCE, NEW CRITICAL BOOST SYSTEM, NEW POTIONS, REWARD SYSTEM, PREY ... [MAPA] FULL GLOBAL MAP WITH FEYRIST TODAS CIDADES E NOVAS AREAS TODAS QUESTS FUNCIONANDO! [EVENTS] WAR-ANTIENTROSA [CONTATO] SKYPE: onjogos WHATSAPP: (66) 998427-4493 [Créditos]Tfs 1.2 Developers -Zbizu - Pitis91 - MatheusMkalo - Gesior - Lundrial - M4G0 - Fish04k - Printer - Djarek - Ninjalulz - Slavidodo - Thexamx - Socket2810 - Ciroc -Absolute - Gordonbay - Mitsuig - Alissonfgp - Gunz - Bruno Minervino - Comedinha -Hirako - Maya - Mattyx14 – Darkjav - Viking Tibia
    1 ponto
  9. @@lokoga @@willxtibia 1 - deletem o firstitems da pasta mods e o que vocês tem no data 2 - Em CADA Sample do server, coloque o item que vocês querem que a vocação referente começe 3 - Vá em data/creaturescripts/scripts e crie firstitems.lua e adicione isso dentro: em creaturescripts.xml adicione a tag: <event type="login" name="FirstItems" script="firstitems.lua" /> Se vocês quiserem, podem configurar já TODOS os itens iniciais de cada vocação ja nos samples, assim, não precisariam do firstitems.lua Abraço.
    1 ponto
  10. Nossa gente, me desculpem, como sou burro kkkk No 10.90, mesmo tendo group id 3 no player, você precisa mudar na database, o type da account para 5.
    1 ponto
  11. O grupo id do god eh o 3, gm eh 2 e player 1 Os first items vc tem q configurar na pasta do ot.
    1 ponto
  12. @@felzan Compartilhava da mesma decepção, mas após esse breve aprodundamento essa semana vejo nelas um leque infinito de opções bacanas. @@Daniel Acabei de tirar elas debaixo da minha cama e coloquei na minha estante.. kkk O tutorial demorou mais do que o previsto pq nao tem recurso se rascunho, browser travou e perdi tudo. Dessa vez fiz no word antes kkkk Me perdoe por postar em spriting,eu sempre entro nela lendo rapido e achando que é scripting. Move pra mim, por favor. Obrigado pelos feedbacks. Abraços
    1 ponto
  13. 1 ponto
  14. Boa ideia Caronte ^^ irei providenciar um github pra mim. Mas akela velha pergunta , como faz um ? ahhaha deve ser simples né ?
    1 ponto
  15. Opa que iniciativa legal, coloca as sources e datapack nosl github, para ser mais fácil de dar updates, através de pulls, commits, forks...
    1 ponto
  16. Clique no rodapé do tópico que resolveu seu problema, no botão de resolvido.
    1 ponto
  17. Não, pretendo deixar 100% com ajuda da comunidade.
    1 ponto
  18. Vou fazer um fix 2.2 para o servidor, foi erro meu, desculpe.
    1 ponto
  19. Pelo o que eu sei não. Não custa tentar também.. Tenta criar um projeto no Dev cpp usando os arquivos .cpp e .h da source..
    1 ponto
  20. Danihcv

    Unexpected Symbol Near

    O script que eu mandei deu uma bugada. E mesmo assim, o q eu modifiquei, acabou sendo um erro, então ignore o que eu mandei. Agora minha pergunta: vc criou um monstro chamado Torcedor em seu server? Pq creio que o problema seja a inexistência de um monstro chamado Torcedor nos arquivos do servidor. (mais especificamente dentro da pasta monster)
    1 ponto
  21. Danihcv

    Unexpected Symbol Near

    Vc tá usando qual editor de texto pra salvar seu script? Se tiver usando o bloco de notas, tente usar o Notepad++. E vice-versa. Basicamente: utilize um editor de texto diferente para salvar o script. #EDIT: na vdd, tinha um erro no 1° script, tinha um [/left] (wtf?!) no meio do script. Tente usa-lo assim:
    1 ponto
  22. OK. local config = { stone_ID = 1546, --ID da pedra que suponho que bloqueie a passagem. stone_posis = { {x = 445, y = 593, z = 14}, --Posições das pedras (pode configurar quantas quiser). {x = 445, y = 594, z = 14} } } function onUse(cid, item, fromPos, item2, toPos) if item.itemid ~= 1945 then return true end for i = 1, #config.stone_posis do doRemoveItem(getTileItemById(config.stone_posis[i], config.stone_ID).uid) end doTransformItem(item.uid, 1946) addEvent(onTimer7, 15*60*1000, toPos) --30minutes return true end function onTimer7(lever_pos) --creates wall back doTransformItem(getTileItemById(lever_pos, 1946).uid, 1945) for i = 1, #config.stone_posis do doCreateItem(config.stone_ID, 1, config.stone_posis[i]) end end
    1 ponto
  23. Eu já sugeri isso e, segundo ele, o erro persistiu, amigo.
    1 ponto
  24. Desnecessario

    [ Goren ] Show-Off Sprites

    @Up Um dos melhores heróis da marvel agora na perspectiva 45°
    1 ponto
  25. Troque: if getPlayerItemCount(cid, need[1].id) < need[1].qt then selfSay("Você não me trouxe os itens necessários...", cid) selfSay("Lembre-se, eu preciso de todos esses itens...", cid) talkState[talkUser] = 0 return true end por: for i = 1, #need do if getPlayerItemCount(cid, need[i].id) < need[i].qt then selfSay("Você não me trouxe os itens necessários...", cid) selfSay("Lembre-se, eu preciso de todos esses itens...", cid) talkState[talkUser] = 0 return true end end Troque: local stoFinish = {92121} por: local stoFinish = 92121 Troque: setPlayerStorageValue(cid, stoFinish, 0) por: setPlayerStorageValue(cid, stoFinish, 1)
    1 ponto
  26. Sinceramente, achei desnecessário criar o tópico sem conteúdo!
    1 ponto
  27. Man usa o evento http://www.xtibia.com/forum/topic/170316-mod-evento-team-battle/ Ou http://www.xtibia.com/forum/topic/235694-battlefield-tfs-11/ como base, ai vc vai mudando as configurações até ficar do jeitinho q vc quer, pq o evento q vc ta pendindo é praticamente esses ai só q editado, ai vc pede ajuda se n conseguir.
    1 ponto
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...