33 :
TeamId(0),
Type(0), TeamName(), CaptainGuid(), BackgroundColor(0), EmblemStyle(0), EmblemColor(0),
34 BorderStyle(0), BorderColor(0)
37 Stats.SeasonGames = 0;
94 std::string playerName;
106 playerName = player->
GetName();
110 playerName = characterInfo->Name;
111 playerClass = characterInfo->Class;
124 uint16 personalRating = 0;
129 personalRating = 1000;
139 matchMakerRating = (*result)[0].GetUInt16();
149 newMember.
Name = playerName;
150 newMember.
Guid = playerGuid;
151 newMember.
Class = playerClass;
190 Field* fields = result->Fetch();
194 CaptainGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64());
216 bool captainPresentInTeam =
false;
220 Field* fields = result->Fetch();
233 newMember.
Guid = ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64());
244 if (newMember.
Name.empty())
246 TC_LOG_ERROR(
"sql.sql",
"ArenaTeam {} has member with empty name - probably {} doesn't exist, deleting him from memberlist!", arenaTeamId, newMember.
Guid.
ToString());
253 captainPresentInTeam =
true;
259 while (result->NextRow());
261 if (
Empty() || !captainPresentInTeam)
264 TC_LOG_DEBUG(
"bg.arena",
"ArenaTeam {} does not have any members or its captain is not in team, disbanding it...",
TeamId);
306 TC_LOG_DEBUG(
"bg.arena",
"Player: {} {} promoted player: {} {} to leader of arena team [Id: {}, Name: {}] [Type: {}].",
316 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
318 if (itr->Guid == guid)
332 TC_LOG_DEBUG(
"bg.arena",
"Player: {} {} left arena team type: {} [Id: {}, Name: {}].", player->GetName(), player->GetGUID().ToString(),
GetType(),
GetId(),
GetName());
351 TC_LOG_DEBUG(
"bg.arena",
"Player: {} {} disbanded arena team type: {} [Id: {}, Name: {}].", player->GetName(), player->GetGUID().ToString(),
GetType(),
GetId(),
GetName());
415 for (MemberList::const_iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
462 for (MemberList::const_iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
464 player->SendDirectMessage(packet);
477 TC_LOG_ERROR(
"bg.arena",
"FATAL: Unknown arena team type {} for some arena team", type);
491 TC_LOG_ERROR(
"bg.arena",
"FATAL: Unknown arena team slot {} for some arena team", slot);
497 for (MemberList::const_iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
498 if (itr->Guid == guid)
509 uint32 matchMakerRating = 0;
511 for (MemberList::const_iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
521 matchMakerRating += itr->MatchMakerRating;
526 if (playerDivider == 0)
529 matchMakerRating /= playerDivider;
531 return matchMakerRating;
538 return 1.0f / (1.0f + std::exp(std::log(10.0f) * (
float(opponentRating) -
float(ownRating)) / 650.0f));
546 float won_mod = (won) ? 1.0f : 0.0f;
547 float mod = won_mod - chance;
564 return (
int32)ceil(mod);
579 if (ownRating < 1300)
583 if (ownRating < 1000)
584 mod = win_rating_modifier1 * (1.0f - chance);
586 mod = ((win_rating_modifier1 / 2.0f) + ((win_rating_modifier1 / 2.0f) * (1300.0f - float(ownRating)) / 300.0f)) * (1.0f - chance);
594 return (
int32)ceil(mod);
607 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
613 Stats.WeekGames += 1;
614 Stats.SeasonGames += 1;
619 if (team->GetType() ==
Type && team->GetStats().Rating >
Stats.Rating)
637 Stats.SeasonWins += 1;
662 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
664 if (itr->Guid == player->
GetGUID())
668 itr->ModifyPersonalRating(player, mod,
GetType());
671 itr->ModifyMatchmakerRating(matchmakerRatingChange,
GetSlot());
675 itr->SeasonGames +=1;
688 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
690 if (itr->Guid == guid)
694 itr->ModifyPersonalRating(
nullptr, mod,
GetType());
697 itr->ModifyMatchmakerRating(MatchmakerRatingChange,
GetSlot());
701 itr->SeasonGames += 1;
710 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
712 if (itr->Guid == player->
GetGUID())
716 itr->ModifyPersonalRating(player, mod,
GetType());
719 itr->ModifyMatchmakerRating(matchmakerRatingChange,
GetSlot());
723 itr->SeasonGames +=1;
724 itr->SeasonWins += 1;
751 for (MemberList::const_iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
754 if (itr->WeekGames == 0 && !forceMemberSave)
764 stmt->
setUInt64(6, itr->Guid.GetCounter());
768 stmt->
setUInt64(0, itr->Guid.GetCounter());
770 stmt->
setUInt16(2, itr->MatchMakerRating);
780 if (
Stats.WeekGames == 0)
788 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
799 for (MemberList::const_iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
801 if (player->GetMap()->IsBattleArena())
809 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
810 if (itr->Name == name)
818 for (MemberList::iterator itr =
Members.begin(); itr !=
Members.end(); ++itr)
819 if (itr->Guid == guid)
@ CHAR_DEL_ARENA_TEAM_MEMBERS
@ CHAR_UPD_ARENA_TEAM_STATS
@ CHAR_INS_ARENA_TEAM_MEMBER
@ CHAR_REP_CHARACTER_ARENA_STATS
@ CHAR_UPD_ARENA_TEAM_MEMBER
@ CHAR_SEL_MATCH_MAKER_RATING
@ CHAR_UPD_ARENA_TEAM_NAME
@ CHAR_UPD_ARENA_TEAM_CAPTAIN
@ CHAR_DEL_ARENA_TEAM_MEMBER
@ EarnPersonalArenaRating
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
@ ARENA_TEAM_PERSONAL_RATING
@ ARENA_TEAM_GAMES_SEASON
void SaveToDB(bool forceMemberSave=false)
void Inspect(WorldSession *session, ObjectGuid guid)
ObjectGuid GetCaptain() const
bool LoadArenaTeamFromDB(QueryResult arenaTeamDataResult)
void OfflineMemberLost(ObjectGuid guid, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange=-12)
int32 LostAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32 &rating_change)
float GetChanceAgainst(uint32 ownRating, uint32 opponentRating)
int32 GetRatingMod(uint32 ownRating, uint32 opponentRating, bool won)
size_t GetMembersSize() const
void DelMember(ObjectGuid guid, bool cleanDb)
void MemberLost(Player *player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange=-12)
bool IsMember(ObjectGuid guid) const
bool SetName(std::string const &name)
bool Create(ObjectGuid captainGuid, uint8 type, std::string const &teamName, uint32 backgroundColor, uint8 emblemStyle, uint32 emblemColor, uint8 borderStyle, uint32 borderColor)
int32 GetMatchmakerRatingMod(uint32 ownRating, uint32 opponentRating, bool won)
void SendStats(WorldSession *session)
int32 WonAgainst(uint32 Own_MMRating, uint32 Opponent_MMRating, int32 &rating_change)
void SetCaptain(ObjectGuid guid)
bool AddMember(ObjectGuid PlayerGuid)
ArenaTeamMember * GetMember(ObjectGuid guid)
void FinishGame(int32 mod)
void NotifyStatsChanged()
void BroadcastPacket(WorldPacket *packet)
uint32 GetAverageMMR(Group *group) const
std::string const & GetName() const
static uint8 GetTypeBySlot(uint8 slot)
bool LoadMembersFromDB(QueryResult arenaTeamMembersResult)
void MemberWon(Player *player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange)
static uint8 GetSlotByType(uint32 type)
Class used to access individual fields of database query result.
std::string GetString() const
bool IsMember(ObjectGuid guid) const
LowType GetCounter() const
std::string ToString() const
static bool IsValidCharterName(std::string_view name)
static ObjectGuid GetGUID(Object const *o)
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type)
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
void SetArenaTeamIdInvited(uint32 ArenaTeamId)
uint32 GetArenaTeamId(uint8) const
void setUInt8(const uint8 index, const uint8 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt16(const uint8 index, const uint16 value)
void setString(const uint8 index, const std::string &value)
void setUInt64(const uint8 index, const uint64 value)
std::string const & GetName() const
Player session in the World.
Player * GetPlayer() const
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
@ CONFIG_ARENA_START_MATCHMAKER_RATING
@ CONFIG_ARENA_START_RATING
@ CONFIG_ARENA_START_PERSONAL_RATING
@ CONFIG_ARENA_WIN_RATING_MODIFIER_1
@ CONFIG_ARENA_WIN_RATING_MODIFIER_2
@ CONFIG_ARENA_LOSE_RATING_MODIFIER
@ CONFIG_ARENA_MATCHMAKER_RATING_MODIFIER
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
TC_GAME_API Player * FindConnectedPlayer(ObjectGuid const &)
void ModifyPersonalRating(Player *player, int32 mod, uint32 type)
void ModifyMatchmakerRating(int32 mod, uint32 slot)