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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user