Ir para conteúdo

Tace

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Curtir
    Tace deu reputação a ADM Milord em OTServer 7.6   
    Amigo caso queria inciar, com a versão Old School, essa aqui é base mais estável que tenho. Ele roda apenas em Linux, e tem alguns erros, por enquanto eu tô introduzindo o cast system nele, em breve posterei aqui no forum, mais se caso você estive com presa esse aqui é melhor.
  2. Curtir
    Tace deu reputação a Summ em A diferença entre: Um Cara Que Programa e Um Programador   
    Primeiramente o artigo não é meu só achei interessante e pensei em compartilhar com vocês, o autor se chama William Bruno.
    Link Original : http://wbruno.com.br/opiniao/diferenca-entre-cara-programa-um-programador/
     
    O ato de escrever códigos te faz ser um cara que programa, mas não necessariamente um programador.
     
    Okay, eu “inventei” agora a diferença entre esses termos.
     
    Digamos que ambos cumprem o papel e resolvem o problema.
    A diferença está na forma de pensar deles.
     
    Existem diversas maneiras de se chegar a um mesmo resultado. Umas mais claras, diretas, outras mais bonitas, elegantes, as vezes nebulosas, cheias de voltas e emaranhados, boas ou ruins. Apesar do peso de subjetividade que esses termos carregam.
    Na minha opinião, um bom código é aquele que, chega onde deve chegar, sendo este legível aos envolvidos, e aqueles que não sabem do que se trata.
     
    -> Bom em performance;
    -> Sem rotinas confusas ou desnecessárias(as famosas gorduras);
    -> Bem indentado e organizado.
     
    Apenas isso. Simples e objetivo. Toda a comunidade, conhece ou deveria conhecer os conceitos que citei. (Keep It Simple, Faça o Simples que Funcione, Você não vai precisar disso, Don’t Repeat Yourself…)
     
    Não quero me alongar sobre cada um deles. O meu ponto é: “Um CQP [Cara Que Programa], não leva ou nem sempre leva em consideração estas ‘máximas’.”
    Já um VP [Verdadeiro Programador], possui esses conceitos incorporados a ele. Na forma de pensar, na maneira de codificar. Para um Programador, é natural, para o CQP, ainda não é.
     
    Todos sofremos pressão, temos prazos apertados, situações difíceis… Este é o nosso mundo. A agência ou empresa, pode lhe dizer que é tranquilo, que são pacientes, que os prazos são legais, e tudo mais.. Porém faz parte da arte de programar. Cedo ou tarde, mais ou menos vezes, nos deparamos com algo urgente e impossível, para ontem.
     
    Um programador resolve da melhor forma possível, enxergando na frente, o outro faz apenas para se ver livre, e entregar logo. O erro aqui, é que depois aquele monstrinho volta, e nem sempre podemos ou temos tempo de refazer ou corrigir.
     
    Dai surgem as cabeças dos nossos monstros. Duas, Três, Sete… a tendência é piorar. Começou errado, por preguiça, falta de conhecimento, mal planejamento, ego…
    Um CQP, acha que sabe tudo, ou não se importa de não saber, e nem tenta. Um VP, tenta saber, sempre busca melhorar, aceita analisando as críticas recebidas, e gosta do que faz.
    Fazer bem feito lhe deixa feliz, o contrário lhe incomoda.
     
    O melhor programador não é aquele que complica mais. Códigos de linguagens alto nível, devem ser escritos por humanos e para humanos. As máquinas entendem, tanto códigos bem escritos, quanto códigos ruins, mas e você no futuro ? e o outro programador ?
     
    Acho que todos nós já demos continuidade no trabalho de alguém. Já vimos scripts porcos, e outros bem feitos.
     
    Quando alguém pegar um trabalho nosso, vamos tentar ser aquele que não será xingado, e nem fez o outro programador perder horas e horas, entendendo as loucuras que fizemos.
     
    Se faça essa pergunta. O que você é? Qual dos dois?
  3. Gostei
    Tace deu reputação a Andreeyyy em All bugs OTSERV - REVELADO ! -   
    Mais ngm disse pra retirar eles, apenas utilizar outro nome no char de base. E manter os Samples
  4. Gostei
    Tace deu reputação a xWhiteWolf em (Resolvido)Deixa Clone Com Buff   
    Coloquei uma variavel chamada names onde vc coloca todos os nomes que quiser sempre separando por virgula e entre aspas
  5. Gostei
    Tace deu reputação a xWhiteWolf em (Resolvido)Deixa Clone Com Buff   
    a cada up que vc der vai ser um dia a mais que eu vou demorar pra resolver isso pra ti. Eu já falei que vou fazer cara, para de ficar pressionando... já é o terceiro script que eu vou resolver pra você e eu te digo que não gosto de ser pressionado e você continua pressionando.. não vai haver uma próxima vez.
  6. Gostei
    Tace deu reputação a xWhiteWolf em (Resolvido)Spells para remover os summons   
    getCreatureSummons(cid) Info This functions checks for creature summons list. Returns false if creature not found, otherwise table with creatures list (NOTE: Can be empty!) Example local summons = getCreatureSummons(cid) if(table.maxn(summons) <= 0) then -- no summons doPlayerSendCancel(cid, "You don't have any summons..") return false end -- remove all summons for _, pid in ipairs(summons) do doRemoveCreature(pid) end
  7. Gostei
    Tace deu reputação a Vodkart em [System] Weapon Hit Rank!   
    Créditos:

    Jhon & Vodkart

    Como funciona:

    É um sistema simples, mostra o rank de maior hit do server, seja de axe, sword, club, wand, etc...

    Mostra o Nome do player - [Hit] - Nome da weapon

    imagem de exemplo:

    rank axe

    rank club

    obs: como o sistema de rank normal, level e etc, para aparecer no rank o jogador tem que relogar ou dar serversalve.
    ---------------------------------------


    RankHit.xml

    <?xml version="1.0" encoding="UTF-8"?> <mod name="RankHit" version="1.0" author="Vodkart e Jhon" contact="tibiaking.com" enabled="yes"> <config name="rank_func"><![CDATA[ WEAPON_WAND = {2190, 2191, 2188, 8921, 2189, 2187, 8920, 8922, 2184, 7414, 2453} WEAPON_ROD = {2182, 2186, 2185, 8911, 2181, 2183, 8912, 8910, 7958, 12609} storage_mostdamage = { CLUB = {155201,156201}, SWORD = {155202,156202}, AXE = {155203,156203}, WAND = {155204,156204}, ROD = {155205,156205}, DISTANCE = {155206,156206}, MAGIC_SD = {155207,156207,157207} } function setSdHit(cid, damage) if damage > getPlayerStorageValue(cid, storage_mostdamage.MAGIC_SD[1]) then setPlayerStorageValue(cid, storage_mostdamage.MAGIC_SD[1], damage) setPlayerStorageValue(cid, storage_mostdamage.MAGIC_SD[2], 2268) end return true end function setPlayerMostHitMage(cid, damage, weapon) if isInArray(WEAPON_WAND, getPlayerSlotItem(cid, CONST_SLOT_LEFT).itemid) == TRUE or isInArray(WEAPON_WAND, getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid) == TRUE then if damage > getPlayerStorageValue(cid, storage_mostdamage.WAND[1]) then setPlayerStorageValue(cid, storage_mostdamage.WAND[1], damage) setPlayerStorageValue(cid, storage_mostdamage.WAND[2], weapon) end elseif isInArray(WEAPON_ROD, getPlayerSlotItem(cid, CONST_SLOT_LEFT).itemid) == TRUE or isInArray(WEAPON_ROD, getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid) == TRUE then if damage > getPlayerStorageValue(cid, storage_mostdamage.ROD[1]) then setPlayerStorageValue(cid, storage_mostdamage.ROD[1], damage) setPlayerStorageValue(cid, storage_mostdamage.ROD[2], weapon) end end return true end function getRankHit(cid, value, wvalue, max, RankName) -- by vodka local str,arm ="","" str = "--[".. (RankName == nil and "RANK STORAGE" or ""..RankName.."") .."]--\n\n" local query = db.getResult("SELECT `player_id`, `value` FROM `player_storage` WHERE `key` = "..value.." ORDER BY cast(value as INTEGER) DESC;") if (query:getID() ~= -1) then k = 1 repeat if k > max then break end local getweapon = db.getResult("SELECT `value` FROM `player_storage` WHERE `player_id` = ".. query:getDataString("player_id") .." AND `key` = "..wvalue) if (getweapon:getID() ~= -1) then arm = getItemNameById(getweapon:getDataString("value")) end str = str .. "\n " .. k .. ". "..getPlayerNameByGUID(query:getDataString("player_id")).." - [" .. query:getDataInt("value") .. "] - "..arm.."" k = k + 1 until not query:next() end return doPlayerPopupFYI(cid, str) end function haveWeapon(cid) -- by vodka local armas = {1,2,3,5,6} if getPlayerSlotItem(cid, CONST_SLOT_RIGHT).itemid > 0 and isInArray(armas, getItemWeaponType(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid)) or getPlayerSlotItem(cid, CONST_SLOT_LEFT).itemid > 0 and isInArray(armas, getItemWeaponType(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid)) then return true end return false end function getWeaponType(cid) -- by vodka return getPlayerSlotItem(cid, CONST_SLOT_LEFT).itemid == 0 and getItemWeaponType(getPlayerSlotItem(cid, CONST_SLOT_RIGHT).uid) or getItemWeaponType(getPlayerSlotItem(cid, CONST_SLOT_LEFT).uid) end ]]></config> <talkaction words="/rankhit;!rankhit" event="buffer"><![CDATA[ domodlib('rank_func') local rank_hit = { ["axe"] = {storage_mostdamage.AXE[1],storage_mostdamage.AXE[2]}, ["sword"] = {storage_mostdamage.SWORD[1],storage_mostdamage.SWORD[2]}, ["club"] = {storage_mostdamage.CLUB[1],storage_mostdamage.CLUB[2]}, ["wand"] = {storage_mostdamage.WAND[1],storage_mostdamage.WAND[2]}, ["rod"] = {storage_mostdamage.ROD[1],storage_mostdamage.ROD[2]}, ["distance"] = {storage_mostdamage.DISTANCE[1],storage_mostdamage.DISTANCE[2]}, ["sd"] = {storage_mostdamage.MAGIC_SD[1],storage_mostdamage.MAGIC_SD[2]} } local param = string.lower(param) if (param == "") then local str = "" str = str .. ""..getCreatureName(cid).." Hit\'s\:\n\n" for hit, item in pairs(rank_hit) do str = str..string.upper(hit)..": ".. (getPlayerStorageValue(cid, item[1]) ~= -1 and "["..getPlayerStorageValue(cid, item[1]).."] - "..getItemNameById(getPlayerStorageValue(cid, item[2])).."" or "None") .."\n" end str = str .. "" doPlayerPopupFYI(cid,str) return true end if not rank_hit[param] then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"digite o nome correto.") end return getRankHit(cid, rank_hit[param][1],rank_hit[param][2], 10, "Rank "..param) ]]></talkaction> <event type="login" name="Rank Hit" event="script"><![CDATA[ domodlib('rank_func') function onLogin(cid) registerCreatureEvent(cid, "RankhitCombat") return true end ]]></event> <event type="combat" name="RankhitCombat" event="script"><![CDATA[ domodlib('rank_func') registerCreatureEvent(target, "RankhitStats") return true ]]></event> <event type="statschange" name="RankhitStats" event="script"><![CDATA[ domodlib('rank_func') if type == STATSCHANGE_HEALTHLOSS and isPlayer(attacker) and haveWeapon(attacker) then t = { [1] = {storage_mostdamage.SWORD[1],storage_mostdamage.SWORD[2]}, [2] = {storage_mostdamage.CLUB[1],storage_mostdamage.CLUB[2]}, [3] = {storage_mostdamage.AXE[1],storage_mostdamage.AXE[2]}, [5] = {storage_mostdamage.DISTANCE[1],storage_mostdamage.DISTANCE[2]} } MyWeapon = getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == 0 and getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid if (getPlayerStorageValue(attacker, storage_mostdamage.MAGIC_SD[3]) >= os.time()) then setSdHit(attacker,value) elseif t[getWeaponType(attacker)] then if value > getPlayerStorageValue(attacker, t[getWeaponType(attacker)][1]) then setPlayerStorageValue(attacker, t[getWeaponType(attacker)][1], value) setPlayerStorageValue(attacker, t[getWeaponType(attacker)][2], MyWeapon) end else setPlayerMostHitMage(attacker, value, MyWeapon) end end return true ]]></event> </mod> Em data > spells > scripts > attack > sudden death.lua adicione depois de function onCastSpell(cid, var) setPlayerStorageValue(cid, 157207, os.time()+3) ficando assim: function onCastSpell(cid, var) setPlayerStorageValue(cid, 157207, os.time()+3) return doCombat(cid, combat, var) end
  8. Gostei
    Tace deu reputação a GabrielSapient em Launcher AutoUpdate C#   
    Galera sempre procurei um Launcher AutoUpdate para meu servidor, depois de muita pesquisa e pouco conhecimento consegui fazer um em C#, está ai:
     

     
    1. Download:
     
     
    • Download | • Scan

    2. Oque ele faz:
     
     
    • Verifica a existência da versão local na pasta do cliente;   • Se a versão do arquivo não existir, ele assume que a versão é "1.0" e cria um arquivo de versão;   • Verifica arquivo .xml no servidor de atualização;   • Baixar atualizações para todas as versões maiores do que a versão atual do cliente (atualiza tudo em apenas formato de arquivo .zip);   • Extrai os arquivos .zip;   • Exclui os arquivos .zip após a extração;   • Arquiva a versão atualizada na pasta do cliente;   • E, finalmente, desbloqueia o botão "Start Game".     3. Como editar:     • Abra o arquivo .sln na pasta "VS Project" com o Visual Studio:   Procure por: string Server = "http://127.0.0.1/Updates/"; • Altere o http://127.0.0.1/Updates/ para qualquer URL que você estará hospedando suas atualizações.
        • Agora vamos procurar por:   Process.Start("OTClient PkR DX9.exe", "\\Pokémon Rusty"); • Modifique o OTClient PkR DX9.exe pelo nome do .exe do seu Client.
     
    • \\Pokémon Rusty e a pasta que está seu .exe e vai ficar seu Launcher. (troque sem tirar os "\\")
     

      • No Visual Studio, selecione o controle WebBrowser(Neste caso, o nome "patchNotes") e alterar a url do "http://127.0.0.1/"para o caminho do arquivo index.html, na pasta do host:       OBS: Isto á opcional, é apenas um template em .html. Você pode remove-lo e editar da maneira deseja.       • Agora apenas jogue o .exe, .dll e o arquivo version da pasta "Launcher\VS Project\Launcher v2\bin\Debug ou Release" para a pasta de seu Client:       Pronto! Agora e com o Site.     • No host do site, apos colarmos a pasta Updates, editamos o arquivo Updates.xml, para cada atualização adicionamos um <update> fechamos com </update> como no exemplo do arquivo. Colocamos o arquivo atualização em .zip nessa mesma pasta, editando a versão e o nome no arquivo:   • No arquivo version.txt colocamos a versão da nova atualização:   • Uma dica para o .zip de atualização é colocar em pastas o caminho no client desejado a fazer update. Exemplo: data/things/854 nesta pasta colocaremos os arquivos que será substituído, no exemplo foi Tibia.spr e .dat. Depois compactamos e deixamos na pasta Updates, sem esquecer de colocar o nome no arquivo Updates.xml.   4. Dica   • Pronto! Agora e só criar um instalador com o launcher, com atalho na área de trabalho (o launcher é o .exe que você colocou no client). Você pode modificar o launcher do jeito que quiser, o arquivo index.html e etc. Quando abrir o arquivo ele irá atualizar, liberar o botão "Start Game", e quando você clicar vai fechar o Launcher e abrir o Client.     5. Créditos     Eu - Pelo launcher e pelo tutorial.
  9. Gostei
    local storage = 18371 -- storage function onEquip(cid, item, slot) if getPlayerStorageValue(cid, storage) <= 0 then setPlayerStorageValue(cid, storage, 1) end return true end function onDeEquip(cid, item, slot) if getPlayerStorageValue(cid, storage) > 0 then setPlayerStorageValue(cid, storage, 0) end return true end <movevent type="DeEquip" itemid="8889" slot="armor" event="script" value="set.lua"/> <movevent type="Equip" itemid="8889" slot="armor" event="script" value="set.lua"/> só muda o id do item e o slot que vc quer que ative isso.
  10. Gostei
    Tace deu reputação a Fire Water Earth Air em [PEDIDO~~Scripts~~] Baú que da level.   
    Bom não pedi para você fazer e sim posso eu fazer perguntei ao membro que esta com duvida se ele queria mas muito obrigado pelo script
  11. Gostei
    Tace deu reputação a jeffersonpetrolina em [PEDIDO] SCRIPT MONSTER/PISO   
    não entendi exatamente oq quer mas, pelo que entendi quer summonar um monstro para matar quando pisar no chão e fazer um efeito se sim ...
    está qui a script
     
    vá em data\movements\scripts Crie um arquivo chamado Piso.lua e adicione isso \/
    vá em data\movements e abra movements.xml e adicione essa linha
    Bom o resto é com você.
    vc vai ter que ir no mapa editor e adicionar esse actionid '5678' no piso que quer.
    Espero ter ajudado !!!
  12. Gostei
    Tace deu reputação a ricardo3 em [Resolvido] [PEDIDO] npc outfits   
    '-'
  13. Gostei
    Tace deu reputação a Lodus em Sword Sprites   
    Ola, sou novo em Pixel art, queria saber oque voces acham das sprites que eu fiz, cada uma eu avaliei, e depois fiz a proxima com consertos nos detalhes das outras que deram errado. '-' entederam né?
    tentei aprender com os erros.
     
    por favor avaliem/critiquem etc... mas por favor mesmo, façam criticas construtivas e falem o que eu errei e no que eu poderia ter feito
     
     essa foi a primeira. quando estava me acostumando com o photoshop/paint
     
     esse eu tentei melhorar a lamina, mesmo estando fina     << isso verde no canto significa raridade Incomum
     
     esse eu me liguei que pixel art não envolve brush mas sim lapis, felizmente saiu assim. << essas duas setas significam raridade Raro
     
     esse é uma versão do de cima com cor diferente e porpurina preta '-'  << essas tres setas significam raridade Craft (feitas pelo jogador)
     
     esse é o mesmo do de cima  so que... luz
     
     tentei fazer ficar mais bunito sei la, mas fazer uq só sei fazer esse tipo de espada.  << raridade Lendaria
     
     por ultima, ja que é a raridade acima de todos eu pensei em faze-la mudando de cor (34 sprites usadas) << raridade Eterna
     
    bem, sou iniciante espero que me ajudem e porfavor não critiquem de forma que não me ajude
     
     
    fiz cada uma em 10 minutos menos a ultima que demorou mais.
     
     
     
     
     
  14. Gostei
    Tace deu reputação a kauan13 em [Sistema De Mana e Vida]   
    Olá Glr Vim trazer 1 script que o player poderá ver mana do adversário e a sua mana
    Sem Enrolação Vamos Lá  
    1- Vá Em data\talkactions\scripts
    2- Crie 1 Arquivo .Lua Chamado vida.lua 
    3- Coloque Isto Dentro 
     
     
     
    function onSay(cid, words, param, channel)
    if(param == '') then
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "\nVida atual: " .. getCreatureHealth(cid) .. "\nVida máxima: " .. getCreatureMaxHealth(cid) .. "")
    return true
    end
    if isPremium(cid) == TRUE then
    local pid = getPlayerByNameWildcard(param)
    if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O jogador com o nome " .. param .. " não esta online ou não existe.")
    return true
    end
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "\nVida de [ " .. getCreatureName(pid) .. " ] atual: " .. getCreatureHealth(pid) .. "\nVida de [ " .. getCreatureName(pid) .. " ] máxima: " .. getCreatureMaxHealth(pid) .. "")
    return true
    else
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Apenas jogadores VIP podem utilizar este comando para visualizar informações de outros jogadores.")
    return true
    end
    end
     
     
     
    4- Criei Outro Arquivo Chamado Mana.lua
    5- Coloque Isto Dentro 
     
     
     
     
    function onSay(cid, words, param, channel)
    if(param == '') then
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "\nMana atual: " .. getCreatureMana(cid) .. "\nMana máxima: " .. getCreatureMaxMana(cid) .. "")
    return true
    end
    if isPremium(cid) == TRUE then
    local pid = getPlayerByNameWildcard(param)
    if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O jogador com o nome " .. param .. " não esta online ou não existe.")
    return true
    end
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "\nMana de [ " .. getCreatureName(pid) .. " ] atual: " .. getCreatureMana(pid) .. "\nMana de [ " .. getCreatureName(pid) .. " ] máxima: " .. getCreatureMaxMana(pid) .. "")
    return true
    else
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Apenas jogadores VIP podem utilizar este comando para visualizar informações de outros jogadores.")
    return true
    end
    end
     
     
     
    Para Ver Mana De Outros Jogadores Fale :!Mana Ex:Kauanzera Mesma Coisa !vida ex:Kauanzera
     
     
    Se te ajudei Deche 1 Rep vlw 
  15. Gostei
    Tace deu reputação a pinpao em Npc de Informações   
    Pelo o que eu entendi,não manjo muito em npc e fiz pelo celular mas tá ai !
    local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, "Yes") then npcHandler:say(" Eu posso te ajudar com informações , como Aol, Hunts, VIP, Houses e Task o que deseja?",cid) elseif msgcontains(msg, "Aol") then npcHandler:say(" Certo você deseja saber sobre o aol, então vamos la, o aol é um amuleto sagrado que vai te proteger em caso de morte, com ele você não ira perder o seus items da sua backpack, e pode ser comprado por 10k!", cid) elseif msgcontains(msg, "Hunts") then npcHandler:say(" Quer saber sobre as hunts, as hunts são lugares onde você pode avançar de nivel, existe varias hunts no mapa , você precisa apenas explorar!", cid) elseif msgcontains(msg, "Vip") then npcHandler:say("A VIP é uma Premium que sua conta ganha quando você compra, com a VIP você pode acessar novas hunts e ter mais vantagens !", cid) elseif msgcontains(msg, "Houses") then npcHandler:say(" Houses são casas que você pode comprar no servidor por um custo basta escolher uma casa, fique na frente da porta e diz !buyhouse, é claro que precisara de dinheiro e um nivel necessário!", cid) elseif msgcontains(msg, "Task") then npcHandler:say("Task são missões que você completa para um certo npc, e com a task completa ganhara exp e items!", cid) return true end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) <?xml version="1.0" encoding="UTF-8"?> <npc name="Arquivo" script="data/npc/scripts/arquivo.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="134" head="78" body="88" legs="0" feet="88" addons="3"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|!, posso ajudar?" /> </parameters> </npc>
  16. Gostei
    Tace deu reputação a NighteyeTV em Como criar quest   
    Para fazer de mais items use o script que vou te mandar: 
     
    function onUse(cid, item, frompos, item2, topos)
    if getPlayerStorageValue(cid, 19891) < 1 then
    doPlayerSendTextMessage(cid,22,"Voce acabou de conseguir o Item da Quest!")
    local bag = doPlayerAddItem(cid, 1999, 1)
    doAddContainerItem(bag, 2398, 1)
    setPlayerStorageValue(cid, 19891, 1)
    else
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce ja pegou os Item da Quest.")
    end
    return TRUE
    end
     
     
    No Storage é o marcador se o player fez ou n a quest... 
    Local bag é o Id da bag que será adicionada com os itens dentro
    doAddContainerItem(bag, id do item, quantidade) é o item que ganhará. Pra fazer mais itens copie essa linha e cole na próxima com o id do item diferente
     
    em setplayerstorage é a storage dada pra marcar que fez a quest, é preciso ser igual a storage que vc colocar acima para evitar que possa pegar sem parar... 
     
    Após fazer isso, em actions.xml
     
    adicione a linha: 
     
    <action actionid="id do action que será colocado no baú" event="script" value="nomedoarquivo.lua"/>
     
     
    Obs: O amigo do tópico usou Unique Id, nessa usa Action Id, então ao inves de colocar no bau Unique id, use a tag de cima, que é Action Id....
     
     
    Vlws, +Rep.
        
    Não, amigo... 
     
    O bang que limina a quest é o Action Id ou Unique Id
     
    Se forem diferentes, vc pode fazer diversas
     
  17. Gostei
    Tace deu reputação a Gustavo Ntos em [NPC] Spells 8.60   
    local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid local moeda = 2157 local t = {          ["exevo gran mas frigo"] = {level = 9},          } if (msgcontains(msg, 'yes') or msgcontains(msg, 'YES'))then local str = "" str = str .. "Eu vendo estas Magias: " for name, pos in pairs(t) do str = str.." {"..name.."} /" end str = str .. "." npcHandler:say(str, cid) elseif t[msg] then              if not getPlayerLearnedInstantSpell(cid, msg) then              if getPlayerLevel(cid) >= t[msg].level then                                    doPlayerLearnInstantSpell(cid, msg)                      doCreatureChangeOutfit(cid, 985)                      npcHandler:say("Você aprendeu uma nova magia chamada ".. msg .."e ganhou uma newtype!", cid)              end              end              else                      npcHandler:say("Desculpe ja te encinei essa magia", cid)              end return TRUE end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
  18. Gostei
    Tace deu reputação a MaXwEllDeN em Aulas de Scripting Lua   
    Quer aprender a programar em Lua? Sugiro que você comece olhando esses tutoriais escritos por Urso Mock, Suricato Notorious e Raposa Skyen Hasus.
    Já leu todas as aulas anteriores e acha que você já está apto a criar seus próprios Scripts? Boa! Agora é hora de por suas habilidades em prática. Leia esses tutoriais:
    Outros Tutoriais:
     
     
    Avançado:
  19. Gostei
    Tace deu reputação a xWhiteWolf em Volatile Spiderling   
    Fala galera do TK, hoje eu venho mais uma vez trazer uma das magias mais incríveis que eu já vi até hoje (sério). A magia original foi feita em outro fórum mas para a versão 10.1... como eu vi que ninguém conseguiu adaptar pra versões inferiores eu decidi criar a minha própria volatile spiderling.
    Confesso que no começo eu tive muita dificuldade em achar as funções certas mas depois de tentar ajudar o membro @234567890z no suporte eu tive uma epifania. Sem mais delongas eu vou explicar oque o script faz e em seguida ensinar a colocá-lo no seu server.

    • Explicação: A magia foi feita baseada na personagem Elise do jogo League of Legends: você faz uma cria que anda até os oponentes e se explodem causando dano em area e deixando eles envenenados. Aqui tem um gif da magia funcionando  
    obs: note que esse gif não fui eu que fiz mas ele demonstra exatamente como a magia funciona.
     
     
    • Instalação: Pra instalá-lo no seu servidor vai ser um pouco complicado pois ele requer diversas modificações... antes de mais nada, coloque essas linhas no seu spells.xml:
    <instant name="Volatile Spiderling" words="utevo res tera" lvl="40" mana="20" prem="1" selftarget="1" exhaustion="2000" groups="1,2000" icon="88" needlearn="0" event="script" value="especiais/spiderling.lua"> <vocation id="3"/> <vocation id="7"/> </instant> <instant name="poison explosion" words="poison explosion" lvl="0" mana="0" prem="0" aggressive="1" exhaustion="3000" needlearn="1" event="script" value="especiais/newspider.lua"> </instant> Agora você vai ter que criar os dois arquivos na pasta spells\scripts\especiais.
    Em newspider.lua coloque o seguinte:
    agora em spiderling.lua coloque o seguinte: Agora feito isso vc vai precisar criar o monstro que usará essa spell.. vá em monster\monsters.xml e adicione a seguinte linha: <monster name="Clone Spider" file="arachnids/newspider.xml"/> agora crie o arquivo data\monsters\arachnids\newspider.xml e adicione o seguinte nele:
    Agora eu vou ensinar vocês a editarem... não tem muito oque mudar, apenas se vc quiser alterar os danos da spell vá em newspider.lua e será possível editar os danos do poison e da explosão:
     
    local damageTable = {     {4, -3},     {9, -2},     {20, -1} }   aqui você muda quantos danos serão e quanto cada um tirará.. no caso serão 4 hits de -3, depois 9 hits de -2 e por fim 20 hits de -1 até o poison parar. Lembrando que esses danos saem de 4 em 4 segundos. Se você quiser que eles sejam mais rápidos é só editar aqui:
    addDamageCondition(poisonpowder, t[1], 4000, t[2]) (4000 significa 4 segundos).
    Feito isso será possível editar também a area e o dano da explosão respectivamente em: Area:    
    Dano:
    doAreaCombatHealth(cid, 1, getThingPos(cid), area, -1, -30, 20)
    Em vermelho temos o dano mínimo, analogamente, em azul, temos o dano máximo.
    Em verde é possível editar o efeito da explosão
    Só lembrando que as edições que forem feitas no newspider.lua devem ser feitas no spider.lua para que a magia tenha graça.. se não o dano da explosão/poison ao explodir será diferente caso ela morrer antes.  Em spiderling.lua vc pode editar a quantidade máxima de crias que um player pode ter... o normal está setado para 2 mas vc pode sentir-se livre pra colocar quantas queira.
    local maxsummon = 2   (Só lembre-se que ao explodir uma aranha pode acertar outra então não é muito bom deixar um numero maior que 3);
     
    Se você for daqueles bem chatinhos com a magia você ainda pode editar algumas coisas importantes tais como:
    O efeito que sai quando ela explode por morte ou pela spell:
     doSendMagicEffect(getThingPos(cid), 16) O tempo em que ela executa a spell, a chance da spell sair naquele tempo e quantos sqm de distancia a criatura alvo deve estar pra aranha se explodir: 
    <attack name="poison explosion" interval="1000" range="1" chance="50"/> interval = de quantos em quantos segundos ela executa a spell
    range = distancia em sqm que o alvo deve estar pra que ela execute a spell
    chance = chance de executar a spell a cada interval (nesse caso a cada 1 segundo tem 50% de chance dela soltar a magia)
     
    Você ainda pode editar aqui em vermelho:
    o tempo que leva pra criatura executar a magia.. Por padrão eu deixei 2 segundos, ou seja... eu sumono a aranha, ela vai até o alvo e a cada segundo q ela passa grudada no alvo (1 sqm de distancia) ela tem 50% de chance de ativar a spell e ficar parada no lugar durante 2 segundos até explodir. Se você quiser que ela leve menos tempo pra explodir é só baixar o 2000 (em milisegundos).. Se você quiser aumentar o dano e deixar ela parada por mais tempo até explodir pode editar a vontade aumentando os 2000.

    • Bom, isso é tudo que dava pra eu explicar... é óbvio que dá pra editar muito mais coisa mas se você não é scripter e não tem muita idéia de como editar eu dei uma ensinada básica doque você está autorizado a mexer. Espero que vocês curtam a spell e deem aquele REP+ pra fortalecer kkkk
    Eu não pretendia liberar essa spell visto que ela é extremamente complexa e nenhum servidor tem ela, mas, acho que seria muito babaca da minha parte ficar guardando um script tão bonito hahaha. Qualquer erro ou dúvida postem nos comentários que eu tento ajudar.
     
    ah, mais uma coisa: Os créditos são 90% meus visto que eu fiz praticamente tudo.. 9% é pro cara que fez a magia original (se vcs derem uma procurada vcs vão ver que não tem quase nada a ver com a minha mas os créditos dele são por ele ter me dado a idéia) e 1% pro cara no suporte que me pediu ajuda numa spell do mesmo gênero e me fez correr atrás de uma forma de fazer essa magia pra versões inferiores a TFS 1.0
  20. Gostei
    Tace deu reputação a WhiteBubble em item que da 1 spell   
    @ZikaLord  Achei esse script do @xWhiteWolf
    Crie um arquivo.lua em actions/scripts e cole isso dentro:
    function onUse(cid, item) local magia = "Nome da spell" if getPlayerLearnedInstantSpell(cid, magia) then doPlayerSendTextMessage(cid,25,"You already learned everything from this scroll.") elseif doPlayerLearnInstantSpell(cid, magia) then local pos = getCreaturePosition(cid) doSendMagicEffect(pos, 0) doPlayerSendTextMessage(cid,19,"By reading this ancient scroll you learned the secrets of "..magia..".") end end Em Nome da spell coloque o nome da spell que você quer aprender, agora em actions.xml adicione a seguinte linha:
    <action itemid="ID" script="nome do arquivo.lua"/> Em id o id do item que sera usado e nome do arquivo o nome do arquivo que você criou em actions/scripts.
     
    Lembrando que em spells.xml a magia que você quer que aprenda devera estar assim nessa parte:
    needlearn="1"  
  21. Gostei
    Tace deu reputação a Wolven em OT Server "Analytics"   
    Obrigado!
    O serviço não precisa tem acesso nenhum! Ele funciona como qualquer outra lista de servidores.
  22. Gostei
    Tace deu reputação a KekezitoLHP em [SISTEMA] Colisão de Magias   
    Nome: Sistema de Colisão de Magias V. 1.0 Autor: Ramza (Ricardo Ianelli) Versão Testada: TFS 0.3.6PL1 (8.54) "PODERÁ FUNCIONA EM VERSÃO 8.54+ FAÇA O TESTE" Introdução
       video: 
        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:   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  
     
    Agora adiciona essa função em todas as magias que você deseja a colisão.
    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 einovadoras 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. 
     
  23. Gostei
    Tace deu reputação a Patrick Jean em Runa de Teleport   
    Olá pessoal maroto do TK... Estou disponibilizando um Script que eu tinha no meu HD externo, ele seria uma runa de teletransporte...

    ~Compatibilidade~
    Feito e testado em TFS 1.1

    ~Funcionamento~
    A runa funciona da seguinte forma: O player clica na runa e seleciona o local onde ele quer ser teleportado. Se o local desejado der pra ir andando, ele será teleportado, se não, ele não irá.
    ~Colocando a mão na massa~





    ~Observações~
    Não se esqueça de mudar o ID da runa na tag para uma que não está sendo utilizada no seu servidor.
    Essa runa se comportará como qualquer outra.

    ~Créditos~
    Não lembro dos creditos, mas dou todo o crédito ao Criador do Script e a mim por ter postado.
  24. Gostei
    Tace deu reputação a xWhiteWolf em Buraco Negro   
    Essa spell foi feita originalmente pro Yazzo numa versão 7.6 do tibia, eu tenho ela salva desde essa época e apenas adaptei e removi umas coisas inúteis (que agora tem função pra isso). A spell não funciona tão bem quanto funcionava naquela época porque muita coisa mudou mas ela funciona e não apresenta nenhum erro então não vejo o porque de não postar já que pode servir de base pra outros scripts de vocês.

    Ela faz um buraco negro e puxa todos que estão na area em direção ao centro (caso seja possível)
    Vou colocar duas versões (a primeira é a original arrumada pra rodar em 8.54 e a segundas é ela com algumas funções novas)

    versão1:



    versão2:



    spells.xml
    <instant name="Dark Hole" words="buraco negro" lvl="160" mana="500" prem="1" exhaustion="2000" needlearn="0" event="script" value="especiais/buraco negro.lua"> <vocation id="6"/> <vocation id="7"/> <vocation id="5"/> </instant> Espero que gostem e estudem o código dela! haha

    Uma imagem da versão 1:




    e uma da versão 2:



  25. Gostei
    Tace deu reputação a Mathias Kenfi em Armas com efeitos   
    Fala galera do TK, hoje vim trazer 1 script de arma com efeito mostrado abaixo:

     
    Quando não sabe editar, parece ser muito complicado, mas depois que aprende é tao simples quanto fazer uma spell qualquer.
    Passarei o script e ensinarei a editar. Siga os passos e você logo logo aprenderá a editar a seu gosto.
     

     
    Simples o dano é normal basta editar. Pois o que nos interessa agora é os efeitos que se localiza aqui.

    Como editar a posição e tals? Pow é só mecher nos números.
     
    Não entendeu? Leia denovo, ou pegue os efeitos e edite você mesmo.
     
     
     
    AJUDEI? REP+

Informação Importante

Confirmação de Termo