Browse Source

Resolve unexpected login->world issues when there is multiple entries in login_characters for same name and server id

Emagi 1 year ago
parent
commit
fa8642a592

+ 2 - 2
EQ2/source/LoginServer/LoginDatabase.cpp

@@ -535,10 +535,10 @@ bool LoginDatabase::DeleteCharacter(int32 account_id, int32 character_id, int32
 	return true;
 }
 
-string LoginDatabase::GetCharacterName(int32 char_id, int32 server_id){
+string LoginDatabase::GetCharacterName(int32 char_id, int32 server_id, int32 account_id){
 	Query query;
 	MYSQL_ROW row;
-	MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT name from login_characters where char_id=%lu and server_id=%lu and deleted = 0", char_id,server_id);
+	MYSQL_RES* result = query.RunQuery2(Q_SELECT, "SELECT name from login_characters where char_id=%lu and server_id=%lu and account_id=%lu and deleted = 0 limit 1", char_id, server_id, account_id);
 
 	if(result && mysql_num_rows(result) == 1){
 		row = mysql_fetch_row(result);

+ 1 - 1
EQ2/source/LoginServer/LoginDatabase.h

@@ -48,7 +48,7 @@ public:
 	int32 GetServer(int32 accountID, int32 charID, string name);
 	void LoadCharacters(LoginAccount* acct, int16 version);
 	void CheckCharacterTimeStamps(LoginAccount* acct);
-	string GetCharacterName(int32 char_id , int32 server_id);
+	string GetCharacterName(int32 char_id , int32 server_id, int32 account_id);
 	void SaveCharacterColors(int32 char_id, char* type, EQ2_Color color);
 	void SaveCharacterFloats(int32 char_id, char* type, float float1, float float2, float float3);
 	int16 GetAppearanceID(string name);

+ 2 - 2
EQ2/source/LoginServer/client.cpp

@@ -328,7 +328,7 @@ bool Client::Process() {
 						server_id = request->getType_int32_ByName("server_id");	
 					}
 					LWorld* world = world_list.FindByID(server_id);
-					string name = database.GetCharacterName(char_id,server_id);
+					string name = database.GetCharacterName(char_id,server_id,GetAccountID());
 					if(world && name.length() > 0){
 						pending_play_char_id = char_id;
 						ServerPacket* outpack = new ServerPacket(ServerOP_UsertoWorldReq, sizeof(UsertoWorldRequest_Struct));
@@ -628,7 +628,7 @@ void Client::WorldResponse(int32 worldid, int8 response, char* ip_address, int32
 	}
 	if(response != 1){
 		if(response == PLAY_ERROR_CHAR_NOT_LOADED){
-			string pending_play_char_name = database.GetCharacterName(pending_play_char_id, worldid);
+			string pending_play_char_name = database.GetCharacterName(pending_play_char_id, worldid, GetAccountID());
 			if(database.VerifyDelete(GetAccountID(), pending_play_char_id, pending_play_char_name.c_str())){
 				GetLoginAccount()->removeCharacter((char*)pending_play_char_name.c_str());
 			}