Core/Player: Fixed faction change for characters that don't have any quests completed, patch by [email protected]

Closes issue #5203.

--HG--
branch : trunk
extra : rebase_source : 6a7676a125be28e5b150db9f27d3488899f6c728
This commit is contained in:
Shauren
2010-12-23 19:15:44 +01:00
parent f3dd337c6a
commit 3b903693aa
@@ -1438,12 +1438,13 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
recv_data >> newname; recv_data >> newname;
recv_data >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face >> race; recv_data >> gender >> skin >> hairColor >> hairStyle >> facialHair >> face >> race;
QueryResult result = CharacterDatabase.PQuery("SELECT class, level, at_login FROM characters WHERE guid ='%u'", GUID_LOPART(guid)); uint32 lowGuid = GUID_LOPART(guid);
QueryResult result = CharacterDatabase.PQuery("SELECT class, level, at_login FROM characters WHERE guid ='%u'", lowGuid);
if (!result) if (!result)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_CREATE_ERROR); data << uint8(CHAR_CREATE_ERROR);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
@@ -1457,7 +1458,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_CREATE_ERROR); data << uint8(CHAR_CREATE_ERROR);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
@@ -1465,7 +1466,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_CREATE_ERROR); data << uint8(CHAR_CREATE_ERROR);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
@@ -1476,7 +1477,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_CREATE_ERROR); data << uint8(CHAR_CREATE_ERROR);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
} }
@@ -1486,7 +1487,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_NAME_NO_NAME); data << uint8(CHAR_NAME_NO_NAME);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
@@ -1495,7 +1496,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(res); data << uint8(res);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
@@ -1504,7 +1505,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_NAME_RESERVED); data << uint8(CHAR_NAME_RESERVED);
SendPacket( &data ); SendPacket (&data);
return; return;
} }
@@ -1515,7 +1516,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
{ {
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1);
data << uint8(CHAR_CREATE_NAME_IN_USE); data << uint8(CHAR_CREATE_NAME_IN_USE);
SendPacket( &data ); SendPacket(&data);
return; return;
} }
} }
@@ -1523,13 +1524,13 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
CharacterDatabase.escape_string(newname); CharacterDatabase.escape_string(newname);
Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair); Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair);
SQLTransaction trans = CharacterDatabase.BeginTransaction(); SQLTransaction trans = CharacterDatabase.BeginTransaction();
trans->PAppend("UPDATE `characters` SET name = '%s', race = '%u', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), race, uint32(used_loginFlag), GUID_LOPART(guid)); trans->PAppend("UPDATE `characters` SET name='%s', race='%u', at_login=at_login & ~ %u WHERE guid='%u'", newname.c_str(), race, used_loginFlag, lowGuid);
trans->PAppend("DELETE FROM character_declinedname WHERE guid ='%u'", GUID_LOPART(guid)); trans->PAppend("DELETE FROM character_declinedname WHERE guid ='%u'", lowGuid);
BattlegroundTeamId team; BattlegroundTeamId team = BG_TEAM_ALLIANCE;
// Search each faction is targeted // Search each faction is targeted
switch(race) switch (race)
{ {
case RACE_ORC: case RACE_ORC:
case RACE_TAUREN: case RACE_TAUREN:
@@ -1539,58 +1540,57 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
team = BG_TEAM_HORDE; team = BG_TEAM_HORDE;
break; break;
default: default:
team = BG_TEAM_ALLIANCE;
break; break;
} }
// Switch Languages // Switch Languages
// delete all languages first // delete all languages first
trans->PAppend("DELETE FROM `character_skills` WHERE `skill` IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND `guid`='%u'", GUID_LOPART(guid)); trans->PAppend("DELETE FROM `character_skills` WHERE `skill` IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND `guid`='%u'", lowGuid);
// now add them back // now add them back
if (team == BG_TEAM_ALLIANCE) if (team == BG_TEAM_ALLIANCE)
{ {
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 98, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 98, 300, 300)", lowGuid);
switch (race) switch (race)
{ {
case RACE_DWARF: case RACE_DWARF:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 111, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 111, 300, 300)", lowGuid);
break; break;
case RACE_DRAENEI: case RACE_DRAENEI:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 759, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 759, 300, 300)", lowGuid);
break; break;
case RACE_GNOME: case RACE_GNOME:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 313, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 313, 300, 300)", lowGuid);
break; break;
case RACE_NIGHTELF: case RACE_NIGHTELF:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 113, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 113, 300, 300)", lowGuid);
break; break;
} }
} }
else if (team == BG_TEAM_HORDE) else if (team == BG_TEAM_HORDE)
{ {
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 109, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 109, 300, 300)", lowGuid);
switch (race) switch (race)
{ {
case RACE_UNDEAD_PLAYER: case RACE_UNDEAD_PLAYER:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 673, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 673, 300, 300)", lowGuid);
break; break;
case RACE_TAUREN: case RACE_TAUREN:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 115, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 115, 300, 300)", lowGuid);
break; break;
case RACE_TROLL: case RACE_TROLL:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 315, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 315, 300, 300)", lowGuid);
break; break;
case RACE_BLOODELF: case RACE_BLOODELF:
trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 137, 300, 300)", GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 137, 300, 300)", lowGuid);
break; break;
} }
} }
if(recv_data.GetOpcode() == CMSG_CHAR_FACTION_CHANGE) if (recv_data.GetOpcode() == CMSG_CHAR_FACTION_CHANGE)
{ {
// Delete all Flypaths // Delete all Flypaths
trans->PAppend("UPDATE `characters` SET taxi_path = '' WHERE guid ='%u'",GUID_LOPART(guid)); trans->PAppend("UPDATE `characters` SET taxi_path = '' WHERE guid ='%u'", lowGuid);
if (level > 7) if (level > 7)
{ {
@@ -1632,7 +1632,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
taximaskstream << "0 "; taximaskstream << "0 ";
taximaskstream << "0"; taximaskstream << "0";
std::string taximask = taximaskstream.str(); std::string taximask = taximaskstream.str();
trans->PAppend("UPDATE `characters` SET `taximask`= '%s' WHERE `guid` = '%u'", taximask.c_str(), GUID_LOPART(guid)); trans->PAppend("UPDATE `characters` SET `taximask`= '%s' WHERE `guid` = '%u'", taximask.c_str(), lowGuid);
} }
// Delete all current quests // Delete all current quests
@@ -1667,36 +1667,37 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
std::string questsStr = quests.str(); std::string questsStr = quests.str();
questsStr = questsStr.substr(0, questsStr.length() - 1); questsStr = questsStr.substr(0, questsStr.length() - 1);
trans->PAppend("DELETE FROM `character_queststatus` WHERE guid= '%u' AND quest IN (%s)",GUID_LOPART(guid),questsStr.c_str()); if (!questsStr.empty())
trans->PAppend("DELETE FROM `character_queststatus` WHERE guid='%u' AND quest IN (%s)", lowGuid, questsStr.c_str());
} }
if (!sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD)) if (!sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD))
{ {
// Reset guild // Reset guild
trans->PAppend("DELETE FROM `guild_member` WHERE `guid`= '%u'",GUID_LOPART(guid)); trans->PAppend("DELETE FROM `guild_member` WHERE `guid`= '%u'", lowGuid);
} }
if (!sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND)) if (!sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND))
{ {
// Delete Friend List // Delete Friend List
trans->PAppend("DELETE FROM `character_social` WHERE `guid`= '%u'",GUID_LOPART(guid)); trans->PAppend("DELETE FROM `character_social` WHERE `guid`= '%u'", lowGuid);
trans->PAppend("DELETE FROM `character_social` WHERE `friend`= '%u'",GUID_LOPART(guid)); trans->PAppend("DELETE FROM `character_social` WHERE `friend`= '%u'", lowGuid);
} }
// Leave Arena Teams // Leave Arena Teams
Player::LeaveAllArenaTeams(GUID_LOPART(guid)); Player::LeaveAllArenaTeams(guid);
// Reset homebind and position // Reset homebind and position
trans->PAppend("DELETE FROM `character_homebind` WHERE guid = '%u'",GUID_LOPART(guid)); trans->PAppend("DELETE FROM `character_homebind` WHERE guid = '%u'", lowGuid);
if(team == BG_TEAM_ALLIANCE) if (team == BG_TEAM_ALLIANCE)
{ {
trans->PAppend("INSERT INTO `character_homebind` VALUES (%u,0,1519,-8867.68,673.373,97.9034)",GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_homebind` VALUES (%u,0,1519,-8867.68,673.373,97.9034)", lowGuid);
Player::SavePositionInDB(0, -8867.68f, 673.373f, 97.9034f, 0.0f, 1519, GUID_LOPART(guid)); Player::SavePositionInDB(0, -8867.68f, 673.373f, 97.9034f, 0.0f, 1519, lowGuid);
} }
else else
{ {
trans->PAppend("INSERT INTO `character_homebind` VALUES (%u,1,1637,1633.33,-4439.11,15.7588)",GUID_LOPART(guid)); trans->PAppend("INSERT INTO `character_homebind` VALUES (%u,1,1637,1633.33,-4439.11,15.7588)", lowGuid);
Player::SavePositionInDB(1, 1633.33f, -4439.11f, 15.7588f, 0.0f, 1637, GUID_LOPART(guid)); Player::SavePositionInDB(1, 1633.33f, -4439.11f, 15.7588f, 0.0f, 1637, lowGuid);
} }
// Achievement conversion // Achievement conversion
@@ -1705,9 +1706,9 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
uint32 achiev_alliance = it->first; uint32 achiev_alliance = it->first;
uint32 achiev_horde = it->second; uint32 achiev_horde = it->second;
trans->PAppend("DELETE FROM `character_achievement` WHERE `achievement`=%u AND `guid`=%u", trans->PAppend("DELETE FROM `character_achievement` WHERE `achievement`=%u AND `guid`=%u",
team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, GUID_LOPART(guid)); team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, lowGuid);
trans->PAppend("UPDATE `character_achievement` SET achievement = '%u' where achievement = '%u' AND guid = '%u'", trans->PAppend("UPDATE `character_achievement` SET achievement = '%u' where achievement = '%u' AND guid = '%u'",
team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, team == BG_TEAM_ALLIANCE ? achiev_horde : achiev_alliance, GUID_LOPART(guid)); team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, team == BG_TEAM_ALLIANCE ? achiev_horde : achiev_alliance, lowGuid);
} }
// Item conversion // Item conversion
@@ -1725,9 +1726,9 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
uint32 spell_alliance = it->first; uint32 spell_alliance = it->first;
uint32 spell_horde = it->second; uint32 spell_horde = it->second;
trans->PAppend("DELETE FROM `character_spell` WHERE `spell`=%u AND `guid`=%u", trans->PAppend("DELETE FROM `character_spell` WHERE `spell`=%u AND `guid`=%u",
team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, GUID_LOPART(guid)); team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, lowGuid);
trans->PAppend("UPDATE `character_spell` SET spell = '%u' where spell = '%u' AND guid = '%u'", trans->PAppend("UPDATE `character_spell` SET spell = '%u' where spell = '%u' AND guid = '%u'",
team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, team == BG_TEAM_ALLIANCE ? spell_horde : spell_alliance, GUID_LOPART(guid)); team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, team == BG_TEAM_ALLIANCE ? spell_horde : spell_alliance, lowGuid);
} }
// Reputation conversion // Reputation conversion
@@ -1736,16 +1737,16 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)
uint32 reputation_alliance = it->first; uint32 reputation_alliance = it->first;
uint32 reputation_horde = it->second; uint32 reputation_horde = it->second;
trans->PAppend("DELETE FROM character_reputation WHERE faction = '%u' AND guid = '%u'", trans->PAppend("DELETE FROM character_reputation WHERE faction = '%u' AND guid = '%u'",
team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, GUID_LOPART(guid)); team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, lowGuid);
trans->PAppend("UPDATE `character_reputation` SET faction = '%u' where faction = '%u' AND guid = '%u'", trans->PAppend("UPDATE `character_reputation` SET faction = '%u' where faction = '%u' AND guid = '%u'",
team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, team == BG_TEAM_ALLIANCE ? reputation_horde : reputation_alliance, GUID_LOPART(guid)); team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, team == BG_TEAM_ALLIANCE ? reputation_horde : reputation_alliance, lowGuid);
} }
} }
CharacterDatabase.CommitTransaction(trans); CharacterDatabase.CommitTransaction(trans);
std::string IP_str = GetRemoteAddress(); std::string IP_str = GetRemoteAddress();
sLog.outDebug("Account: %d (IP: %s), Character guid: %u Change Race/Faction to: %s", GetAccountId(), IP_str.c_str(), GUID_LOPART(guid), newname.c_str()); sLog.outDebug("Account: %d (IP: %s), Character guid: %u Change Race/Faction to: %s", GetAccountId(), IP_str.c_str(), lowGuid, newname.c_str());
WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1 + 8 + (newname.size() + 1) + 1 + 1 + 1 + 1 + 1 + 1 + 1); WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1 + 8 + (newname.size() + 1) + 1 + 1 + 1 + 1 + 1 + 1 + 1);
data << uint8(RESPONSE_SUCCESS); data << uint8(RESPONSE_SUCCESS);