
FeehLoveCes
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
FeehLoveCes recebeu reputação de koyotestark em [ACTION] Cassino - Roleta de itemsOlhando 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
-
FeehLoveCes deu reputação a marcoshps11 em Configurando Docker no windows, adeus VMNeste 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.
-
FeehLoveCes recebeu reputação de yuriowns em [ACTION] Cassino - Roleta de itemsOlhando 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
-
FeehLoveCes recebeu reputação de jackless1 em [ACTION] Cassino - Roleta de itemsOlhando 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
-
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
-
FeehLoveCes recebeu reputação de Orientalz em [ACTION] Cassino - Roleta de itemsOlhando 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
-
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).
-
FeehLoveCes deu reputação a Endless em Proteção contra DoS utilizando Mod_evasive no ApacheOlá 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/
-
FeehLoveCes deu reputação a Yan Liima em Limite de players em guild websiteLimite 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
-
FeehLoveCes recebeu reputação de ernaix69 em [ACTION] Cassino - Roleta de itemsOlhando 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
-
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
-
FeehLoveCes recebeu reputação de Apache em [ACTION] Cassino - Roleta de itemsOlhando 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
-
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)
-
-
FeehLoveCes deu reputação a Endless em [MyAAC] Sistema de Exibir Monstros por LevelOlá 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
-
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
-
FeehLoveCes deu reputação a marcoshps11 em [OTClient Showoff] Mostre seu Projeto/Módulo/Interface do seu OTClientEsse é 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 )
-
FeehLoveCes deu reputação a esnio12 em [OTClient Showoff] Mostre seu Projeto/Módulo/Interface do seu OTClientModulo de Seleção de Level para Dungeon de um servidor de Dungeon ni Deai que estou elaborando.
-
FeehLoveCes deu reputação a Endless em [OTClient Showoff] Mostre seu Projeto/Módulo/Interface do seu OTClientTop Menu Bar desenvolvido juntamente com o @Tottin
-
FeehLoveCes deu reputação a esnio12 em [OTClient Showoff] Mostre seu Projeto/Módulo/Interface do seu OTClientLook de equipamentos e armas do otc custom que estou elaborando
-
FeehLoveCes deu reputação a EddyHavoc em [OTClient Showoff] Mostre seu Projeto/Módulo/Interface do seu OTClientAdiçã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.
-
FeehLoveCes deu reputação a Endless em [MyAAC] Plugin Auction SystemOlá 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
-
FeehLoveCes deu reputação a Kyle Bellini em Spell - Piertotum LocomotorE 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>
-
FeehLoveCes deu reputação a Endless em Gerador de Outfits Automática para o SiteOlá 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.
-
FeehLoveCes recebeu reputação de DarkRed em [ACTION] Cassino - Roleta de itemsOlhando 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
-
FeehLoveCes recebeu reputação de Cat em [ACTION] Cassino - Roleta de itemsOlhando 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