Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 05/19/24 em todas áreas

  1. Desenvolvi por muito tempo uma base Pokémon do 0 (parti do TFS 1.2 e fui implementando tudo até chegar nessa versão que estou disponibilizando). O resultado é um servidor extremamente leve e estável (já testado com 100+ players e por mais de 1 mês sem cair). Basicamente, ele suporta tranquilamente 1k+ players e não tem nenhum bug conhecido que faça com que ele caia. Esse servidor ficou no ar por muito tempo (mais de 2 anos) e era conhecido como PokeDash. Acabei ficando sem tempo para administrar o servidor, o que fez com que a maioria dos players parassem de jogar e com que eu fechasse de vez. Pensei por muito tempo sobre o que fazer com ele, e decidi disponibilizar para a comunidade. Trata-se de algo único (eu ao menos nunca vi um servidor de Pokémon construído a partir do TFS 1.2)! Como desenvolvi todos os sistemas do 0, tomei cuidado para fazer tudo da melhor maneira possível e para que possa ser facilmente modificado e atualizado. Basicamente, os Pokémons podem ser criados a partir de um único arquivo XML (como monstros do Tibia), e nesse arquivo você pode especificar tudo, desde level máximo e mínimo de spawn, loots, tipos (fogo, agua, etc), se ele pode usar habilidades (surf, fly, etc), moves (quando alguém captura), ataques (quando selvagem), evoluções, chance de catch, etc. Exemplo de Pokemon Resumo de alguns sistemas (tem muita coisa, então coloquei os principais) ✅ Pokemons com level, status e boost. O level do player/boost também influencia no status dos pokes. ✅ Sistema de Love (seu poke fica mais forte que os demais quando upa de level matando pokemons mais fortes que ele). ✅ Base propria com Shinys e Ancients. ✅ Cada player pode conseguir ancient stone para evoluir 1 shiny para ancient através de quest. ✅ Moves bar e pokemon bar (troca de pokemon com 1 click). ✅ Autoloot agrupando em bags. ✅ Ganho de exp ao capturar/dar dex em pokes com um bonus adicional para o primeiro catch de cada poke. ✅ Mapa original com mais de 40 quests, incluindo outland com Ancients. ✅ Eventos diários automáticos: Futebol todo dia 19:30, arena PVP todo dia 20:00, golden arena aos sabados 17:00, bag premiada aos domingos/feriados 17:00. ✅ Profissões (facilmente customizáveis): Catcher: 3.5% mais chance de capturar um Pokemon. Hunter: 10% mais status de dano para o seu Pokemon (tanto magico quanto fisico). Blocker: 25% mais vida para seus Pokemons. Healer: 100% mais cura que aplica tanto em potions quando moves dos seus Pokemons. Explorer: 15% mais experiencia para seu personagem durante a caça. ✅ Task diária de catch/loot dando Tokens. Os tokens podem ser trocados por itens raros (dentre eles premier ball e bags personalizadas) além de pagar seu curso com o NPC Job Manager para aprender uma das profissões acima. Uma das maneiras de conseguir tokens é fazendo tasks diárias. ✅ Muito mais! Screenshots Download Baixe o pack contendo o servidor, cliente, site, editor de mapa e editor de itens clique aqui!. Caso considere minha contribuição interessante para a comunidade, considere realizar uma doação para a chave pix: [email protected] GM account: gm/gmgmgm O projeto será atualizado em sua homepage: https://pokedashpota.vercel.app/ SCAN ---EDIT--- Download sources SCAN Problemas e soluções GroupID não existe ao tentar logar no server. Erros ao importar o schema.sql. Comando /cb não funcionando:
  2. Tutorial 2 em 1 - Magic e Shoot Effects

    Gabrielx17 reagiu a KotZletY por uma resposta no tópico

    1 ponto
    Bom galera, o Tópico já diz tudo, irei explicar como mudar para Uint16 dessa vez nas Source, para quem não sabe. Irei explicar como aumentar em Magic Effects, para assim você seu Server usar mais de 255, e ShootEffects para usar mais de 41 Distance efeitos(muito mais). Existe Tópicos no Tk, porém não é a mesma coisa, esse é diferente pois você irá alterá o valor dos uint's disparados para o Client, para assim então usar além do Padrão! Abaixo umas informações essenciais ! Esse Tópico é especifico para TFS 0.4, para que assim você possa aumentar o limite de efeitos no Client, e usar mais de 255 efeitos, e mais de 41 efeitos em Distância. Vale lembra também que você não é obrigado a mudar em ambos, se você quiser apenas aumentar o Limite de Efeitos para mais de 255, então mude apenas ele, caso queria aumentar apenas os Efeitos que são lançados a distância(ShootEffects ou Distance Effects), caso queria os dois, use ambos. Vamos começar primeiramente com os Magic Effects: Agora vamos mudar o ShootEffects para uint16. Bom não adianta mudar isso se não fizer alteração no Client, então deixarei aqui, dois Tópicos de como mudar de uint8 para uint16 no Client em em ShootEffects e MagicEffect. Mudando os Efeitos de uint8 a 16 para Magic Effects Mudando os Efeitos de uint8 a 16 para Shoot Effects Então é isso ae, qualquer erro só comentar para que eu possar tentar ajudar. Tópico exclusivo do Tk, proibido posta em outro site, blog ou fórum! xD
  3. Problema Em Spell

    Fabi Marzan reagiu a Gabrielx17 por uma resposta no tópico

    1 ponto
    obrigado funcionou perfeitamente, consegui enteder tambem mais ou menos por cima de como usar o else pois não sabia que existia elseif! obrigado funcionou perfeitamente! e obrigado por me falar onde estava o erro consegui compreender mais ou menos pois não sabia que existia o elseif!
  4. Problema Em Spell

    Gabrielx17 reagiu a L3K0T por uma resposta no tópico

    1 ponto
    local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, COLOR_ORANGE) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -135.8, 0, -140.9, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, COLOR_RED) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -170.8, 0, -175.9, 0) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -150.8, 0, -155.9, 0) local function onCastSpell1(parameters) doCombat(parameters.cid, parameters.combat1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, parameters.combat2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, parameters.combat3, parameters.var) end function yagai1(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = {x=getThingPosition(getCreatureTarget(cid)).x+1, y=getThingPosition(getCreatureTarget(cid)).y, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(position, 399) end end function yagai2(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = {x=getThingPosition(getCreatureTarget(cid)).x+2, y=getThingPosition(getCreatureTarget(cid)).y+2, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(position, 411) end end function yagai3(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = {x=getThingPosition(getCreatureTarget(cid)).x+1, y=getThingPosition(getCreatureTarget(cid)).y, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(position, 398) end end function yagai4(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = {x=getThingPosition(getCreatureTarget(cid)).x+2, y=getThingPosition(getCreatureTarget(cid)).y+2, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(position, 396) end end function yagai5(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = {x=getThingPosition(getCreatureTarget(cid)).x+1, y=getThingPosition(getCreatureTarget(cid)).y, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(position, 438) end end function yagai6(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = {x=getThingPosition(getCreatureTarget(cid)).x+2, y=getThingPosition(getCreatureTarget(cid)).y+2, z=getThingPosition(getCreatureTarget(cid)).z} doSendMagicEffect(position, 439) end end function onCastSpell(cid, var) local waittime = 3.0 -- Tempo de exhaustion local storage = 143512 -- não mecha local storage2 = 55512 if exhaustion.check(cid, storage) then doPlayerSendCancel(cid, "Aguarde " .. exhaustion.get(cid, storage) .. " segundos para usar a spell novamente.") return false end local parameters = { cid = cid, var = var, combat1 = combat1, combat2 = combat2, combat3 = combat3} if getPlayerStorageValue(cid, storage2) == 5 then addEvent(onCastSpell2, 650, parameters) addEvent(yagai3, 50, cid) addEvent(yagai4, 650, cid) elseif getPlayerStorageValue(cid, storage2) == 4 then addEvent(onCastSpell2, 650, parameters) addEvent(yagai3, 50, cid) addEvent(yagai4, 650, cid) elseif getPlayerStorageValue(cid, storage2) == 3 then addEvent(onCastSpell3, 650, parameters) addEvent(yagai5, 50, cid) addEvent(yagai6, 650, cid) else addEvent(onCastSpell1, 650, parameters) addEvent(yagai1, 50, cid) addEvent(yagai2, 650, cid) end exhaustion.set(cid, storage, waittime) return true end erro: function onCastSpell(cid, var) não tava fechada
  5. Problema Em Spell

    Gabrielx17 reagiu a Fabi Marzan por uma resposta no tópico

    1 ponto
    Comecei a olhar seu código e você tinha um END demais. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, COLOR_ORANGE) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -135.8, 0, -140.9, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, COLOR_RED) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -170.8, 0, -175.9, 0) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -150.8, 0, -155.9, 0) local function onCastSpell1(parameters) doCombat(parameters.cid, parameters.combat1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, parameters.combat2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, parameters.combat3, parameters.var) end function yagai1(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = { x = getThingPosition(getCreatureTarget(cid)).x + 1, y = getThingPosition(getCreatureTarget(cid)).y, z = getThingPosition(getCreatureTarget(cid)).z } doSendMagicEffect(position, 399) end end function yagai2(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = { x = getThingPosition(getCreatureTarget(cid)).x + 2, y = getThingPosition(getCreatureTarget(cid)).y + 2, z = getThingPosition(getCreatureTarget(cid)).z } doSendMagicEffect(position, 411) end end function yagai3(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = { x = getThingPosition(getCreatureTarget(cid)).x + 1, y = getThingPosition(getCreatureTarget(cid)).y, z = getThingPosition(getCreatureTarget(cid)).z } doSendMagicEffect(position, 398) end end function yagai4(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = { x = getThingPosition(getCreatureTarget(cid)).x + 2, y = getThingPosition(getCreatureTarget(cid)).y + 2, z = getThingPosition(getCreatureTarget(cid)).z } doSendMagicEffect(position, 396) end end function yagai5(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = { x = getThingPosition(getCreatureTarget(cid)).x + 1, y = getThingPosition(getCreatureTarget(cid)).y, z = getThingPosition(getCreatureTarget(cid)).z } doSendMagicEffect(position, 438) end end function yagai6(cid) if isCreature(cid) and isCreature(getCreatureTarget(cid)) then local position = { x = getThingPosition(getCreatureTarget(cid)).x + 2, y = getThingPosition(getCreatureTarget(cid)).y + 2, z = getThingPosition(getCreatureTarget(cid)).z } doSendMagicEffect(position, 439) end end function onCastSpell(cid, var) local waittime = 3.0 -- Tempo de exhaustion local storage = 143512 -- não mecha local storage2 = 55512 if exhaustion.check(cid, storage) then doPlayerSendCancel(cid, "Aguarde " .. exhaustion.get(cid, storage) .. " segundos para usar a spell novamente.") return false end local parameters = {cid = cid, var = var, combat1 = combat1, combat2 = combat2, combat3 = combat3} if getPlayerStorageValue(cid, storage2) == 5 then addEvent(onCastSpell2, 650, parameters) addEvent(yagai3, 50, cid) addEvent(yagai4, 650, cid) elseif getPlayerStorageValue(cid, storage2) == 4 then addEvent(onCastSpell2, 650, parameters) addEvent(yagai3, 50, cid) addEvent(yagai4, 650, cid) elseif getPlayerStorageValue(cid, storage2) == 3 then addEvent(onCastSpell3, 650, parameters) addEvent(yagai5, 50, cid) addEvent(yagai6, 650, cid) else addEvent(onCastSpell1, 650, parameters) addEvent(yagai1, 50, cid) addEvent(yagai2, 650, cid) end exhaustion.set(cid, storage, waittime) return true end
  6. Olá, esse tutorial é uma parte do tópico principal: "Tutorial completo de infraestrutura para montar um servidor TFS 1.x no Ubuntu 22.04" ... Aqui ensinaremos como compilar o código fonte do TFS na máquina LINUX e posterior configurar o servidor. PASSO 1 - COMPILANDO TFS NO UBUNTU Primeiramente, devemos instalar os softwares necessários. O comando a seguir instalará o CMake, um compilador e as bibliotecas usadas pelo TFS. Após usar o comando digite Y para aceitar a instalação. sudo apt install cmake build-essential libluajit-5.1-dev libmysqlclient-dev libboost-system-dev libboost-iostreams-dev libboost-filesystem-dev libpugixml-dev libcrypto++-dev libfmt-dev libboost-date-time-dev Caso ainda não tenha criado a pasta do servidor (como foi dito no tutorial de instalação do PHP), use o comando a seguir para criar a pasta: sudo mkdir /home/otserv E depois vá até a pasta usando o comando: cd /home/otserv Agora, usando o WinSCP vá até a pasta /home/otserv/ e jogue a pasta de seu servidor ai dentro ... Antes deve estar assim: (se você seguiu o tutorial de instalação do PHP) Depois, os arquivos transferidos devem ser esses! Caso você não tenha os arquivos necessários, use: - TFS atual: https://github.com/otland/forgottenserver - TFS Nekiro's 8.60 Downgrade: https://github.com/nekiro/TFS-1.5-Downgrades/tree/8.60 Após transferido os arquivos, use o comando abaixo para criar a pasta BUILD e entrar nela: mkdir build && cd build E depois, use o comando do compilador: cmake .. Agora use o comando para compilar o código fonte do TFS: make E pronto, o código fonte foi compilado e gerou um arquivo "tfs", agora use o comando a seguir para mover o TFS para a pasta do servidor e voltar para a pasta anterior. mv tfs .. && cd .. Ficando assim na pasta "otserv": PASSO 2 - IMPORTANDO DATABASE E AJUSTANDO CONEXÃO PELO CONFIG.LUA Entre em seu phpmyadmin pelo navegador (IP/phpmyadmin, ou o outro destino que você escolheu conforme o tópico de instalação do phpmyadmin) Depois clique em "novo" para criar um novo banco de dados: E depois de digitar o nome do novo banco de dados, clique em "criar": Agora clique em "IMPORTAR" e depois em "escolher arquivo": E então selecione o arquivo padrão de database. Se você não tiver um arquivo padrão, use a do TFS: https://raw.githubusercontent.com/otland/forgottenserver/master/schema.sql E por fim, clique em EXECUTAR. No arquivo config.lua.dist você deve ajustar o dados para a conexão com o banco de dados: -- MySQL mysqlHost = "127.0.0.1" mysqlUser = "forgottenserver" mysqlPass = "" mysqlDatabase = "forgottenserver" mysqlPort = 3306 mysqlSock = "" (você pode incluir o caminho do mysqlSock para mysqlSock = "/var/run/mysqld/mysqld.sock" PASSO 3 - LIGANDO SEU SERVIDOR TFS NO UBUNTU E CRIANDO ARQUIVO AUTO RESTART Para prosseguirmos será necessária a instalação do SCREEN em sua máquina, veja o tutorial que explica o que ele é, para que server e ensina instala-lo: AQUI. Após a instalação, vamos criar um SCREEN para rodar o servidor chamada TFS ... screen -S TFS E após, usando o WinSCP, vá até a pasta do seu servidor em /home/otserv/ e crie um arquivo chamado "restart.sh" e coloque isso dentro dele: #!/bin/bash # to get 'ts' command: sudo apt install moreutils # to get 'crc32' command: sudo apt install libarchive-zip-perl BINARY_NAME=tfs MYSQL_USER=xxxx MYSQL_PASS=yyyy MYSQL_DATABASE=zzzz mkdir console mkdir crashlog mkdir mysql_backup # Permitir despejos de nucleo ulimit -c unlimited # Laco principal while true; do # Backup do banco de dados, e o melhor momento para fazer a copia do banco de dados, o OTS esta offline com certeza, entao nao pode haver nenhum clone de item. mysqldump -u $MYSQL_USER -p$MYSQL_PASS $MYSQL_DATABASE > mysql_backup/`date '+%Y-%m-%d_%H-%M'`.sql # Compactar em gzip com mais de 3 dias. find console/ -name "*.log" -mtime +3 -print -exec gzip -f {} \; find crashlog/ -name "*.bin" -mtime +3 -print -exec gzip -f {} \; find crashlog/ -name "*.core" -mtime +3 -print -exec gzip -f {} \; find mysql_backup/ -name "*.sql" -mtime +3 -print -exec gzip -f {} \; BINARY_WITH_HASH=`date '+%Y-%m-%d_%H-%M'`_`crc32 $BINARY_NAME` # copie o arquivo binário atual, você precisa do binário desde o momento da falha para executá-lo no gdb. cp $BINARY_NAME crashlog/$BINARY_WITH_HASH.bin # iniciar servidor # se o seu servidor já imprime a data com cada linha no console, você pode remover "| ts '%Y-%m-%d_%H-%M-%.S'" stdbuf -o 0 ./$BINARY_NAME 2>&1 | ts '%Y-%m-%d_%H-%M-%.S' | tee 'console.log' cat 'console.log' >> 'console/console_'`date '+%Y-%m-%d'`'.log'; mv core crashlog/$BINARY_WITH_HASH.core echo INICIAR A ESPERA POR 3 SEGUNDOS, PRESSIONE CTRL+C PARA DESLIGAR O RESTARTER sleep 3 echo FIM DA ESPERA done Em seguida, dar permissão ao arquivo "restart,sh" com o comando: sudo chmod 777 -R restart.sh Logo, instale os programas necessários para o restart funcionar corretamente: sudo apt install moreutils sudo apt install libarchive-zip-perl Posterior, configure o restart.sh com os dados corretos para a conexão SQL: troque onde esta xxxx, zzzz, yyyy Para o restarter criar o arquivo core é necessário desativar o serviço apport no sistema com o comando: sudo systemctl stop apport.service sudo systemctl disable apport.service Depois de desativar, use o comando a seguir para ver se está ativo o core, você terá que ter como resposta: core cat /proc/sys/kernel/core_pattern E por fim, iniciar o uso do arquivo "restart.sh" com o comando: ./restart.sh A princípio é isso! Siga as atualizações no tópico principal: "Tutorial completo de infraestrutura para montar um servidor TFS 1.x no Ubuntu 22.04" ... Fontes: - https://github.com/otland/forgottenserver/wiki/Compiling-on-Ubuntu
  7. 1 ponto
    Tem, o @SHARINGAN.exe vende a dll de montaria e marketing
  8. Mapa castelo para Tíbia 8.54

    S H I O N reagiu a Renan Gerson por uma resposta no tópico

    1 ponto
    Bom, sempre que eu tiver um tempo disponível eu irei trazer algumas criações de mapas para servidores 8.54. Ao longo do tópico irão ver imagens do mapa criado por mim chamado " Castelo/Castle ". Caso queira pegar o projeto e fazer melhorias para postar no fórum certifique-se de dar os devidos créditos: -------------------------------------------------- Inicialmente criado por: Renan Gerson Modificado e melhorado por: ( SEU NOME ) -------------------------------------------------- Dês de já se consegui te ajudar da REP+ -O mapa mostrando nas imagens é um castelo com apenas um acesso ( frontal/ponte ). -Possuindo algumas casas dentro dele e uma "área real" logo a cima da entrada, uma subida em cada parte da frente do castelo para visualizar novos inimigos se aproximando e caminhos diretos da frente até a "área real". -Também possuindo duas decidas para a área de maquinas ( onde faz a energia chegar nas cassas dos moradores ). -OBS: portas não testadas. Download: https://www.mediafire.com/file/hbf6ci2fugfphow/Mapa_Castelo-Renan_Gerson.rar/file
Líderes está configurado para São Paulo/GMT-03:00

Informação Importante

Confirmação de Termo