diff --git a/src/core/application.cpp b/src/core/application.cpp index a7945e26..5c411a55 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -5385,8 +5385,12 @@ void Application::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float } } } - // After 20s, accept any loaded terrain (fallback for unusual spawns) - if (!groundReady && elapsed >= 20.0f) { + // After 5s with enough tiles loaded, accept terrain as ready even if + // the height sample doesn't match spawn Z exactly. This handles cases + // where getHeightAt returns a slightly different value than the server's + // spawn Z (e.g. terrain LOD, MCNK chunk boundaries, or spawn inside a + // building where floor height differs from terrain below). + if (!groundReady && elapsed >= 5.0f) { if (auto* tm = renderer->getTerrainManager()) { if (tm->getLoadedTileCount() >= 4) { groundReady = true; diff --git a/src/game/warden_handler.cpp b/src/game/warden_handler.cpp index 1bd28a73..a5f38714 100644 --- a/src/game/warden_handler.cpp +++ b/src/game/warden_handler.cpp @@ -536,19 +536,16 @@ void WardenHandler::handleWardenData(network::Packet& packet) { bool isClassic = (owner_.build <= 6005) && !isTurtle; if (!isTurtle && !isClassic) { - // WotLK/TBC (AzerothCore, etc.): strict servers BAN for wrong HASH_RESULT. - // Without a matching CR entry we cannot compute the correct hash - // (requires executing the module's native init function). - // Safest action: don't respond. Server will time-out and kick (not ban). + // WotLK/TBC: don't respond to HASH_REQUEST without a valid CR match. + // ChromieCraft/AzerothCore tolerates the silence (no ban, no kick), + // but REJECTS a wrong hash and closes the connection immediately. + // Staying silent lets the server continue the session without Warden checks. LOG_WARNING("Warden: HASH_REQUEST seed=", seedHex, - " — no CR match, SKIPPING response to avoid account ban"); - LOG_WARNING("Warden: To fix, provide a .cr file with the correct seed→reply entry for this module"); - // Stay in WAIT_HASH_REQUEST — server will eventually kick. + " — no CR match, skipping response (server tolerates silence)"); + wardenState_ = WardenState::WAIT_CHECKS; break; } - // Turtle/Classic: lenient servers (log-only penalties, no bans). - // Send a best-effort fallback hash so we can continue the handshake. LOG_WARNING("Warden: No CR match (seed=", seedHex, "), sending fallback hash (lenient server)");