mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 04:37:00 +00:00
Merge commit 'origin/master' into 320
Conflicts: src/game/ArenaTeam.cpp
This commit is contained in:
commit
f90f3dd987
9 changed files with 234 additions and 199 deletions
|
|
@ -241,10 +241,11 @@ void ReadLiquidTypeTableDBC()
|
||||||
#define MAP_MAGIC 'SPAM'
|
#define MAP_MAGIC 'SPAM'
|
||||||
#define MAP_VERSION_MAGIC '0.1w'
|
#define MAP_VERSION_MAGIC '0.1w'
|
||||||
#define MAP_AREA_MAGIC 'AERA'
|
#define MAP_AREA_MAGIC 'AERA'
|
||||||
#define MAP_HEIGTH_MAGIC 'TGHM'
|
#define MAP_HEIGHT_MAGIC 'TGHM'
|
||||||
#define MAP_LIQUID_MAGIC 'QILM'
|
#define MAP_LIQUID_MAGIC 'QILM'
|
||||||
|
|
||||||
struct map_fileheader{
|
struct map_fileheader
|
||||||
|
{
|
||||||
uint32 mapMagic;
|
uint32 mapMagic;
|
||||||
uint32 versionMagic;
|
uint32 versionMagic;
|
||||||
uint32 areaMapOffset;
|
uint32 areaMapOffset;
|
||||||
|
|
@ -256,17 +257,20 @@ struct map_fileheader{
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAP_AREA_NO_AREA 0x0001
|
#define MAP_AREA_NO_AREA 0x0001
|
||||||
struct map_areaHeader{
|
|
||||||
|
struct map_areaHeader
|
||||||
|
{
|
||||||
uint32 fourcc;
|
uint32 fourcc;
|
||||||
uint16 flags;
|
uint16 flags;
|
||||||
uint16 gridArea;
|
uint16 gridArea;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAP_HEIGHT_NO_HIGHT 0x0001
|
#define MAP_HEIGHT_NO_HEIGHT 0x0001
|
||||||
#define MAP_HEIGHT_AS_INT16 0x0002
|
#define MAP_HEIGHT_AS_INT16 0x0002
|
||||||
#define MAP_HEIGHT_AS_INT8 0x0004
|
#define MAP_HEIGHT_AS_INT8 0x0004
|
||||||
|
|
||||||
struct map_heightHeader{
|
struct map_heightHeader
|
||||||
|
{
|
||||||
uint32 fourcc;
|
uint32 fourcc;
|
||||||
uint32 flags;
|
uint32 flags;
|
||||||
float gridHeight;
|
float gridHeight;
|
||||||
|
|
@ -284,9 +288,10 @@ struct map_heightHeader{
|
||||||
|
|
||||||
|
|
||||||
#define MAP_LIQUID_NO_TYPE 0x0001
|
#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;
|
uint32 fourcc;
|
||||||
uint16 flags;
|
uint16 flags;
|
||||||
uint16 liquidType;
|
uint16 liquidType;
|
||||||
|
|
@ -511,20 +516,20 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x)
|
||||||
map.heightMapSize = sizeof(map_heightHeader);
|
map.heightMapSize = sizeof(map_heightHeader);
|
||||||
|
|
||||||
map_heightHeader heightHeader;
|
map_heightHeader heightHeader;
|
||||||
heightHeader.fourcc = MAP_HEIGTH_MAGIC;
|
heightHeader.fourcc = MAP_HEIGHT_MAGIC;
|
||||||
heightHeader.flags = 0;
|
heightHeader.flags = 0;
|
||||||
heightHeader.gridHeight = minHeight;
|
heightHeader.gridHeight = minHeight;
|
||||||
heightHeader.gridMaxHeight = maxHeight;
|
heightHeader.gridMaxHeight = maxHeight;
|
||||||
|
|
||||||
if (maxHeight == minHeight)
|
if (maxHeight == minHeight)
|
||||||
heightHeader.flags |=MAP_HEIGHT_NO_HIGHT;
|
heightHeader.flags |= MAP_HEIGHT_NO_HEIGHT;
|
||||||
|
|
||||||
// Not need store if flat surface
|
// Not need store if flat surface
|
||||||
if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_height_delta_limit)
|
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
|
// 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;
|
float step;
|
||||||
// Try Store as uint values
|
// Try Store as uint values
|
||||||
|
|
@ -756,22 +761,22 @@ bool ConvertADT(char *filename, char *filename2, int cell_y, int cell_x)
|
||||||
liquidHeader.liquidLevel = minHeight;
|
liquidHeader.liquidLevel = minHeight;
|
||||||
|
|
||||||
if (maxHeight == minHeight)
|
if (maxHeight == minHeight)
|
||||||
liquidHeader.flags|=MAP_LIQUID_NO_HIGHT;
|
liquidHeader.flags |= MAP_LIQUID_NO_HEIGHT;
|
||||||
|
|
||||||
// Not need store if flat surface
|
// Not need store if flat surface
|
||||||
if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_liquid_delta_limit)
|
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)
|
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;
|
liquidHeader.liquidType = type;
|
||||||
else
|
else
|
||||||
map.liquidMapSize+=sizeof(liquid_type);
|
map.liquidMapSize+=sizeof(liquid_type);
|
||||||
|
|
||||||
if (!(liquidHeader.flags&MAP_LIQUID_NO_HIGHT))
|
if (!(liquidHeader.flags & MAP_LIQUID_NO_HEIGHT))
|
||||||
map.liquidMapSize+=sizeof(float)*liquidHeader.width*liquidHeader.height;
|
map.liquidMapSize += sizeof(float)*liquidHeader.width*liquidHeader.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ok all data prepared - store it
|
// 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
|
// Store height data
|
||||||
fwrite(&heightHeader, sizeof(heightHeader), 1, output);
|
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_V9, sizeof(uint16_V9), 1, output);
|
||||||
fwrite(uint16_V8, sizeof(uint16_V8), 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_V9, sizeof(uint8_V9), 1, output);
|
||||||
fwrite(uint8_V8, sizeof(uint8_V8), 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);
|
fwrite(&liquidHeader, sizeof(liquidHeader), 1, output);
|
||||||
if (!(liquidHeader.flags&MAP_LIQUID_NO_TYPE))
|
if (!(liquidHeader.flags&MAP_LIQUID_NO_TYPE))
|
||||||
fwrite(liquid_type, sizeof(liquid_type), 1, output);
|
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<liquidHeader.height;y++)
|
for (int y=0; y<liquidHeader.height;y++)
|
||||||
fwrite(&liquid_height[y+liquidHeader.offsetY][liquidHeader.offsetX], sizeof(float), liquidHeader.width, output);
|
fwrite(&liquid_height[y+liquidHeader.offsetY][liquidHeader.offsetX], sizeof(float), liquidHeader.width, output);
|
||||||
|
|
|
||||||
|
|
@ -19,24 +19,28 @@
|
||||||
#include "WorldPacket.h"
|
#include "WorldPacket.h"
|
||||||
#include "ObjectMgr.h"
|
#include "ObjectMgr.h"
|
||||||
#include "ArenaTeam.h"
|
#include "ArenaTeam.h"
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
ArenaTeam::ArenaTeam()
|
ArenaTeam::ArenaTeam()
|
||||||
{
|
{
|
||||||
Id = 0;
|
m_TeamId = 0;
|
||||||
Type = 0;
|
m_Type = 0;
|
||||||
Name = "";
|
m_Name = "";
|
||||||
CaptainGuid = 0;
|
m_CaptainGuid = 0;
|
||||||
BackgroundColor = 0; // background
|
m_BackgroundColor = 0; // background
|
||||||
EmblemStyle = 0; // icon
|
m_EmblemStyle = 0; // icon
|
||||||
EmblemColor = 0; // icon color
|
m_EmblemColor = 0; // icon color
|
||||||
BorderStyle = 0; // border
|
m_BorderStyle = 0; // border
|
||||||
BorderColor = 0; // border color
|
m_BorderColor = 0; // border color
|
||||||
stats.games_week = 0;
|
m_stats.games_week = 0;
|
||||||
stats.games_season = 0;
|
m_stats.games_season = 0;
|
||||||
stats.rank = 0;
|
m_stats.rank = 0;
|
||||||
stats.rating = 1500;
|
if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6)
|
||||||
stats.wins_week = 0;
|
m_stats.rating = 0;
|
||||||
stats.wins_season = 0;
|
else
|
||||||
|
m_stats.rating = 1500;
|
||||||
|
m_stats.wins_week = 0;
|
||||||
|
m_stats.wins_season = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ArenaTeam::~ArenaTeam()
|
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));
|
sLog.outDebug("GUILD: creating arena team %s to leader: %u", ArenaTeamName.c_str(), GUID_LOPART(captainGuid));
|
||||||
|
|
||||||
CaptainGuid = captainGuid;
|
m_CaptainGuid = captainGuid;
|
||||||
Name = ArenaTeamName;
|
m_Name = ArenaTeamName;
|
||||||
Type = type;
|
m_Type = type;
|
||||||
|
|
||||||
Id = objmgr.GenerateArenaTeamId();
|
m_TeamId = objmgr.GenerateArenaTeamId();
|
||||||
|
|
||||||
// ArenaTeamName already assigned to ArenaTeam::name, use it to encode string for DB
|
// ArenaTeamName already assigned to ArenaTeam::name, use it to encode string for DB
|
||||||
CharacterDatabase.escape_string(ArenaTeamName);
|
CharacterDatabase.escape_string(ArenaTeamName);
|
||||||
|
|
||||||
CharacterDatabase.BeginTransaction();
|
CharacterDatabase.BeginTransaction();
|
||||||
// CharacterDatabase.PExecute("DELETE FROM arena_team WHERE arenateamid='%u'", Id); - MAX(arenateam)+1 not exist
|
// 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'", Id);
|
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) "
|
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')",
|
"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 "
|
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();
|
CharacterDatabase.CommitTransaction();
|
||||||
|
|
||||||
AddMember(CaptainGuid);
|
AddMember(m_CaptainGuid);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -129,19 +133,29 @@ bool ArenaTeam::AddMember(const uint64& PlayerGuid)
|
||||||
newmember.games_week = 0;
|
newmember.games_week = 0;
|
||||||
newmember.wins_season = 0;
|
newmember.wins_season = 0;
|
||||||
newmember.wins_week = 0;
|
newmember.wins_week = 0;
|
||||||
newmember.personal_rating = 1500;
|
if (sWorld.getConfig(CONFIG_ARENA_SEASON_ID) >= 6)
|
||||||
members.push_back(newmember);
|
{
|
||||||
|
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)
|
if(pl)
|
||||||
{
|
{
|
||||||
pl->SetInArenaTeam(Id, GetSlot());
|
pl->SetInArenaTeam(m_TeamId, GetSlot());
|
||||||
pl->SetArenaTeamIdInvited(0);
|
pl->SetArenaTeamIdInvited(0);
|
||||||
pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_PERSONAL_RATING, newmember.personal_rating );
|
pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_PERSONAL_RATING, newmember.personal_rating );
|
||||||
|
|
||||||
// hide promote/remove buttons
|
// 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);
|
pl->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_MEMBER, 1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -156,15 +170,15 @@ bool ArenaTeam::LoadArenaTeamFromDB(uint32 ArenaTeamId)
|
||||||
|
|
||||||
Field *fields = result->Fetch();
|
Field *fields = result->Fetch();
|
||||||
|
|
||||||
Id = fields[0].GetUInt32();
|
m_TeamId = fields[0].GetUInt32();
|
||||||
Name = fields[1].GetCppString();
|
m_Name = fields[1].GetCppString();
|
||||||
CaptainGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
|
m_CaptainGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
|
||||||
Type = fields[3].GetUInt32();
|
m_Type = fields[3].GetUInt32();
|
||||||
BackgroundColor = fields[4].GetUInt32();
|
m_BackgroundColor = fields[4].GetUInt32();
|
||||||
EmblemStyle = fields[5].GetUInt32();
|
m_EmblemStyle = fields[5].GetUInt32();
|
||||||
EmblemColor = fields[6].GetUInt32();
|
m_EmblemColor = fields[6].GetUInt32();
|
||||||
BorderStyle = fields[7].GetUInt32();
|
m_BorderStyle = fields[7].GetUInt32();
|
||||||
BorderColor = fields[8].GetUInt32();
|
m_BorderColor = fields[8].GetUInt32();
|
||||||
|
|
||||||
delete result;
|
delete result;
|
||||||
|
|
||||||
|
|
@ -196,12 +210,12 @@ void ArenaTeam::LoadStatsFromDB(uint32 ArenaTeamId)
|
||||||
|
|
||||||
Field *fields = result->Fetch();
|
Field *fields = result->Fetch();
|
||||||
|
|
||||||
stats.rating = fields[0].GetUInt32();
|
m_stats.rating = fields[0].GetUInt32();
|
||||||
stats.games_week = fields[1].GetUInt32();
|
m_stats.games_week = fields[1].GetUInt32();
|
||||||
stats.wins_week = fields[2].GetUInt32();
|
m_stats.wins_week = fields[2].GetUInt32();
|
||||||
stats.games_season = fields[3].GetUInt32();
|
m_stats.games_season = fields[3].GetUInt32();
|
||||||
stats.wins_season = fields[4].GetUInt32();
|
m_stats.wins_season = fields[4].GetUInt32();
|
||||||
stats.rank = fields[5].GetUInt32();
|
m_stats.rank = fields[5].GetUInt32();
|
||||||
|
|
||||||
delete result;
|
delete result;
|
||||||
}
|
}
|
||||||
|
|
@ -228,7 +242,7 @@ void ArenaTeam::LoadMembersFromDB(uint32 ArenaTeamId)
|
||||||
newmember.personal_rating = fields[5].GetUInt32();
|
newmember.personal_rating = fields[5].GetUInt32();
|
||||||
newmember.name = fields[6].GetCppString();
|
newmember.name = fields[6].GetCppString();
|
||||||
newmember.Class = fields[7].GetUInt8();
|
newmember.Class = fields[7].GetUInt8();
|
||||||
members.push_back(newmember);
|
m_members.push_back(newmember);
|
||||||
}while( result->NextRow() );
|
}while( result->NextRow() );
|
||||||
delete result;
|
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);
|
oldcaptain->SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (GetSlot() * ARENA_TEAM_END) + ARENA_TEAM_MEMBER, 1);
|
||||||
|
|
||||||
// set new captain
|
// set new captain
|
||||||
CaptainGuid = guid;
|
m_CaptainGuid = guid;
|
||||||
|
|
||||||
// update database
|
// 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
|
// enable remove/promote buttons
|
||||||
Player *newcaptain = objmgr.GetPlayer(guid);
|
Player *newcaptain = objmgr.GetPlayer(guid);
|
||||||
|
|
@ -254,11 +268,11 @@ void ArenaTeam::SetCaptain(const uint64& guid)
|
||||||
|
|
||||||
void ArenaTeam::DelMember(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)
|
if (itr->guid == guid)
|
||||||
{
|
{
|
||||||
members.erase(itr);
|
m_members.erase(itr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -286,18 +300,18 @@ void ArenaTeam::Disband(WorldSession *session)
|
||||||
session->BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_DISBANDED_S, 2, session->GetPlayerName(), GetName(), "");
|
session->BuildArenaTeamEventPacket(&data, ERR_ARENA_TEAM_DISBANDED_S, 2, session->GetPlayerName(), GetName(), "");
|
||||||
BroadcastPacket(&data);
|
BroadcastPacket(&data);
|
||||||
|
|
||||||
while (!members.empty())
|
while (!m_members.empty())
|
||||||
{
|
{
|
||||||
// Removing from members is done in DelMember.
|
// Removing from members is done in DelMember.
|
||||||
DelMember(members.front().guid);
|
DelMember(m_members.front().guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
CharacterDatabase.BeginTransaction();
|
CharacterDatabase.BeginTransaction();
|
||||||
CharacterDatabase.PExecute("DELETE FROM arena_team 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'", Id); //< this should be alredy done by calling DelMember(memberGuids[j]); for each member
|
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'", Id);
|
CharacterDatabase.PExecute("DELETE FROM arena_team_stats WHERE arenateamid = '%u'", m_TeamId);
|
||||||
CharacterDatabase.CommitTransaction();
|
CharacterDatabase.CommitTransaction();
|
||||||
objmgr.RemoveArenaTeam(Id);
|
objmgr.RemoveArenaTeam(m_TeamId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArenaTeam::Roster(WorldSession *session)
|
void ArenaTeam::Roster(WorldSession *session)
|
||||||
|
|
@ -307,12 +321,12 @@ void ArenaTeam::Roster(WorldSession *session)
|
||||||
uint8 unk308 = 0;
|
uint8 unk308 = 0;
|
||||||
|
|
||||||
WorldPacket data(SMSG_ARENA_TEAM_ROSTER, 100);
|
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 << uint8(unk308); // 308 unknown value but affect packet structure
|
||||||
data << uint32(GetMembersSize()); // members count
|
data << uint32(GetMembersSize()); // members count
|
||||||
data << uint32(GetType()); // arena team type?
|
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);
|
pl = objmgr.GetPlayer(itr->guid);
|
||||||
|
|
||||||
|
|
@ -344,11 +358,11 @@ void ArenaTeam::Query(WorldSession *session)
|
||||||
data << uint32(GetId()); // team id
|
data << uint32(GetId()); // team id
|
||||||
data << GetName(); // team name
|
data << GetName(); // team name
|
||||||
data << uint32(GetType()); // arena team type (2=2x2, 3=3x3 or 5=5x5)
|
data << uint32(GetType()); // arena team type (2=2x2, 3=3x3 or 5=5x5)
|
||||||
data << uint32(BackgroundColor); // background color
|
data << uint32(m_BackgroundColor); // background color
|
||||||
data << uint32(EmblemStyle); // emblem style
|
data << uint32(m_EmblemStyle); // emblem style
|
||||||
data << uint32(EmblemColor); // emblem color
|
data << uint32(m_EmblemColor); // emblem color
|
||||||
data << uint32(BorderStyle); // border style
|
data << uint32(m_BorderStyle); // border style
|
||||||
data << uint32(BorderColor); // border color
|
data << uint32(m_BorderColor); // border color
|
||||||
session->SendPacket(&data);
|
session->SendPacket(&data);
|
||||||
sLog.outDebug("WORLD: Sent SMSG_ARENA_TEAM_QUERY_RESPONSE");
|
sLog.outDebug("WORLD: Sent SMSG_ARENA_TEAM_QUERY_RESPONSE");
|
||||||
}
|
}
|
||||||
|
|
@ -356,13 +370,13 @@ void ArenaTeam::Query(WorldSession *session)
|
||||||
void ArenaTeam::Stats(WorldSession *session)
|
void ArenaTeam::Stats(WorldSession *session)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_ARENA_TEAM_STATS, 4*7);
|
WorldPacket data(SMSG_ARENA_TEAM_STATS, 4*7);
|
||||||
data << uint32(GetId()); // arena team id
|
data << uint32(GetId()); // team id
|
||||||
data << uint32(stats.rating); // rating
|
data << uint32(m_stats.rating); // rating
|
||||||
data << uint32(stats.games_week); // games this week
|
data << uint32(m_stats.games_week); // games this week
|
||||||
data << uint32(stats.wins_week); // wins this week
|
data << uint32(m_stats.wins_week); // wins this week
|
||||||
data << uint32(stats.games_season); // played this season
|
data << uint32(m_stats.games_season); // played this season
|
||||||
data << uint32(stats.wins_season); // wins this season
|
data << uint32(m_stats.wins_season); // wins this season
|
||||||
data << uint32(stats.rank); // rank
|
data << uint32(m_stats.rank); // rank
|
||||||
session->SendPacket(&data);
|
session->SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -370,7 +384,7 @@ void ArenaTeam::NotifyStatsChanged()
|
||||||
{
|
{
|
||||||
// this is called after a rated match ended
|
// this is called after a rated match ended
|
||||||
// updates arena team stats for every member of the team (not only the ones who participated!)
|
// 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);
|
Player * plr = objmgr.GetPlayer(itr->guid);
|
||||||
if(plr)
|
if(plr)
|
||||||
|
|
@ -388,9 +402,9 @@ void ArenaTeam::InspectStats(WorldSession *session, uint64 guid)
|
||||||
data << uint64(guid); // player guid
|
data << uint64(guid); // player guid
|
||||||
data << uint8(GetSlot()); // slot (0...2)
|
data << uint8(GetSlot()); // slot (0...2)
|
||||||
data << uint32(GetId()); // arena team id
|
data << uint32(GetId()); // arena team id
|
||||||
data << uint32(stats.rating); // rating
|
data << uint32(m_stats.rating); // rating
|
||||||
data << uint32(stats.games_season); // season played
|
data << uint32(m_stats.games_season); // season played
|
||||||
data << uint32(stats.wins_season); // season wins
|
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->games_season); // played (count of all games, that the inspected member participated...)
|
||||||
data << uint32(member->personal_rating); // personal rating
|
data << uint32(member->personal_rating); // personal rating
|
||||||
session->SendPacket(&data);
|
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)
|
void ArenaTeam::SetEmblem(uint32 backgroundColor, uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor)
|
||||||
{
|
{
|
||||||
BackgroundColor = backgroundColor;
|
m_BackgroundColor = backgroundColor;
|
||||||
EmblemStyle = emblemStyle;
|
m_EmblemStyle = emblemStyle;
|
||||||
EmblemColor = emblemColor;
|
m_EmblemColor = emblemColor;
|
||||||
BorderStyle = borderStyle;
|
m_BorderStyle = borderStyle;
|
||||||
BorderColor = borderColor;
|
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)
|
void ArenaTeam::SetStats(uint32 stat_type, uint32 value)
|
||||||
|
|
@ -412,27 +426,27 @@ void ArenaTeam::SetStats(uint32 stat_type, uint32 value)
|
||||||
switch(stat_type)
|
switch(stat_type)
|
||||||
{
|
{
|
||||||
case STAT_TYPE_RATING:
|
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());
|
CharacterDatabase.PExecute("UPDATE arena_team_stats SET rating = '%u' WHERE arenateamid = '%u'", value, GetId());
|
||||||
break;
|
break;
|
||||||
case STAT_TYPE_GAMES_WEEK:
|
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());
|
CharacterDatabase.PExecute("UPDATE arena_team_stats SET games = '%u' WHERE arenateamid = '%u'", value, GetId());
|
||||||
break;
|
break;
|
||||||
case STAT_TYPE_WINS_WEEK:
|
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());
|
CharacterDatabase.PExecute("UPDATE arena_team_stats SET wins = '%u' WHERE arenateamid = '%u'", value, GetId());
|
||||||
break;
|
break;
|
||||||
case STAT_TYPE_GAMES_SEASON:
|
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());
|
CharacterDatabase.PExecute("UPDATE arena_team_stats SET played = '%u' WHERE arenateamid = '%u'", value, GetId());
|
||||||
break;
|
break;
|
||||||
case STAT_TYPE_WINS_SEASON:
|
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());
|
CharacterDatabase.PExecute("UPDATE arena_team_stats SET wins2 = '%u' WHERE arenateamid = '%u'", value, GetId());
|
||||||
break;
|
break;
|
||||||
case STAT_TYPE_RANK:
|
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());
|
CharacterDatabase.PExecute("UPDATE arena_team_stats SET rank = '%u' WHERE arenateamid = '%u'", value, GetId());
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -443,7 +457,7 @@ void ArenaTeam::SetStats(uint32 stat_type, uint32 value)
|
||||||
|
|
||||||
void ArenaTeam::BroadcastPacket(WorldPacket *packet)
|
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);
|
Player *player = objmgr.GetPlayer(itr->guid);
|
||||||
if(player)
|
if(player)
|
||||||
|
|
@ -467,7 +481,7 @@ uint8 ArenaTeam::GetSlotByType( uint32 type )
|
||||||
|
|
||||||
bool ArenaTeam::HaveMember( const uint64& guid ) const
|
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)
|
if(itr->guid == guid)
|
||||||
return true;
|
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
|
// returns how many points would be awarded with this team type with this rating
|
||||||
float points;
|
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)
|
if(rating<=1500)
|
||||||
points = (float)rating * 0.22f + 14.0f;
|
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));
|
points = 1511.26f / (1.0f + 1639.28f * exp(-0.00412f * (float)rating));
|
||||||
|
|
||||||
// type penalties for <5v5 teams
|
// type penalties for <5v5 teams
|
||||||
if(Type == ARENA_TEAM_2v2)
|
if(m_Type == ARENA_TEAM_2v2)
|
||||||
points *= 0.76f;
|
points *= 0.76f;
|
||||||
else if(Type == ARENA_TEAM_3v3)
|
else if(m_Type == ARENA_TEAM_3v3)
|
||||||
points *= 0.88f;
|
points *= 0.88f;
|
||||||
|
|
||||||
return (uint32) points;
|
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
|
// returns the chance to win against a team with the given rating, used in the rating adjustment calculation
|
||||||
// ELO system
|
// 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));
|
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)
|
int32 ArenaTeam::WonAgainst(uint32 againstRating)
|
||||||
{
|
{
|
||||||
// called when the team has won
|
// called when the team has won
|
||||||
//'chance' calculation - to beat the opponent
|
//'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)
|
// calculate the rating modification (ELO system with k=32)
|
||||||
int32 mod = (int32)floor(32.0f * (1.0f - chance));
|
int32 mod = (int32)floor(32.0f * (1.0f - chance));
|
||||||
// modify the team stats accordingly
|
// modify the team stats accordingly
|
||||||
stats.rating += mod;
|
FinishGame(mod);
|
||||||
stats.games_week += 1;
|
m_stats.wins_week += 1;
|
||||||
stats.wins_week += 1;
|
m_stats.wins_season += 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// return the rating change, used to display it on the results screen
|
// return the rating change, used to display it on the results screen
|
||||||
return mod;
|
return mod;
|
||||||
|
|
@ -532,22 +561,11 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating)
|
||||||
{
|
{
|
||||||
// called when the team has lost
|
// called when the team has lost
|
||||||
//'chance' calculation - to loose to the opponent
|
//'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)
|
// calculate the rating modification (ELO system with k=32)
|
||||||
int32 mod = (int32)ceil(32.0f * (0.0f - chance));
|
int32 mod = (int32)ceil(32.0f * (0.0f - chance));
|
||||||
// modify the team stats accordingly
|
// modify the team stats accordingly
|
||||||
stats.rating += mod;
|
FinishGame(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;
|
|
||||||
}
|
|
||||||
|
|
||||||
// return the rating change, used to display it on the results screen
|
// return the rating change, used to display it on the results screen
|
||||||
return mod;
|
return mod;
|
||||||
|
|
@ -556,7 +574,7 @@ int32 ArenaTeam::LostAgainst(uint32 againstRating)
|
||||||
void ArenaTeam::MemberLost(Player * plr, uint32 againstRating)
|
void ArenaTeam::MemberLost(Player * plr, uint32 againstRating)
|
||||||
{
|
{
|
||||||
// called for each participant of a match after losing
|
// 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())
|
if(itr->guid == plr->GetGUID())
|
||||||
{
|
{
|
||||||
|
|
@ -578,7 +596,7 @@ void ArenaTeam::MemberLost(Player * plr, uint32 againstRating)
|
||||||
void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating)
|
void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating)
|
||||||
{
|
{
|
||||||
// called for offline player after ending rated arena match!
|
// 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)
|
if(itr->guid == guid)
|
||||||
{
|
{
|
||||||
|
|
@ -600,7 +618,7 @@ void ArenaTeam::OfflineMemberLost(uint64 guid, uint32 againstRating)
|
||||||
void ArenaTeam::MemberWon(Player * plr, uint32 againstRating)
|
void ArenaTeam::MemberWon(Player * plr, uint32 againstRating)
|
||||||
{
|
{
|
||||||
// called for each participant after winning a match
|
// 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())
|
if(itr->guid == plr->GetGUID())
|
||||||
{
|
{
|
||||||
|
|
@ -626,17 +644,17 @@ void ArenaTeam::UpdateArenaPointsHelper(std::map<uint32, uint32>& PlayerPoints)
|
||||||
// called after a match has ended and the stats are already modified
|
// 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)
|
// 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
|
// 10 played games per week is a minimum
|
||||||
if (stats.games_week < 10)
|
if (m_stats.games_week < 10)
|
||||||
return;
|
return;
|
||||||
// to get points, a player has to participate in at least 30% of the matches
|
// 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);
|
uint32 min_plays = (uint32) ceil(m_stats.games_week * 0.3);
|
||||||
for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
|
for(MemberList::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
|
||||||
{
|
{
|
||||||
// the player participated in enough games, update his points
|
// the player participated in enough games, update his points
|
||||||
uint32 points_to_add = 0;
|
uint32 points_to_add = 0;
|
||||||
if (itr->games_week >= min_plays)
|
if (itr->games_week >= min_plays)
|
||||||
points_to_add = GetPoints(itr->personal_rating);
|
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<uint32, uint32>::iterator plr_itr = PlayerPoints.find(GUID_LOPART(itr->guid));
|
std::map<uint32, uint32>::iterator plr_itr = PlayerPoints.find(GUID_LOPART(itr->guid));
|
||||||
if (plr_itr != PlayerPoints.end())
|
if (plr_itr != PlayerPoints.end())
|
||||||
|
|
@ -655,19 +673,19 @@ void ArenaTeam::SaveToDB()
|
||||||
// save team and member stats to db
|
// save team and member stats to db
|
||||||
// called after a match has ended, or when calculating arena_points
|
// called after a match has ended, or when calculating arena_points
|
||||||
CharacterDatabase.BeginTransaction();
|
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());
|
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 = members.begin(); itr != members.end(); ++itr)
|
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();
|
CharacterDatabase.CommitTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArenaTeam::FinishWeek()
|
void ArenaTeam::FinishWeek()
|
||||||
{
|
{
|
||||||
stats.games_week = 0; // played this week
|
m_stats.games_week = 0; // played this week
|
||||||
stats.wins_week = 0; // wins this week
|
m_stats.wins_week = 0; // wins this week
|
||||||
for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
|
for(MemberList::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
|
||||||
{
|
{
|
||||||
itr->games_week = 0;
|
itr->games_week = 0;
|
||||||
itr->wins_week = 0;
|
itr->wins_week = 0;
|
||||||
|
|
@ -676,7 +694,7 @@ void ArenaTeam::FinishWeek()
|
||||||
|
|
||||||
bool ArenaTeam::IsFighting() const
|
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))
|
if (Player *p = objmgr.GetPlayer(itr->guid))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -123,26 +123,26 @@ class ArenaTeam
|
||||||
ArenaTeam();
|
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);
|
void Disband(WorldSession *session);
|
||||||
|
|
||||||
typedef std::list<ArenaTeamMember> MemberList;
|
typedef std::list<ArenaTeamMember> MemberList;
|
||||||
|
|
||||||
uint32 GetId() const { return Id; }
|
uint32 GetId() const { return m_TeamId; }
|
||||||
uint32 GetType() const { return Type; }
|
uint32 GetType() const { return m_Type; }
|
||||||
uint8 GetSlot() const { return GetSlotByType(GetType()); }
|
uint8 GetSlot() const { return GetSlotByType(GetType()); }
|
||||||
static uint8 GetSlotByType(uint32 type);
|
static uint8 GetSlotByType(uint32 type);
|
||||||
const uint64& GetCaptain() const { return CaptainGuid; }
|
const uint64& GetCaptain() const { return m_CaptainGuid; }
|
||||||
std::string GetName() const { return Name; }
|
std::string GetName() const { return m_Name; }
|
||||||
const ArenaTeamStats& GetStats() const { return stats; }
|
const ArenaTeamStats& GetStats() const { return m_stats; }
|
||||||
void SetStats(uint32 stat_type, uint32 value);
|
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 GetEmblemStyle() const { return m_EmblemStyle; }
|
||||||
uint32 GetEmblemColor() const { return EmblemColor; }
|
uint32 GetEmblemColor() const { return m_EmblemColor; }
|
||||||
uint32 GetBorderStyle() const { return BorderStyle; }
|
uint32 GetBorderStyle() const { return m_BorderStyle; }
|
||||||
uint32 GetBorderColor() const { return BorderColor; }
|
uint32 GetBorderColor() const { return m_BorderColor; }
|
||||||
uint32 GetBackgroundColor() const { return BackgroundColor; }
|
uint32 GetBackgroundColor() const { return m_BackgroundColor; }
|
||||||
|
|
||||||
void SetCaptain(const uint64& guid);
|
void SetCaptain(const uint64& guid);
|
||||||
bool AddMember(const uint64& PlayerGuid);
|
bool AddMember(const uint64& PlayerGuid);
|
||||||
|
|
@ -153,15 +153,15 @@ class ArenaTeam
|
||||||
|
|
||||||
void SetEmblem(uint32 backgroundColor, uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor);
|
void SetEmblem(uint32 backgroundColor, uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor);
|
||||||
|
|
||||||
size_t GetMembersSize() const { return members.size(); }
|
size_t GetMembersSize() const { return m_members.size(); }
|
||||||
bool Empty() const { return members.empty(); }
|
bool Empty() const { return m_members.empty(); }
|
||||||
MemberList::iterator membersBegin() { return members.begin(); }
|
MemberList::iterator m_membersBegin() { return m_members.begin(); }
|
||||||
MemberList::iterator membersEnd() { return members.end(); }
|
MemberList::iterator m_membersEnd() { return m_members.end(); }
|
||||||
bool HaveMember(const uint64& guid) const;
|
bool HaveMember(const uint64& guid) const;
|
||||||
|
|
||||||
ArenaTeamMember* GetMember(const uint64& guid)
|
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)
|
if(itr->guid == guid)
|
||||||
return &(*itr);
|
return &(*itr);
|
||||||
|
|
||||||
|
|
@ -170,7 +170,7 @@ class ArenaTeam
|
||||||
|
|
||||||
ArenaTeamMember* GetMember(const std::string& name)
|
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)
|
if(itr->name == name)
|
||||||
return &(*itr);
|
return &(*itr);
|
||||||
|
|
||||||
|
|
@ -205,21 +205,22 @@ class ArenaTeam
|
||||||
void NotifyStatsChanged();
|
void NotifyStatsChanged();
|
||||||
|
|
||||||
void FinishWeek();
|
void FinishWeek();
|
||||||
|
void FinishGame(int32 mod);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
uint32 Id;
|
uint32 m_TeamId;
|
||||||
uint32 Type;
|
uint32 m_Type;
|
||||||
std::string Name;
|
std::string m_Name;
|
||||||
uint64 CaptainGuid;
|
uint64 m_CaptainGuid;
|
||||||
|
|
||||||
uint32 BackgroundColor; // ARGB format
|
uint32 m_BackgroundColor; // ARGB format
|
||||||
uint32 EmblemStyle; // icon id
|
uint32 m_EmblemStyle; // icon id
|
||||||
uint32 EmblemColor; // ARGB format
|
uint32 m_EmblemColor; // ARGB format
|
||||||
uint32 BorderStyle; // border image id
|
uint32 m_BorderStyle; // border image id
|
||||||
uint32 BorderColor; // ARGB format
|
uint32 m_BorderColor; // ARGB format
|
||||||
|
|
||||||
MemberList members;
|
MemberList m_members;
|
||||||
ArenaTeamStats stats;
|
ArenaTeamStats m_stats;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1190,11 +1190,11 @@ bool GridMap::loadHeihgtData(FILE *in, uint32 offset, uint32 size)
|
||||||
map_heightHeader header;
|
map_heightHeader header;
|
||||||
fseek(in, offset, SEEK_SET);
|
fseek(in, offset, SEEK_SET);
|
||||||
fread(&header, sizeof(header), 1, in);
|
fread(&header, sizeof(header), 1, in);
|
||||||
if (header.fourcc != uint32(MAP_HEIGTH_MAGIC))
|
if (header.fourcc != uint32(MAP_HEIGHT_MAGIC))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
m_gridHeight = header.gridHeight;
|
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))
|
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_liquid_height= header.height;
|
||||||
m_liquidLevel = header.liquidLevel;
|
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];
|
m_liquid_type = new uint8 [16*16];
|
||||||
fread(m_liquid_type, sizeof(uint8), 16*16, in);
|
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];
|
m_liquid_map = new float [m_liquid_width*m_liquid_height];
|
||||||
fread(m_liquid_map, sizeof(float), m_liquid_width*m_liquid_height, in);
|
fread(m_liquid_map, sizeof(float), m_liquid_width*m_liquid_height, in);
|
||||||
|
|
|
||||||
|
|
@ -71,10 +71,11 @@ typedef MaNGOS::SingleThreaded<GridRWLock>::Lock NullGuard;
|
||||||
#define MAP_MAGIC 'SPAM'
|
#define MAP_MAGIC 'SPAM'
|
||||||
#define MAP_VERSION_MAGIC '0.1w'
|
#define MAP_VERSION_MAGIC '0.1w'
|
||||||
#define MAP_AREA_MAGIC 'AERA'
|
#define MAP_AREA_MAGIC 'AERA'
|
||||||
#define MAP_HEIGTH_MAGIC 'TGHM'
|
#define MAP_HEIGHT_MAGIC 'TGHM'
|
||||||
#define MAP_LIQUID_MAGIC 'QILM'
|
#define MAP_LIQUID_MAGIC 'QILM'
|
||||||
|
|
||||||
struct map_fileheader{
|
struct map_fileheader
|
||||||
|
{
|
||||||
uint32 mapMagic;
|
uint32 mapMagic;
|
||||||
uint32 versionMagic;
|
uint32 versionMagic;
|
||||||
uint32 areaMapOffset;
|
uint32 areaMapOffset;
|
||||||
|
|
@ -86,17 +87,20 @@ struct map_fileheader{
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAP_AREA_NO_AREA 0x0001
|
#define MAP_AREA_NO_AREA 0x0001
|
||||||
struct map_areaHeader{
|
|
||||||
|
struct map_areaHeader
|
||||||
|
{
|
||||||
uint32 fourcc;
|
uint32 fourcc;
|
||||||
uint16 flags;
|
uint16 flags;
|
||||||
uint16 gridArea;
|
uint16 gridArea;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAP_HEIGHT_NO_HIGHT 0x0001
|
#define MAP_HEIGHT_NO_HEIGHT 0x0001
|
||||||
#define MAP_HEIGHT_AS_INT16 0x0002
|
#define MAP_HEIGHT_AS_INT16 0x0002
|
||||||
#define MAP_HEIGHT_AS_INT8 0x0004
|
#define MAP_HEIGHT_AS_INT8 0x0004
|
||||||
|
|
||||||
struct map_heightHeader{
|
struct map_heightHeader
|
||||||
|
{
|
||||||
uint32 fourcc;
|
uint32 fourcc;
|
||||||
uint32 flags;
|
uint32 flags;
|
||||||
float gridHeight;
|
float gridHeight;
|
||||||
|
|
@ -104,8 +108,10 @@ struct map_heightHeader{
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAP_LIQUID_NO_TYPE 0x0001
|
#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;
|
uint32 fourcc;
|
||||||
uint16 flags;
|
uint16 flags;
|
||||||
uint16 liquidType;
|
uint16 liquidType;
|
||||||
|
|
@ -116,7 +122,8 @@ struct map_liquidHeader{
|
||||||
float liquidLevel;
|
float liquidLevel;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ZLiquidStatus{
|
enum ZLiquidStatus
|
||||||
|
{
|
||||||
LIQUID_MAP_NO_WATER = 0x00000000,
|
LIQUID_MAP_NO_WATER = 0x00000000,
|
||||||
LIQUID_MAP_ABOVE_WATER = 0x00000001,
|
LIQUID_MAP_ABOVE_WATER = 0x00000001,
|
||||||
LIQUID_MAP_WATER_WALK = 0x00000002,
|
LIQUID_MAP_WATER_WALK = 0x00000002,
|
||||||
|
|
@ -135,7 +142,8 @@ enum ZLiquidStatus{
|
||||||
#define MAP_LIQUID_TYPE_DARK_WATER 0x10
|
#define MAP_LIQUID_TYPE_DARK_WATER 0x10
|
||||||
#define MAP_LIQUID_TYPE_WMO_WATER 0x20
|
#define MAP_LIQUID_TYPE_WMO_WATER 0x20
|
||||||
|
|
||||||
struct LiquidData{
|
struct LiquidData
|
||||||
|
{
|
||||||
uint32 type;
|
uint32 type;
|
||||||
float level;
|
float level;
|
||||||
float depth_level;
|
float depth_level;
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ template<class T>
|
||||||
void PointMovementGenerator<T>::Initialize(T &unit)
|
void PointMovementGenerator<T>::Initialize(T &unit)
|
||||||
{
|
{
|
||||||
unit.StopMoving();
|
unit.StopMoving();
|
||||||
unit.addUnitState(UNIT_STAT_MOVING);
|
unit.addUnitState(UNIT_STAT_ROAMING);
|
||||||
Traveller<T> traveller(unit);
|
Traveller<T> traveller(unit);
|
||||||
i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z);
|
i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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());
|
_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
|
//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?
|
//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)
|
for (int i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
|
||||||
{
|
{
|
||||||
if(BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i))
|
if(BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i))
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8266"
|
#define REVISION_NR "8273"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
|
|
@ -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;
|
//int gGetHeightCounter = 0;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue