
Leandro Vidal Martins
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
Leandro Vidal Martins deu reputação a Movie em [TFS 1.5 - 8.60] New TFS DowngradeDepois de um bom tempo, resolvi postar novamente aqui.
Hoje vou disponibilizar uma datapack com TFS 1.5 para 8.60.
Ela está sendo atualizada semanalmente no Github do projeto.
Para acompanhar e utilizar clique aqui.
Para relatar erros ou sugestões, utilize o GitHub.
-
Leandro Vidal Martins deu reputação a Diego Rulez em Instalando Site e Compilando Source (Ubuntu 20.04)Nesse tutorial vou explicar como instalar tudo que é necessário para rodar qualquer site. Também ensino como compilar as sources OTX2 e TFS-1.3. Utilizarei a versão mais atual do Ubuntu, a versão 20.04.
Iniciando
Ao executar os comandos, algumas vezes será perguntado se você deseja continuar. Por padrão sempre aperte a tecla Y e em seguida a tecla ENTER do teclado, se houver algum ponto em que você precisara agir diferente eu irei indicar o que e onde fazer.
sudo apt update sudo apt upgrade sudo apt install zip sudo apt install nano
Instalando e Configurando NGINX
sudo apt install nginx sudo nano /etc/nginx/sites-available/default Nesse arquivo deve ser adicionado a chamada index.php e deve ser removido o sinal # em algumas linhas. Vou deixar em vermelho as modificações que deverão ser feitas no arquivo. Após terminar a edição aperte CTRL+X, aperte Y, aperte ENTER (tudo isso para salvar o arquivo).
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.php index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; # pass PHP scripts to FastCGI server # location ~ \.php$ { include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; } } E agora, vamos reiniciar o serviço para que entre em vigor todas as alterações.
sudo systemctl restart nginx.service Para testar se ocorreu tudo certo com a instalação, insira o IP do seu VPS no navegador. Se obtiver uma tela de Boas Vindas como na imagem abaixo. Só vá para o próximo passo se estiver tudo certo até aqui.
Instalando MariaDB
sudo apt install mariadb-server
Instalando PHP
sudo apt-get install php-fpm
Instalando phpMyAdmin
Ao executar esse comando, vai aparecer uma tela indicando para você selecionar o apache2 ou lighttpd, porém não selecione nenhuma opção, apenas aperte TAB e depois ENTER.
Na próxima tela terá duas opções YES ou NO, aperte a tecla TAB para marcar a opção NO e depois aperte ENTER para prosseguir.
sudo apt-get install phpmyadmin Após isso, execute o comando a seguir e em sequencia entre no site http://ipNumericoDoSeuServer/phpmyadmin
sudo ln -s /usr/share/phpmyadmin /var/www/html
Será nescessário criar um acesso, pois qualquer outra senha que você tenha definido anteriormente provavelmente não irá funcionar. Não esqueça de substituir as informações em evidencia pelas suas.
sudo mysql -u root CREATE USER 'DIGITE UM LOGIN'@'localhost' IDENTIFIED BY 'DIGITE UMA SENHA'; GRANT ALL PRIVILEGES ON *.* TO 'DIGITE NOVAMENTE SEU LOGIN'@'localhost'; FLUSH PRIVILEGES; Após isso, acesse: 0.0.0.0/phpmyadmin. Onde você vai trocar o 0.0.0.0 pelo IP do seu VPS.
Lembra da senha que você escolheu na instalação do MariaDB? É aqui que você vai usa-la. O usuário é root e a senha é que você escolheu. Depois clique em Banco de Dados e em seguida digite um nome para o banco de dados e clique em criar.
Agora clique em importar, selecione a database e clique em executar.
Transfira os arquivos do seu site para o diretório /var/www/html. Preste muita atenção nessa parte, pois os arquivos do site já devem estar dentro da pasta html, não pode ficar algo como /var/www/html/site. Após isso, abra o arquivo config.php do website que você deseja utilizar e coloque as informações sobre o banco de dados: nome, root, senha.
Compilando a Source TFS 1.3
Entre no repositório do forgottenserver clique aqui
Faça o download para seu PC e extraia o arquivo. Renomeie a pasta extraída para otserv e abra o famoso arquivo config.lua. Configure essa parte de acordo com seus dados, também adicione a última linha.
ip = "digita o ip do VPS" -- MySQL mysqlHost = "127.0.0.1" mysqlUser = "root" mysqlPass = "digite a senha que você escolheu na instalação do Maria DB" mysqlDatabase = "digite o nome da database que você escolheu quando criou a database" mysqlPort = 3306 mysqlSock = "" passwordType = "sha1" Salve o arquivo e depois zipe a paste com a compactação .zip e envie para o diretório /home em seu VPS. Após isso, só executar em sequencia os comandos a seguir que estará compilado.
apt-get install git cmake build-essential liblua5.2-dev libgmp3-dev libmariadb-dev-compat libboost-filesystem-dev libboost-system-dev libboost-iostreams-dev libpugixml-dev libcrypto++-dev cd /home unzip otserv.zip cd otserv mkdir build && cd build cmake .. make -j 2 mv tfs.. && cd .. Para abrir o fechar o servidor respectivamente, você vai usar:
./tfs killall -9 tfs
Compilando a Source OTX 2
Entre no repositório do OTX2 clique aqui
Faça o download para seu PC e extraia o arquivo. Renomeie a pasta extraída para otserv e abra o famoso arquivo config.lua. Configure essa parte de acordo com seus dados, também adicione a última linha.
ip = "digita o ip do VPS" -- MySQL mysqlHost = "127.0.0.1" mysqlUser = "root" mysqlPass = "digite a senha que você escolheu na instalação do Maria DB" mysqlDatabase = "digite o nome da database que você escolheu quando criou a database" mysqlPort = 3306 mysqlSock = "" encryptionType = "sha1" Salve o arquivo e depois zipe a paste com a compactação .zip e envie para o diretório /home em seu VPS. Após isso, só executar em sequencia os comandos a seguir que estará compilado.
apt-get install subversion autoconf build-essential pkg-config libboost-dev libgmp3-dev libxml2-dev liblua5.1-0-dev libmariadbclient-dev-compat ccache libboost-filesystem-dev libboost-regex-dev libboost-system-dev libboost-thread-dev screen libssl-dev libboost-iostreams-dev cd /home/ unzip otserv.zip cd otserv && cd sources sh ./autogen.sh && ./configure --enable-server-diag --enable-mysql --enable-root-permission && make -j mv theotxserver .. && cd .. Para abrir o fechar o servidor respectivamente, você vai usar:
./theotxserver killall -9 theotxserver -
Leandro Vidal Martins deu reputação a Diego Rulez em Google Cloud PlataformIntrodução
O que eu quero falar aqui não é a parte técnica de segurança, desempenho e outros pontos. Quero falar sobre o dia a dia de alguém que pretende ser um administrador e que acabou de começar um projeto. Mesmo que você seja leigo e tenha dificuldades com a "tela preta" do Linux onde você digita os comandos, ainda assim vale a pena optar pelo Linux logo de primeira pelos seguintes motivos:
Quando você for inaugurar seu servidor você vai querer que ele tenha uma boa estabilidade e não fique travando ou sendo derrubado e você vai conseguir isso apenas utilizando Linux, então pra que aprender a montar tudo no Windows se depois, de qualquer forma, você vai ter que aprender Linux? Todo conhecimento é válido, mas você estaria atrasando seu lado fazendo isso. Visual Studio, complementos, bibliotecas. Antes de compilar sua source para Windows você vai precisar fazer o download, instalar e preparar o seu ambiente de trabalho e isso vai te custar muito tempo visto que são programas pesados, que demoram para serem baixados e instalados e que precisam de configurações muito especificas para compilar sem erros. Se você pode fazer isso tudo em 5 minutos e sem erros no Linux, porque insistir no Windows?
Google Cloud Platform
Ativando os créditos
Criando o VPS
Liberando as Portas
Criando um acesso
Enviar arquivos para o VPS
A parte de compilação da source, instalar o site e abrir o server ficará para o próximo tópico, visto que, é possível aplicar em qualquer VPS e não somente do Google.
Se deseja instalar um site e fazer a compilação da source clique aqui
Se você tiver qualquer dúvida em relação a esse tutorial não fique acuado em perguntar, irei responder todas as dúvidas no tópico.
Não respondo PM, porém também estou no Discord do TibiaKing e posso ajuda-los por lá.
-
Leandro Vidal Martins deu reputação a jNo em (Resolvido)Death Look FragsPerfeito mestre Vod, desculpa ai, mas você podia acrescer mais uma informação no codigo acima? No caso, essa parte do meu codigo que mostra os critical e dogdge no look
function getPlayerFrags(cid) local time = os.time() local times = {today = (time - 86400), week = (time - (7 * 86400))} local contents, result = {day = {}, week = {}, month = {}}, db.getResult("SELECT `pd`.`date`, `pd`.`level`, `p`.`name` FROM `player_killers` pk LEFT JOIN `killers` k ON `pk`.`kill_id` = `k`.`id` LEFT JOIN `player_deaths` pd ON `k`.`death_id` = `pd`.`id` LEFT JOIN `players` p ON `pd`.`player_id` = `p`.`id` WHERE `pk`.`player_id` = " .. getPlayerGUID(cid) .. " AND `k`.`unjustified` = 1 AND `pd`.`date` >= " .. (time - (30 * 86400)) .. " ORDER BY `pd`.`date` DESC") if(result:getID() ~= -1) then repeat local content = {date = result:getDataInt("date")} if(content.date > times.today) then table.insert(contents.day, content) elseif(content.date > times.week) then table.insert(contents.week, content) else table.insert(contents.month, content) end until not result:next() result:free() end local size = { day = table.maxn(contents.day), week = table.maxn(contents.week), month = table.maxn(contents.month) } return size.day + size.week + size.month end function onLogin(cid) registerCreatureEvent(cid, "fraglook") return true end function onLook(cid, thing, position, lookDistance) if isPlayer(thing.uid) and thing.uid ~= cid then doPlayerSetSpecialDescription(thing.uid,' [Frags: '..getPlayerFrags(thing.uid)..'], [Critical: '..math.max(0,(tonumber(getCreatureStorage(thing.uid,48903)) or 0))..'], [Dodge: '..math.max(0,(tonumber(getCreatureStorage(thing.uid,48902)) or 0))..']') return true elseif thing.uid == cid then doPlayerSetSpecialDescription(cid,' [Frags: '..getPlayerFrags(cid)..'], [Critical: '..math.max(0,(tonumber(getCreatureStorage(cid,48903)) or 0))..'], [Dodge: '..math.max(0,(tonumber(getCreatureStorage(cid,48902)) or 0))..']') local string = 'You see yourself.' if getPlayerFlagValue(cid, PLAYERFLAG_SHOWGROUPINSTEADOFVOCATION) then string = string..' You are '.. getPlayerGroupName(cid) ..'.' elseif getPlayerVocation(cid) ~= 0 then string = string..' You are '.. getPlayerVocationName(cid) ..'.' else string = string..' You have no vocation.' end string = string..getPlayerSpecialDescription(cid)..'' if getPlayerNameByGUID(getPlayerPartner(cid), false, false) ~= nil then string = string..' You are '.. (getPlayerSex(cid) == 0 and 'wife' or 'husband') ..' of '.. getPlayerNameByGUID(getPlayerPartner(cid)) ..'.' end if getPlayerGuildId(cid) > 0 then string = string..' You are ' .. (getPlayerGuildRank(cid) == '' and 'a member' or getPlayerGuildRank(cid)) ..' of the '.. getPlayerGuildName(cid) string = getPlayerGuildNick(cid) ~= '' and string..' ('.. getPlayerGuildNick(cid) ..').' or string..'.' end if getPlayerFlagValue(cid, PLAYERCUSTOMFLAG_CANSEECREATUREDETAILS) then string = string..'\nHealth: ['.. getCreatureHealth(cid) ..' / '.. getCreatureMaxHealth(cid) ..'], Mana: ['.. getCreatureMana(cid) ..' / '.. getCreatureMaxMana(cid) ..'].' string = string..'\nIP: '.. doConvertIntegerToIp(getPlayerIp(cid)) ..'.' end if getPlayerFlagValue(cid, PLAYERCUSTOMFLAG_CANSEEPOSITION) then string = string..'\nPosition: [X:'.. position.x..'] [Y:'.. position.y..'] [Z:'.. position.z..'].' end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string) return false end return true end
-
Leandro Vidal Martins deu reputação a WooX em Zombie Event [DIFERENCIADO]Zombie Event
Zombie Event é um evento já muito conhecido em que os participantes são jogados em uma arena e zombies são invocados até que reste apenas um jogador, quando um jogador é tocado por um zombie ele é teleportado para o templo, o ultimo jogador a ficar na arena é definido como vencedor e o evento é finalizado ai. Já faz um bom tempo que tive a ideia de mudar o funcionamento deste tradicional evento e finalmente decidi por a mão na massa, irei explicar melhor o que foi alterado abaixo.
Sobre o sistema
O sistema foi testado apenas em OTX2, mas provavelmente também funcione em TFS 0.4
Pra quem quiser esse evento funcional para TFS 1.x, o @Movie se comprometeu a fazer a adaptação, então podem mandar mensagem privada pra ele cobrando que ele gosta.
Quem é familiar com filmes e séries de zombies sabe que quando um zombie morde alguém a pessoa que foi mordida não simplesmente morre, mas ela se torna um zombie, é isso que torna a ideia de um apocalipse zombie tão aterrorizante. Pensando nisso eu tive a ideia de alterar o sistema pra que quando algum player fosse pego por um zombie ele também se transformasse em um e não fosse simplesmente teleportado para o templo. Essa alteração deixa a interação entre os jogadores no evento mais dinâmica pois eventualmente se torna um jogo de Player vs Player ao invés de Player vs Maquina, embora no fim continue sendo uma batalha entre vivos e mortos.
Irei listar abaixo mais algumas características do evento.
É possivel configurar para que seja permitido ou não o uso de MCs. Todos os jogadores ao entrar na arena ficam com a mesma velocidade. Para tornar mais competitivo e divertido, não é permitido utilizar a função Follow dentro do evento. O jogador que foi transformado em zombie que mais contaminar outros jogadores também recebe uma recompensa. Os jogadores que forem transformados em zombies podem subir de rank conforme forem contaminando outros jogadores, alterando assim sua aparência e velocidade na arena.
Vídeozinho
Instalação
Este sistema utiliza de funções contidas na lib do link abaixo, então antes de mais nada é necessário adicionar esta lib no servidor.
Todos os arquivos necessários para instalação do evento estão anexados no tópico, irei apenas mostrar como deve ser configurado.
Toda configuração do sistema se encontra na lib do mesmo, segue abaixo explicação de como configurar.
startTime: configuração de horários para inicio do evento a depender do dia da semana (para cada horário diferente definido aqui um registro extra é necessário no globalevents.xml) announcement: mensagem a ser exibida quando o teleporte para o evento for aberto. startEvent: mensagem a ser exibida quando o teleporte para o evento for fechado e o evento iniciado. playerBitten: mensagem a ser exibida quando um jogador for mordido por um zombie. endEvent: mensagem a ser exibida quando o evento for finalizado. notEnoughPlayers: mensagem a ser exibida quando não houver players suficiente para o evento. zombiesRant: falas que serão randomicamente selecionadas para um jogador que foi transformado em zombie falar.
minOnlinePlayers: define a quantidade minima de jogadores online para o teleporte do evento ser aberto. minPlayers: define a quantidade minima de jogadores na arena para o evento ser iniciado. closeTeleportTime: tempo para fechar o teleporte após o anuncio (o valor deve ser definido em minutos). countDownTime: tempo para iniciar o evento após o fechamento do teleporte (o valor deve ser definido em segundos).
zombieRatio: define a quantidade inicial de zombies baseado na quantidade de jogadores participando do evento. playerSpeed: define a velocidade que o jogador terá durante o evento (valido apenas para jogadores que não foram transformados em zombies). delayToTransform: define o intervalo para um jogador que foi mordido se transformar em um zombie (o valor deve ser definido em segundos). allowMultiClient: pode ser definido como true ou false, se definido como falso não irá permitir a entrada de jogadores com o mesmo IP no evento.
rewards: define as recompensas a serem entregues tanto para o ultimo sobrevivente na arena como para o zombie que mais contaminar outros jogadores. zombiesRank: define os ranks dos zombies, a quantidade de pontos necessária para avançar de rank, aparência e velocidade (valido apenas para jogadores que foram transformados em zombies). area: define a área onde ocorrerá o evento, deve ser preenchido as coordenadas do ponto superior-esquerdo, ponto inferior-direito e o andar do local. teleportAid: define a actionID a ser adicionado no teleporte de entrada do evento (este valor deve ser o mesmo a ser registrado na tag XML do script de movements). teleportPos: define as coordenadas onde deve ser criado o teleporte de entrada para o evento.
Créditos
@LeandroRissa por testar todo o sistema.
event zombie.xml lib_zombie.lua zombieEvent.lua zombieEvent_creature.lua zombieEvent_movement.lua
-
Leandro Vidal Martins deu reputação a Heyron em (Resolvido)Help na magia Utito tempo sanVá em Data/Spells/Support/Sharpshooter.lua e apague o código que estiver lá, e adicione esse novo:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, 10000) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCEPERCENT, 150) setConditionParam(condition, CONDITION_PARAM_BUFF, true) setCombatCondition(combat, condition) function onCastSpell(cid, var) return doCombat(cid, combat, var) end -
Leandro Vidal Martins deu reputação a DukeeH em (Resolvido)Help na magia Utito tempo sanposta o script e a tag do spells.xml
mas no global o utito tempo san exhausta tanto as magias de support quanto as de cura, só deixando as de ataque, por isso.
-
Leandro Vidal Martins deu reputação a nookia em (Resolvido)Ajuda-Passa em um tiler so se tiver x StorageVá em data\movements\scripts e crie um arquivo chamado tilestorage.lua e cole dentro:
function onStepIn(cid, item, pos, fromPos) storage = STORAGE -- aqui a storage que deseja if getPlayerStorageValue(cid, storage) < 1 then doTeleportThing(cid, fromPos) doSendMagicEffect(fromPos, CONST_ME_POFF) doPlayerSendCancel(cid, 'MSG AQUI.') -- aqui a mensagem de erro se o player não tiver a storage end doSendMagicEffect(pos, CONST_ME_MAGIC_BLUE) return true end Vá em data\movements\movements.xml e adicione a tag:
<movevent event="StepIn" uniqueid="1900" script="tilestorage.lua" /> Agora só ir no map editor e adicionar o uniqueid no tile que quiser.
-
Leandro Vidal Martins deu reputação a leozynho123 em [PEDIDO] OTX COM CAST SYSTEMestá com o cast mesmo, precisa adicionar a tag "cast" no config.lua, criar as tabelas no banco de dados, criar uma conta com account name "10"
-
Leandro Vidal Martins deu reputação a Ackerzin em Classic-Yurots [8.60] - Push Cruzado + Cast com SetasNão me lembro agora, qual dos dois bugs que é, mas possui um deles no servidor ou talvez os dois, testei faz 1 mes, "NPC BANK", hi, deposit 999999999999999999999999999999999999, yes.
e você fica com dinheiro infinito, ou é o do sample, hi, transfer, qualquer Player Sample, e voce transfere para os samples, e quando cria um char novo, voce começa com o dinheiro no banco que depositou, todos chares novos.
-
Leandro Vidal Martins deu reputação a rodrygosos em Classic-Yurots [8.60] - Push Cruzado + Cast com Setasas portas de lvl, que so passa com x lvl não estão fechando, se um player passa elas continuam abertas
corrigi o erro
substitui o que ta dentro de movements/clossingdoors
-------------------------------------------------------------
function onStepOut(cid, item, position, lastPosition)
if(getTileInfo(position).creatures > 0) then
return true
end
local newPosition = {x = position.x + 1, y = position.y, z = position.z}
local query = doTileQueryAdd(cid, newPosition)
if(query == RETURNVALUE_NOTENOUGHROOM) then
newPosition.x = newPosition.x - 1
newPosition.y = newPosition.y + 1
query = doTileQueryAdd(cid, newPosition) -- repeat until found
end
if(query == RETURNVALUE_NOERROR and query == RETURNVALUE_NOTENOUGHROOM) then
doRelocate(position, newPosition)
end
position.stackpos = -1
local i, tileItem, tileCount = 1, {uid = 1}, getTileThingByPos(position)
while(tileItem.uid ~= 0 and i < tileCount) do
position.stackpos = i
tileItem = getTileThingByPos(position)
if(tileItem.uid ~= 0 and tileItem.uid ~= item.uid and isMovable(tileItem.uid)) then
doRemoveItem(tileItem.uid)
else
i = i + 1
end
end
local itemInfo = getItemInfo(item.itemid)
doTransformItem(item.uid, itemInfo.transformUseTo)
return true
end
function onStepOut(cid, item, position, lastPosition)
local itemInfo = getItemInfo(item.itemid)
doTransformItem(item.uid, itemInfo.transformUseTo)
return true
end
-
Leandro Vidal Martins deu reputação a railson em [Resolvido] Como mudar o idioma dos npcs nas sourcesPelo o que eu entendi você quer traduzir essa frase do NPC.
Já que na sources nao deu certo, você pode fazer algo bem simples, você só vai acrescentar uma coisa.
"message_sendtrade" e colocar a frase que deseja, nesse caso pega esse aqui e cola isso no arquivo do npc e testa.
-
Leandro Vidal Martins deu reputação a luanluciano93 em [TFS 1.5 - 8.60] STYLLER OT - 2023Atualização 28-12-2021
Atualização para TFS 1.5 Adicionado Deathcast channel Correção provisória de bug no bless. Retirado entrada de itens do shop por onThink Alterado para 15 dias o tempo do player inativo perder a house. Adicionado addon doll e stamina refill Adicionado script para melhor configuração do server (styllerConfig.lua) Adicionado raids. Adicionado trade offline complexo. Alterado todas as spells para free account. Reescrito o código de todos os talkactions. Adicionado guild broadcast. Adicionado war sytem por talkactions. Atualizado spells. Algumas alterações no mapa. Download disponível: v15