From 3557b00a1321ee599ed30673b47ca6b1f5cc28f1 Mon Sep 17 00:00:00 2001 From: balrok Date: Tue, 28 Jul 2009 16:49:42 +0200 Subject: [PATCH 1/8] [8267] ArenaTeam: added check, that teamrating won't become negative for this i added a FinishGame(mod) function which also updates other stats, to avoid redundant code Signed-off-by: balrok --- src/game/ArenaTeam.cpp | 48 ++++++++++++++++++++-------------------- src/game/ArenaTeam.h | 1 + src/shared/revision_nr.h | 2 +- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 6b88ba687..6321225ff 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -502,20 +502,16 @@ float ArenaTeam::GetChanceAgainst(uint32 own_rating, uint32 enemy_rating) return 1.0f/(1.0f+exp(log(10.0f)*(float)((float)enemy_rating - (float)own_rating)/400.0f)); } -int32 ArenaTeam::WonAgainst(uint32 againstRating) +void ArenaTeam::FinishGame(int32 mod) { - // called when the team has won - //'chance' calculation - to beat the opponent - float chance = GetChanceAgainst(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; + if (int32(stats.rating) + mod < 0) + stats.rating = 0; + else + stats.rating += mod; + stats.games_week += 1; - stats.wins_week += 1; stats.games_season += 1; - stats.wins_season += 1; - //update team's rank + // update team's rank stats.rank = 1; ObjectMgr::ArenaTeamMap::const_iterator i = objmgr.GetArenaTeamMapBegin(); for ( ; i != objmgr.GetArenaTeamMapEnd(); ++i) @@ -524,6 +520,21 @@ int32 ArenaTeam::WonAgainst(uint32 againstRating) ++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); + // calculate the rating modification (ELO system with k=32) + int32 mod = (int32)floor(32.0f * (1.0f - chance)); + // modify the team stats accordingly + FinishGame(mod); + stats.wins_week += 1; + stats.wins_season += 1; + // return the rating change, used to display it on the results screen return mod; } @@ -532,22 +543,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(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; diff --git a/src/game/ArenaTeam.h b/src/game/ArenaTeam.h index 9ad3ea618..8025f9d91 100644 --- a/src/game/ArenaTeam.h +++ b/src/game/ArenaTeam.h @@ -205,6 +205,7 @@ class ArenaTeam void NotifyStatsChanged(); void FinishWeek(); + void FinishGame(int32 mod); protected: diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 14b08251c..254306b66 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 "8267" #endif // __REVISION_NR_H__ From 79d1c3fe6fcc00f725bf61f4b6f9ce02143690c8 Mon Sep 17 00:00:00 2001 From: XTZGZoReX Date: Tue, 28 Jul 2009 17:05:39 +0200 Subject: [PATCH 2/8] [8268] ArenaTeam: new rating-system for season 6 every team will start with 0 rating here to enable this you have to set your season in the config-file thanks to danielich for initial patch Signed-off-by: balrok --- src/game/ArenaTeam.cpp | 22 ++++++++++++++++++++-- src/shared/revision_nr.h | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 6321225ff..480f77ffa 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -19,6 +19,7 @@ #include "WorldPacket.h" #include "ObjectMgr.h" #include "ArenaTeam.h" +#include "World.h" ArenaTeam::ArenaTeam() { @@ -34,7 +35,10 @@ ArenaTeam::ArenaTeam() stats.games_week = 0; stats.games_season = 0; stats.rank = 0; - stats.rating = 1500; + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + stats.rating = 0; + else + stats.rating = 1500; stats.wins_week = 0; stats.wins_season = 0; } @@ -129,7 +133,17 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) newmember.games_week = 0; newmember.wins_season = 0; newmember.wins_week = 0; - newmember.personal_rating = 1500; + if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) + { + if (stats.rating < 1000) + newmember.personal_rating = stats.rating; + else + newmember.personal_rating = 1000; + } + else + { + newmember.personal_rating = 1500; + } 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 ); @@ -499,6 +513,10 @@ 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)); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 254306b66..8f3cffbe2 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 "8267" + #define REVISION_NR "8268" #endif // __REVISION_NR_H__ From 0513e5cf06ab85ef3037893dad04d4ffdf7473e4 Mon Sep 17 00:00:00 2001 From: balrok Date: Tue, 28 Jul 2009 18:01:16 +0200 Subject: [PATCH 3/8] [8269] added "m_" prefix to ArenaTeam classmember-variables used this script + some manual edit (i couldn't get out, how to handle comments) function replace() { sed -ri 's/([^a-zA-Z0-9_])'$1'([^a-zA-Z0-9_])/\1'$2'\2/g' ArenaTeam.* } replace Id m_TeamId replace Type m_Type replace Name m_Name replace CaptainGuid m_CaptainGuid replace BackgroundColor m_BackgroundColor replace EmblemStyle m_EmblemStyle replace EmblemColor m_EmblemColor replace BorderStyle m_BorderStyle replace BorderColor m_BorderColor replace members m_members replace stats m_stats Signed-off-by: balrok --- src/game/ArenaTeam.cpp | 240 +++++++++++++++++++-------------------- src/game/ArenaTeam.h | 58 +++++----- src/shared/revision_nr.h | 2 +- 3 files changed, 150 insertions(+), 150 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index 480f77ffa..a24fa06d9 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -23,24 +23,24 @@ ArenaTeam::ArenaTeam() { - Id = 0; - Type = 0; - Name = ""; - CaptainGuid = 0; - BackgroundColor = 0; // background - EmblemStyle = 0; // icon - EmblemColor = 0; // icon color - BorderStyle = 0; // border - BorderColor = 0; // border color - stats.games_week = 0; - stats.games_season = 0; - stats.rank = 0; + m_TeamId = 0; + m_Type = 0; + m_Name = ""; + m_CaptainGuid = 0; + m_BackgroundColor = 0; // background + m_EmblemStyle = 0; // icon + m_EmblemColor = 0; // icon color + m_BorderStyle = 0; // border + m_BorderColor = 0; // border color + m_stats.games_week = 0; + m_stats.games_season = 0; + m_stats.rank = 0; if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) - stats.rating = 0; + m_stats.rating = 0; else - stats.rating = 1500; - stats.wins_week = 0; - stats.wins_season = 0; + m_stats.rating = 1500; + m_stats.wins_week = 0; + m_stats.wins_season = 0; } ArenaTeam::~ArenaTeam() @@ -57,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("INSERT INTO arena_team (arenateamid,name,captainguid,type,BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor) " + // 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,m_BackgroundColor,m_EmblemStyle,m_EmblemColor,m_BorderStyle,m_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; } @@ -135,8 +135,8 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) newmember.wins_week = 0; if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6) { - if (stats.rating < 1000) - newmember.personal_rating = stats.rating; + if (m_stats.rating < 1000) + newmember.personal_rating = m_stats.rating; else newmember.personal_rating = 1000; } @@ -144,18 +144,18 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) { newmember.personal_rating = 1500; } - members.push_back(newmember); + 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()*6) + 5, newmember.personal_rating ); // hide promote/remove buttons - if(CaptainGuid != PlayerGuid) + if(m_CaptainGuid != PlayerGuid) pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * 6) + 1, 1); } return true; @@ -163,22 +163,22 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) bool ArenaTeam::LoadArenaTeamFromDB(uint32 ArenaTeamId) { - QueryResult *result = CharacterDatabase.PQuery("SELECT arenateamid,name,captainguid,type,BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor FROM arena_team WHERE arenateamid = '%u'", ArenaTeamId); + QueryResult *result = CharacterDatabase.PQuery("SELECT arenateamid,name,captainguid,type,m_BackgroundColor,m_EmblemStyle,m_EmblemColor,m_BorderStyle,m_BorderColor FROM arena_team WHERE arenateamid = '%u'", ArenaTeamId); if(!result) return false; 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; @@ -210,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; } @@ -242,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; } @@ -255,10 +255,10 @@ void ArenaTeam::SetCaptain(const uint64& guid) oldcaptain->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + 1 + (GetSlot() * 6), 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); @@ -268,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; } } @@ -300,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) @@ -321,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); @@ -358,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"); } @@ -370,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); } @@ -384,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) @@ -402,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); @@ -412,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 m_BackgroundColor='%u', m_EmblemStyle='%u', m_EmblemColor='%u', m_BorderStyle='%u', m_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) @@ -426,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: @@ -457,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) @@ -481,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; @@ -493,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; @@ -501,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; @@ -522,20 +522,20 @@ float ArenaTeam::GetChanceAgainst(uint32 own_rating, uint32 enemy_rating) void ArenaTeam::FinishGame(int32 mod) { - if (int32(stats.rating) + mod < 0) - stats.rating = 0; + if (int32(m_stats.rating) + mod < 0) + m_stats.rating = 0; else - stats.rating += mod; + m_stats.rating += mod; - stats.games_week += 1; - stats.games_season += 1; + m_stats.games_week += 1; + m_stats.games_season += 1; // update team's rank - stats.rank = 1; + m_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; + if (i->second->GetType() == this->m_Type && i->second->GetStats().rating > m_stats.rating) + ++m_stats.rank; } @@ -545,13 +545,13 @@ 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 FinishGame(mod); - stats.wins_week += 1; - stats.wins_season += 1; + m_stats.wins_week += 1; + m_stats.wins_season += 1; // return the rating change, used to display it on the results screen return mod; @@ -561,7 +561,7 @@ 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 @@ -574,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()) { @@ -596,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) { @@ -618,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()) { @@ -644,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()) @@ -673,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; @@ -694,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 8025f9d91..c893ac09e 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); @@ -209,18 +209,18 @@ class ArenaTeam 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/shared/revision_nr.h b/src/shared/revision_nr.h index 8f3cffbe2..8c9363415 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 "8268" + #define REVISION_NR "8269" #endif // __REVISION_NR_H__ From 46c314814c77ff154808e59ddcabf46f830d900c Mon Sep 17 00:00:00 2001 From: fgenesis Date: Thu, 23 Jul 2009 18:31:35 +0200 Subject: [PATCH 4/8] [8270] Fixed problem with Alt+F4 in instances. Signed-off-by: ApoC --- src/game/WorldSession.cpp | 7 +++++-- src/shared/revision_nr.h | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 798147fe8..5c8b44bc8 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 8c9363415..81f50ea49 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 "8269" + #define REVISION_NR "8270" #endif // __REVISION_NR_H__ From 707c9f315dd635bb1069410ecc0837e17424f8fa Mon Sep 17 00:00:00 2001 From: Ebrithil Date: Tue, 28 Jul 2009 22:22:33 +0200 Subject: [PATCH 5/8] [8271] Fix: SQL typo in [8269] Signed-off-by: balrok --- src/game/ArenaTeam.cpp | 6 +++--- src/shared/revision_nr.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/ArenaTeam.cpp b/src/game/ArenaTeam.cpp index a24fa06d9..d8cbd4281 100644 --- a/src/game/ArenaTeam.cpp +++ b/src/game/ArenaTeam.cpp @@ -69,7 +69,7 @@ bool ArenaTeam::Create(uint64 captainGuid, uint32 type, std::string ArenaTeamNam CharacterDatabase.BeginTransaction(); // 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,m_BackgroundColor,m_EmblemStyle,m_EmblemColor,m_BorderStyle,m_BorderColor) " + 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')", 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 " @@ -163,7 +163,7 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid) bool ArenaTeam::LoadArenaTeamFromDB(uint32 ArenaTeamId) { - QueryResult *result = CharacterDatabase.PQuery("SELECT arenateamid,name,captainguid,type,m_BackgroundColor,m_EmblemStyle,m_EmblemColor,m_BorderStyle,m_BorderColor FROM arena_team WHERE arenateamid = '%u'", ArenaTeamId); + QueryResult *result = CharacterDatabase.PQuery("SELECT arenateamid,name,captainguid,type,BackgroundColor,EmblemStyle,EmblemColor,BorderStyle,BorderColor FROM arena_team WHERE arenateamid = '%u'", ArenaTeamId); if(!result) return false; @@ -418,7 +418,7 @@ void ArenaTeam::SetEmblem(uint32 backgroundColor, uint32 emblemStyle, uint32 emb m_BorderStyle = borderStyle; m_BorderColor = borderColor; - CharacterDatabase.PExecute("UPDATE arena_team SET m_BackgroundColor='%u', m_EmblemStyle='%u', m_EmblemColor='%u', m_BorderStyle='%u', m_BorderColor='%u' WHERE arenateamid='%u'", m_BackgroundColor, m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_TeamId); + 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) diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 81f50ea49..2af3f0d9f 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 "8270" + #define REVISION_NR "8271" #endif // __REVISION_NR_H__ From 7f38da23fdecc487f684ad7ae9ce149bc49c56ce Mon Sep 17 00:00:00 2001 From: Sorya Date: Wed, 29 Jul 2009 09:55:11 +0400 Subject: [PATCH 6/8] [8272] Fixed typos in world 'height' by code. Signed-off-by: VladimirMangos Also some other code style fixes. --- contrib/extractor/System.cpp | 47 ++++++++++++++++++--------------- src/game/Map.cpp | 8 +++--- src/game/Map.h | 26 +++++++++++------- src/shared/revision_nr.h | 2 +- src/shared/vmap/VMapManager.cpp | 2 +- 5 files changed, 49 insertions(+), 36 deletions(-) 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::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/shared/revision_nr.h b/src/shared/revision_nr.h index 2af3f0d9f..edb6523aa 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 "8271" + #define REVISION_NR "8272" #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; From cac822949febd5b19d660fee7ef34c6c9edc60a8 Mon Sep 17 00:00:00 2001 From: NoFantasy Date: Wed, 29 Jul 2009 12:35:01 +0200 Subject: [PATCH 7/8] [8273] Use UNIT_STAT_ROAMING for PointMovement generator. Signed-off-by: NoFantasy --- src/game/PointMovementGenerator.cpp | 2 +- src/shared/revision_nr.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/shared/revision_nr.h b/src/shared/revision_nr.h index edb6523aa..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 "8272" + #define REVISION_NR "8273" #endif // __REVISION_NR_H__ From 7c52111fb1488e25ed5c35ea1771c5472ff4a03b Mon Sep 17 00:00:00 2001 From: tomrus88 Date: Wed, 29 Jul 2009 15:11:19 +0400 Subject: [PATCH 8/8] Fixed /played chat command. (cherry picked from commit 3e49bbe692ea5f44ea2daffdfe970a7201d501f5) Conflicts: src/game/MiscHandler.cpp src/game/SharedDefines.h src/game/UpdateFields.h src/realmd/AuthCodes.h --- src/game/MiscHandler.cpp | 16 +- src/game/SharedDefines.h | 370 +++++++++++++++++++------------------- src/game/WorldSocket.cpp | 3 +- src/realmd/AuthSocket.cpp | 174 ++++++++++-------- 4 files changed, 293 insertions(+), 270 deletions(-) diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 535a29682..d9cff6874 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -1160,15 +1160,17 @@ void WorldSession::HandleWardenDataOpcode(WorldPacket& /*recv_data*/) */ } -void WorldSession::HandlePlayedTime(WorldPacket& /*recv_data*/) +void WorldSession::HandlePlayedTime(WorldPacket& recv_data) { - uint32 TotalTimePlayed = GetPlayer()->GetTotalPlayedTime(); - uint32 LevelPlayedTime = GetPlayer()->GetLevelPlayedTime(); + CHECK_PACKET_SIZE(recv_data, 1); - WorldPacket data(SMSG_PLAYED_TIME, 9); - data << TotalTimePlayed; - data << LevelPlayedTime; - data << uint8(1); + uint8 unk1; + recv_data >> unk1; // 0 or 1 expected + + WorldPacket data(SMSG_PLAYED_TIME, 4 + 4 + 1); + data << uint32(_player->GetTotalPlayedTime()); + data << uint32(_player->GetLevelPlayedTime()); + data << uint8(unk1); // 0 - will not show in chat frame SendPacket(&data); } diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index dbe226931..58c60a012 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -688,190 +688,194 @@ enum SpellEffects enum SpellCastResult { - SPELL_FAILED_AFFECTING_COMBAT = 0, - SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 1, - SPELL_FAILED_ALREADY_AT_FULL_MANA = 2, - SPELL_FAILED_ALREADY_AT_FULL_POWER = 3, - SPELL_FAILED_ALREADY_BEING_TAMED = 4, - SPELL_FAILED_ALREADY_HAVE_CHARM = 5, - SPELL_FAILED_ALREADY_HAVE_SUMMON = 6, - SPELL_FAILED_ALREADY_OPEN = 7, - SPELL_FAILED_AURA_BOUNCED = 8, - SPELL_FAILED_AUTOTRACK_INTERRUPTED = 9, - SPELL_FAILED_BAD_IMPLICIT_TARGETS = 10, - SPELL_FAILED_BAD_TARGETS = 11, - SPELL_FAILED_CANT_BE_CHARMED = 12, - SPELL_FAILED_CANT_BE_DISENCHANTED = 13, - SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 14, - SPELL_FAILED_CANT_BE_MILLED = 15, - SPELL_FAILED_CANT_BE_PROSPECTED = 16, - SPELL_FAILED_CANT_CAST_ON_TAPPED = 17, - SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 18, - SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 19, - SPELL_FAILED_CANT_STEALTH = 20, - SPELL_FAILED_CASTER_AURASTATE = 21, - SPELL_FAILED_CASTER_DEAD = 22, - SPELL_FAILED_CHARMED = 23, - SPELL_FAILED_CHEST_IN_USE = 24, - SPELL_FAILED_CONFUSED = 25, - SPELL_FAILED_DONT_REPORT = 26, - SPELL_FAILED_EQUIPPED_ITEM = 27, - SPELL_FAILED_EQUIPPED_ITEM_CLASS = 28, - SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 29, - SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 30, - SPELL_FAILED_ERROR = 31, - SPELL_FAILED_FIZZLE = 32, - SPELL_FAILED_FLEEING = 33, - SPELL_FAILED_FOOD_LOWLEVEL = 34, - SPELL_FAILED_HIGHLEVEL = 35, - SPELL_FAILED_HUNGER_SATIATED = 36, - SPELL_FAILED_IMMUNE = 37, - SPELL_FAILED_INCORRECT_AREA = 38, - SPELL_FAILED_INTERRUPTED = 39, - SPELL_FAILED_INTERRUPTED_COMBAT = 40, - SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 41, - SPELL_FAILED_ITEM_GONE = 42, - SPELL_FAILED_ITEM_NOT_FOUND = 43, - SPELL_FAILED_ITEM_NOT_READY = 44, - SPELL_FAILED_LEVEL_REQUIREMENT = 45, - SPELL_FAILED_LINE_OF_SIGHT = 46, - SPELL_FAILED_LOWLEVEL = 47, - SPELL_FAILED_LOW_CASTLEVEL = 48, - SPELL_FAILED_MAINHAND_EMPTY = 49, - SPELL_FAILED_MOVING = 50, - SPELL_FAILED_NEED_AMMO = 51, - SPELL_FAILED_NEED_AMMO_POUCH = 52, - SPELL_FAILED_NEED_EXOTIC_AMMO = 53, - SPELL_FAILED_NEED_MORE_ITEMS = 54, - SPELL_FAILED_NOPATH = 55, - SPELL_FAILED_NOT_BEHIND = 56, - SPELL_FAILED_NOT_FISHABLE = 57, - SPELL_FAILED_NOT_FLYING = 58, - SPELL_FAILED_NOT_HERE = 59, - SPELL_FAILED_NOT_INFRONT = 60, - SPELL_FAILED_NOT_IN_CONTROL = 61, - SPELL_FAILED_NOT_KNOWN = 62, - SPELL_FAILED_NOT_MOUNTED = 63, - SPELL_FAILED_NOT_ON_TAXI = 64, - SPELL_FAILED_NOT_ON_TRANSPORT = 65, - SPELL_FAILED_NOT_READY = 66, - SPELL_FAILED_NOT_SHAPESHIFT = 67, - SPELL_FAILED_NOT_STANDING = 68, - SPELL_FAILED_NOT_TRADEABLE = 69, - SPELL_FAILED_NOT_TRADING = 70, - SPELL_FAILED_NOT_UNSHEATHED = 71, - SPELL_FAILED_NOT_WHILE_GHOST = 72, - SPELL_FAILED_NOT_WHILE_LOOTING = 73, - SPELL_FAILED_NO_AMMO = 74, - SPELL_FAILED_NO_CHARGES_REMAIN = 75, - SPELL_FAILED_NO_CHAMPION = 76, - SPELL_FAILED_NO_COMBO_POINTS = 77, - SPELL_FAILED_NO_DUELING = 78, - SPELL_FAILED_NO_ENDURANCE = 79, - SPELL_FAILED_NO_FISH = 80, - SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 81, - SPELL_FAILED_NO_MOUNTS_ALLOWED = 82, - SPELL_FAILED_NO_PET = 83, - SPELL_FAILED_NO_POWER = 84, - SPELL_FAILED_NOTHING_TO_DISPEL = 85, - SPELL_FAILED_NOTHING_TO_STEAL = 86, - SPELL_FAILED_ONLY_ABOVEWATER = 87, - SPELL_FAILED_ONLY_DAYTIME = 88, - SPELL_FAILED_ONLY_INDOORS = 89, - SPELL_FAILED_ONLY_MOUNTED = 90, - SPELL_FAILED_ONLY_NIGHTTIME = 91, - SPELL_FAILED_ONLY_OUTDOORS = 92, - SPELL_FAILED_ONLY_SHAPESHIFT = 93, - SPELL_FAILED_ONLY_STEALTHED = 94, - SPELL_FAILED_ONLY_UNDERWATER = 95, - SPELL_FAILED_OUT_OF_RANGE = 96, - SPELL_FAILED_PACIFIED = 97, - SPELL_FAILED_POSSESSED = 98, - SPELL_FAILED_REAGENTS = 99, - SPELL_FAILED_REQUIRES_AREA = 100, - SPELL_FAILED_REQUIRES_SPELL_FOCUS = 101, - SPELL_FAILED_ROOTED = 102, - SPELL_FAILED_SILENCED = 103, - SPELL_FAILED_SPELL_IN_PROGRESS = 104, - SPELL_FAILED_SPELL_LEARNED = 105, - SPELL_FAILED_SPELL_UNAVAILABLE = 106, - SPELL_FAILED_STUNNED = 107, - SPELL_FAILED_TARGETS_DEAD = 108, - SPELL_FAILED_TARGET_AFFECTING_COMBAT = 109, - SPELL_FAILED_TARGET_AURASTATE = 110, - SPELL_FAILED_TARGET_DUELING = 111, - SPELL_FAILED_TARGET_ENEMY = 112, - SPELL_FAILED_TARGET_ENRAGED = 113, - SPELL_FAILED_TARGET_FRIENDLY = 114, - SPELL_FAILED_TARGET_IN_COMBAT = 115, - SPELL_FAILED_TARGET_IS_PLAYER = 116, - SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 117, - SPELL_FAILED_TARGET_NOT_DEAD = 118, - SPELL_FAILED_TARGET_NOT_IN_PARTY = 119, - SPELL_FAILED_TARGET_NOT_LOOTED = 120, - SPELL_FAILED_TARGET_NOT_PLAYER = 121, - SPELL_FAILED_TARGET_NO_POCKETS = 122, - SPELL_FAILED_TARGET_NO_WEAPONS = 123, - SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 124, - SPELL_FAILED_TARGET_UNSKINNABLE = 125, - SPELL_FAILED_THIRST_SATIATED = 126, - SPELL_FAILED_TOO_CLOSE = 127, - SPELL_FAILED_TOO_MANY_OF_ITEM = 128, - SPELL_FAILED_TOTEM_CATEGORY = 129, - SPELL_FAILED_TOTEMS = 130, - SPELL_FAILED_TRY_AGAIN = 131, - SPELL_FAILED_UNIT_NOT_BEHIND = 132, - SPELL_FAILED_UNIT_NOT_INFRONT = 133, - SPELL_FAILED_WRONG_PET_FOOD = 134, - SPELL_FAILED_NOT_WHILE_FATIGUED = 135, - SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 136, - SPELL_FAILED_NOT_WHILE_TRADING = 137, - SPELL_FAILED_TARGET_NOT_IN_RAID = 138, - SPELL_FAILED_TARGET_FREEFORALL = 139, - SPELL_FAILED_NO_EDIBLE_CORPSES = 140, - SPELL_FAILED_ONLY_BATTLEGROUNDS = 141, - SPELL_FAILED_TARGET_NOT_GHOST = 142, - SPELL_FAILED_TRANSFORM_UNUSABLE = 143, - SPELL_FAILED_WRONG_WEATHER = 144, - SPELL_FAILED_DAMAGE_IMMUNE = 145, - SPELL_FAILED_PREVENTED_BY_MECHANIC = 146, - SPELL_FAILED_PLAY_TIME = 147, - SPELL_FAILED_REPUTATION = 148, - SPELL_FAILED_MIN_SKILL = 149, - SPELL_FAILED_NOT_IN_ARENA = 150, - SPELL_FAILED_NOT_ON_SHAPESHIFT = 151, - SPELL_FAILED_NOT_ON_STEALTHED = 152, - SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 153, - SPELL_FAILED_NOT_ON_MOUNTED = 154, - SPELL_FAILED_TOO_SHALLOW = 155, - SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 156, - SPELL_FAILED_TARGET_IS_TRIVIAL = 157, - SPELL_FAILED_BM_OR_INVISGOD = 158, - SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 159, - SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 160, - SPELL_FAILED_NOT_IDLE = 161, - SPELL_FAILED_NOT_INACTIVE = 162, - SPELL_FAILED_PARTIAL_PLAYTIME = 163, - SPELL_FAILED_NO_PLAYTIME = 164, - SPELL_FAILED_NOT_IN_BATTLEGROUND = 165, - SPELL_FAILED_NOT_IN_RAID_INSTANCE = 166, - SPELL_FAILED_ONLY_IN_ARENA = 167, - SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 168, - SPELL_FAILED_ON_USE_ENCHANT = 169, - SPELL_FAILED_NOT_ON_GROUND = 170, - SPELL_FAILED_CUSTOM_ERROR = 171, - SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 172, - SPELL_FAILED_TOO_MANY_SOCKETS = 173, - SPELL_FAILED_INVALID_GLYPH = 174, - SPELL_FAILED_UNIQUE_GLYPH = 175, - SPELL_FAILED_GLYPH_SOCKET_LOCKED = 176, - SPELL_FAILED_NO_VALID_TARGETS = 177, - SPELL_FAILED_ITEM_AT_MAX_CHARGES = 178, - SPELL_FAILED_NOT_IN_BARBERSHOP = 179, - SPELL_FAILED_FISHING_TOO_LOW = 180, - SPELL_FAILED_UNKNOWN = 181, + SPELL_FAILED_AFFECTING_COMBAT = 0x00, + SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 0x01, + SPELL_FAILED_ALREADY_AT_FULL_MANA = 0x02, + SPELL_FAILED_ALREADY_AT_FULL_POWER = 0x03, + SPELL_FAILED_ALREADY_BEING_TAMED = 0x04, + SPELL_FAILED_ALREADY_HAVE_CHARM = 0x05, + SPELL_FAILED_ALREADY_HAVE_SUMMON = 0x06, + SPELL_FAILED_ALREADY_OPEN = 0x07, + SPELL_FAILED_AURA_BOUNCED = 0x08, + SPELL_FAILED_AUTOTRACK_INTERRUPTED = 0x09, + SPELL_FAILED_BAD_IMPLICIT_TARGETS = 0x0A, + SPELL_FAILED_BAD_TARGETS = 0x0B, + SPELL_FAILED_CANT_BE_CHARMED = 0x0C, + SPELL_FAILED_CANT_BE_DISENCHANTED = 0x0D, + SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 0x0E, + SPELL_FAILED_CANT_BE_MILLED = 0x0F, + SPELL_FAILED_CANT_BE_PROSPECTED = 0x10, + SPELL_FAILED_CANT_CAST_ON_TAPPED = 0x11, + SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 0x12, + SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 0x13, + SPELL_FAILED_CANT_STEALTH = 0x14, + SPELL_FAILED_CASTER_AURASTATE = 0x15, + SPELL_FAILED_CASTER_DEAD = 0x16, + SPELL_FAILED_CHARMED = 0x17, + SPELL_FAILED_CHEST_IN_USE = 0x18, + SPELL_FAILED_CONFUSED = 0x19, + SPELL_FAILED_DONT_REPORT = 0x1A, + SPELL_FAILED_EQUIPPED_ITEM = 0x1B, + SPELL_FAILED_EQUIPPED_ITEM_CLASS = 0x1C, + SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 0x1D, + SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 0x1E, + SPELL_FAILED_ERROR = 0x1F, + SPELL_FAILED_FIZZLE = 0x20, + SPELL_FAILED_FLEEING = 0x21, + SPELL_FAILED_FOOD_LOWLEVEL = 0x22, + SPELL_FAILED_HIGHLEVEL = 0x23, + SPELL_FAILED_HUNGER_SATIATED = 0x24, + SPELL_FAILED_IMMUNE = 0x25, + SPELL_FAILED_INCORRECT_AREA = 0x26, + SPELL_FAILED_INTERRUPTED = 0x27, + SPELL_FAILED_INTERRUPTED_COMBAT = 0x28, + SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 0x29, + SPELL_FAILED_ITEM_GONE = 0x2A, + SPELL_FAILED_ITEM_NOT_FOUND = 0x2B, + SPELL_FAILED_ITEM_NOT_READY = 0x2C, + SPELL_FAILED_LEVEL_REQUIREMENT = 0x2D, + SPELL_FAILED_LINE_OF_SIGHT = 0x2E, + SPELL_FAILED_LOWLEVEL = 0x2F, + SPELL_FAILED_LOW_CASTLEVEL = 0x30, + SPELL_FAILED_MAINHAND_EMPTY = 0x31, + SPELL_FAILED_MOVING = 0x32, + SPELL_FAILED_NEED_AMMO = 0x33, + SPELL_FAILED_NEED_AMMO_POUCH = 0x34, + SPELL_FAILED_NEED_EXOTIC_AMMO = 0x35, + SPELL_FAILED_NEED_MORE_ITEMS = 0x36, + SPELL_FAILED_NOPATH = 0x37, + SPELL_FAILED_NOT_BEHIND = 0x38, + SPELL_FAILED_NOT_FISHABLE = 0x39, + SPELL_FAILED_NOT_FLYING = 0x3A, + SPELL_FAILED_NOT_HERE = 0x3B, + SPELL_FAILED_NOT_INFRONT = 0x3C, + SPELL_FAILED_NOT_IN_CONTROL = 0x3D, + SPELL_FAILED_NOT_KNOWN = 0x3E, + SPELL_FAILED_NOT_MOUNTED = 0x3F, + SPELL_FAILED_NOT_ON_TAXI = 0x40, + SPELL_FAILED_NOT_ON_TRANSPORT = 0x41, + SPELL_FAILED_NOT_READY = 0x42, + SPELL_FAILED_NOT_SHAPESHIFT = 0x43, + SPELL_FAILED_NOT_STANDING = 0x44, + SPELL_FAILED_NOT_TRADEABLE = 0x45, + SPELL_FAILED_NOT_TRADING = 0x46, + SPELL_FAILED_NOT_UNSHEATHED = 0x47, + SPELL_FAILED_NOT_WHILE_GHOST = 0x48, + SPELL_FAILED_NOT_WHILE_LOOTING = 0x49, + SPELL_FAILED_NO_AMMO = 0x4A, + SPELL_FAILED_NO_CHARGES_REMAIN = 0x4B, + SPELL_FAILED_NO_CHAMPION = 0x4C, + SPELL_FAILED_NO_COMBO_POINTS = 0x4D, + SPELL_FAILED_NO_DUELING = 0x4E, + SPELL_FAILED_NO_ENDURANCE = 0x4F, + SPELL_FAILED_NO_FISH = 0x50, + SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 0x51, + SPELL_FAILED_NO_MOUNTS_ALLOWED = 0x52, + SPELL_FAILED_NO_PET = 0x53, + SPELL_FAILED_NO_POWER = 0x54, + SPELL_FAILED_NOTHING_TO_DISPEL = 0x55, + SPELL_FAILED_NOTHING_TO_STEAL = 0x56, + SPELL_FAILED_ONLY_ABOVEWATER = 0x57, + SPELL_FAILED_ONLY_DAYTIME = 0x58, + SPELL_FAILED_ONLY_INDOORS = 0x59, + SPELL_FAILED_ONLY_MOUNTED = 0x5A, + SPELL_FAILED_ONLY_NIGHTTIME = 0x5B, + SPELL_FAILED_ONLY_OUTDOORS = 0x5C, + SPELL_FAILED_ONLY_SHAPESHIFT = 0x5D, + SPELL_FAILED_ONLY_STEALTHED = 0x5E, + SPELL_FAILED_ONLY_UNDERWATER = 0x5F, + SPELL_FAILED_OUT_OF_RANGE = 0x60, + SPELL_FAILED_PACIFIED = 0x61, + SPELL_FAILED_POSSESSED = 0x62, + SPELL_FAILED_REAGENTS = 0x63, + SPELL_FAILED_REQUIRES_AREA = 0x64, + SPELL_FAILED_REQUIRES_SPELL_FOCUS = 0x65, + SPELL_FAILED_ROOTED = 0x66, + SPELL_FAILED_SILENCED = 0x67, + SPELL_FAILED_SPELL_IN_PROGRESS = 0x68, + SPELL_FAILED_SPELL_LEARNED = 0x69, + SPELL_FAILED_SPELL_UNAVAILABLE = 0x6A, + SPELL_FAILED_STUNNED = 0x6B, + SPELL_FAILED_TARGETS_DEAD = 0x6C, + SPELL_FAILED_TARGET_AFFECTING_COMBAT = 0x6D, + SPELL_FAILED_TARGET_AURASTATE = 0x6E, + SPELL_FAILED_TARGET_DUELING = 0x6F, + SPELL_FAILED_TARGET_ENEMY = 0x70, + SPELL_FAILED_TARGET_ENRAGED = 0x71, + SPELL_FAILED_TARGET_FRIENDLY = 0x72, + SPELL_FAILED_TARGET_IN_COMBAT = 0x73, + SPELL_FAILED_TARGET_IS_PLAYER = 0x74, + SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 0x75, + SPELL_FAILED_TARGET_NOT_DEAD = 0x76, + SPELL_FAILED_TARGET_NOT_IN_PARTY = 0x77, + SPELL_FAILED_TARGET_NOT_LOOTED = 0x78, + SPELL_FAILED_TARGET_NOT_PLAYER = 0x79, + SPELL_FAILED_TARGET_NO_POCKETS = 0x7A, + SPELL_FAILED_TARGET_NO_WEAPONS = 0x7B, + SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 0x7C, + SPELL_FAILED_TARGET_UNSKINNABLE = 0x7D, + SPELL_FAILED_THIRST_SATIATED = 0x7E, + SPELL_FAILED_TOO_CLOSE = 0x7F, + SPELL_FAILED_TOO_MANY_OF_ITEM = 0x80, + SPELL_FAILED_TOTEM_CATEGORY = 0x81, + SPELL_FAILED_TOTEMS = 0x82, + SPELL_FAILED_TRY_AGAIN = 0x83, + SPELL_FAILED_UNIT_NOT_BEHIND = 0x84, + SPELL_FAILED_UNIT_NOT_INFRONT = 0x85, + SPELL_FAILED_WRONG_PET_FOOD = 0x86, + SPELL_FAILED_NOT_WHILE_FATIGUED = 0x87, + SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 0x88, + SPELL_FAILED_NOT_WHILE_TRADING = 0x89, + SPELL_FAILED_TARGET_NOT_IN_RAID = 0x8A, + SPELL_FAILED_TARGET_FREEFORALL = 0x8B, + SPELL_FAILED_NO_EDIBLE_CORPSES = 0x8C, + SPELL_FAILED_ONLY_BATTLEGROUNDS = 0x8D, + SPELL_FAILED_TARGET_NOT_GHOST = 0x8E, + SPELL_FAILED_TRANSFORM_UNUSABLE = 0x8F, + SPELL_FAILED_WRONG_WEATHER = 0x90, + SPELL_FAILED_DAMAGE_IMMUNE = 0x91, + SPELL_FAILED_PREVENTED_BY_MECHANIC = 0x92, + SPELL_FAILED_PLAY_TIME = 0x93, + SPELL_FAILED_REPUTATION = 0x94, + SPELL_FAILED_MIN_SKILL = 0x95, + SPELL_FAILED_NOT_IN_ARENA = 0x96, + SPELL_FAILED_NOT_ON_SHAPESHIFT = 0x97, + SPELL_FAILED_NOT_ON_STEALTHED = 0x98, + SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 0x99, + SPELL_FAILED_NOT_ON_MOUNTED = 0x9A, + SPELL_FAILED_TOO_SHALLOW = 0x9B, + SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 0x9C, + SPELL_FAILED_TARGET_IS_TRIVIAL = 0x9D, + SPELL_FAILED_BM_OR_INVISGOD = 0x9E, + SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 0x9F, + SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 0xA0, + SPELL_FAILED_NOT_IDLE = 0xA1, + SPELL_FAILED_NOT_INACTIVE = 0xA2, + SPELL_FAILED_PARTIAL_PLAYTIME = 0xA3, + SPELL_FAILED_NO_PLAYTIME = 0xA4, + SPELL_FAILED_NOT_IN_BATTLEGROUND = 0xA5, + SPELL_FAILED_NOT_IN_RAID_INSTANCE = 0xA6, + SPELL_FAILED_ONLY_IN_ARENA = 0xA7, + SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 0xA8, + SPELL_FAILED_ON_USE_ENCHANT = 0xA9, + SPELL_FAILED_NOT_ON_GROUND = 0xAA, + SPELL_FAILED_CUSTOM_ERROR = 0xAB, + SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 0xAC, + SPELL_FAILED_TOO_MANY_SOCKETS = 0xAD, + SPELL_FAILED_INVALID_GLYPH = 0xAE, + SPELL_FAILED_UNIQUE_GLYPH = 0xAF, + SPELL_FAILED_GLYPH_SOCKET_LOCKED = 0xB0, + SPELL_FAILED_NO_VALID_TARGETS = 0xB1, + SPELL_FAILED_ITEM_AT_MAX_CHARGES = 0xB2, + SPELL_FAILED_NOT_IN_BARBERSHOP = 0xB3, + SPELL_FAILED_FISHING_TOO_LOW = 0xB4, + SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 0xB5, + SPELL_FAILED_SUMMON_PENDING = 0xB6, + SPELL_FAILED_MAX_SOCKETS = 0xB7, + SPELL_FAILED_PET_CAN_RENAME = 0xB8, + SPELL_FAILED_UNKNOWN = 0xB9, - SPELL_CAST_OK = 255 //custom value, don't must be send to client + SPELL_CAST_OK = 0xFF // custom value, don't must be send to client }; // Spell aura states diff --git a/src/game/WorldSocket.cpp b/src/game/WorldSocket.cpp index 2281761e0..737f28631 100644 --- a/src/game/WorldSocket.cpp +++ b/src/game/WorldSocket.cpp @@ -776,10 +776,11 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket) recvPacket >> clientSeed; recvPacket.read (digest, 20); - DEBUG_LOG ("WorldSocket::HandleAuthSession: client %u, unk2 %u, account %s, clientseed %u", + DEBUG_LOG ("WorldSocket::HandleAuthSession: client %u, unk2 %u, account %s, unk3 %u, clientseed %u", BuiltNumberClient, unk2, account.c_str (), + unk3, clientSeed); // Get the account information from the realmd database diff --git a/src/realmd/AuthSocket.cpp b/src/realmd/AuthSocket.cpp index 989c645da..5611d85e8 100644 --- a/src/realmd/AuthSocket.cpp +++ b/src/realmd/AuthSocket.cpp @@ -110,7 +110,7 @@ typedef struct AUTH_LOGON_PROOF_C uint8 M1[20]; uint8 crc_hash[20]; uint8 number_of_keys; - uint8 unk; // Added in 1.12.x client branch + uint8 securityFlags; // 0x00-0x04 } sAuthLogonProof_C; /* typedef struct @@ -262,17 +262,11 @@ void AuthSocket::OnRead() ///- Get the command out of it ibuf.SoftRead((char *)&_cmd, 1); // UQ1: No longer exists in new net code ??? - //ibuf.Read((char *)&_cmd, 1); - /*char *command = (char *)malloc(1); - ibuf.Read(command, 1); - - _cmd = (uint8)command;*/ - // assert(0); size_t i; ///- Circle through known commands and call the correct command handler - for (i=0;icountry[4-i-1]; - sLog.outBasic("[AuthChallenge] account %s is using '%c%c%c%c' locale (%u)", _login.c_str (), ch->country[3],ch->country[2],ch->country[1],ch->country[0], GetLocaleByName(_localizationName)); + sLog.outBasic("[AuthChallenge] account %s is using '%c%c%c%c' locale (%u)", _login.c_str (), ch->country[3], ch->country[2], ch->country[1], ch->country[0], GetLocaleByName(_localizationName)); } } delete result; @@ -508,13 +523,13 @@ bool AuthSocket::_HandleLogonProof() ibuf.Read((char *)&lp, sizeof(sAuthLogonProof_C)); ///- Check if the client has one of the expected version numbers - bool valid_version=false; - int accepted_versions[]=EXPECTED_MANGOS_CLIENT_BUILD; - for(int i=0;accepted_versions[i];i++) + bool valid_version = false; + int accepted_versions[] = EXPECTED_MANGOS_CLIENT_BUILD; + for(int i = 0; accepted_versions[i]; ++i) { - if(_build==accepted_versions[i]) + if(_build == accepted_versions[i]) { - valid_version=true; + valid_version = true; break; } } @@ -527,9 +542,9 @@ bool AuthSocket::_HandleLogonProof() // 24 = len("./patches/65535enGB.mpq")+1 char tmp[24]; // No buffer overflow (fixed length of arguments) - sprintf(tmp,"./patches/%d%s.mpq",_build, _localizationName.c_str()); - // This will be closed at the destruction of the AuthSocket (client deconnection) - FILE *pFile=fopen(tmp,"rb"); + sprintf(tmp, "./patches/%d%s.mpq", _build, _localizationName.c_str()); + // This will be closed at the destruction of the AuthSocket (client disconnection) + FILE *pFile = fopen(tmp, "rb"); if(!pFile) { @@ -538,37 +553,37 @@ bool AuthSocket::_HandleLogonProof() pkt << (uint8) 0x00; pkt << (uint8) REALM_AUTH_WRONG_BUILD_NUMBER; DEBUG_LOG("[AuthChallenge] %u is not a valid client version!", _build); - DEBUG_LOG("[AuthChallenge] Patch %s not found",tmp); + DEBUG_LOG("[AuthChallenge] Patch %s not found", tmp); SendBuf((char const*)pkt.contents(), pkt.size()); return true; } else // have patch { - pPatch=pFile; + pPatch = pFile; XFER_INIT xferh; ///- Get the MD5 hash of the patch file (get it from preloaded Patcher cache or calculate it) - if(PatchesCache.GetHash(tmp,(uint8*)&xferh.md5)) + if(PatchesCache.GetHash(tmp, (uint8*)&xferh.md5)) { - DEBUG_LOG("\n[AuthChallenge] Found precached patch info for patch %s",tmp); + DEBUG_LOG("\n[AuthChallenge] Found precached patch info for patch %s", tmp); } else { // calculate patch md5 - printf("\n[AuthChallenge] Patch info for %s was not cached.",tmp); + printf("\n[AuthChallenge] Patch info for %s was not cached.", tmp); PatchesCache.LoadPatchMD5(tmp); - PatchesCache.GetHash(tmp,(uint8*)&xferh.md5); + PatchesCache.GetHash(tmp, (uint8*)&xferh.md5); } ///- Send a packet to the client with the file length and MD5 hash - uint8 data[2]={AUTH_LOGON_PROOF,REALM_AUTH_UPDATE_CLIENT}; - SendBuf((const char*)data,sizeof(data)); + uint8 data[2] = { AUTH_LOGON_PROOF, REALM_AUTH_UPDATE_CLIENT }; + SendBuf((const char*)data, sizeof(data)); - memcpy(&xferh,"0\x05Patch",7); - xferh.cmd=XFER_INITIATE; - fseek(pPatch,0,SEEK_END); - xferh.file_size=ftell(pPatch); + memcpy(&xferh, "0\x05Patch", 7); + xferh.cmd = XFER_INITIATE; + fseek(pPatch, 0, SEEK_END); + xferh.file_size = ftell(pPatch); - SendBuf((const char*)&xferh,sizeof(xferh)); + SendBuf((const char*)&xferh, sizeof(xferh)); return true; } } @@ -589,27 +604,27 @@ bool AuthSocket::_HandleLogonProof() uint8 t1[16]; uint8 vK[40]; memcpy(t, S.AsByteArray(), 32); - for (int i = 0; i < 16; i++) + for (int i = 0; i < 16; ++i) { - t1[i] = t[i*2]; + t1[i] = t[i * 2]; } sha.Initialize(); sha.UpdateData(t1, 16); sha.Finalize(); - for (int i = 0; i < 20; i++) + for (int i = 0; i < 20; ++i) { - vK[i*2] = sha.GetDigest()[i]; + vK[i * 2] = sha.GetDigest()[i]; } - for (int i = 0; i < 16; i++) + for (int i = 0; i < 16; ++i) { - t1[i] = t[i*2+1]; + t1[i] = t[i * 2 + 1]; } sha.Initialize(); sha.UpdateData(t1, 16); sha.Finalize(); - for (int i = 0; i < 20; i++) + for (int i = 0; i < 20; ++i) { - vK[i*2+1] = sha.GetDigest()[i]; + vK[i * 2 + 1] = sha.GetDigest()[i]; } K.SetBinary(vK, 40); @@ -622,7 +637,7 @@ bool AuthSocket::_HandleLogonProof() sha.Initialize(); sha.UpdateBigNumbers(&g, NULL); sha.Finalize(); - for (int i = 0; i < 20; i++) + for (int i = 0; i < 20; ++i) { hash[i] ^= sha.GetDigest()[i]; } @@ -674,8 +689,8 @@ bool AuthSocket::_HandleLogonProof() } else { - char data[4]={AUTH_LOGON_PROOF,REALM_AUTH_NO_MATCH,3,0}; - SendBuf(data,sizeof(data)); + char data[4]= { AUTH_LOGON_PROOF, REALM_AUTH_NO_MATCH, 3, 0}; + SendBuf(data, sizeof(data)); sLog.outBasic("[AuthChallenge] account %s tried to login with wrong password!",_login.c_str ()); uint32 MaxWrongPassCount = sConfig.GetIntDefault("WrongPass.MaxCount", 0); @@ -770,7 +785,7 @@ bool AuthSocket::_HandleReconnectChallenge() ByteBuffer pkt; pkt << (uint8) AUTH_RECONNECT_CHALLENGE; pkt << (uint8) 0x00; - _reconnectProof.SetRand(16*8); + _reconnectProof.SetRand(16 * 8); pkt.append(_reconnectProof.AsByteBuffer()); // 16 bytes random pkt << (uint64) 0x00 << (uint64) 0x00; // 16 bytes zeros SendBuf((char const*)pkt.contents(), pkt.size()); @@ -852,7 +867,7 @@ bool AuthSocket::_HandleRealmList() pkt << (uint32) 0; pkt << (uint16) m_realmList.size(); RealmList::RealmMap::const_iterator i; - for( i = m_realmList.begin(); i != m_realmList.end(); i++ ) + for( i = m_realmList.begin(); i != m_realmList.end(); ++i ) { uint8 AmountOfCharacters; @@ -899,7 +914,7 @@ bool AuthSocket::_HandleXferResume() { DEBUG_LOG("Entering _HandleXferResume"); ///- Check packet length and patch existence - if (ibuf.GetLength()<9 || !pPatch) + if (ibuf.GetLength() < 9 || !pPatch) { sLog.outError("Error while resuming patch transfer (wrong packet)"); return false; @@ -909,7 +924,7 @@ bool AuthSocket::_HandleXferResume() uint64 start; ibuf.Remove(1); ibuf.Read((char*)&start,sizeof(start)); - fseek(pPatch,start,0); + fseek(pPatch, start, 0); ACE_Based::Thread u(*new PatcherRunnable(this)); return true; @@ -940,9 +955,9 @@ bool AuthSocket::_HandleXferAccept() return false; } - ///- Launch a PatcherRunnable thread, starting at the begining of the patch file + ///- Launch a PatcherRunnable thread, starting at the beginning of the patch file ibuf.Remove(1); // clear input buffer - fseek(pPatch,0,0); + fseek(pPatch, 0, 0); ACE_Based::Thread u(*new PatcherRunnable(this)); return true; @@ -951,12 +966,12 @@ bool AuthSocket::_HandleXferAccept() /// Check if there is lag on the connection to the client bool AuthSocket::IsLag() { - return (TCP_BUFSIZE_READ-GetOutputLength()< 2*ChunkSize); + return (TCP_BUFSIZE_READ-GetOutputLength() < 2 * ChunkSize); } PatcherRunnable::PatcherRunnable(class AuthSocket * as) { - mySocket=as; + mySocket = as; } /// Send content of patch file to the client @@ -975,8 +990,8 @@ void PatcherRunnable::run() ACE_Based::Thread::Sleep(1); } ///- And send content of the patch file to the client - xfdata.data_size=fread(&xfdata.data,1,ChunkSize,mySocket->pPatch); - mySocket->SendBuf((const char*)&xfdata,xfdata.data_size +(sizeof(XFER_DATA_STRUCT)-ChunkSize)); + xfdata.data_size = fread(&xfdata.data, 1, ChunkSize, mySocket->pPatch); + mySocket->SendBuf((const char*)&xfdata, xfdata.data_size + (sizeof(XFER_DATA_STRUCT) - ChunkSize)); } } @@ -997,8 +1012,9 @@ void Patcher::LoadPatchesInfo() errno = 0; if ((dp = readdir(dirp)) != NULL) { - int l=strlen(dp->d_name); - if(l<8)continue; + int l = strlen(dp->d_name); + if(l < 8) + continue; if(!memcmp(&dp->d_name[l-4],".mpq",4)) LoadPatchMD5(dp->d_name); } @@ -1021,15 +1037,15 @@ void Patcher::LoadPatchesInfo() void Patcher::LoadPatchesInfo() { WIN32_FIND_DATA fil; - HANDLE hFil=FindFirstFile("./patches/*.mpq",&fil); - if(hFil==INVALID_HANDLE_VALUE) + HANDLE hFil=FindFirstFile("./patches/*.mpq", &fil); + if(hFil == INVALID_HANDLE_VALUE) return; // no patches were found do { LoadPatchMD5(fil.cFileName); } - while(FindNextFile(hFil,&fil)); + while(FindNextFile(hFil, &fil)); } #endif @@ -1039,11 +1055,11 @@ void Patcher::LoadPatchMD5(char * szFileName) ///- Try to open the patch file std::string path = "./patches/"; path += szFileName; - FILE * pPatch=fopen(path.c_str(),"rb"); - sLog.outDebug("Loading patch info from %s\n",path.c_str()); + FILE *pPatch = fopen(path.c_str(), "rb"); + sLog.outDebug("Loading patch info from %s\n", path.c_str()); if(!pPatch) { - sLog.outError("Error loading patch %s\n",path.c_str()); + sLog.outError("Error loading patch %s\n", path.c_str()); return; } @@ -1062,16 +1078,16 @@ void Patcher::LoadPatchMD5(char * szFileName) ///- Store the result in the internal patch hash map _patches[path] = new PATCH_INFO; - MD5_Final((uint8 *)&_patches[path]->md5 , &ctx); + MD5_Final((uint8 *)&_patches[path]->md5, &ctx); } /// Get cached MD5 hash for a given patch file -bool Patcher::GetHash(char * pat,uint8 mymd5[16]) +bool Patcher::GetHash(char * pat, uint8 mymd5[16]) { - for( Patches::iterator i = _patches.begin(); i != _patches.end(); i++ ) - if(!stricmp(pat,i->first.c_str () )) + for( Patches::iterator i = _patches.begin(); i != _patches.end(); ++i ) + if(!stricmp(pat, i->first.c_str())) { - memcpy(mymd5,i->second->md5,16); + memcpy(mymd5, i->second->md5, 16); return true; } @@ -1087,6 +1103,6 @@ Patcher::Patcher() /// Empty and delete the patch map on termination Patcher::~Patcher() { - for(Patches::iterator i = _patches.begin(); i != _patches.end(); i++ ) + for(Patches::iterator i = _patches.begin(); i != _patches.end(); ++i ) delete i->second; }