diff options
| author | Liberate <tbaart@gmail.com> | 2010-08-27 18:18:26 +0200 |
|---|---|---|
| committer | Liberate <tbaart@gmail.com> | 2010-08-27 18:18:26 +0200 |
| commit | 9bd804deced7dff9e170d19fc7744afb9afb8062 (patch) | |
| tree | 8b8bad6c163f992b1ff1ec9250f10d986948916b /src/server/game/Entities | |
| parent | e2dc4c3a66a53109616bff726bb4f4e198af580b (diff) | |
Updates the arena rating system to use Matchmaker Rating.
The arena_team_stats sql in this commit sets all ratings to 0.
You start with 0 Team Rating and 1500 Matchmaker Rating.
Personal rating is moved to character_arena_stats, and will not reset when disbanding an arena team.
This new system is based on all the info I could get, but Blizzard didn't leak much info about the new system.
At least this system is really close to the official system.
Any issues found should be reported in an issue.
Huge thanks go to Aokromes for the intensive testing he has done with me.
Also thanks to Parzival for hearing me out and giving his ideas.
Fixes issue #3189
--HG--
branch : trunk
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 24 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 49 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 20 |
3 files changed, 64 insertions, 29 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index ecef0276e7a..deac07891a5 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -381,18 +381,18 @@ enum EUnitFields PLAYER_FIELD_BYTES2 = UNIT_END + 0x0439, // Size: 1, Type: 6, Flags: PRIVATE PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x043A, // Size: 1, Type: INT, Flags: PRIVATE PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x043B, // Size: 25, Type: INT, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0454, // Size: 21, Type: INT, Flags: PRIVATE - PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x0469, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x046A, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x046B, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x046C, // Size: 25, Type: INT, Flags: PRIVATE - PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0485, // Size: 4, Type: FLOAT, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x0489, // Size: 3, Type: INT, Flags: PRIVATE - PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x048C, // Size: 6, Type: INT, Flags: PRIVATE - PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0492, // Size: 6, Type: INT, Flags: PRIVATE - PLAYER_GLYPHS_ENABLED = UNIT_END + 0x0498, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_PET_SPELL_POWER = UNIT_END + 0x0499, // Size: 1, Type: INT, Flags: PRIVATE - PLAYER_END = UNIT_END + 0x049A, + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x0454, // Size: 24, Type: INT, Flags: PRIVATE + PLAYER_FIELD_HONOR_CURRENCY = UNIT_END + 0x046C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_ARENA_CURRENCY = UNIT_END + 0x046D, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x046E, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_FIELD_DAILY_QUESTS_1 = UNIT_END + 0x046F, // Size: 25, Type: INT, Flags: PRIVATE + PLAYER_RUNE_REGEN_1 = UNIT_END + 0x0488, // Size: 4, Type: FLOAT, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x048C, // Size: 3, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x048F, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x0495, // Size: 6, Type: INT, Flags: PRIVATE + PLAYER_GLYPHS_ENABLED = UNIT_END + 0x049B, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_PET_SPELL_POWER = UNIT_END + 0x049C, // Size: 1, Type: INT, Flags: PRIVATE + PLAYER_END = UNIT_END + 0x049D, }; enum EGameObjectFields diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3fce503c5c7..73bb481d0bc 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15674,7 +15674,7 @@ void Player::_LoadDeclinedNames(QueryResult_AutoPtr result) void Player::_LoadArenaTeamInfo(QueryResult_AutoPtr result) { - // arenateamid, played_week, played_season, personal_rating + // arenateamid, played_week, played_season, personal_rating, matchmaker_rating memset((void*)&m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1], 0, sizeof(uint32) * MAX_ARENA_SLOT * ARENA_TEAM_END); if (!result) return; @@ -15683,11 +15683,10 @@ void Player::_LoadArenaTeamInfo(QueryResult_AutoPtr result) { Field *fields = result->Fetch(); - uint32 arenateamid = fields[0].GetUInt32(); - uint32 played_week = fields[1].GetUInt32(); - uint32 played_season = fields[2].GetUInt32(); - uint32 wons_season = fields[3].GetUInt32(); - uint32 personal_rating = fields[4].GetUInt32(); + uint32 arenateamid = fields[0].GetUInt32(); + uint32 played_week = fields[1].GetUInt32(); + uint32 played_season = fields[2].GetUInt32(); + uint32 wons_season = fields[3].GetUInt32(); ArenaTeam* aTeam = sObjectMgr.GetArenaTeamById(arenateamid); if (!aTeam) @@ -15703,11 +15702,44 @@ void Player::_LoadArenaTeamInfo(QueryResult_AutoPtr result) SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_GAMES_WEEK, played_week); SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_GAMES_SEASON, played_season); SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_WINS_SEASON, wons_season); - SetArenaTeamInfoField(arenaSlot, ARENA_TEAM_PERSONAL_RATING, personal_rating); - }while (result->NextRow()); } +void Player::_LoadArenaStatsInfo(QueryResult_AutoPtr result) +{ + uint8 slot = 0; + if (!result) + { + for (; slot <= 2; ++slot) + { + CharacterDatabase.PExecute("INSERT INTO character_arena_stats (guid, slot, personal_rating, matchmaker_rating) VALUES (%u, %u, 0, 1500)", GetGUIDLow(), slot); + SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, 0); + } + return; + } + + bool nextrow = true; + do + { + Field *fields = result->Fetch(); + uint32 personalrating = 0; + uint32 matchmakerrating = 1500; + if (fields[0].GetUInt8() > slot) + { + CharacterDatabase.PExecute("INSERT INTO character_arena_stats (guid, slot, personal_rating, matchmaker_rating) VALUES (%u, %u, %u, %u)", GetGUIDLow(), slot, personalrating, matchmakerrating); + SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, personalrating); + slot++; + continue; + } + + personalrating = fields[1].GetUInt32(); + matchmakerrating = fields[2].GetUInt32(); + SetArenaTeamInfoField(slot, ARENA_TEAM_PERSONAL_RATING, personalrating); + slot++; + nextrow = result->NextRow(); + }while (nextrow); +} + void Player::_LoadEquipmentSets(QueryResult_AutoPtr result) { // SetPQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '%u' ORDER BY setindex", GUID_LOPART(m_guid)); @@ -15936,6 +15968,7 @@ bool Player::LoadFromDB(uint32 guid, SQLQueryHolder *holder) _LoadGroup(holder->GetResult(PLAYER_LOGIN_QUERY_LOADGROUP)); _LoadArenaTeamInfo(holder->GetResult(PLAYER_LOGIN_QUERY_LOADARENAINFO)); + _LoadArenaStatsInfo(holder->GetResult(PLAYER_LOGIN_QUERY_LOADARENASTATS)); uint32 arena_currency = fields[39].GetUInt32(); if (arena_currency > sWorld.getIntConfig(CONFIG_MAX_ARENA_POINTS)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 90d5b4494b3..267abba9e9f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -700,14 +700,14 @@ enum InstanceResetWarningType // PLAYER_FIELD_ARENA_TEAM_INFO_1_1 offsets enum ArenaTeamInfoType { - ARENA_TEAM_ID = 0, - ARENA_TEAM_TYPE = 1, // new in 3.2 - team type? - ARENA_TEAM_MEMBER = 2, // 0 - captain, 1 - member - ARENA_TEAM_GAMES_WEEK = 3, - ARENA_TEAM_GAMES_SEASON = 4, - ARENA_TEAM_WINS_SEASON = 5, - ARENA_TEAM_PERSONAL_RATING = 6, - ARENA_TEAM_END = 7 + ARENA_TEAM_ID = 0, + ARENA_TEAM_TYPE = 1, // new in 3.2 - team type? + ARENA_TEAM_MEMBER = 2, // 0 - captain, 1 - member + ARENA_TEAM_GAMES_WEEK = 3, + ARENA_TEAM_GAMES_SEASON = 4, + ARENA_TEAM_WINS_SEASON = 5, + ARENA_TEAM_PERSONAL_RATING = 6, + ARENA_TEAM_END = 7 }; class InstanceSave; @@ -786,7 +786,8 @@ enum PlayerLoginQueryIndex PLAYER_LOGIN_QUERY_LOADSKILLS = 25, PLAYER_LOGIN_QUERY_LOADWEKLYQUESTSTATUS = 26, PLAYER_LOGIN_QUERY_LOADRANDOMBG = 27, - MAX_PLAYER_LOGIN_QUERY = 28 + PLAYER_LOGIN_QUERY_LOADARENASTATS = 28, + MAX_PLAYER_LOGIN_QUERY = 29 }; enum PlayerDelayedOperations @@ -2429,6 +2430,7 @@ class Player : public Unit, public GridObject<Player> bool _LoadHomeBind(QueryResult_AutoPtr result); void _LoadDeclinedNames(QueryResult_AutoPtr result); void _LoadArenaTeamInfo(QueryResult_AutoPtr result); + void _LoadArenaStatsInfo(QueryResult_AutoPtr result); void _LoadEquipmentSets(QueryResult_AutoPtr result); void _LoadBGData(QueryResult_AutoPtr result); void _LoadGlyphs(QueryResult_AutoPtr result); |
