Ir para conteúdo

FeehLoveCes

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Obrigado
    FeehLoveCes recebeu reputação de koyotestark em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  2. Gostei
    FeehLoveCes deu reputação a marcoshps11 em Configurando Docker no windows, adeus VM   
    Neste tutorial, irei ensinar configurar o Docker no windows e rodar seu otserver
     
     
    - Diferença entre Docker x Máquina virtual:
      Docker e Máquinas Virtuais (VMs) ambas são fundamentais usadas para isolar recursos em um sistema de computação, mas funcionam de maneiras muito diferentes.
     
      VMs são ambientes de computação completos, incluindo um sistema operacional (SO) completo, que simulam o hardware de um computador físico. Isso significa que cada VM é um sistema autônomo e independente.   Já o Docker, usa a tecnologia de contêineres. Os contêineres compartilham o mesmo sistema operacional do host, mas mantêm seu próprio espaço de processo, arquivos e rede. Isso significa que eles são muito mais leves do que as VMs, pois não precisam de um SO completo, e podem ser iniciados e parados muito mais rapidamente.
    - Vantagens em utilizar o Docker
     O Docker oferece várias vantagens significativas:
    Eficiência de recursos: Como os contêineres Docker compartilham o SO do host, eles são mais leves e usam menos recursos do que as VMs. Portabilidade: O Docker permite que você "construa uma vez, execute em qualquer lugar". Uma vez criado um contêiner Docker, ele pode ser executado em qualquer sistema que suporte o Docker, independentemente das configurações subjacentes. Isolamento: Cada contêiner Docker é isolado do resto do sistema, o que ajuda a evitar conflitos entre diferentes aplicações e versões de software. Integração e entrega contínua: O Docker se integra bem com ferramentas de CI/CD (Integração Contínua / Entrega Contínua), permitindo a automatização de testes e implantação de aplicações. Escalabilidade e Orquestração: O Docker facilita a escalabilidade de aplicações, permitindo que múltiplos contêineres sejam implantados facilmente. Além disso, com ferramentas como Docker Swarm e Kubernetes, a orquestração de contêineres se torna eficiente e gerenciável  
     
    Colocando a mão na massa
     
    Este tutorial será dividido nas seguintes etapas:
    Preparação do Windows Instalando o Docker Instalando imagens mariadb e phpmyadmin Realizando a build da imagem TFS  
    1º PASSO:  Preparando o Windows com o subsistema Linux.
     
    AVISO: Essa Etapa será necessária somente caso ainda não possua o subsistema Linux ativado em seu windows
     
    Os comandos a seguir, serão todos utilizando o POWERSHELL do windows, na barra de pesquisa digite POWERSHELL e execute como administrador.
     

     
    Com o POWERSHELL aberto, execute os seguintes comandos:
     
    Habilitando subsistema Linux:
      dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart  
     
    Habilitando recurso de máquina virtual: dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart  
    Baixe e instale Kernel do Linux:  
    https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
     
    Após essa etapa, será necessário reiniciar o computador para atualização, após reiniciar, abra novamente o PowerShell
     
    Definindo o WSL 2 como padrão: wsl --set-default-version 2  
     
    Após esses passos, basta entrar na Microsoft Store e instalar o sistema Ubuntu:


     
    Após a instalação, abra o Ubuntu, como será a primeira vez, irá solicitar para que digite um nome de usuário e uma senha.

     
     
     
    Etapa 1 concluída.
     
    Fonte: https://learn.microsoft.com/pt-br/windows/wsl/install-manual
     
    2º PASSO:  Instalando Docker.
     
    este é um passo simples, apenas entre no site oficial do Docker, baixe e instale o Docker Desktop

    https://www.docker.com/
     

     
     
    Etapa 2 concluída.
     
     
    3º PASSO:  Instalando imagens MariaDB e phpMyAdmin
     
     Assim como no passo 1, execute novamente o PowerShell como administrador e siga os seguintes passos:
     
    Primeiro vamos baixar as imagens necessárias, execute os seguintes comandos: docker pull mariadb  
    docker pull phpmyadmin/phpmyadmin  
     
    Agora iremos criar uma "Rede" para que o docker se comunique entre os containers que iremos utilizar. Execute o seguinte comando:  
    docker network create mynetwork  
      mynetwork é o nome que defini neste caso, você pode utilizar o nome que achar melhor, porém lembre-se desse nome que iremos utilizar nos próximos passos.
     
    Agora iremos iniciar essas imagens, utilizando os seguintes comandos:  
    docker run --name mariadb --network=mynetwork -e MYSQL_ROOT_PASSWORD=your_password -d mariadb  
    your_password = altere pela senha que deseja utilizar no mysql
    mynetwork = é o nome que criamos no passo anterior
     
    docker run --name myadmin --network=mynetwork --link mariadb:db -d -p 8080:80 phpmyadmin/phpmyadmin  
    Lembrando novamente, mynetwork é o nome criado anteriormente
     
    Após esses passos, será possível ver seu container rodando no Docker Desktop:

     
    Etapa 3 concluída.
     
    4º PASSO:  Gerando Imagem do TFS e configurações necessárias:

     
    Baixe a TFS, nesse exemplo será o repositório oficial https://github.com/otland/forgottenserver Extraia os arquivos após baixar com o container mariadb e phpmyadmin rodando, acesse http://localhost:8080/  com o login root, e a senha que criou no passo 3, crie uma nova base de dados e importe o arquivo schema.sql do servidor edite o arquivo config.lua.dist
     -- MySQL
    mysqlHost = "mariadb"
    mysqlUser = "root"
    mysqlPass = "SUA SENHA CRIADO NO PASSO 3"
    mysqlDatabase = "NOME DA DATABASE"
    mysqlPort = 3306
    mysqlSock = ""

    mariadb é o nome do container que estamos rodando o mysql  
     
    ** Caso queira utilizar todo potencial do seu computador na hora de buildar a TFS, no arquivo Dockerfile, edite a linha 18:
    RUN cmake --preset default && cmake --build --config RelWithDebInfo --preset default para
     
    RUN cmake --preset default && cmake --build --config RelWithDebInfo --preset default -- -j 16  
    onde 16 é o numero de processadores lógicos que deseja ser utilizados, não é necessário utilizar 100% porém quanto mais melhor, porém caso utilize mais do que está disponível poderá travar,  então utilize a quantidade mostrada pra menos.
    no gerenciador de tarefas aba desempenho, é possível visualizar a quantidade de núcleos e processadores lógicos do seu CPU


     
    Após isso, entre no Power Shell e execute o comando:  
    docker build -t server .  
     onde "server" é o nome da imagem que será gerada
     
    Após isso, é só iniciar o servidor com o seguinte comando  
    docker run --name server --network=mynetwork -p 7171:7171 -p 7172:7172 -d server  
    lembrando que mynetwork é o nome que geramos no passo 3, e o ultimo parametro é nome da imagem que geramos anteriormente.
     
    Você poderá ver seu sevidor ronando no Docker Desktop:
     

     
    caso queira parar algum servidor ou iniciar novamente, é só clicar no botão de ação:
     

     
    Caso precise fazer alguma alteração no server, basta utilizar os comandos de build e run citados anteriormente.
     
     
     
     
    Lembrando que isso é um tutorial básico para rodar o servidor na máquina local, qualquer dúvida ou sugestão, deixe comentário.
     
  3. Gostei
    FeehLoveCes recebeu reputação de yuriowns em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  4. Obrigado
    FeehLoveCes recebeu reputação de jackless1 em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  5. Curtir
    FeehLoveCes deu reputação a najatheus em Sistema de roleta ( Tfs 1.x )   
    Sistema funciona da seguinte maneira, ao clicar na alavanca, vai gerar um numero de 1 a quantidade de mesa ou piso que for configurado na tabela, esse numero sera a posição do item até o ponto que o player vai receber o item, assim si o player tirar o menor numero possivel ele podera ter a sorte de receber os stacks do items, vou estar deixando um video aqui em baixo mostrando o sistema

    agora vamo instalar o codigo :

    Em data/actions/script/, crie um arquivo chamado roleta.lua, dentro dele coloque : 
     
    local configuration_table = { storage_pos_item = 0; -- não mexa level_requeriment = { -- requimento para poder girar alavanca min = 1; max = 100; }; count = 0; -- não mexa count_gire_item = 0; bag_id = 1991; count_remove = 0; -- não mexa floor_id_or_table = 10449; -- id da mesa ou piso que vão ficar os item por cima items = {3000, 2012, 13042, 13045, 13047, 13051, 13044, 13041}; -- items da roleta que vai ser usado na roleta effect_item = 8; -- efeito de quando estiver gerando o item effect_addItem = 1; -- efeito de qnd o player receber o item effect_addItem_remove = 32; -- efeito de qnd o item for pro slot do player effect_removeItem = 36; -- efeito de qnd for remover os item da mesa ou piso time_create_item = 200; -- tempo para criar um a um item na mesa ou piso time_calcule_pos_item = 300; -- tempo para mover o item para a proxima posição time_count_calcule_pos_item = 1600; -- tempo para começar a mover o item ( obs o calculo min tem que ser a quantidade de mesa que vai ter x o tempo time_create_item) position = { -- configuração dos movimentos e posição create_item = { -- posição para criar os items [1] = {x = 981, y = 945, z = 7}; [2] = {x = 981, y = 946, z = 7}; [3] = {x = 982, y = 945, z = 7}; [4] = {x = 982, y = 946, z = 7}; [5] = {x = 983, y = 945, z = 7}; [6] = {x = 983, y = 946, z = 7}; [7] = {x = 984, y = 945, z = 7}; [8] = {x = 984, y = 946, z = 7}; }; roleta = { -- giros da roleta [1] = { [1] = {x = 0, y = 1, z = 0}; [2] = {x = 1, y = -1, z = 0}; [3] = {x = 0, y = 1, z = 0}; [4] = {x = 1, y = -1, z = 0}; [5] = {x = 0, y = 1, z = 0}; [6] = {x = 1, y = -1, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [2] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 1, y = -1, z = 0}; [3] = {x = 0, y = 1, z = 0}; [4] = {x = 1, y = -1, z = 0}; [5] = {x = 0, y = 1, z = 0}; [6] = {x = 1, y = -1, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [3] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 0, y = 0, z = 0}; [3] = {x = 0, y = 1, z = 0}; [4] = {x = 1, y = -1, z = 0}; [5] = {x = 0, y = 1, z = 0}; [6] = {x = 1, y = -1, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [4] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 0, y = 0, z = 0}; [3] = {x = 0, y = 0, z = 0}; [4] = {x = 1, y = -1, z = 0}; [5] = {x = 0, y = 1, z = 0}; [6] = {x = 1, y = -1, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [5] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 0, y = 0, z = 0}; [3] = {x = 0, y = 0, z = 0}; [4] = {x = 0, y = 0, z = 0}; [5] = {x = 0, y = 1, z = 0}; [6] = {x = 1, y = -1, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [6] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 0, y = 0, z = 0}; [3] = {x = 0, y = 0, z = 0}; [4] = {x = 0, y = 0, z = 0}; [5] = {x = 0, y = 0, z = 0}; [6] = {x = 1, y = -1, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [7] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 0, y = 0, z = 0}; [3] = {x = 0, y = 0, z = 0}; [4] = {x = 0, y = 0, z = 0}; [5] = {x = 0, y = 0, z = 0}; [6] = {x = 0, y = 0, z = 0}; [7] = {x = 0, y = 1, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; [8] = { [1] = {x = 0, y = 0, z = 0}; [2] = {x = 0, y = 0, z = 0}; [3] = {x = 0, y = 0, z = 0}; [4] = {x = 0, y = 0, z = 0}; [5] = {x = 0, y = 0, z = 0}; [6] = {x = 0, y = 0, z = 0}; [7] = {x = 0, y = 0, z = 0}; [8] = {x = 3, y = 0, z = 0}; }; } } } local function createItemPos() if(configuration_table.count >= #configuration_table.position.create_item)then configuration_table.count = 0 return end configuration_table.count = configuration_table.count + 1 local item = Game.createItem(configuration_table.items[math.random(1, #configuration_table.items)], 1, configuration_table.position.create_item[configuration_table.count]) local pos_item = item:getPosition() pos_item:sendMagicEffect(configuration_table.effect_item) item:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "Item do evento da roleta") addEvent(createItemPos, configuration_table.time_create_item) end local function removeItemPos() if(configuration_table.count_remove >= #configuration_table.position.create_item)then configuration_table.count_remove = 0 return nil end configuration_table.count_remove = configuration_table.count_remove + 1 local tile = Tile(configuration_table.position.create_item[configuration_table.count_remove]) if not tile then return nil end local item = tile:getTopVisibleThing() if not item then return nil end if(item:getId() == configuration_table.floor_id_or_table)then return removeItemPos() end item:getPosition():sendMagicEffect(configuration_table.effect_removeItem) item:remove() removeItemPos() end local function addItemPlayer(player_uid) local player = Player(player_uid) if not player then return nil end local tile = Tile(configuration_table.storage_pos_item) if not tile then return nil end local item = tile:getTopVisibleThing() if not item then return nil end local player_pos = player:getPosition() local item_pos = item:getPosition() local bag = player:addItem(configuration_table.bag_id, 1, true, 1, 3) bag:addItem(item:getId(), item:getCount(), true, 1, 3) player_pos:sendMagicEffect(configuration_table.effect_addItem) item_pos:sendMagicEffect(configuration_table.effect_addItem_remove) item:remove(item:getCount()) end local function calculePosItem(value, player_uid) if(configuration_table.count_gire_item >= #configuration_table.position.create_item)then removeItemPos() addItemPlayer(player_uid) configuration_table.count_gire_item = 0 return nil end configuration_table.count_gire_item = configuration_table.count_gire_item + 1 local tile = Tile(configuration_table.position.create_item[configuration_table.count_gire_item]) if not tile then return nil end local item = tile:getTopVisibleThing() if not item then return nil end if(item:getId() == configuration_table.floor_id_or_table)then return nil end local pos = item:getPosition() local item_pos_x = pos.x local item_pos_y = pos.y local item_pos_z = pos.z local pos_ = configuration_table.position.roleta[value] local position = Position(item_pos_x + pos_[configuration_table.count_gire_item].x, item_pos_y + pos_[configuration_table.count_gire_item].y, item_pos_z) if not position then return nil end configuration_table.storage_pos_item = position item:moveTo(position) addEvent(calculePosItem, configuration_table.time_calcule_pos_item, value, player_uid) end function onUse(player, item, fromPosition, target, toPosition, isHotkey) if(player:getLevel() > configuration_table.level_requeriment.max)then return(not(player:sendTextMessage(MESSAGE_INFO_DESCR, player:getName() .. " your level(" .. player:getLevel() .. ") needs to be bigger(" .. configuration_table.level_requeriment.max .. ")"))) end if(player:getLevel() < configuration_table.level_requeriment.min)then return(not(player:sendTextMessage(MESSAGE_INFO_DESCR, player:getName() .. " your level(" .. player:getLevel() .. ") needs to be smaller(" .. configuration_table.level_requeriment.min .. ")"))) end if(configuration_table.count_gire_item >= 1) or (configuration_table.count >= 1) or (configuration_table.count_remove >= 1)then return(not(player:sendTextMessage(MESSAGE_INFO_DESCR, player:getName() .. " wait the roulette is in action, wait for it to finish"))) end local random = math.random(1, #configuration_table.position.roleta) configuration_table.storage_pos_item = 0 createItemPos() addEvent(calculePosItem, configuration_table.time_count_calcule_pos_item, random, player.uid) Game.sendAnimatedText("Spin number will be: " .. random, player:getPosition(), math.random(1, 255)) player:sendTextMessage(MESSAGE_INFO_DESCR, player:getName() .. " item of the day is on the rocks there") return true end
    Agora em data/actions/actions.xml, coloque :
     
    <action itemid="o id da alavanca do seu servidor" script="roleta.lua" />
    20211004_171313.mp4
     
  6. Obrigado
    FeehLoveCes recebeu reputação de Orientalz em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  7. Gostei
    FeehLoveCes deu reputação a FlameArcixt em Horder Leader System (Definitivo)   
    ?HORDER LEADER SYSTEM?
    Já vou me adiantando, fiz o script mas não sou programador, testei varias e varias vezes aqui e deu certo, se não der ai eu não ofereço suporte, sorry, se algum programador quiser melhorar o código fica a vontade.
    Como Funciona: Um monstro especial "Boss", quando você targeta nele, ele Cria vários outros monstros mais fracos para ajudar ele. só fiz esse script pra contribuir aqui no tk.
    ?Em data\creaturescript\creaturescript.xml registre?
    ?Em data\creaturescript\script crie um arquivo com nome "target.lua" e cole o código?
    ?Para isso funcionar, você deve registrar os eventos nos monstros que você for usar EX: ?
    O que mudei no script desde o beta? simples, agora só vai spawnar se o monstro levar dano, e a storage global só volta a -1 se o monstro morrer.
    Prováveis problemas? sim, o script foi feito para boss, ou seja, se tiver mais de dois boss no mapa pode dar problema, por exemplo, um boss é atacado e a storage fica ativada, mas ele não é morto então não desativa a storage, se você for matar o outro boss, os monstros não irão nascer, pois a storage já vai estar ativada, ou seja, deixe apenas um boss por vez.
    Só isso mesmo, suporte só com 10zão no pixpobre?
    Agradecimentos ao @Vodkart(Ajudou muito com erros/ediçoes).
  8. Obrigado
    FeehLoveCes deu reputação a Endless em Proteção contra DoS utilizando Mod_evasive no Apache   
    Olá meus senhores, hoje venho trazer pra vocês 1 tutorial que li a muito tempo atrás e me ajudou muito. O tutorial não é meu, mas vejo que muita gente, muita gente mesmo não conhece esse módulo do apache, então achei válido trazer pra comunidade. Espero que ajude alguém!!
    O módulo que venho apresentar a vocês é o mod_evasive do Apache.
     
    Sobre ele:
     

    Instalando o mod_evasive:

     

    Configurando o mod_evasive:
     

    Carregando o módulo mod_evasive no apache:
     

    Teste da proteção DDoS
     

    Conclusão
     

    Créditos:

    https://sempreupdate.com.br/mod_evasive-no-apache-oferece-protecao-contra-ataque-de-ddos/
  9. Gostei
    FeehLoveCes deu reputação a Yan Liima em Limite de players em guild website   
    Limite máximo de players em guild WEBSITE ?

     
    Bom, decidi postar essa modificação que fiz a muito tempo, pois vi que bastante gente queria
    Para Modern AAC e vi que ninguém soube ajudar. Como é algo bem simples e ta parado aqui faz tempo
    Decidi disponibilizar. Não só para Modern, mas para Gesior também!
    Estarei disponibilizando de duas maneiras:
    1º Será um valor configurado no proprio config.php, onde determinará o limite máximo de todas as guild.
    2º A verificação será feita por DB, onde terá um valor padrão para cada guilda criada, podendo ser alterado o valor de membros maximo.
    Ou seja, a guilda número UM pode ter máximo de 50 players, e a guilda número DOIS pode ter o máximo de 100.
    Vocês pode ser criativos e vender items que aumenta o limite ou fazer eventos/sorteios para aumentar...

     
    Enfim, vamos lá...
    Primeira maneira:
    Modern AAC:
    Gesior:
     
    Segunda maneira:
     
    Modern AAC:
    Gesior:
     
    Prontinho galera!!!
    Caso queiram para cmd in-game: LINK
  10. Gostei
    FeehLoveCes recebeu reputação de ernaix69 em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  11. Gostei
    FeehLoveCes deu reputação a Movie em [TFS 1.X] AntiBot   
    [Anti-Bot]

    Fiz esse sistema para o Thunder porém vou deixá-lo a parte nesse tópico aqui para quem quiser implementar em seu otserv.
    Lembrando que esse sistema é para TFS 1.X e qualquer sugestão/problema nesse sistema, deve ser reportado no GitHub.

    Crie um arquivo na pasta lib com o nome antibot.lua
    ANTIBOT = { prefix = "[AntiBot] ", questions = { {question = "Qual o ano que começou o COVID-19?", staticAnswer = true, answer = "2019"}, {question = "Qual seu skill atual de Sword?", skill = true, answer = SKILL_SWORD}, {question = "Qual seu skill atual de Club?", skill = true, answer = SKILL_CLUB}, {question = "Qual seu skill atual de Distance?", skill = true, answer = SKILL_DISTANCE}, {question = "Qual seu level atual?", answer = "level"}, {question = "Qual o dia de hoje?", answer = "day"}, }, playerQuestion = {}, messages = { time = "Você possui %s para responder a pergunta.", chat = "Esse chat só pode ser usado durante a verificação.", howAnswer = "Você deve responder somente a resposta, por exemplo: Qual o dia de hoje? Resposta: %d", correctAnswer = "Você acertou a pergunta. Obrigado.", incorrectAnswer = "Você errou a resposta, você ainda possui %d tentativas.", logout = "Você não pode deslogar enquanto hover uma verificação ativa.", }, punishment = { try = { max = 3, reason = "Quantidade excessiva de tentativas.", timePunishment = 1, -- In days players = {}, }, time = { maxTime = 180, -- In seconds reason = "Não respondeu a pergunta dentro do tempo estipulado.", timePunishment = 2, -- In days players = {}, }, }, verification = {40, 60}, -- in minutes } function ANTIBOT:addTry(playerId) local player = Player(playerId) if not player then return false end playerId = player:getId() if not ANTIBOT.punishment.try.players[playerId] then ANTIBOT.punishment.try.players[playerId] = 0 end ANTIBOT.punishment.try.players[playerId] = ANTIBOT.punishment.try.players[playerId] + 1 if ANTIBOT.punishment.try.players[playerId] and ANTIBOT.punishment.try.players[playerId] >= ANTIBOT.punishment.try.max then sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.punishment.try.reason) ANTIBOT:addPunishment(playerId) end end function ANTIBOT:time(playerId) local player = Player(playerId) if not player then ANTIBOT:reset(playerId) return false end playerId = player:getId() if not ANTIBOT.punishment.time.players[playerId] then ANTIBOT.punishment.time.players[playerId] = 0 ANTIBOT:sendQuestions(playerId) end addEvent(function() if ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= 0 and ANTIBOT.punishment.time.players[playerId] < ANTIBOT.punishment.time.maxTime then ANTIBOT.punishment.time.players[playerId] = ANTIBOT.punishment.time.players[playerId] + 1 player:sendCancelMessage(ANTIBOT.prefix .. ANTIBOT.messages.time:format(string.diff(ANTIBOT.punishment.time.maxTime - ANTIBOT.punishment.time.players[playerId], true))) ANTIBOT:time(playerId) end end, 1000) if ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= ANTIBOT.punishment.time.maxTime then ANTIBOT:addPunishment(playerId) end end function ANTIBOT:sendQuestions(playerId) local player = Player(playerId) if not player then return false end playerId = player:getId() random = math.random(#ANTIBOT.questions) ANTIBOT.playerQuestion[playerId] = random player:say("ANTIBOT", TALKTYPE_MONSTER_SAY) player:openChannel(13) addEvent(sendChannelMessage, 500, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.howAnswer:format(os.date("%d"))) addEvent(sendChannelMessage, 800, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.questions[random].question) end function ANTIBOT:reset(playerId) ANTIBOT.punishment.try.players[playerId] = nil ANTIBOT.punishment.time.players[playerId] = nil ANTIBOT.playerQuestion[playerId] = nil end function ANTIBOT:addPunishment(playerId) local player = Player(playerId) if not player then return false end playerId = player:getId() local accountId = getAccountNumberByPlayerName(player:getName()) if accountId == 0 then return false end local resultId = db.storeQuery("SELECT 1 FROM `account_bans` WHERE `account_id` = " .. accountId) if resultId ~= false then result.free(resultId) return false end local timeNow = os.time() if ANTIBOT.punishment.try.players[playerId] and ANTIBOT.punishment.try.players[playerId] >= ANTIBOT.punishment.try.max then db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. accountId .. ", " .. db.escapeString(ANTIBOT.prefix .. ANTIBOT.punishment.try.reason) .. ", " .. timeNow .. ", " .. timeNow + (ANTIBOT.punishment.try.timePunishment * 86400) .. ", " .. player:getGuid() .. ")") elseif ANTIBOT.punishment.time.players[playerId] and ANTIBOT.punishment.time.players[playerId] >= ANTIBOT.punishment.time.maxTime then db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. accountId .. ", " .. db.escapeString(ANTIBOT.prefix .. ANTIBOT.punishment.time.reason) .. ", " .. timeNow .. ", " .. timeNow + (ANTIBOT.punishment.time.timePunishment * 86400) .. ", " .. player:getGuid() .. ")") end ANTIBOT:reset(playerId) player:save() player:getPosition():sendMagicEffect(CONST_ME_POFF) player:remove() end Não esqueça de registrar essa lib no arquivo lib.lua

    Na pasta chachannels/scripts crie um arquivo chamado antibot.lua
    function onJoin(player) if not ANTIBOT.playerQuestion[player:getId()] then player:sendTextMessage(5, ANTIBOT.prefix .. ANTIBOT.messages.chat) player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end return true end function onLeave(player) if ANTIBOT.playerQuestion[player:getId()] then return false end return true end function onSpeak(player, type, message) if not ANTIBOT.playerQuestion[player:getId()] then sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.chat) player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end local question = ANTIBOT.questions[ANTIBOT.playerQuestion[player:getId()]] if question.skill then correctAnswer = tonumber(player:getSkillLevel(question.answer)) message = tonumber(message) elseif question.answer == "level" then correctAnswer = tonumber(player:getLevel()) message = tonumber(message) elseif question.answer == "day" then correctAnswer = tonumber(os.date("%d")) message = tonumber(message) elseif question.staticAnswer then message = message:lower() correctAnswer = question.answer:lower() end verification = false if message == correctAnswer then verification = true end if verification then addEvent(sendChannelMessage, 200, 13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.correctAnswer) ANTIBOT:reset(player:getId()) else ANTIBOT:addTry(player:getId()) addEvent(function() if ANTIBOT.punishment.try.players[player:getId()] and ANTIBOT.punishment.try.players[player:getId()] < ANTIBOT.punishment.try.max and player then sendChannelMessage(13, TALKTYPE_CHANNEL_O, ANTIBOT.prefix .. ANTIBOT.messages.incorrectAnswer:format(ANTIBOT.punishment.try.max - ANTIBOT.punishment.try.players[player:getId()])) end end, 100) end return true end <channel id="13" name="AntiBot" script="antibot.lua" />
    Agora na pasta creaturescripts/scripts crie um arquivo chamado antibot.lua
    function onLogin(player) if player:getAccountType() >= ACCOUNT_TYPE_GAMEMASTER then return true end player:registerEvent("AntiBot") checkAnti(player:getId()) return true end function checkAnti(playerId) local player = Player(playerId) if not player then return false end min, max = ANTIBOT.verification[1], ANTIBOT.verification[2] random = math.random(min, max) addEvent(function() ANTIBOT:time(player:getId()) checkAnti(player:getId()) end, random * 60 * 1000) end <event type="login" name="AntiBot" script="antibot.lua" />
    Agora no arquivo logout.lua na pasta creaturescripts/scripts
    antes do return true adicione isso
    if ANTIBOT.punishment.try.players[player:getId()] or ANTIBOT.punishment.time.players[player:getId()] then player:sendTextMessage(MESSAGE_INFO_DESCR, ANTIBOT.prefix .. ANTIBOT.messages.logout) player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end ANTIBOT:reset(player:getId())
     
    Sistema 100% feito por mim.
    Créditos adicionais ao @Endless e ao @Tottin por testarem
  12. Gostei
    FeehLoveCes recebeu reputação de Apache em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  13. Gostei
    FeehLoveCes deu reputação a Cat em Água transparente no Tibia 70% (psd + png + obd)   
    ÁGUA TRANSPARENTE NO TIBIA
     
    Amostra/teste:

     
    Download Tibia.otfi -> Arquivo necessário para ativar transparência no seu client.
    (coloque junto ao tibia.dat e tibia.spr)
    Tibia.otfi
     
    Para ativar a transparência nas versões 8.54 e 8.60 é necessário o uso de dll:
    https://github.com/SaiyansKing/Tibia-Extended-Client-Library
     
    Download Object Builder -> Programa usado para add sprites
    https://github.com/ottools/ObjectBuilder/releases/tag/v0.4.8
     
    Download Item Editor -> Usado para cadastrar as propriedades de itens novos e abrir no map editor.
    https://github.com/ottools/ItemEditor/releases/tag/v0.5.1
     
    Download Sprites
    Contém:
    - Sprites de piso d'água full ground + 1 estilo borda (recomendo usar todos como borda, tirar full ground)
    - Sprites borda água-barranco.
    - Sprites borda água-areia.
    - Sprites borda areia-barranco-água.
    - Sprites borda água solo.
    - Sprites cachoeira + quedas d'água versão leste/norte
    - Sprites água transparente versão córrego (12x)
    sprites transparentes.rar
     
     
    (Senha para abrir o arquivo: tibiaking)

     
  14. Gostei
    FeehLoveCes deu reputação a Endless em [MyAAC] Sistema de Exibir Monstros por Level   
    Olá senhores, hoje vim disponibilizar um Sistema desenvolvido por mim para o MyAAC onde a função dele é exibir os monstros do seu jogo baseado em seu Level necessário para acessar ou level indicado.
     
    Exemplo de como vai ficar:
     

    Instalação:
     

    A parte a seguir é 1 tutorial extra para quem quiser 1 base de como exibir os monstros baseado no level.
     

    PS:
    -> O sistema foi testado e não apresentou problemas, porém se vierem a encontrar falhas, favor reportar para que eu possa manter o tópico atualizado/corrigido.
    -> Eu faço correções no sistema caso esteja errado, mas não faço adaptações pro seu servidor. Caso queira variações do sistema, favor enviar seu pedido no discord da Academia de Programação, ou em meu discord privado: Endless#5410
  15. Gostei
    FeehLoveCes deu reputação a ITALOx em Skin System por comando !skin [8.6]   
    Olá rapaziada.
    Hoje tô trazendo sistema de skin por comando.
    Já vi muita gente pedindo por aqui e nunca teve resultado.
     
    Então vamos lá!
     
     
    Lib:
    Crie um arquivo lua com o nome
    210-skins
     
    Actions.xml
     
    <action itemid="11225" event="script" value="skin.lua"/>  
    Actions/scripts
    Crie um arquivo com o nome skin.lua e coloque isso aqui dentro:
    local skin = { [11204] = 1, -- [itemid] = skinid, } function onUse(cid, item, frompos, item2, topos) if not skin[item.itemid] then return false end if doPlayerAddSkin(cid, skin[item.itemid]) then doRemoveItem(item.uid,1) end return true end  
    Agora vá em talkactions.xml e coloque isso aqui lá:
    <talkaction words="!skin" event="script" value="skin.lua"/>  
    Em talkactions/scripts crie um arquivo com o nome skin.lua
    e coloquei isso aqui:
    function onSay(cid, words, param, channel) if param ~= "remover" or param ~= "remove" then doPlayerUseSkin(cid, tonumber(param)) elseif param == "remover" or param == "remove" then doPlayerRemoveSkin(cid) end return true end  
  16. Gostei
    Esse é meu charlist, detalhe que puxa personagem de 2 servidores diferentes, um que seria o Rate Alta ( servidor com xp rate alta ) e Rate Baixa ( servidor com xp rate baixa )
     

  17. Gostei
    Modulo de Seleção de Level para Dungeon de um servidor de Dungeon ni Deai que estou elaborando.
  18. Gostei
    Top Menu Bar desenvolvido juntamente com o @Tottin


  19. Gostei
    Look de equipamentos e armas do otc custom que estou elaborando

  20. Gostei
    Adição de informação do jogador na interface.
    Avatar do jogador (Alterando automaticamente conforme o Outfit)
    Name, Level, Health, Mana, Experience. (Atualizando corretamente.)
    Inventário do jogador com equipamentos em nova disposição, exibindo o outfit atual e descrições do personagem.
     

  21. Obrigado
    FeehLoveCes deu reputação a Endless em [MyAAC] Plugin Auction System   
    Olá senhores, desenvolvi um Plugin que vai dar um "tchann" extra em seu servidor rsrsrs.

    Sobre o Sistema:

    Este é o Sistema de Auction, convertido para MyAAC.
    Testado para 0.3.6 / 0.4
    Para alterar qualquer configuração do sistema, você pode acessar: system/pages/auction.php
     
    Demo:

     
     
    Instalação:

    Baixe o plugin: auction-system.zip
    Vá até o Painel de Administração, selecione a aba 'Plugins' e selecione auction-system.zip, clique em upload.
    Mova o arquivo => auctionsystem.lua <= para `data/talkactions/scripts`
    Adicione a tag `<talkaction words="!offer_gold" event="script" value="auctionsystem.lua"/>` em talkactions.xml de seu servidor

    Pronto, instalado XD!!

    PS:
    -> O sistema foi testado e não apresentou problemas, porém se vierem a encontrar falhas, favor reportar para que eu possa manter o tópico atualizado/corrigido.
    -> Eu faço correções no sistema caso esteja errado, mas não faço adaptações pro seu servidor. Caso queira variações do sistema, favor enviar seu pedido no discord da Academia de Programação, ou em meu discord privado: Endless#5410

    Créditos:
    @Tottin Por desenvolver junto comigo a lógica.
    Créditos pela script base: https://tibiaking.com/forums/topic/34172-trade-off-shop-offline/?tab=comments#comment-192640
     
  22. Obrigado
    FeehLoveCes deu reputação a Kyle Bellini em Spell - Piertotum Locomotor   
    E aí, pessoal!
     
    Esses dias eu estava na vibe Harry Potter e antes de dormir acabei tendo a ideia de fazer uma spell inspirada na magia Piertotum Locomotor. Criei ela, e decidi compartilhar com vocês auhauah
     
    Funcionamento:
    Dois golems serão invocados e aprisionarão o inimigo com pedras durante um certo período. (R.I.P qualidade)
     

     
    Vamos ao código (deixei alguns comentários explicando, mas está bem fácil de compreender o funcionamento, se tiver alguma dúvida pode comentar no tópico).
    Primeiro, crie um arquivo.lua, e cole o script dentro:
     
    Feito isso, no arquivo spells.xml recomendo que deixem o parâmetro (needtarget="1"). Exemplo de tag:
    <instant name="Piertotum Locomotor" words="Piertotum Locomotor" lvl="200" mana="1000" needtarget="1" prem="0" exhaustion="10000" groups="1,1500" icon="87" needlearn="0" event="script" value="hogwarts/piertotum locomotor.lua"> <vocation id="1"/> <vocation id="2"/> </instant>  
  23. Obrigado
    FeehLoveCes deu reputação a Endless em Gerador de Outfits Automática para o Site   
    Olá meus senhores, tem muita gente que pede serviços em relação a Gerar Outfits Animadas do seu cliente, o que muitos não sabem é que existe esse sistema de Gerar as Outfit animadas gratuitamente na internet e ele foi desenvolvido pelo Gesior.pl (Polones), então todo o crédito deste tutorial em relações a códigos vão para ele.

    Primeiro de tudo, o que é esse Sistema de Gerar Outfits Animadas?

    Basicamente é 1 Sistema Web que vai ler o teu tibia.spr / tibia.dat e seu items.otb e gerar todas suas outfit do seu cliente em forma de frames e na hora de exibir o sistema utiliza uma script em php que fica responsável por montar 1 gif utilizando esses frames.
    O resultado é algo como isto:



    Existe 2 formas de utilizar o sistema, eu vou ensinar a mais fácil, para quem quiser vou deixar o link do código fonte e vocês podem simplesmente estar clonando o repositório e fazer suas alterações a vontade. (Sim, ele é open source e.e).

    Código Fonte: https://github.com/gesior/open-tibia-library 

    Explicando como utilizar o sistema:

    1° acesse o link => https://outfit-images.ots.me/generator/

    Você deve visualizar algo como isto: 



    Percebam que ele vai pedir os seguintes dados: 
    -Client Version:
    -Sprite file:
    -Dat file:
    -Otb file:

    Antes de sair adicionando, precisamos configurar nosso cliente para que o sistema consiga reconhecer ele. Abra seu cliente no object builder. Agora vá na área de effects e apague todos os efeitos. Sim apague TODOS, agora vá até Tools->Spriter Otimizer



    Clique em start e você vai ter 1 retorno parecido com isto:



    Agora aperta CTRL+SHIFT+S, vamos salvar esse cliente em 1 pasta separada (você só vai usar ele pra esse sistema, então fique tranquilo, você não vai apagar o original). Na hora de salvar deixe desmarcado as 3 opções (Extended, Transparency, Improved Animations).



    Tendo feito isso, agora vamos voltar para o site. 
    Em Client Version você vai digitar a versão de seu cliente. Exemplo: Se for 8.60 digite 860
    Em sprite file você vai selecionar o tibia.spr do seu cliente que você exportou (esse sem efeitos)
    Em dat file você vai selecionar o tibia.dat do seu cliente que você exportou (esse sem efeitos)
    Em otb file você vai selecionar o items.otb do seu servidor.

    Agora clique em Load Files. Você deve ter 1 retorno parecido com isto:



    Agora clique em Generate Imagens e ele vai começar a gerar os frames das suas outfits.



    Ao terminar ele vai efetuar sozinho o download das outfits.




    Agora acesse este repositório no github e baixe os arquivos: https://github.com/gesior/open-tibia-library/tree/master/tools/colored-outfit-images-generator

    Tendo feito o download, você vai extrair a pasta outfits.zip que você baixo e extrair a pasta que você clonou o repositório. Ao extrair o arquivo outfits.zip você vai encontrar 1 pasta chamada outfits_anim, dentro dela você deve ter algo como isto:



    Cada pasta é referente a 1 looktype do seu cliente.
    Agora copie a pasta 'outfits_anim' que está dentro da pasta outfits que você extraiu e cole dentro da pasta do repositório que foi clonado. Ficando assim:



    Pronto, agora você somente precisa deixar essa pasta em 1 servidor web e utilizar a mesma via requisição. Exemplo:
    Se você for exibir uma outfit, você pode exibir da seguinte forma:
    <img src="http://seudominio.com/nomedapastaqueestaoosarquivos/animoutfit.php/?id=270">  
    Esse id será o looktype que você deseja. Lembrando que: Você pode colocar 1 script pra puxar a outfit de cada vocação e chamar esse diretório, ele vai exibir a imagem já com o diretório correto.
    Sugestão de uso: Para derivados de NTO/DBO e afins, você pode utilizar para exibir as outfits de transformações de cada Personagens, algo como isto:



     
    Outra opção é exibir na lista de Ranking no menu da direita (Normalmente Tibia Classico faz isso)
    A criatividade fica por conta de vocês.
     
    Créditos:
    Gesior.pl por todo o código e disponibilizar para a comunidade em 1 Forum Gringo
    A mim por disponibilizar o tutorial para a comunidade.
  24. Obrigado
    FeehLoveCes recebeu reputação de DarkRed em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     
  25. Gostei
    FeehLoveCes recebeu reputação de Cat em [ACTION] Cassino - Roleta de items   
    Olhando alguns posts vi que pediram um Cassino que já existe em um servidor ou um semelhante, porem não encontrei ninguém postando nenhum, então resolvi criar ele já que não tinha nada melhor pra fazer...
     
    Testado: OTX mas acredito que funcione em TFS 0.3/0.4
    Como funciona: Ao puxar a alavanca será roletado uma serie de itens X vezes, ao terminar o item que parar no centro é a recompensa do player.
     
     
    Instalação: Crie uma sala parecida com esta pelo seu Map Editor
     
     
    Depois em data/actions/scripts crie um arquivo chamado cassinoroll.lua
     
    Agora em Actions.xml
     
    Créditos:
    Feeh - Por criar
    @Storm - Me ajudar em algumas duvidas
     
    Caso alguém conheça quem teve a ideia do evento eu coloco os créditos
     

Informação Importante

Confirmação de Termo