Ir para conteúdo

Tabela de Classificação


Conteúdo Mais Visto

Exibindo conteúdo com a maior reputação desde 22em todas áreas

  1. 6 pontos
    GryLLo

    Tutorial sobre Quests/Quest Log! #vemcomgryllo

    MINI TUTORIALZIN SOBRE QUESTS E QUEST LOG. Vamos chamar de QUEST a missão como um todo e de MISSÃO as missões que são advindas das QUESTS. Por exemplo, para concluir o acesso de Yalahar (QUEST) é necessário que o jogador conclua várias missões, sacou? Agora vamos entender como funcionam as quests. Primeiro procure por 'data/lib/miscellaneous/051-storages.lua' ; Talvez os nomes dos arquivos/pastas mudem de acordo com o servidor que foi baixado; Caso não encontre o arquivo acima, procure algum .LUA relacionado a STORAGE. Se mesmo assim não encontrar, poste abaixo nos comentários que tentarei ajudar assim que for possível, belezura? O que é Storage? Storage é um tabela que usamos para guardar certos tipos de informações do jogador enviando para o banco uma key numérica (serve como identificador ID) e seu value (valor), para entendermos seu funcionamento, supondo que você tenha uma noção básica sobre programação, precisamos de um objeto da classe Player que não seja nulo, digamos que temos este objeto e seu nome seja player e precisamos acessar sua quantidade de horas jogadas, supondo que o ID da quantidade de horas seja 10777, fazemos assim: player:getStorageValue(10777). PUFT! Assim teremos de retorno o valor de ID dentro do Storage, se ficar confuso, pode perguntar bro. O que são esses números no 051-storages.lua? Se pegarmos a quest InServiceofYalahar como exemplo (mete um CTRL+F aí), temos os identificadores de cada missão e também da quest em si (questline), vejamos: Questline é basicamente a inicialização da QUEST, para iniciar as missões, você primeiro precisa inicializar a quest (questline). Não adianta você criar um NPC com a função de inicializar a missão de id 12241 (Mission01) se o Questline ainda não foi iniciado!! Para que eu irei utilizar esse 051-storages.lua? Bom, aqui a ideia é padronizar e também facilitar, ao criar uma quest, primeiro crie suas etapas neste arquivo, vamos ver um exemplo: QuestDoGryllao = { Questline = 999, Mission01 = 1000, Mission02 = 1001, Mission03 = 1002 } Agora como dito acima, para verificarmos se o player tem ou está em alguma etapa da Mission02 da QuestDoGryllao, fazemos o seguinte: player:getStorageValue(Storage.QuestDoGryllao.Mission02) Ué? Mas de onde saiu esse Storage? Storage é apenas um aviso para o código de que você quer pegar um valor de dentro do 051-storages.lua, entrando em Storage temos QuestDoGryllao e dentro temos as missões, ficando assim (Storage.QuestDoGryllao.Mission01). A ideia de utilizar o 051-storages.lua é facilitar na hora de buscar um STORAGE específico. Você poderia fazer assim também: player:getStorageValue(1001) Assim fica mais simples, cê tem demência GryLLo? Não, calma lá, imagina se você tiver uma nova quest BOLADÍSSIMA com 18 missões, você vai querer decorar todos os identificadores criados? E no futuro como fica se esquecer? Colocar tudo no 051-storages.lua é uma forma de deixar as tuas PARADAS mais organizadas e simples de entender até para outros programadores! Agora vamos procurar por 'data/XML/quests.xml', utilizaremos ainda a quest In Service of Yalahar como base de explicação; <quest name="In Service of Yalahar" startstorageid="12240" startstoragevalue="5"> <mission name="Mission 01: Something Rotten" storageid="12241" startvalue="1" endvalue="6"> <missionstate id="1" description="Palimuth asked you to help with some sewer malfunctions. You will need a Crowbar, there are 4 places where you need to go marked with an X on your map." /> <missionstate id="2" description="You cleaned 1 pipe of 4 from the garbage." /> <missionstate id="3" description="You cleaned 2 pipes of 4 from the garbage." /> <missionstate id="4" description="You cleaned 3 pipes of 4 from the garbage." /> <missionstate id="5" description="You cleaned 4 pipes of 4 from the garbage. Go back to Palimuth and report your mission" /> <missionstate id="6" description="You cleaned all pipes from the garbage! Go back to Palimuth and ask for mission." /> </mission> </quest> Entramos em <quest vamos ver o que temos aqui dentro O que é o atributo NAME? É onde fica o nome da QUEST que será mostrado no Quest Log E o atributo STARTSTORAGEID? Esse é o identificador da sua quest (QUESTLINE), não irei entrar muito em detalhes, mas é a partir desse identificador que o OTZÃO BOLADO identifica que é a "Quest X" que deve ser ou foi iniciada; Tá, e esse STARTSTORAGEVALUE? Esse aqui diz qual valor é necessário para se iniciar a quest, como padrão é 1, mas nesse caso em especial está em 5. Aqui é uma das coisas que fazem a galera se perder ao tentar forçar o início de algumas quests diretamente pelo código ou por algum npc novo. Se você quer inicializar a Quest pelo código, inicialize o QUESTLINE com o valor de STARTSTORAGEVALUE, após isso, você pode ir inicializando as missões dela. Agora em <mission, bora ver! Atributo NAME, de novo? Calma jovem, esse é nome da MISSÃO, será mostrado no Quest Log E o STORAGEID? Assim como o startstorageid é um identificador, porém, de cada missão dentro da quest; STARTVALUE? Esse atributo é parecido com o startstoragevalue é o valor para se inicializar a MISSÃO ENDVALUE? Esse atributo diz em que momento a MISSÃO será finalizada, nesse exemplo nós temos 6 sub-missões dentro dessa missão para que ela seja concluída. Simbora pro <missionstate Atributo ID? Este atributo é apenas o identificador da missão, provavelmente ele quem ordena as missões dentro do QUEST LOG e faz mais umas paradas si pá. E finalmente, o último DESCRIPTION!? Aqui é a descrição da missão, normalmente diz o que o player tem que fazer para concluir essa etapa, veja abaixo: Beleza, agora que tu sabe as paradas, vamos utilizar a QuestDoGryllao como exemplo e criaremos algo simples, vamos lá: Em 051-storage.lua coloque: QuestDoGryllao = { Questline = 999, Mission01 = 1000, Mission02 = 1001, Mission03 = 1002 } DEPENDENDO DE ONDE VOCÊ COLE ISTO, NÃO ESQUEÇA DE VERIFICAR SE FALTARAM VÍRGULAS OU OUTRAS PARADAS Agora em quests.xml fazemos uma parada assim: <quest name="Quest do Gryllao" startstorageid="999" startstoragevalue="1"> <mission name="Mission 01: Empregadinho" storageid="1000" startvalue="1" endvalue="2"> <missionstate id="1" description="De um oi para o Gryllao" /> <missionstate id="2" description="Leve um cafezin pro Gryllo" /> </mission> <mission name="Mission 02: Ajude a enfrentar inimigos" storageid="1001" startvalue="1" endvalue="2"> <missionstate id="1" description="Ajude Gryllo a matar 40 rotworms" /> <missionstate id="2" description="Ajude Gryllots a matar 40 bugs" /> </mission> <mission name="Mission 03: A Procura" storageid="1002" startvalue="1" endvalue="3"> <missionstate id="1" description="Procure o cachorrinho do Gryllo" /> <missionstate id="2" description="Fale com Godofredo para pedir informacoes" /> <missionstate id="3" description="Devolva o dogao ao Gryllo" /> </mission> </quest> Vocês entenderam a ideia? Vocês já sabem como verificar o status de uma Quest: player:getStorageValue(<id_da_quest>) -- ou player:getStorageValue(Storage.<nome_da_quest_no_storage>.<missao>) Irei apenas passar mais uma funçãozinha, que é para inserir dados no Storage, serve para avançar o jogador em missões ou gravar outras informações, seria assim ó: player:setStorageValue(<id_da_quest>, <value>) -- id da quest é o startstorageid ou storageid da quest/missao que quer atualizar -- value é basicamente o progresso da quest/missao, na Mission01 do gryllo por exemplo, poderia por 1 ou 2 #EDIT 28/12/2018 Falei sobre o Storage ser uma referência as variáveis dentro de 051-storages.lua e esqueci de uma parada, na verdade, notei recentemente. Observe dentro de 051-storages.lua dentro de QUAL ARRAY você está colocando sua quest ou está a quest que você quer mexer, dentro dele há o Storage que foi explicado acima e o GlobalStorage (tem basicamente a mesma função só que com outros IDs) Acho que o básico sobre as Quests e também como mostrá-las no Quest Log já está aí. Por hoje é só pessoal, fiquem bem e sonhem com Batman! Uns abraços, GryLLo
  2. 2 pontos
    Majesty

    [Suporte] Editar script stamina potion

    local config = { storage = 12345, -- Storage vazia time = 120, -- Tempo em minutos de stamina a ser recuperada delay = 60, -- Tempo em minutos para usar novamente effect = 592, -- Efeito remove = true -- Remover ao usar maxstamina = 42 * 60 -- Stamina maxima } function onUse(cid, item, fromPosition, itemEx, toPosition) if (getPlayerStorageValue(cid, config.storage) >= os.time()) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_RED, "You need to wait " .. ((getPlayerStorageValue(cid, config.storage) - os.time()) / 60)..", minutes to refill your stamina again.") end if (getPlayerStamina(cid) >= config.maxstamina) then return doPlayerSendCancel(cid, "Your stamina is already full.") end doPlayerAddStamina(cid, config.time) doSendMagicEffect(getThingPos(cid), config.effect) setPlayerStorageValue(cid, config.storage, os.time() + config.delay * 60) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Your stamina has been refilled in " .. config.time .. " minutes, please relog to activate.") if (config.remove) then doRemoveItem(item.uid, 1) end return true end
  3. 2 pontos
    Olá pessoal hoje venho trazer para o Fórum um passo a passo de como montar um servidor completo na VPN da Google Cloud. 1- Criação de Maquina Virtual (Instância) 2 - Configuração de Rede e Domínio (Endereço de IP Externo, DNS e Firewall) Acesse o serviço de REDE VPC e vá até o item Endereços IP Externos. Passo 2.1 - Localize a instancia que esta com o Tipo de Endereço como Temporário. Passo 2.2 - Siga o Passo a Passo Para Liberação de Portas no Item Firewall 3 - Apontamento de Domínio e Configuração de DNS 4 - Configuração Interna do Servidor Volte para sua instância (Compute Engine -> Instâncias de VMs) 4.2 - Liberando acesso SSHD 4.3 Instalação de pacote Web ( MySQL-SERVER, Apache, PHP, PHPMyadmin) 4.4 Configurando o PHPMyadmin 4.5 Compilando uma distro em Debian9 4.6 Instalando um Website 5 - Instalação de protocolo HTTPS / Certificado Digital SSL Para ligar o servidor utilize o comando: Funciona em versões 11+ e 10- Se te ajudei deixa um comentário e um +REP
  4. 2 pontos
    Majesty

    [TFS 0.4 - 8.6] Autoloot Não Cumpre o Prometido

    1 - if vip.hasVip (cid) then if getPlayerStorageValue(cid, 04420011) < 2 then No código acima, altere o 2 para um valor maior. 0, 1 - free account 0, 1, 2 - premium account obs: são números de storages utilizados. Para liberar mais 2 slots aos jogadores premium account, aumente o valor para 3. O código está estruturado para ter no máximo 4 slots, então se precisar liberar mais slots terá que modificar o sistema. 2 - data/creaturescripts/scripts/autoloot.lua: function onLogin(cid) if not vip.hasVip(cid) then local active_slots = getPlayerStorageValue(cid, 04420011) if active_slots >= 1 then for i = 1, active_slots do doPlayerSetStorageValue(cid, (04420031 + (i * 10)), -1) doPlayerSetStorageValue(cid, 04420011, active_slots - 1) end end end return true end Créditos: Dwarfer. data/creaturescripts/creaturescripts.xml: <event type="login" name="AutoLoot" script="autoloot.lua" />
  5. 2 pontos
    Majesty

    Feliz 2019 + Retrospectiva OTBR 2018!

    Fala, Tibianos! Nós do OTServ Brasil desejamos a todos um feliz e próspero ano novo e que com ele venha ótimos momentos, recordações, diversão e muito OTServ! Gostaríamos de aproveitar e convidá-los para conferir nossa retrospectiva de 2018, afinal, nada melhor do que terminar o ano com um pouco de nostalgia, não é mesmo? Relembre conosco todos os conteúdos em destaque que passaram pela Cidade OTBR! → OTServ Notícias e Discussões (7 tópicos); Destaques: Porta de level 999? o que você faria? OTU - OpenTibiaUnity - Novo ClienteTibia baseado na engine Unity3D Suporte - Dúvidas, Bugs, Erros (148 tópicos respondidos); Downloads: OTServs Normais (10 tópicos); Destaques: [8.60] Yurots 1.2 [10.99] Global v30 - OTX [10x/12x] OTX Global - Full Global Project [10.x Old/ 11.49] Ombra Global Pack - Base OTX [10.x/12.x] GlobalFull Tibia 12 (11.44.5516) / Tibia 10 - New Asuras, Falcons, Warzones 4,5,6 OTServs Derivados (10 tópicos); Destaques: The Ruby Project - Base Pokémon Pokémon Mythology [8.54] PokéCamp.net [8.54] Pokémon Gabrieltxu 3.2 [Versão Final] PokeChampions Utilitários (19 tópicos); Destaques: Remere's Map Editor 3.5 [OTX Global - Full Global Project] Cliente Tibia 10 / Cliente Tibia 11 Discord Bot para Servidores Open Tibia Visual Studio Code TFS 1.x Snippets OTMapGen Mapas (11 tópicos); Destaques: Ethno, Gengia, Ghala, Ghenov, Oken, Pyre, Vikia, Atlantyda Feyrist [11.49] Hovera Custom Map [8.70] Elysium World Map Warzone 4, 5, 6 / New Asuras / Falcons Scripts: Sistemas (1 tópico); Funções e Bibliotecas (3 tópicos); Destaque: [TFS 1.2] Modal Window Helper Lib Actions (2 tópicos); Destaque: [TFS 1.2] Prision Boss Script Talkactions e Movements (2 tópicos); Creature Scripts e Global Events (2 tópicos); Destaque: [TFS 1.2] Death Cast NPCs (2 tópicos); Destaque: [TFS 1.x] NPC Cassino / Dicer Websites e Aplicações: Websites (7 tópicos); Destaques: GesiorAAC - Premium Pack 2018 Premium GesiorAAC - The Real Ferobra Gesior 2012 para OldServer 7.x Layouts (4 tópicos); Destaques: [MyAAC] Thora Layout [GesiorAAC] Thora Layout Aplicativos (1 tópico); Destaque: [GesiorAAC] Store para Tibia 11 Sprites (2 tópicos); Destaques: Sprites - Tibia 11.94.7595 Sprites - Tibia 12.00.7695 OTClient: Códigos C++ (1 tópico); MODs (1 tópico); Destaque: [MOD] Monster Maker Tutoriais: Infraestrutura (4 tópicos); Destaques: [10.x Old /11.x] Object Builder 0.3.3 + Item Editor 0.4 Cliente Tibia 11 - Edição de Recursos Gráficos Mapping (5 tópicos); Destaques: Remere's Map Editor 3.4 - Abrindo Mapa 11.x Como abrir e/ou criar mapas com o The Ruby RME (32-bit/64-bit) Manual do RME 01 - Introdução e configurações iniciais Scripting (3 tópicos); Destaque: Tutorial sobre Quests/Quest Log! Spriting (2 tópicos); Destaque: Como adicionar uma Mask (OBD) Programação (8 tópicos); Destaques: [Windows][VC2017] Compilando Sources OTXServer Global Full [Windows][VC2017] Compilando Sources TFS 1.3 + TFS SDK 3.2 [Windows][VC2017] Compilando Sources do The Ruby Server [Windows][VC2017] Compilando Sources RME (32-bit/64-bit) [Windows][Dev-C++] Compilando Sources TFS 0.4 (8.6) Websites (2 tópicos); Destaques: [Windows][MySQL] Ruby Website + WampServer [Cliente Tibia 11] [GesiorAAC] Solução para o problema "illegal value" OTClient (4 tópicos); Destaque: [Windows][VC2017] Compilando Sources do The Ruby Client Divulgação de Servidores (29 tópicos); Projetos e Formações de Equipes (14 tópicos); Encerramos mais um ano após uma longa jornada pelas Terras Tibianas e nos vemos ano que vem com mais novidades, conteúdo de qualidade e fazendo o melhor possível pelos cidadãos e viajantes que passam por nossa comunidade. Aproveitem a oportunidade para dar aquele feedback básico e contar suas expectativas para o próximo ano. 2004-2019
  6. 2 pontos
    Majesty

    Monster Maker

    Monster Maker Download do Monster Maker, aplicativo para criação de monstros para servidores OpenTibia. Fica a escolha do usuário adicionar imagens (addons, itens, efeitos). Obs: as imagens precisam estar em formato .gif. 1 - Como utilizar: 2 - Downloads: Monster Maker: Monster Maker.zip Monster Maker - Sources: Monster Maker - source.zip Scan: Monster Maker: [Conteúdo Oculto] Monster Maker - Sources: [Conteúdo Oculto] 3 - Créditos: jestem pro (OTLand)
  7. 2 pontos
    Ruquan

    [login.lua] Adicionar quests ao player

    @Majesty, pode encerrar o tópico. @GryLLo, obrigado! Na primeira linha não funcionou, porém consegui adicionando abaixo da linha 97; Solução encontrada (OTX Malucoo, TFS 1.3): Em login.lua Procure por: player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr) Adicionar abaixo: --Quests Liberadas; --In Service of Yalahar player:setStorageValue(Storage.InServiceofYalahar.Questline, 5) --> START player:setStorageValue(Storage.InServiceofYalahar.Mission01, 6) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission02, 8) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission03, 6) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission04, 6) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission05, 8) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission06, 5) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission07, 5) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission08, 4) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission09, 2) --> END MISSION player:setStorageValue(Storage.InServiceofYalahar.Mission10, 1) --> OPEN MISSION Conforme o Gryllo explicou: player:setStorageValue() --> Função para adicionar informação ao player; Storage --> Representa o arquivo "051-storages.lua" que esta localizado na pasta /lib/ InServiceofYalahar --> Nome da quest em "051-storages.lua" Questline --> Neste exemplo é o nome de start da quest em "051-storages.lua" 5 --> Representa o START ou a ETAPA da quest no arquivo "Quests.XML"
  8. 2 pontos
    Majesty

    [10.x/12.x] GlobalFull Tibia 12 (11.44.5516) / Tibia 10 - New Asuras, Falcons, Warzones 4,5,6

    [10.x/12.x] GlobalFull Tibia 12 (11.44.5516) / Tibia 10 - New Asuras, Falcons, Warzones 4,5,6 Download de servidor GlobalFull na versão 10.x/12.x. 1- Características: 2 - Imagem: 3 - Downloads: Servidor: [Conteúdo Oculto] Database: [Conteúdo Oculto] Cliente Tibia 10: [Conteúdo Oculto] Cliente Tibia 11.44.5516: [Conteúdo Oculto] RME Tibia 12: [Conteúdo Oculto] 4 - Créditos:
  9. 1 ponto
    Majesty

    Erro no index.php Gesior 2012 Natanael

    No seu index.php não existe a opção para incluir subtópicos e páginas. Adicione o seguinte código: //load subtopic page if(empty($_REQUEST['subtopic'])) { $_REQUEST['subtopic'] = "latestnews"; $subtopic = "latestnews"; } switch($_REQUEST['subtopic']) { case "latestnews": $topic = "Latest News"; $subtopic = "latestnews"; include("latestnews.php"); break; case "exemplo"; $topic = "Exemplo"; $subtopic = "exemplo"; include("exemplo.php"); break; } Quando quiser adicionar novos, basta apenas seguir o exemplo.
  10. 1 ponto
    GryLLo

    [Suporte] Editar script stamina potion

    "You need to wait " .. (getPlayerStorageValue(cid, config.storage) - os.time()) ..", minutes to refill your stamina again." Se liga aqui ó: (getPlayerStorageValue(cid, config.storage) - os.time()) -- segundos ((getPlayerStorageValue(cid, config.storage) - os.time()) / 60) -- minutos (((getPlayerStorageValue(cid, config.storage) - os.time()) / 60) / 60) -- horas Uns hugs
  11. 1 ponto
    GryLLo

    Ajuda com script de forja

    Opa @egyptPOWER belê? Vamos fazer um bate e volta, porque eu também não tenho certeza sobre isso. Considerando que o pos é da classe Item, tenta adicionar antes do if pos.itemid.. alguns print, assim: print(pos.itemid) print(pos:getId()) print(pos:getCount()) Fico no aguardo do resultado, é nósssssss!
  12. 1 ponto
    Majesty

    [10.x/11.x] Telara-ATS

    [10.x/11.x] Telara-ATS Download de servidor custom na versão 10.x/11.x - Base OTX. Testado em Ubuntu 14.04. 1 - Características: 2 - Imagens: 3 - Downloads: Servidor: [Conteúdo Oculto] Cliente: [Conteúdo Oculto] Database: [Conteúdo Oculto] Website: Scan: [Conteúdo Oculto] 4 - Créditos: Adolfo H.N.B Coltera Lordzetros Nolis Yinz
  13. 1 ponto
    GryLLo

    Imbuement System

    Bom, acredito que o problema esteja no .cpp então, weapons.cpp, pra ser mais específico. Nos seu servidor parece que não chega o valor pra elementDamage, lembro de ter mexido nisso há um tempo atrás. Vá até o weapons.cpp e procure por eventPlayerOnUseWeapon, e se não encontrar, bicho, vai ter que vasculhar até achar onde o OnUseWeapon está sendo chamado no .cpp e onde o .cpp tá chamando o OnUseWeapon do .lua, prosseguindo, se encontrar, faça essa alteração: Isso aqui: damage.primary.type = params.combatType; damage.primary.value = (getWeaponDamage(player, target, item) * damageModifier) / 100; damage.secondary.type = getElementType(); int32_t tmpDamage = 0; if (damage.origin == ORIGIN_MELEE) { g_events->eventPlayerOnUseWeapon(player, damage.primary.value, damage.secondary.type, tmpDamage); } damage.secondary.value = getElementDamage(player, target, item, tmpDamage, damage.secondary.type); Combat::doCombatHealth(player, target, damage, params); Vira isso aqui: damage.primary.type = params.combatType; damage.primary.value = (getWeaponDamage(player, target, item) * damageModifier) / 100; damage.secondary.type = getElementType(); damage.secondary.value = getElementDamage(player, target, item, 0, damage.secondary.type); if (damage.origin == ORIGIN_MELEE) { g_events->eventPlayerOnUseWeapon(player, damage.primary.value, damage.secondary.type, damage.secondary.value); } Combat::doCombatHealth(player, target, damage, params); Eu não testei a alteração aí acima, se ele estiver batendo pouco no dano elemental ou estiver saindo algo errado ou estranho, faça testes no valor de: damage.secondary.value e verifique também o funcionamento da função getElementDamage e vai vasculhando aí. Uns abraços!
  14. 1 ponto
    GryLLo

    Imbuement System

    Coé @shocks belê? O parâmetro onde vem o dano elemental nessas funções aí é o elementDamage. Se o problema for só esse aí, é só fazer assim: if (typeEnchant == "hitpointsleech") then local normalHealHP = normalDamage*(enchantPercent/100) local elementHealHP = elementDamage*(enchantPercent/100) local healHP = normalHealHP + elementHealHP self:addHealth(math.abs(healHP)) elseif (typeEnchant == "manapointsleech") then local normalHealMP = normalDamage*(enchantPercent/100) local elementHealMP = elementDamage*(enchantPercent/100) local healMP = normalHealMP + elementHealMP self:addMana(math.abs(healMP)) end É nósssssssssssssss!
  15. 1 ponto
    Marco Oliveira

    [Linux] Compilar OTX - TFS

    PS: utilizei o repositorio do tfs como exemplo no tutorial, porém o mesmo vale pro OTX e outros projetos. Arch Linux: 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. $ sudo pacman -Syu $ sudo pacman -S base-devel git cmake lua gmp boost boost-libs libmariadbclient pugixml 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make CentOS: 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. sudo yum install git cmake gcc-c++ boost-devel gmp-devel mariadb-devel lua-devel pugixml-devel 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make Debian GNU Linux: O Forgotten Server requer pelo menos o gcc 4.8, que está disponível no Debian 8 (jessie). 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. # apt-get install git cmake build-essential liblua5.2-dev libgmp3-dev libmysqlclient-dev libboost-system-dev libboost-iostreams-dev libpugixml-dev libcrypto++-dev Substitua libmysqlclient-dev por libmariadbclient-dev no Debian 9 e posterior. 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make Fedora: 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. $ sudo dnf install git cmake gcc-c++ boost-devel gmp-devel community-mysql-devel lua-devel pugixml-devel 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make FreeBSD: 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. # pkg install git cmake luajit boost-libs gmp mysql-connector-c pugixml 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make Gentoo: 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. # pkg install git cmake luajit boost-libs gmp mysql-connector-c pugixml 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make Ubuntu: 1. Instale o software necessário: O comando a seguir instalará o Git, o cmake, um compilador e as bibliotecas usadas pelo The Forgotten Server. O Git será usado para baixar o código-fonte, e o cmake será usado para gerar os arquivos de compilação. $ sudo apt-get install git cmake build-essential liblua5.2-dev libgmp3-dev libmysqlclient-dev libboost-system-dev libboost-iostreams-dev libpugixml-dev libcrypto++-dev 2. Download do servidor: $ git clone --recursive [Conteúdo Oculto] 3. Gerando os arquivos de build: $ cd forgottenserver $ mkdir build $ cd build $ cmake .. 4. Compilando: $ make
  16. 1 ponto
    Majesty

    Mudar a quantidade de exp que precisa para passar de lvl.

    A fórmula original para calcular experiência para o próximo nível é essa: [(50 * level³) - (150 * level²) + (400 * level)] / 3 Do Level 1 ao 2 ser 20 de experiência: [(50 *1³) - (150 * 1²) + (400 * 1)] / 15 = 20 Então a fórmula vai ficar assim: player.h: ((50ULL * lv * lv * lv) - (150ULL * lv * lv) + (400ULL * lv)) / 15ULL;
  17. 1 ponto
    GryLLo

    Sistema de Exercise Training

    valor está dando nulo porque a variável voc não existe ali fora. Altere: required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain currently = player:getManaSpent() player:addManaSpent(required - currently) Para: local up_skill = exercise_mana_use * configManager.getNumber(configKeys.RATE_MAGIC) player:addManaSpent(up_skill) exercise_mana_use você pode inserir um valor equivalente a quanto de mana cada HIT da exercise wand/rod valerá. Se você colocar 1000, cada HIT da exercise será o mesmo que usar 1000 de mana (isso em RATE 1X) E depois altere: required = voc:getRequiredSkillTries(skills[itemid].id, player:getSkillLevel(skills[itemid].id)+1)/skill_gain currently = player:getSkillTries(skills[itemid].id) player:addSkillTries(skills[itemid].id, (required - currently)) Para: local skillId = skills[itemid].id local up_skill = exercise_hit * configManager.getNumber(configKeys.RATE_SKILL) player:addSkillTries(skillId, up_skill) exercise_hit você pode inserir um valor equivalente a quantos HITS cada HIT da exercise sword/axe/club/dist valerá. Se você colocar 10, cada HIT da exercise será o mesmo que dar 10 HITS em monstros (isso em RATE 1X) É nóssssssssssss e TO VAZANDO AGORA, BEJUS
  18. 1 ponto
    bolotabunito

    Sistema de Exercise Training

    Em: required = voc:getRequiredManaSpent(player:getBaseMagicLevel() + 1)/skill_gain currently = player:getManaSpent() player:addManaSpent(required - currently) Fica: player:addManaSpent(610) não lí o código inteiro, se for haver algum problema, será na quantidade de charges que eu não sei onde fica, deve ficar no item mas se o código se comportar da maneira que eu espero que se comporte (executa a cada hit da wand), isso aí já basta
  19. 1 ponto
    Majesty

    Pedestal Online não estar sincronizado Gesior

    1 - layouts/tibiacom/layout.php: Verifique o seu código, substitua pelo código acima. O nome do monstro no pedestal é só alterar também no lugar de "/images/hellhound.gif".
  20. 1 ponto
    GryLLo

    Sistema de Exercise Training

    Hello @shocks tudo bom brother? Então, ta logo no início do código onde você precisa fazer modificação, nessa linha: local skill_gain = 1 -- per hit Ali está escrito pra dar 1 skill por hit, se você quiser que seja um treinamento aprimorado, terá de fazer cálculos. Primeiro crie um boost pro próprio exercise, vamos chamá-lo de exercise_boost, e vamos fazer com que ele seja equivalente a 30 hits, ou seja, cada hit da exercise equivalerá a 30 hits. Agora vamos supor que cada SWORD FIGHTING acrescente 50% a mais de hits que você precisa dar pra subir a skill, ou seja, se SWORD 30 pro 31 precisar de 10 hits, pro 32 vai precisar de 10 + 5 (50% de 10) = 15, seguindo esse raciocínio você pode começar a calcular: Pega a skill do jogador (80 sword) e calcula a quantidade de hits que você precisa pro 81; Acrescenta o boost que você quiser no exercise training (exercise_boost); Coloca tudo na variável skill_gain; Ficando mais ou menos assim: -- pega a quantidade de hits, finge que é 30000 divide por 30 ficando 1000, sendo necessário 1000 hits para subir a skill. local to_up_skill = quantidade_hits / exercise_boost; Aplica uma regra de 3 simplona! (1000 = 100; 1 = x) 1000x = 100.1 x = 100/1000 x = 0.1 Aqui você descobre quantos % cada hit vai dar, pra não ter que alterar a lógica do seu código que 1 equivale a 100, pegamos o x e dividimos por 100. 0.1 / 100 = 0.001 Agora sim, temos o valor de skill_gain, que é 0.001, ou seja, 0.001% por hit, até alcançar os 1000 hits necessários pro up. Power of matemática mai friendi. EDIT1: Você pode usar a mesma ideia pro MAGIC, porém nesse o calculo é utilizado a quantidade de mana gasta. É nóissssssssssssss.
  21. 1 ponto
    Nazo

    O que é e como indentar código

    Buenas! Bom, falarei sobre indentação, o que é, por que e para que é utilizado. A palavra indentação, é um anglicismo (palavra derivada do inglês "indentation", mas que não existe no nosso vocabulário real, como "linkar", "scannear", "printar", etc) e se refere a hierarquia de código de programação. Já viram aqueles códigos com espaços originados da tecla "tab" do teclado? Então, são estes mesmos, servem para deixar o código com estrutura, elegância, fácil entendimento e em algumas linguagens de programação como Python, é obrigatório para seu funcionamento. Exemplo de indentação de código em C: if (unlikely(prev->policy == SCHED_RR)) if (!prev->counter) { prev->counter = NICE_TO_TICKS(prev->nice); move_last_runqueue(prev); } switch (prev->state) { case TASK_INTERRUPTIBLE: if (signal_pending(prev)) { prev->state = TASK_RUNNING; break; } default: del_from_runqueue(prev); } prev->need_resched = 0; Como seria sem indentação: if (unlikely(prev->policy == SCHED_RR)) if (!prev->counter){ prev->counter = NICE_TO_TICKS(prev->nice); move_last_runqueue(prev); } switch (prev->state){ case TASK_INTERRUPTIBLE: if (signal_pending(prev)){ prev->state = TASK_RUNNING; break; } default: del_from_runqueue(prev); } prev->need_resched = 0; Basicamente, você adiciona um "tab" em cada bloco de comando e a cada nova função, ou em outras palavras, sempre que você abre um "then" e fecha com um "end", ou um "do" e fecha com um "end", e etc. Como é facilmente notável, a indentação permite que você identifique onde começa e determina cada ponto, de onde cada bloco de comando pertence, ou seja, define a hierarquia. Geralmente alguns editores de textos possuem a função de indentação automática, de acordo com o código que você marcar que está programando (como o notepad++ com um plugin em específico), porém também existem programas que fazem tal função com código pronto, como o Lua Auto Indent, porém é recomendado utilizar apenas quando você já pega códigos prontos que não estão indentados, afinal, se você o utilizar sem saber indentar, continuará sem conhecimento sobre. Em Lua, você pode se deparar com este tipo de coisa: (ignorando por sinal o fato desse código do print ser uma completa gambiarra) Como diariamente vejo que muitos scripters do Open Tibia não tem conhecimento da indentação, espero que isso lhes contribuam com algo, e que percebam a diferença de mexer em um código indentado, e um bagunçado "não-indentando".
  22. 1 ponto
    Nazo

    Town Portal System (based Dota 2)

    Um mano gringo aí pediu algo do tipo, e eu precisava me familiarizar melhor com a orientação a objetos usada em Lua do TFS 1.3, então fiz esse action, onde o player que possui um scroll pode fazer um portal para seu templo, que é usado dando USE mesmo, e sua party inteira pode ir junto para seus respectivos templos se não estiverem pz locked ou com battle, e caso o player não esteja em uma party, apenas o mesmo pode entrar no portal. Tags XML: <action actionid="43443" script="townportalsystem.lua"/> <action itemid="SCROLLID HERE" script="townportalsystem.lua"/> Arquivo townportalsystem.lua em data/actions/scripts/: -- Town Portal Scroll System based in Dota 2 -- by Nazo local config = { portalId = 1231, -- change to portal item id portalTime = 30, -- portal duration in seconds scrollId = 1232, -- change to scroll item id effect = CONST_ME_POFF -- effect id or CONST that appears at the end of time } local function removePortal(portal) if(portal) portal:remove() portal:getPosition():sendMagicEffect(config.effect) else print("A bug has deleted the portal") end end function onUse(player, item, fromPosition, target, toPosition, isHotkey) if(item:getId()==config.scrollId) then portal = Game.createItem(config.portalId, 1, player:getPosition()) if(player:getParty()) then portal:setCustomAttribute("party", player:getParty()) else portal:setCustomAttribute("owner", player:getName()) end portal:setAction(43443) addEvent(removePortal, config.portalTime * 1000, portal) item:remove() else if(not player:isPzLocked() and not player:getCondition(CONDITION_INFIGHT, CONDITIONID_DEFAULT)) then if(item:getCustomAttribute("party")) then if(player:getParty()==item:getCustomAttribute("party")) then player:teleportTo(player:getTown():getTemplePosition(), true) else player:popupFYI("You do not participate in the portal creator's party.") end elseif(item:getCustomAttribute("name") and player:getName() == item:getCustomAttribute("name")) then player:teleportTo(player:getTown():getTemplePosition(), true) else player:popupFYI("You isn't the owner.") end else player:popupFYI("You are PZ locked or in battle.") end end return true end Obs: fiz e testei apenas no TFS 1.3. Obs²: se desejar trocar a action, lembre-se de mudar no código também, procurando por "setAction".
  23. 1 ponto
    Rookie

    Erro ao compilar

    Consegui resolver, fui olhando uma outra source que possuía o sistema e verificando o que tinha de errado na minha source! Source utilizada: [Conteúdo Oculto]
  24. 1 ponto
    Rookie

    [TFS 0.3.6] Adicionando novas RAÇAS

    Olá pessoal, estive reparando que varias pessoas estão a procura de como criar uma nova raça no Tibia além das normais (fire, venom e undead), então estarei postando o método de como criar uma nova raça. 1 - No arquivo const.h procure por: enum TextColor_t { 1.2 - E coloque isso abaixo: TEXTCOLOR_NOVARACE = 5, 2 - Agora no arquivo enums.h procure por: enum RaceType_t{ RACE_NONE = 0, RACE_VENOM, RACE_BLOOD, RACE_UNDEAD, RACE_FIRE, RACE_ENERGY, 2.1 - E coloque isso abaixo de RACE_ENERGY: RACE_NOVARACE = 6, 3 - Em monsters.cpp agora procure por isso: if(readXMLString(root, "race", strValue)){ std::string tmpStrValue = asLowerCaseString(strValue); if(tmpStrValue == "venom" || atoi(strValue.c_str()) == 1) mType->race = RACE_VENOM; else if(tmpStrValue == "blood" || atoi(strValue.c_str()) == 2) mType->race = RACE_BLOOD; else if(tmpStrValue == "undead" || atoi(strValue.c_str()) == 3) mType->race = RACE_UNDEAD; else if(tmpStrValue == "fire" || atoi(strValue.c_str()) == 4) mType->race = RACE_FIRE; else if(tmpStrValue == "energy" || atoi(strValue.c_str()) == 5) mType->race = RACE_ENERGY; 3.1 - Agora coloque isso abaixo de mType->race = RACE_ENERGY; else if(tmpStrValue == "NOVARACE" || atoi(strValue.c_str()) == 6) mType->race = RACE_NOVARACE; 4 - Agora em game.cpp procure por: case RACE_BLOOD:textColor = TEXTCOLOR_RED; magicEffect = MAGIC_EFFECT_DRAW_BLOOD; splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD); break; 4.1 - Agora coloque isso abaixo:  case RACE_NOVARACE:textColor = TEXTCOLOR_NOVARACE; magicEffect = MAGIC_EFFECT_DRAW_BLOOD; splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD); break; Pronto de "rebuild all" e compile sua "source" que você terá uma nova raça em seu servidor.
  25. 1 ponto
    Majesty

    Erro ao instalar qualquer tipo de GesiorAAC

    $config['site']['serverPath'] = "/"; Configure somente o diretório do servidor. Exemplo: $config['site']['serverPath'] = "C:\OTServ/";
  26. 1 ponto
    bob loko

    Configuração de portas Google Cloud

    Vamos lá o Google Cloud é bem mais fácil de liberar portas do que parece! Siga o passo a passo abaixo: 1 - Acessa no seu painel o menu Regras de Fire Wall 2 - Dentro o painel clique em Criar nova Regra de Firewall 3 - Siga o seguinte passo a passo: Ps: Crie duas regras idênticas uma de saída e outra de entrada 4 - Vá até suas instâncias, clique sobre ela e Clique em Editar 5 - Localize o item Tags de Rede e insira as regras de Firewall criadas 6 - Salve as alterações Portas de acesso configuradas! Te ajudei da um +Rep! Estou a disposição!
  27. 1 ponto
    potinho

    Munição infinita - ExtremeOT 7.6

    Uma pena, gostei muito do servidor e trabalhei alguns dias pra ajustá-lo, não gostaria de perder o que foi feito...mas muito obrigado pelo apoio.
  28. 1 ponto
    Majesty

    Erro ao compilar

    Já tentou compilar com este tutorial? Já consegui compilar sources TFS 0.3.6 e 0.4. As sources 0.4 que estão no tutorial e os servidores 0.3.6 abaixo: [Conteúdo Oculto] [Conteúdo Oculto]
  29. 1 ponto
    Majesty

    The Forgotten Client - Cliente Tibia baseado na engine Unity3D

    The Forgotten Client - Cliente Tibia baseado na engine Unity3D Fala pessoal, vocês tem interesse em conhecer o The Forgotten Client? É um cliente Tibia baseado na engine Unity3D que está sendo desenvolvido pelo usuário Fenrisus da OTLand desde Janeiro de 2017. Para quem não sabe, Unity3D ou UnityEngine é um motor de jogo proprietário criado pela Unity Technologies para criação de jogos. Você pode saber mais acessando o site da Unity: [Conteúdo Oculto] Segue abaixo mais informações sobre o cliente: [Conteúdo Oculto] O cliente e suas ferramentas estão disponíveis para download no tópico abaixo:
  30. 1 ponto
    Majesty

    [Unity3D] The Forgotten Client

    [Unity3D] The Forgotten Client Download de cliente Tibia feito com base na engine Unity3D para a comunidade OpenTibia. Download de ferramentas para editar o cliente. Mais informações: [Conteúdo Oculto] Obs: cliente em desenvolvimento. 1 - TFC: [Conteúdo Oculto] Requisitos para a compilação: - Visual Studio 2017; - Unity3D versão 2018.3.0.f2 ou superior. 1.1 - TFC - Ferramentas: [Conteúdo Oculto]Tools Requisito para a compilação: - Visual Studio 2017. 2 - Créditos Fenrisus
  31. 1 ponto
    Yinz

    [GesiorAAC] Airetsam Kit

    tava sem nada pra fazer e comecei a editar um layoutzinho, no intuito de praticar. Aproveitarei e vim disponibilizar aqui, qualquer erro ou bug que acharem podem reportar que irei arrumar. Airetsam Layout Version: Gesior2012 Download: [Conteúdo Oculto] Images:
  32. 1 ponto
    Yinz

    [GesiorAAC] Material Kit

    tava sem nada pra fazer e comecei a editar um layoutzinho, no intuito de praticar. Aproveitarei e vim disponibilizar aqui, qualquer erro ou bug que acharem podem reportar que irei arrumar. Material Kit Layout Version: Gesior2012 Download: [Conteúdo Oculto] Images: como eu comecei a fazer hoje, até o momento de postar eu já vi alguns erros, estarei fixando os mesmos e atualizando no git, abraçoxxxxxxxxxxxxxx
  33. 1 ponto
    diegocaettan

    Como corrigir o Last Login

    Hmmm entendido, muito obrigado, vai ajudar bastante ! <3
  34. 1 ponto
    GryLLo

    Como corrigir o Last Login

    Bom dia @diegocaettan, beleza? Só pra entender melhor, você quer salvar esse Last Login em tempo real e pegar essa informação ou apenas quer pegar o valor do último Last Login salvo? Se apenas quiser o Last Login do Player é simples, apenas use um objeto da classe Player e chame essa função: player:getLastLoginSaved() GG WELL PLAYED! Uns abraços, GryLLo
  35. 1 ponto
    Pepeco

    Monster Friend

    Base: TFS 1.2, Versão: 8.6 Qual a sua pergunta? Queria fazer com que um monstro não ataque um certo tipo de pessoa (que seria uma vocação), mas ele sempre fica com o target na pessoa, mesmo eu fazendo varias tentativas, como addFriend, removeTarget e RETURNVALUE_YOUMAYNOTATTACKTHISCREATURE Eu pesquisei em vários lugares e achei esse tópico que trata exatamente meu problema. Link Mas no caso dele funcionou, o meu não funcionou. Monster events/creatures.lua
  36. 1 ponto
    GryLLo

    [login.lua] Adicionar quests ao player

    Opa @Ruquan, beleza? Então, vamos lá. Já que você só quer testar o Quest Log, faça o seguinte: Abra o login.lua que está utilizando e insira a linha abaixo (NO COMEÇO DO LOGIN.LUA): player:setStorageValue(Storage.InServiceofYalahar.Questline, 5) Nota: A quest In Service of Yalahar, o start do Questline dela por algum motivo é 5, e não 1, falei sobre isso no tutorial. Essa linha irá inicializar a Quest InServiceofYalahar em todos os players que logarem (lembre-se, adicione no começo do login.lua) por algum motivo você está colocando os gets/sets dentro de um if, se esse if não for true, nunca irá entrar aí. Uma dica é utilizar a função print("qualquer texto aqui") para saber no Console do Servidor se o código que você queria foi chamado. Só com o código acima, já é possível ver a quest no Quest Log, mas sem missões dentro dela, caso queira adicionar missões, faça isso: player:setStorageValue(Storage.InServiceofYalahar.Mission01, 1) Lembre-se, sempre inicialize a Questline antes de iniciar as missões seguintes, como dito no tutorial que escrevi. Sobre seus testes, você está apenas "BUSCANDO" dentro do Storage do player se ele tem aquela quest. o getStorageValue é apenas para buscar, caso queira tentar inserir a quest, use o setStorageValue. Por fim, você só precisar inserir UM PARÂMETRO na função getStorageValue, que é o ID do Storage, você está chamando o id pelo Storage (Storage.InServiceofYalahar.Questline) que vale 12440 e o id numérico (12440) também. Bom, por hoje é isso mano, dia 24 e 25 vai ser difícil de entrar, então tenta reler o tutorial caso ainda tenha alguma dúvida, fechou? Uns abraços, GryLLo
  37. 1 ponto
    GryLLo

    [login.lua] Adicionar quests ao player

    Opa, beleza bro? Pelo que vi aí no seu código, está faltando inicializar o Questline. Eu fiz um tópico tutorial sobre Quests e Quest Log aqui no fórum, pode ser que te ajude!
  38. 1 ponto
    Majesty

    OTU - OpenTibiaUnity - Novo Cliente Tibia baseado na engine Unity3D

    OTU - OpenTibiaUnity - Novo Cliente Tibia baseado na engine Unity3D Fala pessoal, vocês tem interesse em conhecer o projeto de um novo Cliente Tibia que está sendo desenvolvido baseado na engine Unity3D? Para quem não sabe, Unity3D ou UnityEngine é um motor de jogo proprietário criado pela Unity Technologies para criação de jogos. Você pode saber mais acessando o site da Unity: [Conteúdo Oculto] Esse novo cliente está sendo desenvolvido pelo usuário Slavi Dodo da OTLand, segue abaixo a tradução do tópico original: [Conteúdo Oculto] Por que um novo cliente? O que isso resolve? Informações: Imagens: O cliente é baseado em um projeto sprite-atlas: [Conteúdo Oculto] Ajude o desenvolvedor no Patreon: [Conteúdo Oculto] Não é necessário que você apoie o projeto, o projeto será no final open-source mas por enquanto, será apenas para os patreons ajudarem a continuarem desenvolvendo o projeto.
  39. 1 ponto
    Majesty

    Sprite para Cliente 11

  40. 1 ponto
    Majesty

    GesiorAAC - Premium Pack 2018

    GesiorAAC - Premium Pack 2018 Download do website GesiorAAC baseado no layout oficial do Tibia criado pela Cipsoft, editado por Marco Oliveira. 1 - Características - Nova página Highscores; - Pagseguro Lightbox; - Página houses com imagens; - Sistema de tickets; - Diversos bugs de segurança corrigidos; - Página de downloads atualizadas; - Página Worlds igual ao global. 2 - Imagem 3 - Como instalar - A instalação é muito simples, basta editar o config.php dentro da pasta config do site. 4 - Download: Github: [Conteúdo Oculto] 5 - Créditos Cipsoft Marco Oliveira
  41. 1 ponto
    Majesty

    Criar novas tasks

    data/lib/miscellaneous/killingInTheNameofQuest.lua. [Conteúdo Oculto] Exemplo: 500 kills, Level 130 a 250, sem repetir, só para premium, criatura = Demon Outcast, recompensa do tipo - Pontos - valor 4. [51] = {killsRequired = 500, raceName = "Demons", level = {130, 250}, norepeatable = true, premium = true, creatures = {"Demon Outcast"}, rewards = {{type = "points", value = {4}}}},
  42. 1 ponto
    Marco Oliveira

    GesiorAAC - Premium Pack 2018

    Ótimo tópico e o conteúdo melhor ainda! hahaha
  43. 1 ponto
    Majesty

    Cliente Tibia 11 - Edição de Recursos Gráficos

    Cliente Tibia 11 - Edição de Recursos Gráficos Tutorial explicando como editar os recursos gráficos do cliente Tibia 11. 1 - Downloads Quickbms: [Conteúdo Oculto] Script para extensão rcc: [Conteúdo Oculto] 2 - Como usar - Extraia os arquivos em uma pasta; - Execute o quickbms.exe; - Selecione o arquivo do script; - Selecione o arquivo graphics_resources.rcc da pasta do cliente; - Selecione a pasta para onde deseja extrair os recursos; - Modifique os arquivos com o editor gráfico de sua preferência; - Execute reimport.bat; - Selecione o arquivo do script; - Selecione o arquivo graphics_resources.rcc; - Selecione a mesma pasta onde foram extraídos os recursos; - Aproveite os novos recursos de seu cliente! 3 - Créditos Qbazzz - OTLand: [Conteúdo Oculto] Majesty (Tradução)
  44. 1 ponto
    Nolis

    OpenTibia Sprite Pack

    Tópico bem organizado, parabéns. Muito bacana esse projeto, foi muito bom contribuir para o Pixel Realm e fico contente em saber que o projeto foi adiante.. Se eu voltar a fazer mais sprites com certeza disponibilizarei!
  45. 1 ponto
    Majesty

    OTClient

    OTClient Um cliente alternativo para OTServ escrito em C++, feito com um sistema modular que usa scripts lua para interface e funcionalidade do jogo, tornando o OTClient flexível e fácil de usar. Para fazer o download das sources do OTClient, consulte o link abaixo. Download: [Conteúdo Oculto] Tutorial:
  46. 1 ponto
    Majesty

    [8.54] Poke x VNZL

    [8.54] Poke x VNZL Download de Servidor Derivado de Pokémon. 1- Características: 2- Imagens: 3 - Downloads: Servidor: [Conteúdo Oculto] Cliente: [Conteúdo Oculto] Scan Servidor: [Conteúdo Oculto] Scan Cliente: [Conteúdo Oculto] 4 - Créditos: Yoelvis Sneider Master Server
  47. 1 ponto
    Lordfire

    Controle de fluxo - condição e repetição

    Existe um mundo mágico onde todas as coisas são perfeitamente lineares e sempre acontecem de forma previsivel. Este, certamente, não é o mundo da programação. Nossos códigos eventualmente precisam saber que caminho tomar dentre múltiplas opções, ou então fazer a mesma coisa mais de uma vez. É pra isso que utilizaremos nossas estruturas de seleção e repetição! Eu recomendo que você leia sobre variáveis em Lua para entender bem como os valores se comportam. Seleção (condição) Uma instrução de seleção é uma parte do código que altera o fluxo de acordo com uma condição predefinida, ou seja, com uma expressão que seja true ou false (valor booleano). if Primeiro nós temos o if, que testa uma condição dada. Caso essa condição seja verdadeira (true), o conteúdo é executado; senão, é ignorado. Por exemplo: if not (level < 100) then minhafuncao(level) endNeste exemplo, uma função é executada caso a variável level não seja menor que 100. Preste atenção nas palavras chave then e end, elas indicam o começo e o fim de um bloco if, respectivamente. else Mas e se eu quiser fazer outra coisa caso minha condição não seja atingida? Aí, utilizamos o else. if not (level < 100) then minhafuncao(level) else minhaoutrafuncao(level) endRepare que o else não leva then, e só existe um end no final de todo o bloco. elseif Também podemos ter mais de 2 casos no nosso código, nós usamos a estrutura elseif, da seguinte forma: if not (level < 100) then minhafuncao(level) elseif vocation == 7 then autor = 'Lordfire' else minhaoutrafuncao(level) endO elseif leva then também. Você pode ter quantos elseifs quiser, mas lembre-se que apenas UM dos blocos será executado. Se o seu bloco tiver 100 ifs/elseifs, apenas o primeiro cuja condição seja verdadeira vai ser executado, e todos os outros serão ignorados. Repare que o elseif é só um atalho, seu código poderia ser assim: if not (level < 100) then minhafuncao(level) else if vocation == 7 then autor = 'Lordfire' else minhaoutrafuncao(level) end endCom exatamente a mesma lógica, mas uma linha e um nível de identação a mais. Repetição (iteração) Nós temos três tipos de repetição em Lua: for, while e repeat. Vou apresentar uma de cada vez. for O for pode ser utilizado de uma forma genérica como um loop controlado (ou seja, eu defino quando começa e termina) que permite percorrer todos os valores retornados por uma função iteradora. Neste tutorial que linkei, eu uso este for: k = {1, 2, 3, 4, 5} for i in square(k) do print(i) endPara cada vez que a função square executada na minha variável k (uma tabela) e retorne um valor diferente de nil, o meu i se torna esse valor e executa uma vez o bloco dentro do for (que vai até o end). Também existe uma segunda versão do for, exclusivamente para valores numéricos, com a seguinte sintaxe: for i = inicio, fim, aumento do (...) endOnde início é o número inicial, fim é o final, e aumento é um valor opcional da qual i aumenta a cada iteração (repetição). Por exemplo, para executar uma função em todos os números pares de 2 até 50: for i = 2, 50, 2 do (...) endEu aumento de 2 em 2, efetivamente passando apenas pelos números pares. Caso o aumento seja de 1, é só ignorar: for i = 1, 10 do print(i ^ 2) endUma coisa importante: o valor da variável de controle do for não é preservado depois do final. É como se a variável nunca tivesse existido. Você também não deve alterar o valor dessa variável dentro do for, pois os resultados são imprevisíveis. while O while, ao contrário do for, não tem um começo e um fim bem definidos. Ele leva uma condição, assim como o if, e executa o bloco enquanto essa condição for verdadeira. Um while simples, que mostra os números de 0 a 10: i = 0 while i <= 10 do print(i) i = i + 1 endNo momento em que i for 10 e eu executo a linha i = i + 1, o valor de i passa a ser 11 e o próximo passo é o teste novamente. Como a condição é falsa, o fluxo sai do loop e continua o resto do código. O while, portanto, faz o teste antes de executar o código. repeat O repeat, por sua vez, faz o teste depois de executar o bloco e repete até que dada condição seja verdadeira. Portanto, para fazer o mesmo loop, temos que inverter a condição. No mesmo exemplo: i = 0 repeat print(i) i = i + 1 until i > 10 > é logicamente inverso a <=. No caso do repeat, o bloco seria no mínimo uma vez executado mesmo que eu definisse o valor inicial de i como 100, já que ele só testa no final. Portanto, você deve evitar usar o repeat caso precise dessa consistência. Para reforçar a ideia de que essas duas estruturas são bastante diferentes, vamos mudar nossa condição: vamos executar o bloco caso x > 0 no while (e x <= 0 no repeat). O while, como nem na primeira vez vai ter a condição verdadeira, nem vai ser executado. O repeat, como vai ter após a primeira execução sua condição verdadeira, entraria em loop infinito. Tome cuidado com estes casos! Como sair de uma repetição? Haverão casos em que nós vamos querer percorrer alguns registros (com um for) ou testar alguma condição por várias vezes (com um while ou um repeat), mas ao encontrar alguma peculiaridade, vamos querer sair desse loop. Para isso, usamos a palavra break no momento em que queremos sair. k = {1, 2, 3, 4, 5} for i in square(k) do print(i) if i % 8 == 0 then break end endNesse código, eu imprimo i para todos os valores retornados por square(k), porém, ao encontrar um valor de i cuja divisão por 8 não retorne resto (que seja divisível por 8), eu executo um break e saio desse laço. Isso vai acontecer quando eu chegar em 16 (4 ^ 2) e não vai mostrar o último valor, 25. Note que não faz sentido ter código depois de um break, já que o código depois dele não seria executado de qualquer forma. Um break sai de apenas um loop de repetição, caso você tenha um loop dentro de outro, apenas o que executou o break será parado (e tudo que houver dentro dele, inclusive outros loops). Vale lembrar que todos esses conhecimentos são relacionados a linguagem Lua, e não são coisas exclusivas de OTserv.
  48. 1 ponto
    Mock

    [8.x+ TFS]Comando !online personalizado

    !online Quantas veses no seu ot vc entra ai nao quer receber pvt ou n que que saibam que vocÊ esta online pois vc so responde pelo ctrl-r ai so tem vc online vc bane alguem e descobrem q é vc e começam a perseguir vc :/ Isso ocorre sempre nao com todos mais ocorre entao eu dei um jeito de dar uma mudada nisso eu estava aqui brincando com scripts e consegui faze-lo! você chega la: fala !online ai aparece quem ta on, na maioria dos casos aparece o level Nesse meu script e diferente! aparece os nomes, levels quantas pessoas estao online e ainda se tiver gm,god, CM online nao mostra o name Bom e facil demais vo passa o script: Viram VocÊ pode mudar o script se quiser pondo os players em tabelas e ordenando por level pode por varias coisas. Agora e o seguinte vc vai por isso em talkactions e parabens se vc falar !online vai sair o !online do server q ta no commands.xml, pra ajeitar isso e facil: Vai em commands.xml e muda isso: ai vc poe tudo 7 pra nen o proprio HOSTER poder usar xDDD ai o unico problema é q vc vai soltar o ocmando vai aparecer q vc n pode usar mais vai executar a talkaction
Esta tabela de classificação está definida como São Paulo/GMT-02:00
×