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__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
@ 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)
ObjectGuid const & GetGUID() const
Class used to access individual fields of database query result.
uint32 GetUInt32() const noexcept
uint16 GetUInt16() const noexcept
uint8 GetUInt8() const noexcept
std::string GetString() const noexcept
bool IsMember(ObjectGuid guid) const
LowType GetCounter() const
std::string ToString() const
static bool IsValidCharterName(std::string_view name)
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 setUInt16(uint8 index, uint16 value)
void setString(uint8 index, std::string &&value)
void setUInt32(uint8 index, uint32 value)
void setUInt64(uint8 index, uint64 value)
void setUInt8(uint8 index, uint8 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)