diff --git a/contrib/extractor/System.cpp b/contrib/extractor/System.cpp index 57dc16b22..a851412b0 100644 --- a/contrib/extractor/System.cpp +++ b/contrib/extractor/System.cpp @@ -241,10 +241,11 @@ void ReadLiquidTypeTableDBC() #define MAP_MAGIC 'SPAM' #define MAP_VERSION_MAGIC '0.1w' #define MAP_AREA_MAGIC 'AERA' -#define MAP_HEIGTH_MAGIC 'TGHM' +#define MAP_HEIGHT_MAGIC 'TGHM' #define MAP_LIQUID_MAGIC 'QILM' -struct map_fileheader{ +struct map_fileheader +{ uint32 mapMagic; uint32 versionMagic; uint32 areaMapOffset; @@ -256,17 +257,20 @@ struct map_fileheader{ }; #define MAP_AREA_NO_AREA 0x0001 -struct map_areaHeader{ + +struct map_areaHeader +{ uint32 fourcc; uint16 flags; uint16 gridArea; }; -#define MAP_HEIGHT_NO_HIGHT 0x0001 +#define MAP_HEIGHT_NO_HEIGHT 0x0001 #define MAP_HEIGHT_AS_INT16 0x0002 #define MAP_HEIGHT_AS_INT8 0x0004 -struct map_heightHeader{ +struct map_heightHeader +{ uint32 fourcc; uint32 flags; float gridHeight; @@ -284,9 +288,10 @@ struct map_heightHeader{ #define MAP_LIQUID_NO_TYPE 0x0001 -#define MAP_LIQUID_NO_HIGHT 0x0002 +#define MAP_LIQUID_NO_HEIGHT 0x0002 -struct map_liquidHeader{ +struct map_liquidHeader +{ uint32 fourcc; uint16 flags; uint16 liquidType; @@ -511,20 +516,20 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x) map.heightMapSize = sizeof(map_heightHeader); map_heightHeader heightHeader; - heightHeader.fourcc = MAP_HEIGTH_MAGIC; + heightHeader.fourcc = MAP_HEIGHT_MAGIC; heightHeader.flags = 0; heightHeader.gridHeight = minHeight; heightHeader.gridMaxHeight = maxHeight; if (maxHeight == minHeight) - heightHeader.flags |=MAP_HEIGHT_NO_HIGHT; + heightHeader.flags |= MAP_HEIGHT_NO_HEIGHT; // Not need store if flat surface if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_height_delta_limit) - heightHeader.flags |=MAP_HEIGHT_NO_HIGHT; + heightHeader.flags |= MAP_HEIGHT_NO_HEIGHT; // Try store as packed in uint16 or uint8 values - if (!(heightHeader.flags&MAP_HEIGHT_NO_HIGHT)) + if (!(heightHeader.flags & MAP_HEIGHT_NO_HEIGHT)) { float step; // Try Store as uint values @@ -756,22 +761,22 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x) liquidHeader.liquidLevel = minHeight; if (maxHeight == minHeight) - liquidHeader.flags|=MAP_LIQUID_NO_HIGHT; + liquidHeader.flags |= MAP_LIQUID_NO_HEIGHT; // Not need store if flat surface if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_liquid_delta_limit) - liquidHeader.flags|=MAP_LIQUID_NO_HIGHT; + liquidHeader.flags |= MAP_LIQUID_NO_HEIGHT; if (!fullType) - liquidHeader.flags|=MAP_LIQUID_NO_TYPE; + liquidHeader.flags |= MAP_LIQUID_NO_TYPE; - if (liquidHeader.flags&MAP_LIQUID_NO_TYPE) + if (liquidHeader.flags & MAP_LIQUID_NO_TYPE) liquidHeader.liquidType = type; else map.liquidMapSize+=sizeof(liquid_type); - if (!(liquidHeader.flags&MAP_LIQUID_NO_HIGHT)) - map.liquidMapSize+=sizeof(float)*liquidHeader.width*liquidHeader.height; + if (!(liquidHeader.flags & MAP_LIQUID_NO_HEIGHT)) + map.liquidMapSize += sizeof(float)*liquidHeader.width*liquidHeader.height; } // Ok all data prepared - store it @@ -789,14 +794,14 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x) // Store height data fwrite(&heightHeader, sizeof(heightHeader), 1, output); - if (!(heightHeader.flags&MAP_HEIGHT_NO_HIGHT)) + if (!(heightHeader.flags & MAP_HEIGHT_NO_HEIGHT)) { - if (heightHeader.flags&MAP_HEIGHT_AS_INT16) + if (heightHeader.flags & MAP_HEIGHT_AS_INT16) { fwrite(uint16_V9, sizeof(uint16_V9), 1, output); fwrite(uint16_V8, sizeof(uint16_V8), 1, output); } - else if (heightHeader.flags&MAP_HEIGHT_AS_INT8) + else if (heightHeader.flags & MAP_HEIGHT_AS_INT8) { fwrite(uint8_V9, sizeof(uint8_V9), 1, output); fwrite(uint8_V8, sizeof(uint8_V8), 1, output); @@ -814,7 +819,7 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x) fwrite(&liquidHeader, sizeof(liquidHeader), 1, output); if (!(liquidHeader.flags&MAP_LIQUID_NO_TYPE)) fwrite(liquid_type, sizeof(liquid_type), 1, output); - if (!(liquidHeader.flags&MAP_LIQUID_NO_HIGHT)) + if (!(liquidHeader.flags&MAP_LIQUID_NO_HEIGHT)) { for (int y=0; y= 6) + m_stats.rating = 0; + else + m_stats.rating = 1500; + m_stats.wins_week = 0; + m_stats.wins_season = 0; } ArenaTeam::~ArenaTeam() @@ -53,27 +57,27 @@ bool ArenaTeam::Create(uint64 captainGuid, uint32 type, std::string ArenaTeamNam sLog.outDebug("GUILD: creating arena team %s to leader: %u", ArenaTeamName.c_str(), GUID_LOPART(captainGuid)); - CaptainGuid = captainGuid; - Name = ArenaTeamName; - Type = type; + m_CaptainGuid = captainGuid; + m_Name = ArenaTeamName; + m_Type = type; - Id = objmgr.GenerateArenaTeamId(); + m_TeamId = objmgr.GenerateArenaTeamId(); // ArenaTeamName already assigned to ArenaTeam::name, use it to encode string for DB CharacterDatabase.escape_string(ArenaTeamName); CharacterDatabase.BeginTransaction(); - // CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid='%u'", Id); - MAX(arenateam)+1 not exist - CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid='%u'", Id); + // CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid='%u'", m_TeamId); - MAX(arenateam)+1 not exist + CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid='%u'", m_TeamId); CharacterDatabase.PExecute("INSERT INTO arena_team (arenateamid,name,captainguid,type,BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor) " "VALUES('%u','%s','%u','%u','%u','%u','%u','%u','%u')", - Id, ArenaTeamName.c_str(), GUID_LOPART(CaptainGuid), Type, BackgroundColor, EmblemStyle, EmblemColor, BorderStyle, BorderColor); + m_TeamId, ArenaTeamName.c_str(), GUID_LOPART(m_CaptainGuid), m_Type, m_BackgroundColor, m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor); CharacterDatabase.PExecute("INSERT INTO arena_team_stats (arenateamid, rating, games, wins, played, wins2, rank) VALUES " - "('%u', '%u', '%u', '%u', '%u', '%u', '%u')", Id, stats.rating, stats.games_week, stats.wins_week, stats.games_season, stats.wins_season, stats.rank); + "('%u', '%u', '%u', '%u', '%u', '%u', '%u')", m_TeamId, m_stats.rating, m_stats.games_week, m_stats.wins_week, m_stats.games_season, m_stats.wins_season, m_stats.rank); CharacterDatabase.CommitTransaction(); - AddMember(CaptainGuid); + AddMember(m_CaptainGuid); return true; } @@ -129,19 +133,29 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) newmember.games_week = 0; newmember.wins_season = 0; newmember.wins_week = 0; - newmember.personal_rating = 1500; - members.push_back(newmember); + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + { + if (m_stats.rating < 1000) + newmember.personal_rating = m_stats.rating; + else + newmember.personal_rating = 1000; + } + else + { + newmember.personal_rating = 1500; + } + m_members.push_back(newmember); - CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid, guid, personal_rating) VALUES ('%u', '%u', '%u')", Id, GUID_LOPART(newmember.guid), newmember.personal_rating ); + CharacterDatabase.PExecute("INSERT INTO arena_team_member (arenateamid, guid, personal_rating) VALUES ('%u', '%u', '%u')", m_TeamId, GUID_LOPART(newmember.guid), newmember.personal_rating ); if(pl) { - pl->SetInArenaTeam(Id, GetSlot()); + pl->SetInArenaTeam(m_TeamId, GetSlot()); pl->SetArenaTeamIdInvited(0); pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_PERSONAL_RATING, newmember.personal_rating ); // hide promote/remove buttons - if(CaptainGuid != PlayerGuid) + if(m_CaptainGuid != PlayerGuid) pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_MEMBER, 1); } return true; @@ -156,15 +170,15 @@ bool ArenaTeam::LoadArenaTeamFromDB(uint32 ArenaTeamId) Field *fields = result->Fetch(); - Id = fields[0].GetUInt32(); - Name = fields[1].GetCppString(); - CaptainGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER); - Type = fields[3].GetUInt32(); - BackgroundColor = fields[4].GetUInt32(); - EmblemStyle = fields[5].GetUInt32(); - EmblemColor = fields[6].GetUInt32(); - BorderStyle = fields[7].GetUInt32(); - BorderColor = fields[8].GetUInt32(); + m_TeamId = fields[0].GetUInt32(); + m_Name = fields[1].GetCppString(); + m_CaptainGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER); + m_Type = fields[3].GetUInt32(); + m_BackgroundColor = fields[4].GetUInt32(); + m_EmblemStyle = fields[5].GetUInt32(); + m_EmblemColor = fields[6].GetUInt32(); + m_BorderStyle = fields[7].GetUInt32(); + m_BorderColor = fields[8].GetUInt32(); delete result; @@ -196,12 +210,12 @@ void ArenaTeam::LoadStatsFromDB(uint32 ArenaTeamId) Field *fields = result->Fetch(); - stats.rating = fields[0].GetUInt32(); - stats.games_week = fields[1].GetUInt32(); - stats.wins_week = fields[2].GetUInt32(); - stats.games_season = fields[3].GetUInt32(); - stats.wins_season = fields[4].GetUInt32(); - stats.rank = fields[5].GetUInt32(); + m_stats.rating = fields[0].GetUInt32(); + m_stats.games_week = fields[1].GetUInt32(); + m_stats.wins_week = fields[2].GetUInt32(); + m_stats.games_season = fields[3].GetUInt32(); + m_stats.wins_season = fields[4].GetUInt32(); + m_stats.rank = fields[5].GetUInt32(); delete result; } @@ -228,7 +242,7 @@ void ArenaTeam::LoadMembersFromDB(uint32 ArenaTeamId) newmember.personal_rating = fields[5].GetUInt32(); newmember.name = fields[6].GetCppString(); newmember.Class = fields[7].GetUInt8(); - members.push_back(newmember); + m_members.push_back(newmember); }while( result->NextRow() ); delete result; } @@ -241,10 +255,10 @@ void ArenaTeam::SetCaptain(const uint64& guid) oldcaptain->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_MEMBER, 1); // set new captain - CaptainGuid = guid; + m_CaptainGuid = guid; // update database - CharacterDatabase.PExecute("UPDATE arena_team SET captainguid = '%u' WHERE arenateamid = '%u'", GUID_LOPART(guid), Id); + CharacterDatabase.PExecute("UPDATE arena_team SET captainguid = '%u' WHERE arenateamid = '%u'", GUID_LOPART(guid), m_TeamId); // enable remove/promote buttons Player *newcaptain = objmgr.GetPlayer(guid); @@ -254,11 +268,11 @@ void ArenaTeam::SetCaptain(const uint64& guid) void ArenaTeam::DelMember(uint64 guid) { - for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if (itr->guid == guid) { - members.erase(itr); + m_members.erase(itr); break; } } @@ -286,18 +300,18 @@ void ArenaTeam::Disband(WorldSession *session) session->BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_DISBANDED_S, 2, session->GetPlayerName(), GetName(), ""); BroadcastPacket(&data); - while (!members.empty()) + while (!m_members.empty()) { // Removing from members is done in DelMember. - DelMember(members.front().guid); + DelMember(m_members.front().guid); } CharacterDatabase.BeginTransaction(); - CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid = '%u'", Id); - CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", Id); //< this should be alredy done by calling DelMember(memberGuids[j]); for each member - CharacterDatabase.PExecute("DELETE FROM arena_team_stats WHERE arenateamid = '%u'", Id); + CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid = '%u'", m_TeamId); + CharacterDatabase.PExecute("DELETE FROM arena_team_member WHERE arenateamid = '%u'", m_TeamId); //< this should be alredy done by calling DelMember(memberGuids[j]); for each member + CharacterDatabase.PExecute("DELETE FROM arena_team_stats WHERE arenateamid = '%u'", m_TeamId); CharacterDatabase.CommitTransaction(); - objmgr.RemoveArenaTeam(Id); + objmgr.RemoveArenaTeam(m_TeamId); } void ArenaTeam::Roster(WorldSession *session) @@ -307,12 +321,12 @@ void ArenaTeam::Roster(WorldSession *session) uint8 unk308 = 0; WorldPacket data(SMSG_ARENA_TEAM_ROSTER, 100); - data << uint32(GetId()); // arena team id + data << uint32(GetId()); // team id data << uint8(unk308); // 308 unknown value but affect packet structure data << uint32(GetMembersSize()); // members count data << uint32(GetType()); // arena team type? - for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { pl = objmgr.GetPlayer(itr->guid); @@ -344,11 +358,11 @@ void ArenaTeam::Query(WorldSession *session) data << uint32(GetId()); // team id data << GetName(); // team name data << uint32(GetType()); // arena team type (2=2x2, 3=3x3 or 5=5x5) - data << uint32(BackgroundColor); // background color - data << uint32(EmblemStyle); // emblem style - data << uint32(EmblemColor); // emblem color - data << uint32(BorderStyle); // border style - data << uint32(BorderColor); // border color + data << uint32(m_BackgroundColor); // background color + data << uint32(m_EmblemStyle); // emblem style + data << uint32(m_EmblemColor); // emblem color + data << uint32(m_BorderStyle); // border style + data << uint32(m_BorderColor); // border color session->SendPacket(&data); sLog.outDebug("WORLD: Sent SMSG_ARENA_TEAM_QUERY_RESPONSE"); } @@ -356,13 +370,13 @@ void ArenaTeam::Query(WorldSession *session) void ArenaTeam::Stats(WorldSession *session) { WorldPacket data(SMSG_ARENA_TEAM_STATS, 4*7); - data << uint32(GetId()); // arena team id - data << uint32(stats.rating); // rating - data << uint32(stats.games_week); // games this week - data << uint32(stats.wins_week); // wins this week - data << uint32(stats.games_season); // played this season - data << uint32(stats.wins_season); // wins this season - data << uint32(stats.rank); // rank + data << uint32(GetId()); // team id + data << uint32(m_stats.rating); // rating + data << uint32(m_stats.games_week); // games this week + data << uint32(m_stats.wins_week); // wins this week + data << uint32(m_stats.games_season); // played this season + data << uint32(m_stats.wins_season); // wins this season + data << uint32(m_stats.rank); // rank session->SendPacket(&data); } @@ -370,7 +384,7 @@ void ArenaTeam::NotifyStatsChanged() { // this is called after a rated match ended // updates arena team stats for every member of the team (not only the ones who participated!) - for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + for(MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { Player * plr = objmgr.GetPlayer(itr->guid); if(plr) @@ -388,9 +402,9 @@ void ArenaTeam::InspectStats(WorldSession *session, uint64 guid) data << uint64(guid); // player guid data << uint8(GetSlot()); // slot (0...2) data << uint32(GetId()); // arena team id - data << uint32(stats.rating); // rating - data << uint32(stats.games_season); // season played - data << uint32(stats.wins_season); // season wins + data << uint32(m_stats.rating); // rating + data << uint32(m_stats.games_season); // season played + data << uint32(m_stats.wins_season); // season wins data << uint32(member->games_season); // played (count of all games, that the inspected member participated...) data << uint32(member->personal_rating); // personal rating session->SendPacket(&data); @@ -398,13 +412,13 @@ void ArenaTeam::InspectStats(WorldSession *session, uint64 guid) void ArenaTeam::SetEmblem(uint32 backgroundColor, uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor) { - BackgroundColor = backgroundColor; - EmblemStyle = emblemStyle; - EmblemColor = emblemColor; - BorderStyle = borderStyle; - BorderColor = borderColor; + m_BackgroundColor = backgroundColor; + m_EmblemStyle = emblemStyle; + m_EmblemColor = emblemColor; + m_BorderStyle = borderStyle; + m_BorderColor = borderColor; - CharacterDatabase.PExecute("UPDATE arena_team SET BackgroundColor='%u', EmblemStyle='%u', EmblemColor='%u', BorderStyle='%u', BorderColor='%u' WHERE arenateamid='%u'", BackgroundColor, EmblemStyle, EmblemColor, BorderStyle, BorderColor, Id); + CharacterDatabase.PExecute("UPDATE arena_team SET BackgroundColor='%u', EmblemStyle='%u', EmblemColor='%u', BorderStyle='%u', BorderColor='%u' WHERE arenateamid='%u'", m_BackgroundColor, m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_TeamId); } void ArenaTeam::SetStats(uint32 stat_type, uint32 value) @@ -412,27 +426,27 @@ void ArenaTeam::SetStats(uint32 stat_type, uint32 value) switch(stat_type) { case STAT_TYPE_RATING: - stats.rating = value; + m_stats.rating = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET rating = '%u' WHERE arenateamid = '%u'", value, GetId()); break; case STAT_TYPE_GAMES_WEEK: - stats.games_week = value; + m_stats.games_week = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET games = '%u' WHERE arenateamid = '%u'", value, GetId()); break; case STAT_TYPE_WINS_WEEK: - stats.wins_week = value; + m_stats.wins_week = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET wins = '%u' WHERE arenateamid = '%u'", value, GetId()); break; case STAT_TYPE_GAMES_SEASON: - stats.games_season = value; + m_stats.games_season = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET played = '%u' WHERE arenateamid = '%u'", value, GetId()); break; case STAT_TYPE_WINS_SEASON: - stats.wins_season = value; + m_stats.wins_season = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET wins2 = '%u' WHERE arenateamid = '%u'", value, GetId()); break; case STAT_TYPE_RANK: - stats.rank = value; + m_stats.rank = value; CharacterDatabase.PExecute("UPDATE arena_team_stats SET rank = '%u' WHERE arenateamid = '%u'", value, GetId()); break; default: @@ -443,7 +457,7 @@ void ArenaTeam::SetStats(uint32 stat_type, uint32 value) void ArenaTeam::BroadcastPacket(WorldPacket *packet) { - for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { Player *player = objmgr.GetPlayer(itr->guid); if(player) @@ -467,7 +481,7 @@ uint8 ArenaTeam::GetSlotByType( uint32 type ) bool ArenaTeam::HaveMember( const uint64& guid ) const { - for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if(itr->guid == guid) return true; @@ -479,7 +493,7 @@ uint32 ArenaTeam::GetPoints(uint32 MemberRating) // returns how many points would be awarded with this team type with this rating float points; - uint32 rating = MemberRating + 150 < stats.rating ? MemberRating : stats.rating; + uint32 rating = MemberRating + 150 < m_stats.rating ? MemberRating : m_stats.rating; if(rating<=1500) points = (float)rating * 0.22f + 14.0f; @@ -487,9 +501,9 @@ uint32 ArenaTeam::GetPoints(uint32 MemberRating) points = 1511.26f / (1.0f + 1639.28f * exp(-0.00412f * (float)rating)); // type penalties for <5v5 teams - if(Type == ARENA_TEAM_2v2) + if(m_Type == ARENA_TEAM_2v2) points *= 0.76f; - else if(Type == ARENA_TEAM_3v3) + else if(m_Type == ARENA_TEAM_3v3) points *= 0.88f; return (uint32) points; @@ -499,30 +513,45 @@ float ArenaTeam::GetChanceAgainst(uint32 own_rating, uint32 enemy_rating) { // returns the chance to win against a team with the given rating, used in the rating adjustment calculation // ELO system + + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + if (enemy_rating < 1300) + enemy_rating = 1300; return 1.0f/(1.0f+exp(log(10.0f)*(float)((float)enemy_rating - (float)own_rating)/400.0f)); } +void ArenaTeam::FinishGame(int32 mod) +{ + if (int32(m_stats.rating) + mod < 0) + m_stats.rating = 0; + else + m_stats.rating += mod; + + m_stats.games_week += 1; + m_stats.games_season += 1; + // update team's rank + m_stats.rank = 1; + ObjectMgr::ArenaTeamMap::const_iterator i = objmgr.GetArenaTeamMapBegin(); + for ( ; i != objmgr.GetArenaTeamMapEnd(); ++i) + { + if (i->second->GetType() == this->m_Type && i->second->GetStats().rating > m_stats.rating) + ++m_stats.rank; + } + + +} + int32 ArenaTeam::WonAgainst(uint32 againstRating) { // called when the team has won //'chance' calculation - to beat the opponent - float chance = GetChanceAgainst(stats.rating,againstRating); + float chance = GetChanceAgainst(m_stats.rating, againstRating); // calculate the rating modification (ELO system with k=32) int32 mod = (int32)floor(32.0f * (1.0f - chance)); // modify the team stats accordingly - stats.rating += mod; - stats.games_week += 1; - stats.wins_week += 1; - stats.games_season += 1; - stats.wins_season += 1; - //update team's rank - stats.rank = 1; - ObjectMgr::ArenaTeamMap::const_iterator i = objmgr.GetArenaTeamMapBegin(); - for ( ; i != objmgr.GetArenaTeamMapEnd(); ++i) - { - if (i->second->GetType() == this->Type && i->second->GetStats().rating > stats.rating) - ++stats.rank; - } + FinishGame(mod); + m_stats.wins_week += 1; + m_stats.wins_season += 1; // return the rating change, used to display it on the results screen return mod; @@ -532,22 +561,11 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating) { // called when the team has lost //'chance' calculation - to loose to the opponent - float chance = GetChanceAgainst(stats.rating,againstRating); + float chance = GetChanceAgainst(m_stats.rating, againstRating); // calculate the rating modification (ELO system with k=32) int32 mod = (int32)ceil(32.0f * (0.0f - chance)); // modify the team stats accordingly - stats.rating += mod; - stats.games_week += 1; - stats.games_season += 1; - //update team's rank - - stats.rank = 1; - ObjectMgr::ArenaTeamMap::const_iterator i = objmgr.GetArenaTeamMapBegin(); - for ( ; i != objmgr.GetArenaTeamMapEnd(); ++i) - { - if (i->second->GetType() == this->Type && i->second->GetStats().rating > stats.rating) - ++stats.rank; - } + FinishGame(mod); // return the rating change, used to display it on the results screen return mod; @@ -556,7 +574,7 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating) void ArenaTeam::MemberLost(Player * plr, uint32 againstRating) { // called for each participant of a match after losing - for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + for(MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if(itr->guid == plr->GetGUID()) { @@ -578,7 +596,7 @@ void ArenaTeam::MemberLost(Player * plr, uint32 againstRating) void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating) { // called for offline player after ending rated arena match! - for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + for(MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if(itr->guid == guid) { @@ -600,7 +618,7 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating) void ArenaTeam::MemberWon(Player * plr, uint32 againstRating) { // called for each participant after winning a match - for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + for(MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if(itr->guid == plr->GetGUID()) { @@ -626,17 +644,17 @@ void ArenaTeam::UpdateArenaPointsHelper(std::map& PlayerPoints) // called after a match has ended and the stats are already modified // helper function for arena point distribution (this way, when distributing, no actual calculation is required, just a few comparisons) // 10 played games per week is a minimum - if (stats.games_week < 10) + if (m_stats.games_week < 10) return; // to get points, a player has to participate in at least 30% of the matches - uint32 min_plays = (uint32) ceil(stats.games_week * 0.3); - for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + uint32 min_plays = (uint32) ceil(m_stats.games_week * 0.3); + for(MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { // the player participated in enough games, update his points uint32 points_to_add = 0; if (itr->games_week >= min_plays) points_to_add = GetPoints(itr->personal_rating); - // OBSOLETE : CharacterDatabase.PExecute("UPDATE arena_team_member SET points_to_add = '%u' WHERE arenateamid = '%u' AND guid = '%u'", points_to_add, Id, itr->guid); + // OBSOLETE : CharacterDatabase.PExecute("UPDATE arena_team_member SET points_to_add = '%u' WHERE arenateamid = '%u' AND guid = '%u'", points_to_add, m_TeamId, itr->guid); std::map::iterator plr_itr = PlayerPoints.find(GUID_LOPART(itr->guid)); if (plr_itr != PlayerPoints.end()) @@ -655,19 +673,19 @@ void ArenaTeam::SaveToDB() // save team and member stats to db // called after a match has ended, or when calculating arena_points CharacterDatabase.BeginTransaction(); - CharacterDatabase.PExecute("UPDATE arena_team_stats SET rating = '%u',games = '%u',played = '%u',rank = '%u',wins = '%u',wins2 = '%u' WHERE arenateamid = '%u'", stats.rating, stats.games_week, stats.games_season, stats.rank, stats.wins_week, stats.wins_season, GetId()); - for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + CharacterDatabase.PExecute("UPDATE arena_team_stats SET rating = '%u',games = '%u',played = '%u',rank = '%u',wins = '%u',wins2 = '%u' WHERE arenateamid = '%u'", m_stats.rating, m_stats.games_week, m_stats.games_season, m_stats.rank, m_stats.wins_week, m_stats.wins_season, GetId()); + for(MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { - CharacterDatabase.PExecute("UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u', personal_rating = '%u' WHERE arenateamid = '%u' AND guid = '%u'", itr->games_week, itr->wins_week, itr->games_season, itr->wins_season, itr->personal_rating, Id, GUID_LOPART(itr->guid)); + CharacterDatabase.PExecute("UPDATE arena_team_member SET played_week = '%u', wons_week = '%u', played_season = '%u', wons_season = '%u', personal_rating = '%u' WHERE arenateamid = '%u' AND guid = '%u'", itr->games_week, itr->wins_week, itr->games_season, itr->wins_season, itr->personal_rating, m_TeamId, GUID_LOPART(itr->guid)); } CharacterDatabase.CommitTransaction(); } void ArenaTeam::FinishWeek() { - stats.games_week = 0; // played this week - stats.wins_week = 0; // wins this week - for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + m_stats.games_week = 0; // played this week + m_stats.wins_week = 0; // wins this week + for(MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { itr->games_week = 0; itr->wins_week = 0; @@ -676,7 +694,7 @@ void ArenaTeam::FinishWeek() bool ArenaTeam::IsFighting() const { - for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if (Player *p = objmgr.GetPlayer(itr->guid)) { diff --git a/src/game/ArenaTeam.h b/src/game/ArenaTeam.h index 629b89d99..3fabde337 100644 --- a/src/game/ArenaTeam.h +++ b/src/game/ArenaTeam.h @@ -123,26 +123,26 @@ class ArenaTeam ArenaTeam(); ~ArenaTeam(); - bool Create(uint64 CaptainGuid, uint32 type, std::string ArenaTeamName); + bool Create(uint64 captainGuid, uint32 type, std::string ArenaTeamName); void Disband(WorldSession *session); typedef std::list MemberList; - uint32 GetId() const { return Id; } - uint32 GetType() const { return Type; } + uint32 GetId() const { return m_TeamId; } + uint32 GetType() const { return m_Type; } uint8 GetSlot() const { return GetSlotByType(GetType()); } static uint8 GetSlotByType(uint32 type); - const uint64& GetCaptain() const { return CaptainGuid; } - std::string GetName() const { return Name; } - const ArenaTeamStats& GetStats() const { return stats; } + const uint64& GetCaptain() const { return m_CaptainGuid; } + std::string GetName() const { return m_Name; } + const ArenaTeamStats& GetStats() const { return m_stats; } void SetStats(uint32 stat_type, uint32 value); - uint32 GetRating() const { return stats.rating; } + uint32 GetRating() const { return m_stats.rating; } - uint32 GetEmblemStyle() const { return EmblemStyle; } - uint32 GetEmblemColor() const { return EmblemColor; } - uint32 GetBorderStyle() const { return BorderStyle; } - uint32 GetBorderColor() const { return BorderColor; } - uint32 GetBackgroundColor() const { return BackgroundColor; } + uint32 GetEmblemStyle() const { return m_EmblemStyle; } + uint32 GetEmblemColor() const { return m_EmblemColor; } + uint32 GetBorderStyle() const { return m_BorderStyle; } + uint32 GetBorderColor() const { return m_BorderColor; } + uint32 GetBackgroundColor() const { return m_BackgroundColor; } void SetCaptain(const uint64& guid); bool AddMember(const uint64& PlayerGuid); @@ -153,15 +153,15 @@ class ArenaTeam void SetEmblem(uint32 backgroundColor, uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor); - size_t GetMembersSize() const { return members.size(); } - bool Empty() const { return members.empty(); } - MemberList::iterator membersBegin() { return members.begin(); } - MemberList::iterator membersEnd() { return members.end(); } + size_t GetMembersSize() const { return m_members.size(); } + bool Empty() const { return m_members.empty(); } + MemberList::iterator m_membersBegin() { return m_members.begin(); } + MemberList::iterator m_membersEnd() { return m_members.end(); } bool HaveMember(const uint64& guid) const; ArenaTeamMember* GetMember(const uint64& guid) { - for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if(itr->guid == guid) return &(*itr); @@ -170,7 +170,7 @@ class ArenaTeam ArenaTeamMember* GetMember(const std::string& name) { - for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) + for (MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) if(itr->name == name) return &(*itr); @@ -205,21 +205,22 @@ class ArenaTeam void NotifyStatsChanged(); void FinishWeek(); + void FinishGame(int32 mod); protected: - uint32 Id; - uint32 Type; - std::string Name; - uint64 CaptainGuid; + uint32 m_TeamId; + uint32 m_Type; + std::string m_Name; + uint64 m_CaptainGuid; - uint32 BackgroundColor; // ARGB format - uint32 EmblemStyle; // icon id - uint32 EmblemColor; // ARGB format - uint32 BorderStyle; // border image id - uint32 BorderColor; // ARGB format + uint32 m_BackgroundColor; // ARGB format + uint32 m_EmblemStyle; // icon id + uint32 m_EmblemColor; // ARGB format + uint32 m_BorderStyle; // border image id + uint32 m_BorderColor; // ARGB format - MemberList members; - ArenaTeamStats stats; + MemberList m_members; + ArenaTeamStats m_stats; }; #endif diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 3da757a68..a3bf2242c 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1190,11 +1190,11 @@ bool GridMap::loadHeihgtData(FILE *in, uint32 offset, uint32 size) map_heightHeader header; fseek(in, offset, SEEK_SET); fread(&header, sizeof(header), 1, in); - if (header.fourcc != uint32(MAP_HEIGTH_MAGIC)) + if (header.fourcc != uint32(MAP_HEIGHT_MAGIC)) return false; m_gridHeight = header.gridHeight; - if (!(header.flags & MAP_HEIGHT_NO_HIGHT)) + if (!(header.flags & MAP_HEIGHT_NO_HEIGHT)) { if ((header.flags & MAP_HEIGHT_AS_INT16)) { @@ -1243,12 +1243,12 @@ bool GridMap::loadLiquidData(FILE *in, uint32 offset, uint32 size) m_liquid_height= header.height; m_liquidLevel = header.liquidLevel; - if (!(header.flags&MAP_LIQUID_NO_TYPE)) + if (!(header.flags & MAP_LIQUID_NO_TYPE)) { m_liquid_type = new uint8 [16*16]; fread(m_liquid_type, sizeof(uint8), 16*16, in); } - if (!(header.flags&MAP_LIQUID_NO_HIGHT)) + if (!(header.flags & MAP_LIQUID_NO_HEIGHT)) { m_liquid_map = new float [m_liquid_width*m_liquid_height]; fread(m_liquid_map, sizeof(float), m_liquid_width*m_liquid_height, in); diff --git a/src/game/Map.h b/src/game/Map.h index d8665f670..d5b5bef4f 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -71,10 +71,11 @@ typedef MaNGOS::SingleThreaded::Lock NullGuard; #define MAP_MAGIC 'SPAM' #define MAP_VERSION_MAGIC '0.1w' #define MAP_AREA_MAGIC 'AERA' -#define MAP_HEIGTH_MAGIC 'TGHM' +#define MAP_HEIGHT_MAGIC 'TGHM' #define MAP_LIQUID_MAGIC 'QILM' -struct map_fileheader{ +struct map_fileheader +{ uint32 mapMagic; uint32 versionMagic; uint32 areaMapOffset; @@ -86,17 +87,20 @@ struct map_fileheader{ }; #define MAP_AREA_NO_AREA 0x0001 -struct map_areaHeader{ + +struct map_areaHeader +{ uint32 fourcc; uint16 flags; uint16 gridArea; }; -#define MAP_HEIGHT_NO_HIGHT 0x0001 +#define MAP_HEIGHT_NO_HEIGHT 0x0001 #define MAP_HEIGHT_AS_INT16 0x0002 #define MAP_HEIGHT_AS_INT8 0x0004 -struct map_heightHeader{ +struct map_heightHeader +{ uint32 fourcc; uint32 flags; float gridHeight; @@ -104,8 +108,10 @@ struct map_heightHeader{ }; #define MAP_LIQUID_NO_TYPE 0x0001 -#define MAP_LIQUID_NO_HIGHT 0x0002 -struct map_liquidHeader{ +#define MAP_LIQUID_NO_HEIGHT 0x0002 + +struct map_liquidHeader +{ uint32 fourcc; uint16 flags; uint16 liquidType; @@ -116,7 +122,8 @@ struct map_liquidHeader{ float liquidLevel; }; -enum ZLiquidStatus{ +enum ZLiquidStatus +{ LIQUID_MAP_NO_WATER = 0x00000000, LIQUID_MAP_ABOVE_WATER = 0x00000001, LIQUID_MAP_WATER_WALK = 0x00000002, @@ -135,7 +142,8 @@ enum ZLiquidStatus{ #define MAP_LIQUID_TYPE_DARK_WATER 0x10 #define MAP_LIQUID_TYPE_WMO_WATER 0x20 -struct LiquidData{ +struct LiquidData +{ uint32 type; float level; float depth_level; diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp index 19f596dd2..05adbe011 100644 --- a/src/game/PointMovementGenerator.cpp +++ b/src/game/PointMovementGenerator.cpp @@ -28,7 +28,7 @@ template void PointMovementGenerator::Initialize(T &unit) { unit.StopMoving(); - unit.addUnitState(UNIT_STAT_MOVING); + unit.addUnitState(UNIT_STAT_ROAMING); Traveller traveller(unit); i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z); diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index ac8f661b3..eb16e4d13 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -311,10 +311,13 @@ void WorldSession::LogoutPlayer(bool Save) _player->TeleportTo(_player->m_homebindMapId, _player->m_homebindX, _player->m_homebindY, _player->m_homebindZ, _player->GetOrientation()); //this is a bad place to call for far teleport because we need player to be in world for successful logout //maybe we should implement delayed far teleport logout? - while(_player->IsBeingTeleportedFar()) - HandleMoveWorldportAckOpcode(); } + // FG: finish pending transfers after starting the logout + // this should fix players beeing able to logout and login back with full hp at death position + while(_player->IsBeingTeleportedFar()) + HandleMoveWorldportAckOpcode(); + for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) { if(BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i)) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 14b08251c..5f604ed83 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8266" + #define REVISION_NR "8273" #endif // __REVISION_NR_H__ diff --git a/src/shared/vmap/VMapManager.cpp b/src/shared/vmap/VMapManager.cpp index ec5d87006..9e4488183 100644 --- a/src/shared/vmap/VMapManager.cpp +++ b/src/shared/vmap/VMapManager.cpp @@ -444,7 +444,7 @@ namespace VMAP //========================================================= /** - get height or INVALID_HEIGHT if to hight was calculated + get height or INVALID_HEIGHT if to height was calculated */ //int gGetHeightCounter = 0;