mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-03 16:03:52 +00:00
Detect server disconnect during character loading and show error
GameHandler::update() now detects when the socket closes mid-session (e.g. Warden rejection) and transitions to DISCONNECTED state. Character screen shows a disconnect message instead of hanging on "Loading characters..." forever. Reverted SHA1(seed+module) fallback to SHA1(seed) since neither is correct without module execution.
This commit is contained in:
parent
1a463b5a48
commit
b6bcdf0d74
2 changed files with 24 additions and 6 deletions
|
|
@ -253,6 +253,13 @@ void GameHandler::update(float deltaTime) {
|
||||||
auto socketEnd = std::chrono::high_resolution_clock::now();
|
auto socketEnd = std::chrono::high_resolution_clock::now();
|
||||||
socketTime += std::chrono::duration<float, std::milli>(socketEnd - socketStart).count();
|
socketTime += std::chrono::duration<float, std::milli>(socketEnd - socketStart).count();
|
||||||
|
|
||||||
|
// Detect server-side disconnect (socket closed during update)
|
||||||
|
if (socket && !socket->isConnected() && state != WorldState::DISCONNECTED) {
|
||||||
|
LOG_WARNING("Server closed connection in state: ", worldStateName(state));
|
||||||
|
disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Post-gate visibility: determine whether server goes silent or closes after Warden requirement.
|
// Post-gate visibility: determine whether server goes silent or closes after Warden requirement.
|
||||||
if (wardenGateSeen_ && socket && socket->isConnected()) {
|
if (wardenGateSeen_ && socket && socket->isConnected()) {
|
||||||
wardenGateElapsed_ += deltaTime;
|
wardenGateElapsed_ += deltaTime;
|
||||||
|
|
@ -2281,13 +2288,12 @@ void GameHandler::handleWardenData(network::Packet& packet) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// SHA1(seed + moduleImage) — the server verifies this against its own copy
|
// SHA1(seed) fallback — wrong answer but sends a response to avoid silent hang.
|
||||||
|
// Correct answer requires executing the Warden module via emulator (not yet functional).
|
||||||
|
// Server will likely disconnect, but GameHandler::update() now detects that gracefully.
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> hashInput;
|
auto hash = auth::Crypto::sha1(seed);
|
||||||
hashInput.insert(hashInput.end(), seed.begin(), seed.end());
|
LOG_WARNING("Warden: Sending SHA1(seed) fallback — server will likely reject");
|
||||||
hashInput.insert(hashInput.end(), wardenModuleData_.begin(), wardenModuleData_.end());
|
|
||||||
auto hash = auth::Crypto::sha1(hashInput);
|
|
||||||
LOG_INFO("Warden: SHA1 fallback hash over ", hashInput.size(), " bytes (seed+module)");
|
|
||||||
std::vector<uint8_t> resp;
|
std::vector<uint8_t> resp;
|
||||||
resp.push_back(0x04);
|
resp.push_back(0x04);
|
||||||
resp.insert(resp.end(), hash.begin(), hash.end());
|
resp.insert(resp.end(), hash.begin(), hash.end());
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,18 @@ void CharacterScreen::render(game::GameHandler& gameHandler) {
|
||||||
// Get character list
|
// Get character list
|
||||||
const auto& characters = gameHandler.getCharacters();
|
const auto& characters = gameHandler.getCharacters();
|
||||||
|
|
||||||
|
// Handle disconnected state (e.g. Warden kicked us)
|
||||||
|
if (gameHandler.getState() == game::WorldState::DISCONNECTED ||
|
||||||
|
gameHandler.getState() == game::WorldState::FAILED) {
|
||||||
|
ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "Disconnected from server.");
|
||||||
|
ImGui::TextWrapped("The server closed the connection. This may be caused by "
|
||||||
|
"anti-cheat (Warden) verification failure.");
|
||||||
|
ImGui::Spacing();
|
||||||
|
if (ImGui::Button("Back", ImVec2(120, 36))) { if (onBack) onBack(); }
|
||||||
|
ImGui::End();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Request character list if not available.
|
// Request character list if not available.
|
||||||
// Also show a loading state while CHAR_LIST_REQUESTED is in-flight (characters may be cleared to avoid stale UI).
|
// Also show a loading state while CHAR_LIST_REQUESTED is in-flight (characters may be cleared to avoid stale UI).
|
||||||
if (characters.empty() &&
|
if (characters.empty() &&
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue