Ir para conteúdo

Lurk

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Lurk recebeu reputação de ILex WilL em Countdown horário dos próximos eventos   
    Peço desculpas caso esteja postando na área errada, por favor movam o tópico. Isso é um tutorial
    O script já existe na base que o @WooX postou aqui mas quando tentei passar pro meu sv 0.4 ficava dando debug dai eu desisti na época. Dai eu tava tentando ajudar nesse tópico, tentei mais uma vez e consegui fazer funcionar. Exemplo de como fica ingame
     

     
    Vamos a instalação
    em data/globalevents/scripts crie um arquivo chamado eventcheck.lua e cole isso dentro
    local EventsListalist = {         {time = "01:00", name = "Snowball Event"},                 {time = "02:00", name = "DesertWar Event"},         {time = "03:00", name = "Capture The Flag"},         {time = "04:00", name = "FireStorm Event"},         {time = "09:00", name = "Defend The Tower"},         {time = "10:00", name = "Snowball Event"},         {time = "11:00", name = "DesertWar Event"},         {time = "12:00", name = "Capture The Flag"},         {time = "13:00", name = "FireStorm Event"},         {time = "15:00", name = "Battlefield Event"},         {time = "16:00", name = "Defend The Tower"},         {time = "17:00", name = "Snowball Event"},         {time = "18:00", name = "DesertWar Event",},         {time = "19:00", name = "Capture The Flag",},         {time = "20:00", name = "FireStorm Event"},         {time = "21:00", name = "Real Castle"},         {time = "22:00", name = "Battlefield Event"},         {time = "23:00", name = "Defend The Tower"} }      local position = {x = 129, y = 58, z = 7} -- posição do mapa onde o efeito vai sair function onThink(interval, lastExecution)  local people = getPlayersOnline() if #people == 0 then     return true end      local Count = 0 for _, t in ipairs(EventsListalist) do     local eventTime = hourToNumber(t.time)     local realTime = hourToNumber(os.date("%H:%M:%S"))     if eventTime >= realTime then         doCreatureSay(people[1], "Proximo evento as {"..t.time.."h} "..t.name..", faltam "..timeString(eventTime - realTime)..".", TALKTYPE_ORANGE_1, false, 0, position) -- não use acentos aqui ou eles serão alterados por simbolos ingame         return true     end     Count = Count + 1 end return true end Em data/globalevents/globalevents.xml adicione
    <globalevent name="eventos" interval="10000" event="script" value="eventcheck.lua"/> Depois adicione no fim de data/lib/050-function.lua
    function hourToNumber(str) -- By Killua     local hour = (tonumber(str:sub(1,2))*3600) + (tonumber(str:sub(4,5)) * 60)     if #str > 5 then         hour = hour + tonumber(str:sub(7,8))     end     return hour end function timeString(timeDiff,english) -- créditos: Killua     local dateFormat = {}     if english then         dateFormat = {             {"day", timeDiff / 60 / 60 / 24},             {"hour", timeDiff / 60 / 60 % 24},             {"minute", timeDiff / 60 % 60},             {"second", timeDiff % 60}         }     else         dateFormat = {             {"dia", timeDiff / 60 / 60 / 24},             {"hora", timeDiff / 60 / 60 % 24},             {"minuto", timeDiff / 60 % 60},             {"segundo", timeDiff % 60}         }              end     local out = {}     for k, t in ipairs(dateFormat) do         local v = math.floor(t[2])         if(v > 0) then             table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))         end     end          return table.concat(out) end Créditos:
    @WooX que postou a base onde eu peguei o script
    Aparentemente o Killua que criou a função hourToNumber
    Seja lá quem criou o script, tem o nome de um tal "Henrique" no arquivo original, talvez tenha sido ele
    E eu por algumas pequenas alterações pra fazer o script funcionar em tfs 0.4
    CASO VOCÊ QUEIRA O MESMO SISTEMA PARA OTX 2 PROVAVELMENTE O DA BASE POSTADO PELO WOOX VAI FUNCIONAR desde que você adicione o hourToNumber na lib
     
  2. Obrigado
    Lurk recebeu reputação de Lord Danilus em Spell que bloqueia o target do player   
    Fiz essa spell a pedido de um usuário do fórum e logo depois outro usuário pediu uma versão onde o target do player afetado pela magia ficasse bloqueado por um tempo configurável, gostei da ideia e decidi postar em forma de tópico. Primeiro de tudo você vai precisar dessa função feita/disponibilizada pelo @WooX (não se esqueçam de passar no tópico dele e agradecer)
     
    Em data/spells.xml adicione
    <instant name="Cancel Enemy Target" words="Cancel Enemy Target" lvl="12" mana="20" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="canceltargetlurk.lua"> <vocation id="1"/> <vocation id="2"/> </instant> em data/spells/scripts crie um arquivo chamado canceltargetlurk.lua e coloque isso dentro
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local tempo_block = 5 -- quanto tempo o player afetado pela magia vai ficar sem poder atacar OUTRO PLAYER local templo_cannot_be_blocked = 50 -- tempo em que o target vai ficar invuneravel a spell caso já tenha sido afetado por ela local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() and getPlayerStorageValue(target, 234514) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(target, 234513, tempo_block + os.time()) setPlayerStorageValue(target, 234514, templo_cannot_be_blocked + os.time()) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(target, 234514) > os.time() then doPlayerSendCancel(cid, "This player has been affect by this spell recently, you must wait ".. getPlayerStorageValue(target, 234514) - os.time() .." to block his attacks again.") return false elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end agora em data/creaturescripts.xml adicione
    <event type="attack" name="lurkBlockTarget" event="script" value="canceltargetlurk.lua"/> em data/creaturescripts/scripts crie um arquivo chamado canceltargetlurk.lua e cole isso dentro
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- function onAttack(cid, target) if getPlayerStorageValue(cid, 234513) > os.time() and isPlayer(target) then return doPlayerSendCancel(cid, "You're under effect of the cancel target spell, you must wait".. getPlayerStorageValue(cid, 234513) - os.time() .." seconds to attack again.") and false end return true end por ultimo, abre o arquivo login.lua que está na pasta data/creaturescripts/scripts e adicione isso ANTES DO ULTIMO RETURN TRUE
    registerCreatureEvent(cid, "lurkBlockTarget") Se você quer só E SOMENTE SÓ cancelar o target do inimigo uma unica vez, basta utilizar essa versão da spell
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end Créditos:
    Eu pela spell e creaturescript
    @WooX pela criação da função
     
    se gostou, rep+ aqui e no post do @WooX pela função : p 
  3. Curtir
    Lurk recebeu reputação de IGlanot em Countdown horário dos próximos eventos   
    Peço desculpas caso esteja postando na área errada, por favor movam o tópico. Isso é um tutorial
    O script já existe na base que o @WooX postou aqui mas quando tentei passar pro meu sv 0.4 ficava dando debug dai eu desisti na época. Dai eu tava tentando ajudar nesse tópico, tentei mais uma vez e consegui fazer funcionar. Exemplo de como fica ingame
     

     
    Vamos a instalação
    em data/globalevents/scripts crie um arquivo chamado eventcheck.lua e cole isso dentro
    local EventsListalist = {         {time = "01:00", name = "Snowball Event"},                 {time = "02:00", name = "DesertWar Event"},         {time = "03:00", name = "Capture The Flag"},         {time = "04:00", name = "FireStorm Event"},         {time = "09:00", name = "Defend The Tower"},         {time = "10:00", name = "Snowball Event"},         {time = "11:00", name = "DesertWar Event"},         {time = "12:00", name = "Capture The Flag"},         {time = "13:00", name = "FireStorm Event"},         {time = "15:00", name = "Battlefield Event"},         {time = "16:00", name = "Defend The Tower"},         {time = "17:00", name = "Snowball Event"},         {time = "18:00", name = "DesertWar Event",},         {time = "19:00", name = "Capture The Flag",},         {time = "20:00", name = "FireStorm Event"},         {time = "21:00", name = "Real Castle"},         {time = "22:00", name = "Battlefield Event"},         {time = "23:00", name = "Defend The Tower"} }      local position = {x = 129, y = 58, z = 7} -- posição do mapa onde o efeito vai sair function onThink(interval, lastExecution)  local people = getPlayersOnline() if #people == 0 then     return true end      local Count = 0 for _, t in ipairs(EventsListalist) do     local eventTime = hourToNumber(t.time)     local realTime = hourToNumber(os.date("%H:%M:%S"))     if eventTime >= realTime then         doCreatureSay(people[1], "Proximo evento as {"..t.time.."h} "..t.name..", faltam "..timeString(eventTime - realTime)..".", TALKTYPE_ORANGE_1, false, 0, position) -- não use acentos aqui ou eles serão alterados por simbolos ingame         return true     end     Count = Count + 1 end return true end Em data/globalevents/globalevents.xml adicione
    <globalevent name="eventos" interval="10000" event="script" value="eventcheck.lua"/> Depois adicione no fim de data/lib/050-function.lua
    function hourToNumber(str) -- By Killua     local hour = (tonumber(str:sub(1,2))*3600) + (tonumber(str:sub(4,5)) * 60)     if #str > 5 then         hour = hour + tonumber(str:sub(7,8))     end     return hour end function timeString(timeDiff,english) -- créditos: Killua     local dateFormat = {}     if english then         dateFormat = {             {"day", timeDiff / 60 / 60 / 24},             {"hour", timeDiff / 60 / 60 % 24},             {"minute", timeDiff / 60 % 60},             {"second", timeDiff % 60}         }     else         dateFormat = {             {"dia", timeDiff / 60 / 60 / 24},             {"hora", timeDiff / 60 / 60 % 24},             {"minuto", timeDiff / 60 % 60},             {"segundo", timeDiff % 60}         }              end     local out = {}     for k, t in ipairs(dateFormat) do         local v = math.floor(t[2])         if(v > 0) then             table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))         end     end          return table.concat(out) end Créditos:
    @WooX que postou a base onde eu peguei o script
    Aparentemente o Killua que criou a função hourToNumber
    Seja lá quem criou o script, tem o nome de um tal "Henrique" no arquivo original, talvez tenha sido ele
    E eu por algumas pequenas alterações pra fazer o script funcionar em tfs 0.4
    CASO VOCÊ QUEIRA O MESMO SISTEMA PARA OTX 2 PROVAVELMENTE O DA BASE POSTADO PELO WOOX VAI FUNCIONAR desde que você adicione o hourToNumber na lib
     
  4. Gostei
    Lurk deu reputação a Namikaze em Remake Blood City 8.6   
    Olá Pessoal !
     
     
    Vim trazer a vocês a cidade a qual dediquei muito tempo. É um ramake da blood city, popular cidade do mapa styller 8.6.
    Minha vontade era finalizar e colocar o server online, porém não tenho muito tempo e nem todo conhecimento necessário para abrir um servidor sozinho.
    Quero agradecer muito ao meu mentor @Nolis por compartilhar seu conhecimento e me ajudar na construção dessa cidade.
    Aproveitem e utilizem da melhor maneira possível!!
    vocês podem encontrar fotos no meu show off dessa cidade:
     
     
     
    Scan: https://www.virustotal.com/gui/file/c75865cca9a19f7427b211bd913af03ef4642efb54bd8c44ff7929c5ef35fb89/detection
    Cidade:NamikazeStyller.otbm
  5. Gostei
    Lurk recebeu reputação de Rogex Joyz em Clean Database by luanluciano93   
    aq no tibiaking em geral acho q o povo usa mais a tfs 0.4 e aquela exclusive edition, o q mantem a tfs 0.4 tão forte aq eh o tanto de post, sistema e suporte já pronto de anos, trocar pra 1.x seria bacana mas acho q vai demorar bastante p toda a comunidade abraçar 
  6. Gostei
    Lurk recebeu reputação de Alberto Cabrera em Countdown horário dos próximos eventos   
    Peço desculpas caso esteja postando na área errada, por favor movam o tópico. Isso é um tutorial
    O script já existe na base que o @WooX postou aqui mas quando tentei passar pro meu sv 0.4 ficava dando debug dai eu desisti na época. Dai eu tava tentando ajudar nesse tópico, tentei mais uma vez e consegui fazer funcionar. Exemplo de como fica ingame
     

     
    Vamos a instalação
    em data/globalevents/scripts crie um arquivo chamado eventcheck.lua e cole isso dentro
    local EventsListalist = {         {time = "01:00", name = "Snowball Event"},                 {time = "02:00", name = "DesertWar Event"},         {time = "03:00", name = "Capture The Flag"},         {time = "04:00", name = "FireStorm Event"},         {time = "09:00", name = "Defend The Tower"},         {time = "10:00", name = "Snowball Event"},         {time = "11:00", name = "DesertWar Event"},         {time = "12:00", name = "Capture The Flag"},         {time = "13:00", name = "FireStorm Event"},         {time = "15:00", name = "Battlefield Event"},         {time = "16:00", name = "Defend The Tower"},         {time = "17:00", name = "Snowball Event"},         {time = "18:00", name = "DesertWar Event",},         {time = "19:00", name = "Capture The Flag",},         {time = "20:00", name = "FireStorm Event"},         {time = "21:00", name = "Real Castle"},         {time = "22:00", name = "Battlefield Event"},         {time = "23:00", name = "Defend The Tower"} }      local position = {x = 129, y = 58, z = 7} -- posição do mapa onde o efeito vai sair function onThink(interval, lastExecution)  local people = getPlayersOnline() if #people == 0 then     return true end      local Count = 0 for _, t in ipairs(EventsListalist) do     local eventTime = hourToNumber(t.time)     local realTime = hourToNumber(os.date("%H:%M:%S"))     if eventTime >= realTime then         doCreatureSay(people[1], "Proximo evento as {"..t.time.."h} "..t.name..", faltam "..timeString(eventTime - realTime)..".", TALKTYPE_ORANGE_1, false, 0, position) -- não use acentos aqui ou eles serão alterados por simbolos ingame         return true     end     Count = Count + 1 end return true end Em data/globalevents/globalevents.xml adicione
    <globalevent name="eventos" interval="10000" event="script" value="eventcheck.lua"/> Depois adicione no fim de data/lib/050-function.lua
    function hourToNumber(str) -- By Killua     local hour = (tonumber(str:sub(1,2))*3600) + (tonumber(str:sub(4,5)) * 60)     if #str > 5 then         hour = hour + tonumber(str:sub(7,8))     end     return hour end function timeString(timeDiff,english) -- créditos: Killua     local dateFormat = {}     if english then         dateFormat = {             {"day", timeDiff / 60 / 60 / 24},             {"hour", timeDiff / 60 / 60 % 24},             {"minute", timeDiff / 60 % 60},             {"second", timeDiff % 60}         }     else         dateFormat = {             {"dia", timeDiff / 60 / 60 / 24},             {"hora", timeDiff / 60 / 60 % 24},             {"minuto", timeDiff / 60 % 60},             {"segundo", timeDiff % 60}         }              end     local out = {}     for k, t in ipairs(dateFormat) do         local v = math.floor(t[2])         if(v > 0) then             table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))         end     end          return table.concat(out) end Créditos:
    @WooX que postou a base onde eu peguei o script
    Aparentemente o Killua que criou a função hourToNumber
    Seja lá quem criou o script, tem o nome de um tal "Henrique" no arquivo original, talvez tenha sido ele
    E eu por algumas pequenas alterações pra fazer o script funcionar em tfs 0.4
    CASO VOCÊ QUEIRA O MESMO SISTEMA PARA OTX 2 PROVAVELMENTE O DA BASE POSTADO PELO WOOX VAI FUNCIONAR desde que você adicione o hourToNumber na lib
     
  7. Gostei
    Lurk deu reputação a Cat em Yutae - Cidade + Hunts   
    Yutae
    Fiz essa cidade a alguns anos e estava guardada no meu PC. Completei ela com 5 hunts, pois tinha um comprador interessado, porém o mesmo foi assaltado e desistiu da compra, então decidi postar pra vocês. O mapa é simples, mas tem vários acessos pela cidade pra WAR e locais para NPC, é uma cidade completa, as houses já vem cadastradas, mais informações e imagens abaixo.
     
    Informações:
    Versão: 11.0
    Depots: 38
    Criaturas: 596
    Casas: 24 (maior casa: "Plazza C GH II" (145 sqm))
     
     
    Show Off Cidade:
    Templo & Depot:
     
     
     
    Norte da Cidade e Porto
     
     
     
    Centro da Cidade:
     
     
     
    Arredores:
     
     
     
    Saída sul para as hunts com algun s mobs:
     
     
     
     
     
    Show Off Hunts:

     
    1 - Azul: Shock Head, Betrayed Wraith, Destroyer e Blightwalker
    Imagens:
     
     
    2 - Amarelo: Serpent Spawn, Medusa e Wyvern, 
    Imagens:
     
     
     
    3 - Laranja: Wailing Window, Son of Verminor e Plaguesmith.
    Imagens:
     
     
     
    4 - Vermelho: Silencer, Demon, Behemoth, Dark Torturer e Juggernaut.
    Imagens:
     
     
     
    5 - Rosa: Fury, Grim Reaper e Hellhound.
    Imagens:
     
     
     
    6 - Cinza: Serpent Spawn & Medusa
     
     
     
    7 - Marrom: Betrayed Wraith, Blightwalker e Undead Dragon.
     
     
     
    A ilha das fury acompanha um depot:
     
     
     
    Baixar mapa:
    Yutaev1_Nolis.rar
     
    Créditos:
    @SamueLGuedes
    @Cat
     
     
     
     
     
  8. Gostei
    parabéns pro pessoal que teve seu conteúdo publicado na primeira tk magazine!

    @Nolis parabens por ter organizado isso, inclusive com as conquistas, ficou bem legal ??
  9. Gostei
    Lurk deu reputação a Endless em Restringindo a listagem de diretórios do seu servidor (APACHE)   
    Opa, recentemente alguns programadores entraram em contato comigo procurando saber sobre proteção/restrição de informações do seu site.
    Mas como assim?
    Bom, por padrão, o apache vem configurado para ser livre o acesso a listagem de arquivos de 1 servidor. Por exemplo:
    Seu site tem o domínio rogerincudetcheca.com que carrega pelo diretório var/www/html, e supondo que dentro da pasta html exista 1 pasta chamada templates. Se o usuário simplesmente digitar rogerincudetcheca.com/templates e dentro dessa pasta não existir nenhum arquivo de índice como por exemplo: index.html ou index.php, por padrão vai ser listado todos arquivos daquela pasta. E isso ele pode fazer para qualquer diretório de seu servidor.



    Mas Endless, quer dizer então que ele pode ter acesso a qualquer arquivo do meu site? E a resposta é SIM, se a plataforma AAC que você utilizar não conter 1 regra que controle isso, por padrão qualquer 1 tem acesso a esses arquivos de seu site.
    Pensando nisso, vim explicar como alterar essa configuração básica que muita gente, mas muiiiita gente não sabe como funciona. OBS: Eu somente vou explicar como fazer o básico para evitar a listagem, mas existe muito mais opções para você inserir, vocês podem dar uma estudada mais a fundo direto na documentação do próprio apache. clicando aqui.
    Bom vamos lá:

    1° Passo:
     

    Passo 2:

     
     
    Pronto, se você tentar acessar o mesmo diretório que antes listava todos arquivos você irá ter o seguinte retorno: 


     
    Bom, como eu citei no início do tópico, existem + opções de você controlar esses acesso. Um exemplo disso é o .htaccess, mas não vou abordar sobre ele aqui.
    É isso, espero ajudar, abraços!!
    Pra galera que busca 1 discord de desenvolvimento, existe 1 Discord chamado Academia de Codding, onde o intuito é justamente ajudar quem precisa (OBS: Ajudar não é fazer o código pra ti, isso tu resolve pagando rsrs).
    Link do discord: https://discord.gg/JmTn69B
  10. Gostei
    Novos Servidores Otserv!
     
    A versão 8.60 está com bastante novidades, acompanha tutorial de instalação, imagens e suporte nos comentários!
    Veja abaixo servidores e outros conteúdos 8.60 postados no Tk!
     
     
     
     
    Nekiro Otserv 8.60

    Descrição: TFS 1.3 com tela estendida!
    «Baixar»

     
     
    Woox Baiak PvP 8.60

    Descrição: Watch System, Cast System, Anti Entrosa, Anti Divulgação, Party Share, Exhaust e Boosted Creatures.
    «Baixar»

     
     
    TeamWar Hardcore Time vs. Time 8.60

    Descrição: Auto Map Change, Auto Re-Balanceamento de Teams, Auto Mensagens, Anti MC, Gold e Exp ao Matar e Skull System.
    «Baixar»

     
     
     
     
    Novidades em Bots!
    ElfBot Bypass auto-target
    «Baixar»
    Descrição: Jogar com auto-target do ElfBot em servidores protegidos, dll com o fix do win10 incluso.

     
     
    Dash/Light & Minimize
    «Baixar»
    Descrição: Fix para ElfBot Windows 10.

     
     
    Dll Anti Auto-Target Elfbot
    «Baixar»
    Descrição: Dll feita com a função de bloquear o Auto Target e o Aimbot.

     
     
     
    Novas Ferramentas e Dlls!
    Map Tracker 8.0~8.60
    «Baixar»
    Descrição: Função que salva posição de destino dos teleports que o jogador entrar, salva também monstros e npcs.

     
     
     
    Anti Map-Tracker [8.54 & 8.60]
    «Baixar»
    Descrição: Compile o servidor e estará com um 'anti-track' ativo, o map tracker padrão não conseguirá interpretar o mapa.

     
     
     
    Tibia 8.60 Editor - Criar Client 8.60 Customizado
    «Baixar»
    Descrição: Imagem em Spoiler:
     
     

     
     
     
     
    Sistemas de Eventos!
    Zombie Event Apocaliptico
    «Baixar Sistema»
    Descrição: "Quem é familiar com filmes e séries de zombies sabe que quando um zombie morde alguém a pessoa que foi mordida não simplesmente morre, mas ela se torna um zombie, é isso que torna a ideia de um apocalipse zombie tão aterrorizante. Pensando nisso eu tive a ideia de alterar o sistema pra que quando algum player fosse pego por um zombie ele também se transformasse em um e não fosse simplesmente teleportado para o templo. Essa alteração deixa a interação entre os jogadores no evento mais dinâmica pois eventualmente se torna um jogo de Player vs Player ao invés de Player vs Maquina, embora no fim continue sendo uma batalha entre vivos e mortos." - Woox.
     
     
    Evento Click Up
    «Baixar»
    Descrição: Durante o evento (duração de 15 min que você pode diminuir/aumentar), quando um player clica no item ele vai receber x leveis e a cada 2 clicks ele vai ganhar um item (no meu caso, uma event coin). Tem um exhaust de 2 secs a cada click pra evitar abuso com elfbot/auto click.

     
     
    First to Speak Summon System
    «Baixar»
    Descrição: Sumona um monstro numa posição setada por sua preferencia, também verifica uma posxyz configurável, usa o comando: "!fss" que só pode ser pronunciado por 1 player, se alguém falar o comando depois de você... não irá sumonar até que recarregue o tempo pra enviar o comando novamente acabe.

     
     
    Online Bonus System
    «Baixar»
    Descrição: A cada uma hora ininterrupta que o personagem ficar online, o mesmo irá ganhar 1 Online Bônus. Acumulando 30 Online Bônus, o personagem ganha 1 dia de Premium Account, e a sua quantidade de Online Bônus recomeçará a ser contada a partir do zero.

     
     
    Daily Task com 4 opções diarias
    «Baixar»
    Descrição: É possivel escolher entre 4 opções, sendo elas de nível "easy", "medium", "hard" e "expert", e tem até o server save para entregar. Como recompensa, coloquei: Quantidade aleatoria de XP, Quantidade fixa de um Item fixo e quantidade aleatoria de um(ou mais) item aleatorio.

     
     
     
     
    Esta foi a primeira edição do Tk Magazine, acompanhe nosso portal que terá mais!
     
     
    Premiações!

     

     
    Membros que receberam a medalha Tkm Nível 1 como forma de agradecimento por terem contribuído com um conteúdo exclusivo:
    @BrazItzMe @WooX(2x) @HeberPcL @Cjaker(x3) @Ackerzin @Lurk @L3K0T @139 @Mor3nao
    (Quem teve mais de um conteúdo destacado receberá as medalhas sucessivas)
     
    • [Informações] Tk Magazine
    • Lista de Medalhas TKM.

    Créditos pelo outfit: @FlameArcixt
     
     
     
     
     
  11. Curtir
    Lurk recebeu reputação de Cat em Sistema de Medalhões! Solicite aqui!   
    atualiza aqui pfvr? 
  12. Gostei
    Lurk deu reputação a WooX em Zombie Event [DIFERENCIADO]   
    Zombie Event

    Zombie Event é um evento já muito conhecido em que os participantes são jogados em uma arena e zombies são invocados até que reste apenas um jogador, quando um jogador é tocado por um zombie ele é teleportado para o templo, o ultimo jogador a ficar na arena é definido como vencedor e o evento é finalizado ai. Já faz um bom tempo que tive a ideia de mudar o funcionamento deste tradicional evento e finalmente decidi por a mão na massa, irei explicar melhor o que foi alterado abaixo.
     
     
    Sobre o sistema

    O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4
     
    Pra quem quiser esse evento funcional para TFS 1.x, o @Movie se comprometeu a fazer a adaptação, então podem mandar mensagem privada pra ele cobrando que ele gosta.
     
    Quem é familiar com filmes e séries de zombies sabe que quando um zombie morde alguém a pessoa que foi mordida não simplesmente morre, mas ela se torna um zombie, é isso que torna a ideia de um apocalipse zombie tão aterrorizante. Pensando nisso eu tive a ideia de alterar o sistema pra que quando algum player fosse pego por um zombie ele também se transformasse em um e não fosse simplesmente teleportado para o templo. Essa alteração deixa a interação entre os jogadores no evento mais dinâmica pois eventualmente se torna um jogo de Player vs Player ao invés de Player vs Maquina, embora no fim continue sendo uma batalha entre vivos e mortos.
     
    Irei listar abaixo mais algumas características do evento.
     
    É possivel configurar para que seja permitido ou não o uso de MCs. Todos os jogadores ao entrar na arena ficam com a mesma velocidade. Para tornar mais competitivo e divertido, não é permitido utilizar a função Follow dentro do evento. O jogador que foi transformado em zombie que mais contaminar outros jogadores também recebe uma recompensa. Os jogadores que forem transformados em zombies podem subir de rank conforme forem contaminando outros jogadores, alterando assim sua aparência e velocidade na arena.  
    Vídeozinho
     
    Instalação

    Este sistema utiliza de funções contidas na lib do link abaixo, então antes de mais nada é necessário adicionar esta lib no servidor.
     
    Todos os arquivos necessários para instalação do evento estão anexados no tópico, irei apenas mostrar como deve ser configurado.
     
    Toda configuração do sistema se encontra na lib do mesmo, segue abaixo explicação de como configurar.
     
    startTime: configuração de horários para inicio do evento a depender do dia da semana (para cada horário diferente definido aqui um registro extra é necessário no globalevents.xml) announcement: mensagem a ser exibida quando o teleporte para o evento for aberto. startEvent: mensagem a ser exibida quando o teleporte para o evento for fechado e o evento iniciado. playerBitten: mensagem a ser exibida quando um jogador for mordido por um zombie. endEvent: mensagem a ser exibida quando o evento for finalizado. notEnoughPlayers: mensagem a ser exibida quando não houver players suficiente para o evento. zombiesRant: falas que serão randomicamente selecionadas para um jogador que foi transformado em zombie falar.  
    minOnlinePlayers: define a quantidade minima de jogadores online para o teleporte do evento ser aberto. minPlayers: define a quantidade minima de jogadores na arena para o evento ser iniciado. closeTeleportTime: tempo para fechar o teleporte após o anuncio (o valor deve ser definido em minutos). countDownTime: tempo para iniciar o evento após o fechamento do teleporte (o valor deve ser definido em segundos).  
    zombieRatio: define a quantidade inicial de zombies baseado na quantidade de jogadores participando do evento. playerSpeed: define a velocidade que o jogador terá durante o evento (valido apenas para jogadores que não foram transformados em zombies). delayToTransform: define o intervalo para um jogador que foi mordido se transformar em um zombie (o valor deve ser definido em segundos). allowMultiClient: pode ser definido como true ou false, se definido como falso não irá permitir a entrada de jogadores com o mesmo IP no evento.  
    rewards: define as recompensas a serem entregues tanto para o ultimo sobrevivente na arena como para o zombie que mais contaminar outros jogadores. zombiesRank: define os ranks dos zombies, a quantidade de pontos necessária para avançar de rank, aparência e velocidade (valido apenas para jogadores que foram transformados em zombies). area: define a área onde ocorrerá o evento, deve ser preenchido as coordenadas do ponto superior-esquerdo, ponto inferior-direito e o andar do local. teleportAid: define a actionID a ser adicionado no teleporte de entrada do evento (este valor deve ser o mesmo a ser registrado na tag XML do script de movements). teleportPos: define as coordenadas onde deve ser criado o teleporte de entrada para o evento.  
    Créditos

    @LeandroRissa por testar todo o sistema.
    event zombie.xml lib_zombie.lua zombieEvent.lua zombieEvent_creature.lua zombieEvent_movement.lua
  13. Gostei
    Lurk deu reputação a WooX em Trade Offline V2.0   
    Trade Offline V2.0

    Esse sistema me foi pedido a alguns meses atrás e hoje tirei um tempinho pra trazer aqui.
    O sistema consiste em permitir que jogadores negociem sem contato direto entre comprador e vendedor.
    Mas como assim?
    O vendedor pode criar um anuncio de venda informando item, valores ou até mesmo items que ele queira em troca, após feito o anuncio todas essas informações ficam armazenadas no banco de dados do servidor, permitindo assim serem exibidas em uma página no site para interessados, junto de todas informações fornecidas pelo vendedor é exibido um comando para que os interessados possam adquirir a oferta exibida na página.
     
    Sobre o sistema

     
    O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4
     
    Versão para TFS 1.x adaptada pelo @luanluciano93
     
    Como mencionado acima, o sistema funciona de forma semelhante ao Market System das versões atuais porem sem exibição gráfica das ofertas in-game, para isso o sistema vai acompanhado de uma página para o Gesior AAC. Este sistema existe no fórum há um bom tempo e já é familiar pra muitos jogadores, essa versão trás consigo algumas melhorias e diferenças que irei listar abaixo.
     
    Sistema
    Agora é possivel vender um item exigindo outro item em troca ao invés de dinheiro. Containers com um conjunto de items dentro agora podem ser anunciados. Agora o sistema verifica as cargas e durações dos items antes de criar uma oferta. Novo parâmetro adicionado para verificar informações de ofertas in-game. Agora todo valor recebido vai diretamente para o banco do vendedor. Página
    A depender da quantidade de ofertas existentes no servidor, a página agora irá separa-las por páginas. Agora além do valor é exibido também imagem da moeda a depender do valor da oferta. Agora é possivel ver as características tanto dos items ofertados como dos items exigidos pelo vendedor. Adicionado filtros para exibir somente ofertas de items vip, containers ou trocas. Adicionado barras de pesquisas para filtrar as ofertas por items ou nome do jogador.  
    Algumas imagens
     
    Instalação

    Antes de mais nada é necessário citar os requisitos necessários para o funcionamento correto do sistema, ele utiliza de algumas funções que não estão no script principal e portanto é necessário a instalação de uma lib extra, também é necessário instalar as funções doItemSetDuration e getItemDurationTime na source do servidor, ambos os links se encontram abaixo.
     
    Todos os arquivos necessários para a instalação estão anexados no tópico, irei apenas dizer onde instalar e como deve ser configurado.
     
    Primeiramente importe o arquivo schema.sql no banco de dados, ou se preferir pode executar as queries a seguir.
    CREATE TABLE IF NOT EXISTS `trade_off_offers` ( `id` int(11) NOT NULL auto_increment, `player_id` int(11) NOT NULL, `type` int(1) NOT NULL DEFAULT '0', `item_id` int(11), `item_count` int(11) NOT NULL DEFAULT '1', `item_charges` int(11) NULL, `item_duration` int(11) NULL, `item_name` varchar(255), `item_trade` tinyint(1) NOT NULL DEFAULT '0', `cost` bigint(20) UNSIGNED NOT NULL, `cost_count` int(11) NOT NULL DEFAULT '1', `date` bigint(20), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE IF NOT EXISTS `trade_off_container_items` ( `offer_id` int(11) NOT NULL, `item_id` int(11), `item_charges` int(11) NULL, `item_duration` int(11) NULL, `count` int(11) DEFAULT '1' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; ALTER TABLE `trade_off_container_items` ADD KEY `offer_id` (`offer_id`); ALTER TABLE `trade_off_container_items` ADD CONSTRAINT `offer_id_fk` FOREIGN KEY (`offer_id`) REFERENCES `trade_off_offers`(`id`) ON DELETE CASCADE;  
    Configuração no arquivo tradeoff.lua: 
    -- Trade Offline 2.0 by WooX -- local config = { priceLimit = 2000000000, -- 2kkk offerLimit = 3, offerLimitStor = 86420, infoOnPopUp = true, infoMsgType = MESSAGE_STATUS_CONSOLE_BLUE, errorMsgType = MESSAGE_STATUS_CONSOLE_RED, successMsgType = MESSAGE_INFO_DESCR, helpMsg = "Enter the parameters (add, remove, active, buy, info).", goldItems = {2148, 2152, 2160}, itemsVIP = {4540, 4545, 4560}, } priceLimit: define o valor máximo de uma oferta. offerLimit: define o valor máximo de ofertas que um jogador pode adicionar. offerLimitStor: storage que irá armazenar quantas ofertas ativas o jogador possui. infoOnPopUp: pode ser definido como true ou false, se definido como falso irá enviar os detalhes da oferta no default ao invés de como é mostrado nas imagens acima. infoMsgType: define como será exibido uma mensagem de informação ao jogador (não recomendo mexer a menos que saiba o que está fazendo). errorMsgType: define como será exibido uma mensagem de erro ao jogador (não recomendo mexer a menos que saiba o que está fazendo). successMsgType: define como será exibido uma mensagem de ação sucedida ao jogador (não recomendo mexer a menos que saiba o que está fazendo). helpMsg: mensagem que será enviada para o jogador caso ele erre os parâmetros do comando. goldItems: nesta tabela deve ser preenchido todos os IDs de moedas no servidor como gold coins, platinum coins, etc. itemsVIP: nesta tabela deve ser preenchido os IDs dos items vips existentes no servidor.  
    Agora para a instalação da página, no arquivo mysql_db.php deve ser preenchido os dados para conexão no banco de dados do servidor.
    /** * Host do banco de dados * @var string */ private static $DB_HOST = 'localhost'; /** * Usuario de conexao ao banco de dados * @var string */ private static $DB_USER = 'root'; /** * Senha de conexao ao banco de dados * @var string */ private static $DB_PASS = 'SUA_SENHA'; /** * Nome do banco de dados * @var string */ private static $DB_NAME = 'NOME_BANCO'; Após feito isso, o arquivo paginationClass.php em conjunto do arquivo mysql_db.php devem ser adicionados no seguinte diretório do Gesior AAC.
    classes/
    Finalizado isto, basta jogar o arquivo tradeoff.php dentro do diretório informado abaixo e o sistema estará pronto para uso.
    pages/
     
    Avisos

     
    Eu escrevi somente o sistema, não sou o autor da página para o Gesior AAC portanto não estarei dando suporte em relação a página que não seja sobre a instalação da mesma no Gesior AAC 2012, e embora esteja funcional, eu não recomendo o uso da página devido a falta do uso de cache para leitura do items.xml. Foram mais de 600 linhas de código sem contar funções extras e alterações na source, além de muitas horas de testes para garantir que tudo estava funcionando corretamente, tudo que peço em troca é que não removam os créditos no arquivo quando forem usar.  
    Créditos

    @MatheusDuarte pela página do Gesior AAC.
    schema.sql tradeoff.lua tradeoff.php mysql_db.php paginationClass.php
  14. Gostei
    doItemSetDuration(uid, duration)
    getItemDurationTime(uid)
     
    A primeira função adiciona ou altera a duração de um item, a segunda retorna o valor em segundos da duração de um item.
     
    Instalação
    No arquivo luascript.cpp da source procure por:
    //getItemWeight(uid[, precise = true]) lua_register(m_luaState, "getItemWeight", LuaInterface::luaGetItemWeight); Acima adicione:
    //doItemSetDuration(uid, duration) lua_register(m_luaState, "doItemSetDuration", LuaInterface::luaDoItemSetDuration); //getItemDurationTime(uid) lua_register(m_luaState, "getItemDurationTime", LuaInterface::luaGetItemDurationTime); Depois procure por:
    int32_t LuaInterface::luaGetItemWeight(lua_State* L) E adicione acima:
    int32_t LuaInterface::luaDoItemSetDuration(lua_State* L) { //doItemSetDuration(uid, duration) uint32_t duration = (popNumber(L) * 1000); ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushboolean(L, false); return 1; } item->setDuration(duration); return 1; } int32_t LuaInterface::luaGetItemDurationTime(lua_State* L) { //getItemDurationTime(uid) ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushboolean(L, false); return 1; } uint32_t duration = (item->getDuration() / 1000); lua_pushnumber(L, duration); return 1; } Agora no arquivo luascript.h da source procure por:
    static int32_t luaGetItemWeight(lua_State* L); E adicione acima:
    static int32_t luaDoItemSetDuration(lua_State* L); static int32_t luaGetItemDurationTime(lua_State* L); Pronto, agora basta compilar e ambas as funções irão estar prontas para serem usadas.
  15. Gostei
    Lurk deu reputação a KevinLuzetti em NPC Cassino   
    Oi gente, eu estava procurando aqui um npc de aposta de 21 e achei no meio das minhas coisas vou disponibilizar pra vcs.
     
    Testado em 0.3.6 e 0.4
     
    XML

    <?xml version="1.0"?> <npc name="Brian O'Conner" script="data/npc/scripts/dicer.lua" walkinterval="0" floorchange="0"> <health now="100" max="100"/> <look type="132" head="114" body="0" legs="0" feet="114" addons="3"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|, quer {apostar} comigo? " /> </parameters> </npc>
     
     
     
     
    LUA

    price_21 = 1000 -- 1k ou 1000gold price_jogo6 = 5000 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, 'apostar')) then selfSay('Eu faco 2 jogos: {21}, e jogo do {6}, escolha um deles!', cid) talkState[talkUser] = 5 elseif (msgcontains(msg, '6') and talkState[talkUser] == 5)    then selfSay('O Jogo do 6 funciona assim: Eu vou rodar um dado, e se cair no numero 6 voce ganha o sextuplo (6 vezes) do valor apostado.', cid) selfSay('Caso nao caia no 6, voce perde apenas o dinheiro da aposta.', cid) selfSay('Esta pronto para {comecar}?.', cid) talkState[talkUser] = 3 elseif(msgcontains(msg, 'comecar') and talkState[talkUser] == 3) then selfSay('Voce possui o {dinheiro} da aposta ('..price_jogo6..')golds ?', cid) if doPlayerRemoveMoney(cid, price_jogo6) == TRUE then talkState[talkUser] = 2 else selfSay('Desculpe, mais voce nao tem dinheiro para apostar comigo.',cid) end elseif(msgcontains(msg, 'dinheiro') and talkState[talkUser] == 2) then sorteio6 = math.random(1,6) if sorteio6 == 6 then talkState[talkUser] = 3 selfSay('Parabens, o numero sorteado foi 6 e voce acaba de ganhar '..(price_jogo6*6) ..'golds, mais o dinheiro que voce pagou da aposta.',cid) doPlayerAddMoney(cid,price_jogo6*6) else talkState[talkUser] = 2 selfSay('Que azar, o numero sorteado foi '..sorteio6..', mais sorte na proxima.',cid) end elseif(msgcontains(msg, '21') and talkState[talkUser] == 5) then selfSay('O 21 funciona assim: Voce ira ganhar 1 numero e o numero tem quer ser 21, ou chegar o mais proximo possivel sem ultrapassar esse valor.', cid) selfSay('E a mesma coisa sera feita comigo, ganharei 1 numero.', cid) selfSay('Voce pode ir comprando mais numeros dizendo {comprar} e se quiser parar e so dizer {parar}.', cid) selfSay('Se voce ganhar de mim, voce leva o triplo do dinheiro apostado.', cid) selfSay('Esta pronto para {comecar}?.', cid) talkState[talkUser] = 0 elseif(msgcontains(msg, 'comecar') and talkState[talkUser] == 0) then selfSay('Voce possui o {dinheiro} da aposta ('..price_21..')golds ?', cid) talkState[talkUser] = 1 elseif(msgcontains(msg, 'dinheiro') and talkState[talkUser] == 1) then if doPlayerRemoveMoney(cid, price_21) == TRUE then talkState[talkUser] = 0 local mpn = math.random(1,21) setPlayerStorageValue(cid, 55411,mpn)   local pn = getPlayerStorageValue(cid, 55411)         selfSay('Seu numero e '..pn..', quer comprar mais ou parar?',cid) else selfSay('Desculpe, mais voce nao tem dinheiro para apostar comigo.',cid) end elseif(msgcontains(msg, 'comprar') and talkState[talkUser] == 0) then local cp = math.random(1,10) setPlayerStorageValue(cid, 55411, (getPlayerStorageValue(cid, 55411))+cp) selfSay('Seu numero e '..getPlayerStorageValue(cid, 55411)..', quer comprar mais ou parar?',cid) talkState[talkUser] = 0   elseif(msgcontains(msg, 'parar') and talkState[talkUser] == 0) then local npcn = math.random(1,21) setPlayerStorageValue(cid, 2224, npcn) if getPlayerStorageValue(cid, 55411) < getPlayerStorageValue(cid, 2224) then selfSay('Meu numero e '..getPlayerStorageValue(cid, 2224)..'.',cid)        selfSay('Seu numero final e '..getPlayerStorageValue(cid, 55411)..'.',cid)   selfSay('Ganhei, mais sorte na proxima vez.',cid)    talkState[talkUser] = 1 elseif getPlayerStorageValue(cid, 55411) == getPlayerStorageValue(cid, 2224) then selfSay('Meu numero e '..getPlayerStorageValue(cid, 2224)..'.',cid)        selfSay('Seu numero final e '..getPlayerStorageValue(cid, 55411)..'.',cid)   selfSay('Empato, portanto ninguem ganha nada.',cid) talkState[talkUser] = 1 elseif  getPlayerStorageValue(cid, 55411) > getPlayerStorageValue(cid, 2224) and getPlayerStorageValue(cid, 55411) <= 21 then selfSay('Meu numero e '..getPlayerStorageValue(cid, 2224)..'.',cid)        selfSay('Seu numero final e '..getPlayerStorageValue(cid, 55411)..'.',cid)   local somag = (price_21*3) selfSay('Voce ganhou '..somag..'golds, mais os seus '..price_21..'golds de volta. Parabens !!!',cid)    doPlayerAddMoney(cid, somag) doPlayerAddMoney(cid, price_21) talkState[talkUser] = 1 else selfSay('Você tirou um numero maior que 21, então você perdeu.',cid) end                        end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
  16. Gostei
    Lurk deu reputação a Rogex Joyz em Ferumbras Ascendant [ENTRADA FULL]   
    Para quem quiser, ai está a entrada toda da Ferumbras Ascendant do global, (desde o teleport de entrada até os teleports de entrada para cada Seal) com mais ou menos 90% de igualdade ao original. Adaptei para a versão 8.60, as escadas estão funcionando conforme deveriam, é composto por 3 andares e possui o hur up/down ao sul (que não tem no global, porém vários ots gostam de ter, então é optativo). Quando eu tiver tempo eu faço as seals. 
     
     
    Imagens do mapa 
      
    O círculo vermelho é a entrada de tudo.
    Na imagem 1 o círculo em amarelo é o hur up/down / Na imagem 2 o mesmo círculo amarelo é o local de destino dos players após dar hur down na imagem 1.
    Na imagem 1 o círculo em azul é a escada de acesso ao resto da quest (caso opte por retirar o hur up/hur down, os player terão que fazer todo o caminho até essa escada / Na imagem 2 o mesmo círculo azul é o destino em que a escada na imagem 1 leva.
     
    SCAN
    Ferumbras Ascendant (entrada).otbm

  17. Gostei
    Lurk deu reputação a WooX em Spell que bloqueia o target do player   
    A spell está configurada pra não afetar aliados (jogadores na mesma party ou da mesma guild), e também ira apenas remover o target, para realizar o bloqueio do target ainda é necessário utilizar em conjunto a spell o creaturescript postado pelo @Lurk, eu testei a spell novamente e está funcional.
     
     
  18. Gostei
    Lurk deu reputação a EddyHavoc em [TFS 1.3] Block Wall Spell   
    Nome: Ice Wall
    Tipo: Spell
    Autor: Eddy Havoc
     
     
     
    Essa é a versão final da spell Ice Wall ou Block Wall criada por mim.
     
    Exibição in-game:
     
     
     
     
    Crie um arquivo chamado ice_wall.lua na pasta data/spells/scripts/conjuring e copie o conteúdo abaixo:
    --[[ Created by: Eddy Havoc name: Victor Amaral contact: [email protected] É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- local north = 0 local south = 2 local east = 1 local west = 3 local delay = 1 -- Tempo em segundos local itemh = 6728 local itemv = 6729 combat = createCombatObject() combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLICE) function onCastSpell(creature, variant) local cDir = creature:getDirection() local cPos = creature:getPosition () local pos = (Position(0,0,0)) if cDir == north then if not getTileInfo(cPos).house and not getTilePzInfo(cPos) then setCombatParam(combat, COMBAT_PARAM_CREATEITEM, itemv) pos = Position(cPos + Position(0, -1)) meffect = pos:sendMagicEffect(44) end elseif cDir == east then if not getTileInfo(cPos).house and not getTilePzInfo(cPos) then setCombatParam(combat, COMBAT_PARAM_CREATEITEM, itemh) pos = Position(cPos + Position(1, 0)) meffect = pos:sendMagicEffect(44) end elseif cDir == south then if not getTileInfo(cPos).house and not getTilePzInfo(cPos) then setCombatParam(combat, COMBAT_PARAM_CREATEITEM, itemv) pos = Position(cPos + Position(0, 1)) meffect = pos:sendMagicEffect(44) end elseif cDir == west then if not getTileInfo(cPos).house and not getTilePzInfo(cPos) then setCombatParam(combat, COMBAT_PARAM_CREATEITEM, itemh) pos = Position(cPos + Position(-1, 0)) meffect = pos:sendMagicEffect(44) end end addEvent(function() local wall = {itemh, itemv} for i = 1, 2 do if getTileItemById(pos, wall[i]).uid > 0 then doRemoveItem(getTileItemById(pos, wall[i]).uid) return TRUE end end end,delay*1000) return doCombat(creature, combat, variant) end Adicione a seguinte tag no arquivo spells.xml localizadon a pasta data/spells:
     
    <instant group="support" spellid="94" name="Protection" words="Ice Wall" level="1" mana="1" casterTargetOrDirection="1" blocktype="all" prem="0" cooldown="1000" groupcooldown="500" needlearn="0" script="conjuring/ice_wall.lua"> <vocation name="Elder Druid"/> </instant>  
     
     
    Para configurar qual item a spell irá conjurar edite itemh/itemv. Itemh: item que irá aparecer horizontalmente (norte e sul). Itemv: item que irá aparecer verticalmente (leste e oeste).  
     
    Qualquer dúvida estou a disposição,
    Atenciosamente, Eddy Havoc.
     
     
     
  19. Gostei
    Lurk deu reputação a WooX em Spell que bloqueia o target do player   
    Não é necessário, da pra fazer utilizando o callback onTargetCreature.
     
     
    Fiz com base na spell "exevo gran mas vis" do Tibia, os parâmetros da spell podem ser alterados.
    --[[ <instant name="Remove Target" words="gtfo" lvl="55" mana="650" selftarget="1" prem="0" exhaustion="1800" needlearn="0" event="script" value="support/remove_target.lua"> <vocation id="1"/> <vocation id="5"/> </instant> ]] local config = { blockTarget = true, blockTime = 5, -- Segundos affectAllies = false, affectTargetCasterOnly = false -- Se marcado como true ira remover o target somente de quem estiver atacando o usuario da spell } local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 8, 5, 7, 11) function onTargetCreature(cid, target) if config.affectTargetCasterOnly and getCreatureTarget(target) ~= cid then return false end if not config.affectAllies then local partyMembers = getPartyMembers(cid) if getPlayerGuildId(cid) == getPlayerGuildId(target) or isInArray(partyMembers, target) then return false end end if config.blockTarget then setPlayerStorageValue(target, 234512, os.time() + config.blockTime) end --errors(false) doPlayerTargetCreature(target, target) --errors(true) return true end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") local area = createCombatArea(AREA_CROSS6X6) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end  
  20. Gostei
    Lurk recebeu reputação de WooX em Spell que bloqueia o target do player   
    Fiz essa spell a pedido de um usuário do fórum e logo depois outro usuário pediu uma versão onde o target do player afetado pela magia ficasse bloqueado por um tempo configurável, gostei da ideia e decidi postar em forma de tópico. Primeiro de tudo você vai precisar dessa função feita/disponibilizada pelo @WooX (não se esqueçam de passar no tópico dele e agradecer)
     
    Em data/spells.xml adicione
    <instant name="Cancel Enemy Target" words="Cancel Enemy Target" lvl="12" mana="20" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="canceltargetlurk.lua"> <vocation id="1"/> <vocation id="2"/> </instant> em data/spells/scripts crie um arquivo chamado canceltargetlurk.lua e coloque isso dentro
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local tempo_block = 5 -- quanto tempo o player afetado pela magia vai ficar sem poder atacar OUTRO PLAYER local templo_cannot_be_blocked = 50 -- tempo em que o target vai ficar invuneravel a spell caso já tenha sido afetado por ela local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() and getPlayerStorageValue(target, 234514) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(target, 234513, tempo_block + os.time()) setPlayerStorageValue(target, 234514, templo_cannot_be_blocked + os.time()) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(target, 234514) > os.time() then doPlayerSendCancel(cid, "This player has been affect by this spell recently, you must wait ".. getPlayerStorageValue(target, 234514) - os.time() .." to block his attacks again.") return false elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end agora em data/creaturescripts.xml adicione
    <event type="attack" name="lurkBlockTarget" event="script" value="canceltargetlurk.lua"/> em data/creaturescripts/scripts crie um arquivo chamado canceltargetlurk.lua e cole isso dentro
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- function onAttack(cid, target) if getPlayerStorageValue(cid, 234513) > os.time() and isPlayer(target) then return doPlayerSendCancel(cid, "You're under effect of the cancel target spell, you must wait".. getPlayerStorageValue(cid, 234513) - os.time() .." seconds to attack again.") and false end return true end por ultimo, abre o arquivo login.lua que está na pasta data/creaturescripts/scripts e adicione isso ANTES DO ULTIMO RETURN TRUE
    registerCreatureEvent(cid, "lurkBlockTarget") Se você quer só E SOMENTE SÓ cancelar o target do inimigo uma unica vez, basta utilizar essa versão da spell
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end Créditos:
    Eu pela spell e creaturescript
    @WooX pela criação da função
     
    se gostou, rep+ aqui e no post do @WooX pela função : p 
  21. Curtir
    Lurk recebeu reputação de WooX em [TFS 0.x] Função doPlayerTargetCreature   
    se alguém quiser um exemplo do que da pra fazer com esse código, aqui uma magia que cancela o target do seu target
  22. Gostei
    Lurk recebeu reputação de Ackerzin em Spell que bloqueia o target do player   
    Fiz essa spell a pedido de um usuário do fórum e logo depois outro usuário pediu uma versão onde o target do player afetado pela magia ficasse bloqueado por um tempo configurável, gostei da ideia e decidi postar em forma de tópico. Primeiro de tudo você vai precisar dessa função feita/disponibilizada pelo @WooX (não se esqueçam de passar no tópico dele e agradecer)
     
    Em data/spells.xml adicione
    <instant name="Cancel Enemy Target" words="Cancel Enemy Target" lvl="12" mana="20" range="3" blockwalls="1" needtarget="1" exhaustion="2000" needlearn="0" event="script" value="canceltargetlurk.lua"> <vocation id="1"/> <vocation id="2"/> </instant> em data/spells/scripts crie um arquivo chamado canceltargetlurk.lua e coloque isso dentro
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local tempo_block = 5 -- quanto tempo o player afetado pela magia vai ficar sem poder atacar OUTRO PLAYER local templo_cannot_be_blocked = 50 -- tempo em que o target vai ficar invuneravel a spell caso já tenha sido afetado por ela local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() and getPlayerStorageValue(target, 234514) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(target, 234513, tempo_block + os.time()) setPlayerStorageValue(target, 234514, templo_cannot_be_blocked + os.time()) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(target, 234514) > os.time() then doPlayerSendCancel(cid, "This player has been affect by this spell recently, you must wait ".. getPlayerStorageValue(target, 234514) - os.time() .." to block his attacks again.") return false elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end agora em data/creaturescripts.xml adicione
    <event type="attack" name="lurkBlockTarget" event="script" value="canceltargetlurk.lua"/> em data/creaturescripts/scripts crie um arquivo chamado canceltargetlurk.lua e cole isso dentro
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- function onAttack(cid, target) if getPlayerStorageValue(cid, 234513) > os.time() and isPlayer(target) then return doPlayerSendCancel(cid, "You're under effect of the cancel target spell, you must wait".. getPlayerStorageValue(cid, 234513) - os.time() .." seconds to attack again.") and false end return true end por ultimo, abre o arquivo login.lua que está na pasta data/creaturescripts/scripts e adicione isso ANTES DO ULTIMO RETURN TRUE
    registerCreatureEvent(cid, "lurkBlockTarget") Se você quer só E SOMENTE SÓ cancelar o target do inimigo uma unica vez, basta utilizar essa versão da spell
    --[[ Made by Moira (Lurk on TibiaKing) NÃO REMOVA OS CRÉDITOS ]]-- local storage = 234512 -- tenha certeza de estar usando um numero que ainda não esteja em uso no seu servidor local tempo = 50 -- tempo em segundos para usar a magia novamente local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) function onCastSpell(cid, var) local target = getCreatureTarget(cid) if isPlayer(target) and getPlayerStorageValue(cid, storage) < os.time() then doPlayerTargetCreature(target, target) setPlayerStorageValue(cid, storage, tempo + os.time()) return doCombat(cid, combat, var) elseif getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You must wait ".. getPlayerStorageValue(cid, storage) - os.time() .." seconds to use this spell again.") else doPlayerSendCancel(cid, "You may only cast this spell on players.") end return false end Créditos:
    Eu pela spell e creaturescript
    @WooX pela criação da função
     
    se gostou, rep+ aqui e no post do @WooX pela função : p 
  23. Curtir
    Lurk deu reputação a L3K0T em New Target OTC 0.6.6 e 0.6.7 - 2020   
    Olá galera, hoje vim trazer um tutorial bem completinho para vocês do sistema de "Target Animada pela source do OTC" renovada para otcliente 0.6.6 e 0.6.7 e espero que gostem  
     
    Imagens do Target Azul;;

     
    Imagens do Target Vermelho;;

     
    VIÍDEO:;;
     
     
    TUTORIAL
    1° Vai na pasta do seu otcliente e ache a pasta da source dele otclient-0.6.6\src\client dentro dela abre o arquivo creature.cpp e procure;;
    void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } altere para;;
     
    void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); /* if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } */ if(m_showTimedSquare && animate) { /*ImagePtr L3K0Tt = Image::load("data/images/target.png"); //se preferir usar por imagem TexturePtr L3K0T = TexturePtr(new Texture(L3K0Tt, false)); g_painter->drawTexturedRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(L3K0T->getHeight(), L3K0T->getWidth())*scaleFactor), L3K0T);*/ EffectPtr efeitoL3K0T = EffectPtr(new Effect()); efeitoL3K0T->setId(653); //id da sprite do efeito g_painter->setColor(m_timedSquareColor); Rect rect = Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor); g_painter->drawTexturedRect(rect, efeitoL3K0T->getThingType()->getTexture(0)); g_painter->setColor(Color::white); g_painter->setColor(Color::white); // by L3K0T g_painter->setOpacity(0.9); } if(m_showStaticSquare && animate) { /*ImagePtr L3K0Tt = Image::load("data/images/target.png"); //se preferir usar por imagem TexturePtr L3K0T = TexturePtr(new Texture(L3K0Tt, false)); g_painter->drawTexturedRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(L3K0T->getHeight(), L3K0T->getWidth())*scaleFactor), L3K0T);*/ EffectPtr efeitoL3K0T = EffectPtr(new Effect()); efeitoL3K0T->setId(653); //id da sprite do efeito g_painter->setColor(m_staticSquareColor); Rect rect = Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor); g_painter->drawTexturedRect(rect, efeitoL3K0T->getThingType()->getTexture(0)); g_painter->setColor(Color::white); //1 para não piscar e fixar no vermelho } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } salve.
     
     2° agora volte na pasta da source do otclient e abra o arquivo thingtype.h e procure por;;
    const TexturePtr& getTexture(int animationPhase); altere para
    /*const TexturePtr& getTexture(int animationPhase);*/ depois ache;;
    std::vector<int> getSprites() { return m_spritesIndex; } abaixo cole;;
    const TexturePtr& getTexture(int animationPhase); dps é só abrir o object guilder e importar o efeito do target;; >>>>> effect_653.obd  tem outras sprite doadas por mim segue o link 
     
     
    Depois de recortar é só por o efeito no otc e colocar o ID da sprite ali aonde tá o numero 653 no código.
     
    Ajudei?? REP+  
     
    Créditos:;
    -Eu por alterar outras coisas que faltou.
    -Jair Kevick (código base)
     

  24. Gostei
    Lurk deu reputação a L3K0T em GRAMA - SPRITE - REPINTADA (VERDE)   
    Olá galera esses dias repintei uma grama que no caso era amarela, deixei ela num tom verde que ficou muito bonita no mapa e não quebrava a cor das arvores etc... essa é do tibia global, então só mudei a cor dela. espero que gostem algumas imagens abaixo junto a meu jogo .
     
    grama >> 
     

     
     

     
     
    scan da sprite de montar:  https://www.virustotal.com/#/file/c80fbe750939ce45bfedccbfc81dbe76032ef5c760146607b6c29263cffb6cc1/detection
    scan da sprite OBD: https://www.virustotal.com/#/file/9c4cef388da4a8c19e45c8eb4aa85ba7d376103ffdcabd157f43e1929979e618/detection
     
    Download da sprite pra montar:  http://www.mediafire.com/file/eep0s1a5gd8fn5n/grama 1.zip
    Download da sprite em OBD: http://www.mediafire.com/file/fr3db9ctmt44dam/sprite+em+obd.zip
     
    senha: pokemonpwo
     
    créditos: cipsoft e a mim por mudar a cor pra verde como na imagem.
     
    Ajudei?? REP+  
  25. Curtir
    Lurk deu reputação a MayconPhP em Implementação PicPay-Didático   
    Olá pessoal do Tibia King sou o Maycon, sou desenvolvedor Web.
    E para ajudar as pessoas que tem interesse em aprender PHP resolvi fazer 1 tutorial de como implementar o PicPay no gesior. O vídeo tem o intuito de ajudar a pessoas que tenha dúvida de como funciona o Gesior.
    OBS: o vídeo é apenas para fins didático, então para implementação você precisará fazer uma regra de negócio de acordo com o que precisa para implementação.
     
    Espero ter ajudado abraços.
     
    Video 1
    Video 2
    Video 3
    Video 4

Informação Importante

Confirmação de Termo