mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-03 08:03:50 +00:00
Fix character creation on Turtle WoW (4 extra bytes + IN_PROGRESS handling)
CMSG_CHAR_CREATE was silently dropped by the server because the packet was 4 bytes too short. Wireshark capture of the real 1.12.1 client revealed 4 trailing zero bytes after outfitId. Also treat IN_PROGRESS (code 46) as success since Turtle WoW sends it instead of SUCCESS.
This commit is contained in:
parent
f9e6f8b045
commit
b67cdc261c
2 changed files with 14 additions and 2 deletions
|
|
@ -1798,8 +1798,8 @@ void GameHandler::handleCharCreateResponse(network::Packet& packet) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.result == CharCreateResult::SUCCESS) {
|
if (data.result == CharCreateResult::SUCCESS || data.result == CharCreateResult::IN_PROGRESS) {
|
||||||
LOG_INFO("Character created successfully");
|
LOG_INFO("Character created successfully (code=", static_cast<int>(data.result), ")");
|
||||||
requestCharacterList();
|
requestCharacterList();
|
||||||
if (charCreateCallback_) {
|
if (charCreateCallback_) {
|
||||||
charCreateCallback_(true, "Character created!");
|
charCreateCallback_(true, "Character created!");
|
||||||
|
|
@ -1821,6 +1821,15 @@ void GameHandler::handleCharCreateResponse(network::Packet& packet) {
|
||||||
case CharCreateResult::LEVEL_REQUIREMENT: msg = "Level requirement not met"; break;
|
case CharCreateResult::LEVEL_REQUIREMENT: msg = "Level requirement not met"; break;
|
||||||
case CharCreateResult::UNIQUE_CLASS_LIMIT: msg = "Unique class limit reached"; break;
|
case CharCreateResult::UNIQUE_CLASS_LIMIT: msg = "Unique class limit reached"; break;
|
||||||
case CharCreateResult::RESTRICTED_RACECLASS: msg = "Race/class combination not allowed"; break;
|
case CharCreateResult::RESTRICTED_RACECLASS: msg = "Race/class combination not allowed"; break;
|
||||||
|
case CharCreateResult::IN_PROGRESS: msg = "Character creation in progress..."; break;
|
||||||
|
case CharCreateResult::CHARACTER_CHOOSE_RACE: msg = "Please choose a different race"; break;
|
||||||
|
case CharCreateResult::CHARACTER_ARENA_LEADER: msg = "Arena team leader restriction"; break;
|
||||||
|
case CharCreateResult::CHARACTER_DELETE_MAIL: msg = "Character has mail"; break;
|
||||||
|
case CharCreateResult::CHARACTER_SWAP_FACTION: msg = "Faction swap restriction"; break;
|
||||||
|
case CharCreateResult::CHARACTER_RACE_ONLY: msg = "Race-only restriction"; break;
|
||||||
|
case CharCreateResult::CHARACTER_GOLD_LIMIT: msg = "Gold limit reached"; break;
|
||||||
|
case CharCreateResult::FORCE_LOGIN: msg = "Force login required"; break;
|
||||||
|
case CharCreateResult::CHARACTER_IN_GUILD: msg = "Character is in a guild"; break;
|
||||||
// Name validation errors
|
// Name validation errors
|
||||||
case CharCreateResult::NAME_FAILURE: msg = "Invalid name"; break;
|
case CharCreateResult::NAME_FAILURE: msg = "Invalid name"; break;
|
||||||
case CharCreateResult::NAME_NO_NAME: msg = "Please enter a name"; break;
|
case CharCreateResult::NAME_NO_NAME: msg = "Please enter a name"; break;
|
||||||
|
|
|
||||||
|
|
@ -299,6 +299,9 @@ network::Packet CharCreatePacket::build(const CharCreateData& data) {
|
||||||
packet.writeUInt8(data.hairColor);
|
packet.writeUInt8(data.hairColor);
|
||||||
packet.writeUInt8(data.facialHair);
|
packet.writeUInt8(data.facialHair);
|
||||||
packet.writeUInt8(0); // outfitId, always 0
|
packet.writeUInt8(0); // outfitId, always 0
|
||||||
|
// Turtle WoW / 1.12.1 clients send 4 extra zero bytes after outfitId.
|
||||||
|
// Servers may validate packet length and silently drop undersized packets.
|
||||||
|
packet.writeUInt32(0);
|
||||||
|
|
||||||
LOG_DEBUG("Built CMSG_CHAR_CREATE: name=", data.name,
|
LOG_DEBUG("Built CMSG_CHAR_CREATE: name=", data.name,
|
||||||
" race=", static_cast<int>(data.race),
|
" race=", static_cast<int>(data.race),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue