diff options
Diffstat (limited to 'src/server')
3 files changed, 166 insertions, 59 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 377b5254144..f6051cd4c6e 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1269,9 +1269,19 @@ void WorldSession::HandleSetPlayerDeclinedNames(WorldPacket& recv_data)          CharacterDatabase.EscapeString(declinedname.name[i]);      SQLTransaction trans = CharacterDatabase.BeginTransaction(); -    trans->PAppend("DELETE FROM character_declinedname WHERE guid = '%u'", GUID_LOPART(guid)); -    trans->PAppend("INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES ('%u', '%s', '%s', '%s', '%s', '%s')", -        GUID_LOPART(guid), declinedname.name[0].c_str(), declinedname.name[1].c_str(), declinedname.name[2].c_str(), declinedname.name[3].c_str(), declinedname.name[4].c_str()); + +    PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME); +    stmt->setUInt32(0, GUID_LOPART(guid)); +    trans->Append(stmt); + +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_DECLINED_NAME); +    stmt->setUInt32(0, GUID_LOPART(guid)); + +    for (uint8 i = 0; i < 5; i++) +        stmt->setString(i+1, declinedname.name[i]); + +    trans->Append(stmt); +      CharacterDatabase.CommitTransaction(trans);      WorldPacket data(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, 4+8); @@ -1679,8 +1689,18 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)      CharacterDatabase.EscapeString(newname);      Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair);      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, used_loginFlag, lowGuid); -    trans->PAppend("DELETE FROM character_declinedname WHERE guid ='%u'", lowGuid); + +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_FACTION_OR_RACE); +    stmt->setString(0, newname); +    stmt->setUInt8(1, race); +    stmt->setUInt16(2, used_loginFlag); +    stmt->setUInt32(3, lowGuid); +    trans->Append(stmt); + +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME); +    stmt->setUInt32(0, lowGuid); +    trans->Append(stmt); +      sWorld->UpdateCharacterNameData(GUID_LOPART(guid), newname, gender, race);      BattlegroundTeamId team = BG_TEAM_ALLIANCE; @@ -1701,52 +1721,68 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)      // Switch Languages      // 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'", lowGuid); -    // now add them back +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_LANGUAGES); +    stmt->setUInt32(0, lowGuid); +    trans->Append(stmt); + +    // Now add them back +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILL_LANGUAGE); +    stmt->setUInt32(0, lowGuid); + + +    // Faction specific languages      if (team == BG_TEAM_ALLIANCE)      { -        trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 98, 300, 300)", lowGuid); -        switch (race) -        { -        case RACE_DWARF: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 111, 300, 300)", lowGuid); -            break; -        case RACE_DRAENEI: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 759, 300, 300)", lowGuid); -            break; -        case RACE_GNOME: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 313, 300, 300)", lowGuid); -            break; -        case RACE_NIGHTELF: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 113, 300, 300)", lowGuid); -            break; -        } +        stmt->setUInt16(1, 98);      }      else if (team == BG_TEAM_HORDE)      { -        trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 109, 300, 300)", lowGuid); -        switch (race) -        { -        case RACE_UNDEAD_PLAYER: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 673, 300, 300)", lowGuid); -            break; -        case RACE_TAUREN: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 115, 300, 300)", lowGuid); -            break; -        case RACE_TROLL: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 315, 300, 300)", lowGuid); -            break; -        case RACE_BLOODELF: -            trans->PAppend("INSERT INTO `character_skills` (guid, skill, value, max) VALUES (%u, 137, 300, 300)", lowGuid); -            break; -        } +        stmt->setUInt16(1, 109);      } +    trans->Append(stmt); + +    // Race specific languages +    stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILL_LANGUAGE); +    stmt->setUInt32(0, lowGuid); + +    switch (race) +    { +    case RACE_DWARF: +        stmt->setUInt16(1, 111); +        break; +    case RACE_DRAENEI: +        stmt->setUInt16(1, 759); +        break; +    case RACE_GNOME: +        stmt->setUInt16(1, 313); +        break; +    case RACE_NIGHTELF: +        stmt->setUInt16(1, 113); +        break; +    case RACE_UNDEAD_PLAYER: +        stmt->setUInt16(1, 673); +        break; +    case RACE_TAUREN: +        stmt->setUInt16(1, 115); +        break; +    case RACE_TROLL: +        stmt->setUInt16(1, 315); +        break; +    case RACE_BLOODELF: +        stmt->setUInt16(1, 137); +        break; +    } + +    trans->Append(stmt); +      if (recv_data.GetOpcode() == CMSG_CHAR_FACTION_CHANGE)      {          // Delete all Flypaths -        trans->PAppend("UPDATE `characters` SET taxi_path = '' WHERE guid ='%u'", lowGuid); +        PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_TAXI_PATH); +        stmt->setUInt32(0, lowGuid); +        trans->Append(stmt);          if (level > 7)          { @@ -1788,11 +1824,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)                  taximaskstream << "0 ";              taximaskstream << '0';              std::string taximask = taximaskstream.str(); -            trans->PAppend("UPDATE `characters` SET `taximask`= '%s' WHERE `guid` = '%u'", taximask.c_str(), lowGuid); + +            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_TAXIMASK); +            stmt->setString(0, taximask); +            stmt->setUInt32(1, lowGuid); +            trans->Append(stmt);          }          // Delete all current quests -        trans->PAppend("DELETE FROM `character_queststatus` WHERE guid ='%u'", GUID_LOPART(guid)); +        stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS); +        stmt->setUInt32(0, GUID_LOPART(guid)); +        trans->Append(stmt);          // Delete record of the faction old completed quests          { @@ -1843,15 +1885,21 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)          if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND))          {              // Delete Friend List -            trans->PAppend("DELETE FROM `character_social` WHERE `guid`= '%u'", lowGuid); -            trans->PAppend("DELETE FROM `character_social` WHERE `friend`= '%u'", lowGuid); +            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID); +            stmt->setUInt32(0, lowGuid); +            trans->Append(stmt); + +            stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND); +            stmt->setUInt32(0, lowGuid); +            trans->Append(stmt); +          }          // Leave Arena Teams          Player::LeaveAllArenaTeams(guid);          // Reset homebind and position -        PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND); +        stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);          stmt->setUInt32(0, lowGuid);          trans->Append(stmt); @@ -1882,10 +1930,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)          {              uint32 achiev_alliance = it->first;              uint32 achiev_horde = it->second; -            trans->PAppend("DELETE FROM `character_achievement` WHERE `achievement`=%u AND `guid`=%u", -                            team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde, lowGuid); -            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, lowGuid); + +            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT); +            stmt->setUInt16(0, uint16(team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde)); +            stmt->setUInt32(1, lowGuid); +            trans->Append(stmt); + +            stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACHIEVEMENT); +            stmt->setUInt16(0, uint16(team == BG_TEAM_ALLIANCE ? achiev_alliance : achiev_horde)); +            stmt->setUInt16(1, uint16(team == BG_TEAM_ALLIANCE ? achiev_horde : achiev_alliance)); +            stmt->setUInt32(2, lowGuid); +            trans->Append(stmt);          }          // Item conversion @@ -1893,8 +1948,12 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)          {              uint32 item_alliance = it->first;              uint32 item_horde = it->second; -            trans->PAppend("UPDATE `item_instance` ii, `character_inventory` ci SET ii.itemEntry = '%u' WHERE ii.itemEntry = '%u' AND ci.guid = '%u' AND ci.item = ii.guid", -                team == BG_TEAM_ALLIANCE ? item_alliance : item_horde, team == BG_TEAM_ALLIANCE ? item_horde : item_alliance, guid); + +            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE); +            stmt->setUInt32(0, (team == BG_TEAM_ALLIANCE ? item_alliance : item_horde)); +            stmt->setUInt32(1, (team == BG_TEAM_ALLIANCE ? item_horde : item_alliance)); +            stmt->setUInt32(2, guid); +            trans->Append(stmt);          }          // Spell conversion @@ -1902,10 +1961,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)          {              uint32 spell_alliance = it->first;              uint32 spell_horde = it->second; -            trans->PAppend("DELETE FROM `character_spell` WHERE `spell`=%u AND `guid`=%u", -                            team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde, lowGuid); -            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, lowGuid); + +            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL); +            stmt->setUInt32(0, (team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde)); +            stmt->setUInt32(1, lowGuid); +            trans->Append(stmt); + +            stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE); +            stmt->setUInt32(0, (team == BG_TEAM_ALLIANCE ? spell_alliance : spell_horde)); +            stmt->setUInt32(1, (team == BG_TEAM_ALLIANCE ? spell_horde : spell_alliance)); +            stmt->setUInt32(2, lowGuid); +            trans->Append(stmt);          }          // Reputation conversion @@ -1913,10 +1979,17 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data)          {              uint32 reputation_alliance = it->first;              uint32 reputation_horde = it->second; -            trans->PAppend("DELETE FROM character_reputation WHERE faction = '%u' AND guid = '%u'", -                team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde, lowGuid); -            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, lowGuid); + +            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REP_BY_FACTION); +            stmt->setUInt32(0, uint16(team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde)); +            stmt->setUInt32(1, lowGuid); +            trans->Append(stmt); + +            stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE); +            stmt->setUInt16(0, uint16(team == BG_TEAM_ALLIANCE ? reputation_alliance : reputation_horde)); +            stmt->setUInt16(1, uint16(team == BG_TEAM_ALLIANCE ? reputation_horde : reputation_alliance)); +            stmt->setUInt32(2, lowGuid); +            trans->Append(stmt);          }      } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index cf3b7fdd5e6..d6019d0b6da 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -483,4 +483,21 @@ void CharacterDatabaseConnection::DoPrepareStatements()      PREPARE_STATEMENT(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? and spell = ?", CONNECTION_ASYNC);      PREPARE_STATEMENT(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_ASYNC);      PREPARE_STATEMENT(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_DECLINED_NAME, "DELETE FROM character_declinedname WHERE guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_INS_CHAR_DECLINED_NAME, "INSERT INTO character_declinedname (guid, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_FACTION_OR_RACE, "UPDATE characters SET name = ?, race = ?, at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_SKILL_LANGUAGES, "DELETE FROM character_skills WHERE skill IN (98, 113, 759, 111, 313, 109, 115, 315, 673, 137) AND guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_INS_CHAR_SKILL_LANGUAGE, "INSERT INTO `character_skills` (guid, skill, value, max) VALUES (?, ?, 300, 300)", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_CHAR_TAXI_PATH, "UPDATE characters SET taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_CHAR_TAXIMASK, "UPDATE characters SET taximask = ? WHERE guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_QUESTSTATUS, "DELETE FROM character_queststatus WHERE guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_SOCIAL_BY_GUID, "DELETE FROM character_social WHERE guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, "DELETE FROM character_social WHERE friend = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, "DELETE FROM character_achievement WHERE achievement = ? AND guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_CHAR_ACHIEVEMENT, "UPDATE character_achievement SET achievement = ? where achievement = ? AND guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, "UPDATE item_instance ii, character_inventory ci SET ii.itemEntry = ? WHERE ii.itemEntry = ? AND ci.guid = ? AND ci.item = ii.guid", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_SPELL_BY_SPELL, "DELETE FROM character_spell WHERE spell = ? AND guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, "UPDATE character_spell SET spell = ? where spell = ? AND guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_DEL_CHAR_REP_BY_FACTION, "DELETE FROM character_reputation WHERE faction = ? AND guid = ?", CONNECTION_ASYNC); +    PREPARE_STATEMENT(CHAR_UPD_CHAR_REP_FACTION_CHANGE, "UPDATE character_reputation SET faction = ? where faction = ? AND guid = ?", CONNECTION_ASYNC);  } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index 0fce8d51c2f..05d0d0e6d36 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -446,6 +446,23 @@ enum CharacterDatabaseStatements      CHAR_DEL_PET_SPELL_BY_SPELL,      CHAR_INS_PET_SPELL,      CHAR_INS_PET_AURA, +    CHAR_DEL_CHAR_DECLINED_NAME, +    CHAR_INS_CHAR_DECLINED_NAME, +    CHAR_UPD_FACTION_OR_RACE, +    CHAR_DEL_CHAR_SKILL_LANGUAGES, +    CHAR_INS_CHAR_SKILL_LANGUAGE, +    CHAR_UPD_CHAR_TAXI_PATH, +    CHAR_UPD_CHAR_TAXIMASK, +    CHAR_DEL_CHAR_QUESTSTATUS, +    CHAR_DEL_CHAR_SOCIAL_BY_GUID, +    CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, +    CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, +    CHAR_UPD_CHAR_ACHIEVEMENT, +    CHAR_UPD_CHAR_INVENTORY_FACTION_CHANGE, +    CHAR_DEL_CHAR_SPELL_BY_SPELL, +    CHAR_UPD_CHAR_SPELL_FACTION_CHANGE, +    CHAR_DEL_CHAR_REP_BY_FACTION, +    CHAR_UPD_CHAR_REP_FACTION_CHANGE,      MAX_CHARACTERDATABASE_STATEMENTS,  };  | 
