Ir para conteúdo

Leandro Vidal Martins

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Obrigado
    Leandro Vidal Martins deu reputação a Movie em [TFS 1.5 - 8.60] New TFS Downgrade   
    Depois 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.
  2. Obrigado
    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
  3. Curtir
    Leandro Vidal Martins deu reputação a Diego Rulez em Google Cloud Plataform   
    Introduçã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á.
  4. Obrigado
    Leandro Vidal Martins deu reputação a jNo em (Resolvido)Death Look Frags   
    Perfeito 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  
  5. Obrigado
    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
  6. Obrigado
    Leandro Vidal Martins deu reputação a Heyron em (Resolvido)Help na magia Utito tempo san   
    Vá 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
  7. Gostei
    Leandro Vidal Martins deu reputação a DukeeH em (Resolvido)Help na magia Utito tempo san   
    posta 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.
  8. Obrigado
    Vá 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.
  9. Obrigado
    Leandro Vidal Martins deu reputação a leozynho123 em [PEDIDO] OTX COM CAST SYSTEM   
    está 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"
  10. Haha
    Nã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.
  11. Curtir
    as 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
  12. Gostei
    Pelo 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.
     
     
     
  13. Curtir
    Leandro Vidal Martins deu reputação a luanluciano93 em [TFS 1.5 - 8.60] STYLLER OT - 2023   
    Atualizaçã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

Informação Importante

Confirmação de Termo