Ir para conteúdo

L3K0T

Diretor
  • Registro em

  • Última visita

Tudo que L3K0T postou

  1. envia um banco de dados nunca usado é nginx né?
  2. L3K0T postou uma resposta no tópico em Portal
    Vou trazer mais para frente, vou trazer a versão nova ainda
  3. porque n desativar então o proteção? e ativar modo pvp por nivel? function onCombat(cid, target) -- Verificações gerais if not isPlayer(target) then return true end -- Verificações de nível para PVP if getPlayerLevel(target) < 80 then doPlayerSendTextMessage(cid, 25, "PVP é a partir do level 80.") return false end if getPlayerLevel(cid) < 80 then doPlayerSendTextMessage(cid, 25, "PVP é a partir do level 80.") return false end -- Verificações de skulls if getCreatureSkullType(cid) == 1 then return true end if getCreatureSkullType(cid) >= 3 and getCreatureSkullType(target) >= 3 then return true end if isPlayer(cid) then return true end end <event type="combat" name="semcombate" registerTo="semcombate" event="script" value="semcombate.lua"/> login.lua: registerCreatureEvent(cid, "semcombate") assim vc desativa a proteção e o player n passar mais entro do dp
  4. volta bool Player::canWalkthrough(const Creature* creature) const { if(creature == this || hasCustomFlag(PlayerCustomFlag_CanWalkthrough) || creature->isWalkable() || (creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster()))) return true; const Player* player = creature->getPlayer(); if(!player) return false; if((((g_game.getWorldType() == WORLD_TYPE_NO_PVP && player->getVocation()->isAttackable()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || (player->getVocation()->isAttackable() && player->getLevel() < (uint32_t)g_config.getNumber(ConfigManager::PROTECTION_LEVEL))) && player->getTile()->ground) && (!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges) || player->getAccess() <= getAccess())) return true; return (player->isGhost() && getGhostAccess() < player->getGhostAccess()) || (isGhost() && getGhostAccess() > player->getGhostAccess()); }
  5. coloquei todos mundos pra testar bool Player::canWalkthrough(const Creature* creature) const { if(creature == this || hasCustomFlag(PlayerCustomFlag_CanWalkthrough) || creature->isWalkable() || (creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster()))) return true; const Player* player = creature->getPlayer(); if(!player) return false; if((((g_game.getWorldType() == WORLD_TYPE_NO_PVP && player->getVocation()->isAttackable()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || (player->getVocation()->isAttackable() && player->getLevel() < (uint32_t)g_config.getNumber(ConfigManager::PROTECTION_LEVEL))) && player->getTile()->ground) && (!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges) || player->getAccess() <= getAccess())) return true; return (player->isGhost() && getGhostAccess() < player->getGhostAccess()) || (isGhost() && getGhostAccess() > player->getGhostAccess()); }
  6. quando vc pisa no piso fala quantos itens vc tem no depot? usando o script que te passei?
  7. da look do item no chão porque ele tem as mesma imagens que os outros piso iguais a esse tbm n testa como adm teste como player, adm n tem verificação
  8. é só assim de <item fromid="11059" toid="11060" name="glowing switch"> <attribute key="walkStack" value="0"/> para <item fromid="11059" toid="11060" name="glowing switch" />
  9. item.xml apaga oque vc fez e coloca <item fromid="11059" toid="11060" name="glowing switch" />
  10. bool Player::canWalkthrough(const Creature* creature) const { if(creature == this || hasCustomFlag(PlayerCustomFlag_CanWalkthrough) || creature->isWalkable() || (creature->getMaster() && creature->getMaster() != this && canWalkthrough(creature->getMaster()))) return true; const Player* player = creature->getPlayer(); if(!player) return false; if((((g_game.getWorldType() == WORLDTYPE_OPTIONAL && !player->isEnemy(this, true) && player->getVocation()->isAttackable()) || player->getTile()->hasFlag(TILESTATE_PROTECTIONZONE) || (player->getVocation()->isAttackable() && player->getLevel() < (uint32_t)g_config.getNumber(ConfigManager::PROTECTION_LEVEL))) && player->getTile()->ground && Item::items[player->getTile()->ground->getID()].walkStack) && (!player->hasCustomFlag(PlayerCustomFlag_GamemasterPrivileges) || player->getAccess() <= getAccess())) return true; return (player->isGhost() && getGhostAccess() < player->getGhostAccess()) || (isGhost() && getGhostAccess() > player->getGhostAccess()); } com o codigo q vc mexeu tava pvp, por padrão é opcional, precisa testar assim
  11. movements.xml <movevent type="StepIn" itemid="11059" event="script" value="tiles.lua"/> <movevent type="StepOut" itemid="11060" event="script" value="tiles.lua"/> local config = { maxLevel = getConfigInfo('maximumDoorLevel') } local increasingItems = {[416] = 417, [426] = 425, [446] = 447, [3216] = 3217, [3202] = 3215, [11059] = 11060} local decreasingItems = {[417] = 416, [425] = 426, [447] = 446, [3217] = 3216, [3215] = 3202, [11060] = 11059} local depots = {2589, 2590, 2591, 2592} local checkCreature = {isPlayer, isMonster, isNpc} local function pushBack(cid, position, fromPosition, displayMessage) doTeleportThing(cid, fromPosition, false) doSendMagicEffect(position, CONST_ME_MAGIC_BLUE) if(displayMessage) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "The tile seems to be protected against unwanted intruders.") end end function onStepIn(cid, item, position, fromPosition) if(not increasingItems[item.itemid]) then return false end if(not isPlayerGhost(cid)) then doTransformItem(item.uid, increasingItems[item.itemid]) end if(item.actionid >= 194 and item.actionid <= 196) then local f = checkCreature[item.actionid - 193] if(f(cid)) then pushBack(cid, position, fromPosition, false) end return true end if(item.actionid >= 191 and item.actionid <= 193) then local f = checkCreature[item.actionid - 190] if(not f(cid)) then pushBack(cid, position, fromPosition, false) end return true end if(not isPlayer(cid)) then return true end if(item.actionid == 189 and not isPremium(cid)) then pushBack(cid, position, fromPosition, true) return true end local gender = item.actionid - 186 if(isInArray({PLAYERSEX_FEMALE, PLAYERSEX_MALE, PLAYERSEX_GAMEMASTER}, gender)) then if(gender ~= getPlayerSex(cid)) then pushBack(cid, position, fromPosition, true) end return true end local skull = item.actionid - 180 if(skull >= SKULL_NONE and skull <= SKULL_BLACK) then if(skull ~= getCreatureSkullType(cid)) then pushBack(cid, position, fromPosition, true) end return true end local group = item.actionid - 150 if(group >= 0 and group < 30) then if(group > getPlayerGroupId(cid)) then pushBack(cid, position, fromPosition, true) end return true end local vocation = item.actionid - 100 if(vocation >= 0 and vocation < 50) then local playerVocationInfo = getVocationInfo(getPlayerVocation(cid)) if(playerVocationInfo.id ~= vocation and playerVocationInfo.fromVocation ~= vocation) then pushBack(cid, position, fromPosition, true) end return true end if(item.actionid >= 1000 and item.actionid <= config.maxLevel) then if(getPlayerLevel(cid) < item.actionid - 1000) then pushBack(cid, position, fromPosition, true) end return true end if(item.actionid ~= 0 and getPlayerStorageValue(cid, item.actionid) <= 0) then pushBack(cid, position, fromPosition, true) return true end if(getTileInfo(position).protection) then local depotPos, depot = getCreatureLookPosition(cid), {} depotPos.stackpos = STACKPOS_GROUND while(true) do if(not getTileInfo(depotPos).depot) then break end depotPos.stackpos = depotPos.stackpos + 1 depot = getThingFromPos(depotPos) if(depot.uid == 0) then break end if(isInArray(depots, depot.itemid)) then local depotItems = getPlayerDepotItems(cid, getDepotId(depot.uid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, "Your depot contains " .. depotItems .. " item" .. (depotItems > 1 and "s" or "") .. ".") break end end return true end return false end function onStepOut(cid, item, position, fromPosition) if(not decreasingItems[item.itemid]) then return false end if(not isPlayerGhost(cid)) then doTransformItem(item.uid, decreasingItems[item.itemid]) return true end return false end
  12. Instalando o Sistema max_packets_per_seconds no Servidor 0.x Passo 1: Modificar o Connection.cpp Abra o arquivo Connection.cpp. Procure pela função: void Connection::parseHeader(const boost::system::error_code& error) Antes da linha: --m_pendingRead; try Adicione o seguinte código: uint32_t timePassed = std::max<uint32_t>(1, (time(NULL) - m_timeConnected) + 1); if ((++m_packetsSent / timePassed) > static_cast<uint32_t>(g_config.getNumber(ConfigManager::MAX_PACKETS_PER_SECOND))) { std::cout << convertIPAddress(getIP()) << " disconnected for exceeding packet per second limit." << std::endl; close(); m_connectionLock.unlock(); return; } if (timePassed > 2) { m_timeConnected = time(NULL); m_packetsSent = 0; } Passo 2: Modificar o Connection.h Abra o arquivo Connection.h. Procure pela classe: class Connection : public boost::enable_shared_from_this<Connection>, boost::noncopyable Abaixo de: m_protocol = NULL; Adicione: m_packetsSent = 0; m_timeConnected = time(NULL); Abaixo de: uint32_t m_refCount; Adicione: time_t m_timeConnected; uint32_t m_packetsSent; Passo 3: Modificar o ProtocolGame.cpp Abra o arquivo ProtocolGame.cpp. Procure pela função: void ProtocolGame::parsePacket(NetworkMessage &msg) Abaixo de: if(!player || !m_acceptPackets || g_game.getGameState() == GAME_STATE_SHUTDOWN || msg.getMessageLength() <= 0) return; Adicione: uint32_t now = time(NULL); if(m_packetTime != now) { m_packetTime = now; m_packetCount = 0; } ++m_packetCount; if(m_packetCount > (uint32_t)g_config.getNumber(ConfigManager::MAX_PACKETS_PER_SECOND)) return; Passo 4: Modificar o ProtocolGame.h Abra o arquivo ProtocolGame.h. Procure por: ProtocolGame(Connection_ptr connection): Protocol(connection) Substitua: m_eventConnect = 0; por: m_eventConnect = m_packetCount = m_packetTime = 0; Procure por: uint32_t m_eventConnect Substitua por: uint32_t m_eventConnect, m_maxSizeCount, m_packetCount, m_packetTime; Passo 5: Modificar o ConfigManager.cpp Abra o arquivo ConfigManager.cpp. Procure por: m_loaded = true; Acima disso, adicione: m_confNumber[MAX_PACKETS_PER_SECOND] = getGlobalNumber("max_packets_per_second", 500); Passo 6: Modificar o ConfigManager.h Abra o arquivo ConfigManager.h. Procure por LAST_NUMBER_CONFIG /* this must be the last one */ Acima disso, adicione: MAX_PACKETS_PER_SECOND, Passo 7: Modificar o config.lua No arquivo config.lua do seu servidor, adicione: max_packets_per_second = 80 Lembrando que, quanto maior o número, mais pacotes a pessoa pode enviar sem ser desconectada. Medidas para ajudar a proteger o servidor contra ataques de "packet flood" ou "SYN flood". Esses ataques envolvem o envio de um grande número de pacotes ao servidor em um curto espaço de tempo, com a intenção de sobrecarregar os recursos do servidor e causar falhas ou degradação no desempenho. Implementando o sistema max_packets_per_seconds, você está limitando o número de pacotes que cada conexão pode enviar por segundo. Isso ajuda a mitigar o impacto de ataques de flood, desconectando automaticamente conexões que excedem o limite configurado de pacotes por segundo. Essas mudanças melhoram a resiliência do seu servidor contra certos tipos de ataques de negação de serviço (DoS), contribuindo para a estabilidade e segurança do seu OTServer. Créditos @L3K0T por esse tutorial formatado. @Yan Liima [TFS 0.4 REV3996] pelo código
  13. L3K0T postou uma resposta no tópico em Portal
    Quem sabe mais pra frente agora só na dev mesmo
  14. Como Evitar Quedas no Servidor ao Exibir Mensagens de Admin (Error - void ServiceManager::run()) NETWORK: O endereço solicitado não é válido no contexto (Error - void ServicePort::open(IPAddressList, uint16_t)) NETWORK: O endereço solicitado não é válido no contexto Problema: Em determinadas situações, a exibição de mensagens de admin está causando a queda do servidor. Isso ocorre quando uma exceção não tratada é lançada ao tentar abrir portas de serviço. Solução: A solução envolve modificar o código em server.cpp para evitar que o servidor caia quando uma exceção é lançada. Vamos alterar o método ServicePort::open para tratar exceções de forma segura. Passos: Localize o Arquivo server.cpp: Abra o arquivo server.cpp no seu projeto. Você pode usar um editor de texto ou uma IDE de sua preferência. Encontre o Método ServicePort::open: Procure pelo método ServicePort::open no arquivo. O código original se parece com isto: void ServicePort::open(IPAddressList ips, uint16_t port) { m_pendingStart = false; m_serverPort = port; bool error = false; for(IPAddressList::iterator it = ips.begin(); it != ips.end(); ++it) { try { Acceptor_ptr tmp(new boost::asio::ip::tcp::acceptor(m_io_service, boost::asio::ip::tcp::endpoint(*it, m_serverPort))); accept(tmp); m_acceptors.push_back(tmp); } catch(std::exception& e) { m_pendingStart = true; Scheduler::getInstance().addEvent(createSchedulerTask(5000, boost::bind( &ServicePort::service, boost::weak_ptr<ServicePort>(shared_from_this()), *it, m_serverPort))); } } if(error) m_logError = false; } 3. Modifique o Método ServicePort::open Vamos alterar o código para tratar exceções de maneira adequada, evitando a queda do servidor. A versão modificada do método fica assim: void ServicePort::open(IPAddressList ips, uint16_t port) { m_pendingStart = false; m_serverPort = port; bool error = false; for(IPAddressList::iterator it = ips.begin(); it != ips.end(); ++it) { try { Acceptor_ptr tmp(new boost::asio::ip::tcp::acceptor(m_io_service, boost::asio::ip::tcp::endpoint(*it, m_serverPort))); accept(tmp); m_acceptors.push_back(tmp); } catch(std::exception& e) { // Tratamento de exceção vazio para evitar a queda do servidor } } } Recompile o Servidor Após fazer as modificações, salve o arquivo e recompile o servidor. Com essas mudanças, o servidor não deve mais cair quando uma exceção for lançada ao abrir portas de serviço. Este código foi testado e comprovado eficaz para evitar as quedas. Até mais by L3K0T
  15. L3K0T postou uma resposta no tópico em Arquivo Público
    Este tópico foi arquivado para que possamos fazer a manutenção dos conteúdos na seção onde ele ficava. Ele ficará disponível para consulta à aqueles que precisarem, no entanto permanecerá fechado. Se você precisar comentar sobre ou tirar alguma dúvida busque a seção coerente com o assunto desde tópico ou a de suporte.
  16. L3K0T postou uma resposta no tópico em Sprites
    media fire está fora, deve ser manutenção, tente mais tarde
  17. L3K0T postou uma resposta no tópico em Portal
    kkkk essa versão precisa ser executada como administrador. sobre as ferramenta, procuro as mais atualziadas para por, ja vem com ele
  18. Tela Estendida para OTClient V8 (TFS 0.4) Olá pessoal, hoje estou trazendo uma tela estendida para o OTClient V8 na versão mais recente. Espero que isso seja útil para vocês! Esta versão vem com atualizações de código que são fáceis de entender. Testado em TFS 0.4. Passo 1: Modificações no const.h Abra o arquivo const.h e encontre: #define NETWORK_MAX_SIZE ou #define NETWORKMESSAGE_MAXSIZE Altere para: #define NETWORK_MAX_SIZE 49180 ou, dependendo da sua source, #define NETWORKMESSAGE_MAXSIZE 49180 Passo 2: Modificações no Protocollgame.cpp Encontre: ((x >= myPos.x - 8 + offsetz) && (x <= myPos.x + 9 + offsetz) && //(y >= myPos.y - 6 + offsetz) && (y <= myPos.y + 7 + offsetz)); Altere para: ((x >= myPos.x - Map::maxClientViewportX + offsetz) && (x <= myPos.x + (Map::maxClientViewportX+1) + offsetz) && (y >= myPos.y - Map::maxClientViewportY + offsetz) && (y <= myPos.y + (Map::maxClientViewportY+1) + offsetz)); Passo 3: Atualizações nas descrições do mapa Encontre: GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg); Altere para: GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg); Passo 4: Atualizações na movimentação do personagem Encontre: if(oldPos.y > newPos.y) // north, for old x { msg->put<char>(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if(oldPos.y < newPos.y) // south, for old x { msg->put<char>(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if(oldPos.x < newPos.x) // east, [with new y] { msg->put<char>(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if(oldPos.x > newPos.x) // west, [with new y] { msg->put<char>(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); } Altere para: if (oldPos.y > newPos.y) { // north, for old x msg->put<char>(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->put<char>(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->put<char>(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->put<char>(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } Passo 5: Atualizações na descrição dos pisos Encontre: GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); 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); Altere para: GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); 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); Passo 6: Outras modificações Encontre: GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.z - 3, 18, 14, 3, skip); Altere para: GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.z - 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); Passo 7: Modificações adicionais Encontre: GetMapDescription(oldPos.x - 8, oldPos.y + 1 - 6, newPos.z, 1, 14, msg); Altere para: GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); Passo 8: Atualizações finais Encontre: GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg); ALTERE PARA GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); Passo 9: Mais modificações nas descrições de pisos Encontre: 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); Altere para: 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); Passo 10: Últimas modificações Encontre: GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip); Altere para: GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip); Passo 11: Ajustes finais Encontre: GetMapDescription(oldPos.x + 9, oldPos.y - 1 - 6, newPos.z, 1, 14, msg); Altere para: GetMapDescription(oldPos.x + Map::maxClientViewportX+1, oldPos.y - (Map::maxClientViewportY+1), newPos.z, 1, ((Map::maxClientViewportY+1)*2), msg); Passo 12: Atualizações em MAP.H Abra o arquivo MAP.H do servidor e encontre: static const int32_t maxViewportX = 11; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 11; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 8; static const int32_t maxClientViewportY = 6; Altere para: static const int32_t maxViewportX = 15; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 15; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 14; static const int32_t maxClientViewportY = 12; Pronto, agora é só compilar as sources do seu servidor no modo Rebuild para apagar o cache. Parte 2: OTClient 0.6.6 Abra o arquivo map.cpp das sources do OTClient V8 e encontre: void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); } Altere para: void Map::resetAwareRange() { AwareRange range; range.left = 14; //Change this to = maxClientViewportX range.top = 12; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); } Compile a source do OTClient também no modo Rebuild e pronto!
  19. O melhor do Tibia com a magia de Harry Potter! Descubra todas as novidades e melhorias que preparamos para você. Otclient V8 com bot incluído: Experimente uma jogabilidade mais prática e funcional com nosso Otclient V8, que vem com um bot integrado para facilitar suas tarefas diárias no jogo. Hunts privadas: Desfrute de locais exclusivos para caçar com seus amigos, proporcionando uma experiência única e personalizada sem interrupções. Sprites reformuladas: Aproveite visuais totalmente renovados que trazem uma nova vida ao jogo, tornando cada aventura mais envolvente e emocionante. Mapa brilhante e otimizado: Nosso mapa foi cuidadosamente revisado e otimizado, garantindo uma navegação fluida e a descoberta de novos locais emocionantes. Melhorias em áreas específicas tornam o ambiente mais desafiador e gratificante. Scripts totalmente refeitos: Implementamos uma série de novos scripts para melhorar a jogabilidade. Exemplos incluem um sistema de pets que permite que você tenha companheiros leais em suas aventuras, vassouras mágicas para uma locomoção rápida e NPCs customizados para interações mais ricas e variadas. Limpeza de scripts desnecessários: Removemos scripts que não adicionavam valor ao jogo, tornando-o mais leve e rápido. Agora, com comandos úteis e balanceados, você terá uma experiência mais fluida e eficiente. Balanciamento de spells: Ajustamos o dano das spells de ataque para que sejam proporcionais ao nível de magia (ML) do jogador, ao invés de um dano fixo. Isso traz um novo nível de estratégia ao combate, tornando cada batalha mais desafiadora e justa. Site exclusivo e OTClient desenvolvido pela nossa equipe: Nosso site exclusivo e o OTClient foram desenvolvidos por nossa equipe dedicada, oferecendo uma interface intuitiva e funcional, com todas as informações e ferramentas que você precisa para uma experiência de jogo completa. Sistema de craft: Introduzimos um sistema de craft robusto, permitindo que você crie seus próprios itens a partir de materiais coletados durante suas aventuras. Descubra novas receitas e possibilidades que vão aprimorar ainda mais sua jornada. Venha fazer parte dessa jornada mágica em Tibia Harry Potter Origin! Transforme-se em um verdadeiro bruxo e explore um mundo cheio de aventuras e mistérios. Junte-se a nós e viva a magia!** Não perca a oportunidade de embarcar nesta experiência única e desafiadora, onde cada detalhe foi pensado para proporcionar o máximo de diversão e imersão. Site: https://thpo.com.br seguro Discord: https://discord.gg/HCUP82gTFH +de 100 membros ja
  20. L3K0T postou uma resposta no tópico em Portal
    Tibia Ginius Versão 1.1 by L3K0T O Tibia Genius, desenvolvido por L3K0T, é uma ferramenta essencial para desenvolvedores de OTServ que desejam otimizar e simplificar o processo de desenvolvimento dos seus servidores. Essa ferramenta integra diversas funcionalidades que eliminam a necessidade de utilizar múltiplos programas para tarefas distintas. Entre suas principais funcionalidades, destacam-se: Item Editor: Permite a edição detalhada dos itens do jogo, facilitando a criação e modificação de itens conforme a necessidade do servidor. RME (Remere's Map Editor): Um editor de mapas completo que oferece uma interface intuitiva para criar e modificar mapas do jogo. Object Builder: Ferramenta para a construção e edição de objetos no jogo, essencial para personalizar a experiência do jogador. Mapa Converter: Utilitário que converte mapas entre diferentes formatos, garantindo compatibilidade e facilitando a integração de mapas em diversos servidores. Servidor Integrado: Opção para iniciar o servidor diretamente no ambiente Windows para testes, eliminando a necessidade de configurar servidores externos para verificações rápidas. Acesso Facilitado às Pastas: Botões dedicados para acessar rapidamente as pastas do servidor, aumentando a eficiência no gerenciamento dos arquivos do servidor. Antes de utilizar o Tibia Genius, é necessário importar o servidor. Isso é feito através do botão "Selecionar Servidor", onde o usuário deve especificar a pasta do servidor para que todas as funcionalidades possam ser utilizadas de forma integrada. Da mesma forma, para utilizar o RME e o Item Editor, é preciso importar os arquivos SPR e DAT do cliente do jogo. Com o Tibia Genius, l3k0t proporciona uma solução tudo-em-um para desenvolvedores de OTServ, tornando o processo de desenvolvimento mais ágil e centralizado, ao mesmo tempo que oferece ferramentas poderosas e de fácil acesso para a criação e manutenção de servidores personalizados. Espero que ajude os preguiçosos risos, qualquer coisa reporte e ajude a melhorar, ideias são todas bem vindas! Download GitHub: https://github.com/l3k0t/Tibia_Ginius Scan Virus Total: https://www.virustotal.com/gui/file/f406f1310f8c5f403c35115eaaddc609ccdff2ff56b4a96b619ac7df914829e1?nocache=1 Discord do Projeto: https://discord.gg/MGD55hPWYf
  21. compilar a versão do cliente para versão 8.60 v2 ou 8.60 v1 por isso... se ainda n funcionar, compile no modo estendido ou visse versa.
  22. faça esse procedimento para mehah https://otland.net/threads/compiling-otclient-mehah-in-visual-studio-2022.288711/ faça esse procedimento apenas para v8 https://github.com/OTAcademy/otclientv8 *não em problema se tiver mais bibliotecas não vai dar conflito.

Informação Importante

Confirmação de Termo