Ir para conteúdo

EddyHavoc

Héroi
  • Registro em

  • Última visita

Tudo que EddyHavoc postou

  1. Acredito que é interessante que este tutorial esteja também no TibiaKing. Créditos ao Flatlander e Animera pelo tutorial inicial. Realizei algumas atualizações. Descrição: Com estas alterações nas sources do servidor e do OTC você conseguirá aumentar a visão do jogador (terá mais SQMs disponíveis na tela.) Server sources. No arquivo const.h altere isso: #define NETWORKMESSAGE_MAXSIZE 24590 Para isso: #define NETWORKMESSAGE_MAXSIZE 49180 No arquivo protocolgame.cpp Em bool ProtocolGame :: canSee (int32_t x, int32_t y, int32_t z) const Altere isso: if ((x >= myPos.getX() - 8 + offsetz) && (x <= myPos.getX() + 9 + offsetz) && (y >= myPos.getY() - 6 + offsetz) && (y <= myPos.getY() + 7 + offsetz)) { Para isso: if ((x >= myPos.getX() - Map::maxClientViewportX + offsetz) && (x <= myPos.getX() + (Map::maxClientViewportX+1) + offsetz) && (y >= myPos.getY() - Map::maxClientViewportY + offsetz) && (y <= myPos.getY() + (Map::maxClientViewportY+1) + offsetz)) { Em void ProtocolGame :: sendMapDescription (const Position & pos) Altere isso: GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); Para isso: GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg); Em void ProtocolGame :: sendMoveCreature (const Creature * criatura, const Position & newPos, int32_t newStackPos, const Position & oldPos, int32_t oldStackPos, bool teleport) Altere isso: if (oldPos.y > newPos.y) { // north, for old x msg.AddByte(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if (oldPos.y < newPos.y) { // south, for old x msg.AddByte(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if (oldPos.x < newPos.x) { // east, [with new y] msg.AddByte(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if (oldPos.x > newPos.x) { // west, [with new y] msg.AddByte(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); } Para isso: if (oldPos.y > newPos.y) { // north, for old x msg.AddByte(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } else if (oldPos.y < newPos.y) { // south, for old x msg.AddByte(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y + (Map::maxClientViewportY+1), newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } if (oldPos.x < newPos.x) { // east, [with new y] msg.AddByte(0x66); GetMapDescription(newPos.x + (Map::maxClientViewportX+1), newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } else if (oldPos.x > newPos.x) { // west, [with new y] msg.AddByte(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } Em void ProtocolGame :: MoveUpCreature (NetworkMessage & msg, const Creature * criatura, const Position & newPos, const Position & oldPos) Altere isso: if (newPos.z == 7) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 4, 18, 14, 4, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 3, 18, 14, 5, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 2, 18, 14, 6, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 1, 18, 14, 7, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 0, 18, 14, 8, skip); Para isso: if (newPos.z == 7) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 4, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 4, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 5, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 6, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 7, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 0, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 8, skip); Logo abaixo, altere isso: else if (newPos.z > 7) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.getZ() - 3, 18, 14, 3, skip); Para isso: else if (newPos.z > 7) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.getZ() - 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); Logo abaixo, altere isso: //moving up a floor up makes us out of sync //west msg.AddByte(0x68); GetMapDescription(oldPos.x - 8, oldPos.y - 5, newPos.z, 1, 14, msg); //north msg.AddByte(0x65); GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg); Para isso: //moving up a floor up makes us out of sync //west msg.AddByte(0x68); GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); //north msg.AddByte(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); Em void ProtocolGame :: MoveDownCreature (NetworkMessage & msg, const Creature * criatura, const Position & newPos, const Position & oldPos) Altere isso: //going from surface to underground if (newPos.z == 8) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 14, -1, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 1, 18, 14, -2, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Para isso: //going from surface to underground if (newPos.z == 8) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -1, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -2, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); Logo abaixo, altere: //going further down else if (newPos.z > oldPos.z && newPos.z > 8 && newPos.z < 14) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Para isso: //going further down else if (newPos.z > oldPos.z && newPos.z > 8 && newPos.z < 14) { int32_t skip = -1; GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); E logo abaixo disso, altere: //moving down a floor makes us out of sync //east msg.addByte(0x66); GetMapDescription(oldPos.x + 9, oldPos.y - 7, newPos.z, 1, 14, msg); //south msg.addByte(0x67); GetMapDescription(oldPos.x - 8, oldPos.y + 7, newPos.z, 18, 1, msg); Para isso: //moving down a floor makes us out of sync //east msg.addByte(0x66); GetMapDescription(oldPos.x + Map::maxClientViewportX+1, oldPos.y - (Map::maxClientViewportY+1), newPos.z, 1, ((Map::maxClientViewportY+1)*2), msg); //south msg.addByte(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y + (Map::maxClientViewportY+1), newPos.z, ((Map::maxClientViewportX+1)*2), 1, msg); Estas alterações são aplicadas para o TFS 1.x, se você estiver utilizando o TFS 1.3 ou superior, você deve substituir AddByte para addByte e se você estiver alterando as sources do TFS abaixo do TFS 1.x você ainda deve realizar as seguintes alterações em protocolgame.cpp Alterar isso: void ProtocolGame::AddMapDescription(NetworkMessage_ptr msg, const Position& pos) { msg->put<char>(0x64); msg->putPosition(player->getPosition()); GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); } Para isso: void ProtocolGame::AddMapDescription(NetworkMessage_ptr msg, const Position& pos) { msg->put<char>(0x64); msg->putPosition(player->getPosition()); GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); } Estas são todas as alterações em protocolgame.cpp Client sources Agora no arquivo map.cpp Altere isso: void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); } Para isso: { AwareRange range; range.left = 8; //Altere este 8 para o mesmo valor que você clocou do maxClientViewportX em map.h range.top = 6; //Altere este 6 para o mesmo valor que você clocou do maxClientViewportY em map.h range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); } E no arquivo creature.cpp Altere isso bool Creature::canSee(const Position& myPos, const Position& pos, int32_t viewRangeX, int32_t viewRangeY) { if (myPos.z <= 7) { //we are on ground level or above (7 -> 0) //view is from 7 -> 0 if (pos.z > 7) { return false; } } else if (myPos.z >= 8) { //we are underground (8 -> 15) //view is +/- 2 from the floor we stand on if (Position::getDistanceZ(myPos, pos) > 2) { return false; } } const int_fast32_t offsetz = myPos.getZ() - pos.getZ(); return (pos.getX() >= myPos.getX() - viewRangeX + offsetz) && (pos.getX() <= myPos.getX() + viewRangeX + offsetz) && (pos.getY() >= myPos.getY() - viewRangeY + offsetz) && (pos.getY() <= myPos.getY() + viewRangeY + offsetz); } Para isso: bool Creature::canSee(const Position& myPos, const Position& pos, int32_t viewRangeX, int32_t viewRangeY) { if (myPos.z <= 7) { //we are on ground level or above (7 -> 0) //view is from 7 -> 0 if (pos.z > 7) { return false; } } else if (myPos.z >= 8) { //we are underground (8 -> 15) //view is +/- 2 from the floor we stand on if (Position::getDistanceZ(myPos, pos) > 2) { return false; } } const int_fast32_t offsetz = myPos.getZ() - pos.getZ(); return (pos.getX() >= myPos.getX() - Map::maxViewportX + offsetz) && (pos.getX() <= myPos.getX() + Map::maxViewportX + offsetz) && (pos.getY() >= myPos.getY() - Map::maxViewportY + offsetz) && (pos.getY() <= myPos.getY() + Map::maxViewportY + offsetz); } Fim! Estas são todas as alterações, eu adicionei algumas novas atualizações e melhorias além das descritas no tópico original, obrigado novamente ao Flatlander e Animera.
  2. Este erro atualmente ocorre quando vamos instalar o MyAAC utilizando o banco de dados disponibilizado no forgottenserver atualizado. Mensagem do erro: "Unknown column 'lastday' in 'field list'" Para resolver este erro, reinstale a Database e o MyAAC. Antes de iniciar a nova instalação do MyAAC, após importar o banco de dados (schema.sql) do forgottenserver, execute no phpMyAdmin o código abaixo. ALTER TABLE `accounts` ADD `lastday` int unsigned NOT NULL DEFAULT '0'; Após seguir estes passos, você irá conseguir efetuar a sua instalação com sucesso!
  3. [TFS 1.3] Goldchange - Converter 100 gold coin em 1 platinum coin e 100 platinum coin em 1 crystal coin Muitos dos novos servers não tem mais esta função facilitadora que os jogadores tanto adoram! Por este motivo venho compartilhar aqui com vocês. gold_change.lua Em Data/Scripts/Actions/Other/ crie um arquivo .lua chamado gold_change.lua e insira o código abaixo: CRÉDITOS: @EddyHavoc
  4. Open Source MMORPG emulador de Tibia escrito em C++. Servidor Oficial do Tibiaking! [OTG][NPC][Storages][Dawnport] Liberando os acessos das Quests e Missões pelo NPC Captain Dreadnought Tutorial explicado de como liberar os acessos, missões e quests para todos os jogadores! NPC Captain Dreadnought Abra o script do npc captain_dreadnought.lua localizado na pasta data/npc/scripts/ e substitua todo o código pelo código abaixo: CRÉDITOS: @EddyHavoc @Marco Oliveira
  5. Ajustes nas Towns realizados. O script foi feito para funcionar em especifico no OTG KING, é possível adapta-lo para demais servidores.
  6. Open Source MMORPG emulador de Tibia escrito em C++. Servidor Oficial do Tibiaking! [OTG][NPC][Storages][Rookgaard] Liberando os acessos das Quests e Missões pelo NPC Oracle Tutorial explicado de como liberar as acessos, missões e quests para todos os jogadores! NPC Oracle Abra o script do npc the_oracle.lua localizado na pasta data/npc/scripts/ e substitua todo o código pelo código abaixo: CRÉDITOS: @EddyHavoc @Marco Oliveira
  7. EddyHavoc postou uma resposta no tópico em Novidades sobre Tibia
    A Linguagem Orc A Linguagem Orc é muito antiga no Tibia, acredita-se que surgiu em Rookgaard em 17 de Março de 2000. Um fato curioso é que com o passar dos tempos aparentemente até mesmo os próprios Orcs foram deixando de falar esta linguagem, ao menos conosco. Podemos encontrar bastante informações sobre esta língua em Rookgaard, existem livros escritos e NPCs que podemos conversar usando esta linguagem. Ela pode ser útil para conseguir até mesmo alguns benefícios na ilha. Abaixo irei citar algumas traduções da linguagem orc para o inglês. Traduções Palavra aprendidas no Livro chamado "My Travels" encontrado na Academia de Rookgaard, acredita-se que este livro foi escrito pela Amber: charach -> hi Palavras aprendidas diretamente com a Amber: burp -> no mok -> yes pixo -> arrow Palavras aprendidas com o Blind Orc Ikem -> I goshak -> Buy Porak -> Weapons Bata -> Armors and Helmets Dora -> Shield Porak (Weapons): Charcha -> Sabre Burka -> Short Sword Burka Bata -> Sword Batuk -> Bow Bata (Armos and Helmets): Aka Bora -> Leather Armor Tulak Bora-> Studded Armor Hakhak -> Hatchet Grofa -> Studded Helmet Dora (Shields): Donga -> Brass Shield Outras palavras: aka -> leather ba -> what burp -> no buta -> stupid futchi -> bye humak -> human ikem -> I klamuk -> unknown insult (noun) maruk -> you nixda -> not enough gold (em alemão é algo como "nichts da" = "nothing there") pashak -> sell rambo -> thank? or friend? ta -> this tefar -> bunch or 10 (but orcs can only count to 5, so it's unlikely) tulak -> studded (this word is not used in studded helmet) ul -> for zambo -> thank? or friend? Palavras encontradas em livros escrito na linguagem dos Orcs próximo a Bear Room Quest: 5 5 5 5 2 -> 22 (na linguagem orc os números vão até 5) arash -> ? bana -> destroy? kill? batash -> ? Booz -> ? bota -> ? ferut -> ? gort -> ? karak -> ? karakim -> ? karek -> ? kiskesh -> ? mora -> ? Omark -> ? ouk -> ? taka -> ? utash -> ? Palavras encontradas em notas penduradas nas paredes: daem -> ? desmet -> ? irkm -> ? Exemplo de Negociação com o Blind Orc Iniciando a conversa com o Blind Orc sem ser na linguagem Orc: (Ele não irá negociar com você se você não falar na linguagem Orc) - Hi. - Buta humak! -> Stupid human! Iniciando a conversa na linguagem Orc: Charach. -> Hi. Ikem Charach maruk. -> I greet you. Negociando: Ikem goshak. -> I buy. Ikem pashak porak, bata, dora. Ba goshak maruk? -> I sell weapons, armors/helmets, shields. What buying you? Negociando Armas: Goshak porak. -> Buy weapon. Ikem pashak charcha, burka, burka bata, hakhak. Ba goshak maruk? -> I sell sabre, short sword, sword, hatchet. What buying you? Negociando Armaduras e Capacetes: Goshak bata. -> Buy armor/helmet. Ikem pashak aka bora, tulak bora, grofa. Ba goshak maruk? -> I sell leather armor, studded armor, studded helmet. What buying you? Negociando escudos: Goshak dora. -> Buy shield. Ikem pashak donga. Ba goshak maruk? -> I sell brass shield. What buying you? Comprando um item: Goshak batuk. -> Buy bow. Ahhhh, maruk goshak batuk? -> Ahhhh, you buying bow? Mok. -> Yes. Maruk rambo zambo! -> You thank friend(?)! Comprando flechas (Só é possível comprar de 10 em 10): Goshak pixo. -> Buy arrows. Maruk goshak tefar pixo ul batuk? -> You buy ten(or bunch) arrows for bow? Mok. -> Yes. Considerações Finais Vocês gostaram desse tipo de conteúdo? Eu particularmente sou apaixonado pela Lore do Tibia! Deixe um comentário falando sobre o que você achou deste tópico, deste tipo de conteúdo, e o que você gostaria de saber sobre a história desse jogo maravilhoso em tópicos futuros! Até a próxima! Maruk rambo zambo!
  8. Open Source MMORPG emulador de Tibia escrito em C++. Servidor Oficial do Tibiaking! [Ubuntu] Compilando as Sources OTG KING GLOBAL Tutorial explicado de como compilar as sources no Ubuntu 16-20. Instalação dos Softwares Necessários Execute os comandos abaixo para instalar o Git, Cmake e as Bibliotecas utilizadas pelas sources do OTG KING sudo apt install git cmake build-essential libluajit-5.1-dev libmysqlclient-dev libboost-system-dev libboost-iostreams-dev libboost-filesystem-dev libpugixml-dev libcrypto++-dev Pacote Adicional para o Ubuntu 20.04: sudo apt install libboost-date-time-dev Instalando as Sources do OTG KING git clone --recursive https://github.com/Johncorex/otg-king.git Compilando cd otg-king-master mkdir build && cd build cmake .. make CRÉDITOS: The Forgotten Server OTG contribuidores OTX contribuidores Otbr contribuidores Tibiaking Johncore (@Johncore) Erick Nunes Cjaker (@Cjaker) Marson Schneider Erimyth Nolis (@Nolis) Toninho Renan Ulian jzdj (Se você contribuiu com o projeto de alguma forma e gostaria de ser citado, por favor me envie no privado descrevendo a sua contribuição, que irei editar a postagem e inserir o seu nome.)
  9. Este é um erro muito comum para as pessoas vão compilar pela primeira vez, e por este motivo resolvi criar este tópico para lhe ajudar. (Windows - Microsoft Visual Studio) Mensagem do erro: Cannot open include file: 'lua.hpp': No such file or directory Para resolver este erro, é muito simples! Faça as seguintes alterações nos arquivos configmanager.cpp e luascript.h Altere #include "lua/lua.hpp" Por: #include "luajit/lua.hpp" Agora é só felicidade!
  10. Entre na pasta HTDOCS (C:\xampp\htdocs\) do XAMPP e abra o config.php Procure por: $config['site']['serverPath'] E coloque corretamente o seu diretório, exemplo: $config['site']['serverPath'] = "C:\Users\malla\Desktop\colossus\config.lua"
  11. É um prazer estar de volta amigos! Irei tentar voltar a contribuir com a comunidade como antes. Um grande abraço! @Nolis @Johncore É aquela história: "Você sai do Tibia mas o Tibia não sai de você."
  12. Open Source MMORPG emulador de Tibia escrito em C++. Servidor Oficial do Tibiaking! [Windows][VC2019] Compilando as Sources OTG KING GLOBAL Tutorial explicado de como compilar as sources utilizando o Microsoft Visual 2019. Downloads necessários: Git: https://git-scm.com/download/win Visual Studio 2019 Community: https://www.visualstudio.com/vs/ VCPKG: https://github.com/Microsoft/vcpkg Instalando o Microsoft Visual Studio 2019. https://www.visualstudio.com/vs/ Após instalar, na tela inicial selecione o produto Visual Studio Community 2019 e clique no botão instalar. Na próxima tela, selecione Desenvolvimento para Desktop com C++. Na mesma tela em Detalhes da Instalação, selecione: Na página, pacotes de idioma, selecione: (Há pessoas que selecionam Inglês e Português (Brasil), porém apenas o idioma Inglês é essencial para a compilação) Instalando o Git. https://git-scm.com/download/win Instalando o VCPKG. Abra o GIT Bash e execute os comandos abaixo: cd C:/ git clone https://github.com/Microsoft/vcpkg cd vcpkg .\bootstrap-vcpkg.bat .\vcpkg integrate install Instalando as Sources do OTG KING Abra o GIT Bash e execute os comandos abaixo: cd C:/ git clone --recursive https://github.com/Johncorex/otg-king.git Instalando as bibliotecas Abra o GIT Bash e execute os comandos abaixo de acordo com o seu sistema operacional: Para 64-bit (64x) ./vcpkg install --triplet x64-windows boost-iostreams boost-asio boost-system boost-filesystem boost-variant boost-lockfree luajit libmariadb pugixml cryptopp Para 32-bit (32x) ./vcpkg install boost-iostreams boost-asio boost-system boost-filesystem boost-variant boost-lockfree luajit libmariadb pugixml cryptopp Após completar a instalação de todas as bibliotecas de acordo como sistema operacional, execute o comando abaixo: .\vcpkg integrate install Compilando as Sources do OTG KING Entre no diretório vc14 das sources do OTG KING (C:/otg-king-master/vc14) e abra o arquivo otg-king.sln O Visual Studio será aberto, selecione Release e x64 ou win32 e inicie a compilação utilizando o atalho CTRL + SHIFT + B ou vá em Build > Build Solution As sources serão compiladas com sucesso! DLL's 64-bit (64x): - Copie as DLLs da pasta (C:/otg-king-master/vc14/x64/release). - Copie o executável da pasta (C:/otg-king-master/vc14/x64/release). - E cole na pasta raiz do servidor. Para compilação em 32-bit: - Copie as DLLs da pasta (C:/otg-king-master/vc14/x64/release). - Copie o executável da pasta (C:/otg-king-master/vc14/x64/release). - E cole na pasta raiz do servidor. CRÉDITOS: The Forgotten Server OTG contribuidores OTX contribuidores Otbr contribuidores Tibiaking Johncore (@Johncore) Erick Nunes Cjaker (@Cjaker) Marson Schneider Erimyth Nolis (@Nolis) Toninho Renan Ulian jzdj (Se você contribuiu com o projeto de alguma forma e gostaria de ser citado, por favor me envie no privado descrevendo a sua contribuição, que irei editar a postagem e inserir o seu nome.)
  13. EddyHavoc postou uma resposta no tópico em Suporte Tibia OTServer
    Por gentileza poste o seu 'Data/Actions/Other/Taming.lua'
  14. Olá para compilar você pode seguir um dos tutoriais abaixo, qualquer dúvida, volte a entrar em contato.
  15. Você não definiu o caminho das bibliotecas corretamente. (Include/ Libs) Indico seguir os passos de um dos tutoriais abaixo, qualquer dúvida volte a entrar em contato.
  16. Resumo Recentemente estava observando que quando estou usando o OTClient ao descer para andares escuros do mapa o jogador fica com uma luz ao redor e quando usamos o Tibia Client esta mesma luz não aparece, ou seja, no OTClient a necessidade do jogador usar uma tocha ou uma magia para iluminar é muito menor que no Tibia Client pois utilizando o OTC o nível de luz não fica como deveria. Após estudar alguns arquivos da source do OTC consegui encontrar a solução, e é bem simples! Instalando Dentro do arquivo creatures.cpp nas sources do OTClient modificar: light.intensity = std::max<uint8>(light.intensity, 3); por light.intensity = std::max<uint8>(light.intensity, 0); Pronto! Espero que gostem!
  17. @ricardok10 Aqui no fórum você pode encontrar diversos servidores que usam como base o TFS 1.2, acredito que também tem disponível o servidor limpo com as sources do TFS 1.2.
  18. @ricardok10 Realmente, não contempla a função apresentada no tópico. Indico você usar TFS 1.x+ para servidores com versões mais recentes caso queira desfrutar das últimas features.
  19. @ricardok10 Que estranho, este é um evento registrado nas Sources do TFS 1.2+. Você está usando qual TFS?
  20. Resumo A maneira atual para implementar Modal Window é um pouco complicada. Atualmente precisamos cria-la em algum lugar, registrar o evento, adicionar os botões em uma ordem específica, definir o ID da janela, dos botões e da escolha. Isso não é o ideal, então esta biblioteca foi criada pelo Non Sequitur para ajudar nisso. E eu estou trazendo para a OtServBrasil. Exemplo/ Tutorial Usando Modal Window Instalando Adicionar em data/lib/lib.lua dofile('data/lib/modalwindow.lua') Crie o arquivo modalwindow.lua com o seguinte conteúdo em data/lib if not modalWindows then modalWindows = { modalWindowConstructor = ModalWindow, nextFreeId = 500, windows = {} } end local MT = {} MT.__index = MT function ModalWindow(...) local args = {...} if type(args[1]) == 'table' then local self = setmetatable(args[1], MT) local id = modalWindows.nextFreeId self.id = id self.buttons = {} self.choices = {} self.players = {} self.created = false modalWindows.nextFreeId = id + 1 table.insert(modalWindows.windows, self) return self end return modalWindows.modalWindowConstructor(...) end function MT:setDefaultCallback(callback) self.defaultCallback = callback end function MT:addButton(text, callback) local button = {text = tostring(text), callback = callback} table.insert(self.buttons, button) return button end function MT:addButtons(...) for _, text in ipairs({...}) do table.insert(self.buttons, {text = tostring(text)}) end end function MT:addChoice(text) local choice = {text = tostring(text)} table.insert(self.choices, choice) return choice end function MT:addChoices(...) for _, text in ipairs({...}) do table.insert(self.choices, {text = tostring(text)}) end end function MT:setDefaultEnterButton(text) self.defaultEnterButton = text end function MT:setDefaultEscapeButton(text) self.defaultEscapeButton = text end function MT:setTitle(title) self.title = tostring(title) end function MT:setMessage(message) self.message = tostring(message) end local buttonOrder = { [4] = {3, 4, 2, 1}, [3] = {2, 3, 1}, [2] = {1, 2}, [1] = {1} } function MT:create() local modalWindow = modalWindows.modalWindowConstructor(self.id, self.title, self.message) local order = buttonOrder[math.min(#self.buttons, 4)] if order then for _, i in ipairs(order) do local button = self.buttons[i] modalWindow:addButton(i, button.text) button.id = i if button.text == self.defaultEnterButton then modalWindow:setDefaultEnterButton(i) elseif button.text == self.defaultEscapeButton then modalWindow:setDefaultEscapeButton(i) end end end for _, choice in ipairs(self.choices) do modalWindow:addChoice(_, choice.text) choice.id = _ end self.modalWindow = modalWindow end function MT:sendToPlayer(player) if not self.modalWindow then self:create() end player:registerEvent('ModalWindowHelper') self.players[player:getId()] = true return self.modalWindow:sendToPlayer(player) end Adicionar em data/creaturescripts/craturescripts.xml <event type="modalwindow" name="ModalWindowHelper" script="modalwindowhelper.lua" /> Crie o arquivo modalwindowhelper.lua com o seguinte conteúdo em data/creaturescripts/scripts/ function onModalWindow(player, modalWindowId, buttonId, choiceId) local modalWindow for _, window in ipairs(modalWindows.windows) do if window.id == modalWindowId then modalWindow = window break end end if not modalWindow then return true end local playerId = player:getId() if not modalWindow.players[playerId] then return true end modalWindow.players[playerId] = nil local choice = modalWindow.choices[choiceId] for _, button in ipairs(modalWindow.buttons) do if button.id == buttonId then local callback = button.callback or modalWindow.defaultCallback if callback then callback(button, choice) break end end end return true end Pronto! Espero que gostem. Posteriormente irei postar um tutorial de como usar/ aplicar e alguns scripts utilizando a Biblioteca.
  21. Obrigado @Daniel, é fácil a configuração para aumentar o tempo dele no mapa, deixei de maneira simples, só editar o código abaixo dentro do script. local delay = 1
  22. @InicianteAprendiz Você pode adicionar os npcs manualmente, no momento não pretendo trazer atualizações para este Datapack. Você pode encontrar tutoriais de como adicionar os npcs aqui no fórum.

Informação Importante

Confirmação de Termo