Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Core/Arena Arena anticheat system #11586

Closed
wants to merge 3 commits into from
@Yelvann

Arena anticheat system
Tries to stop players from cheating on arenas, wining against teams which do nothing.
You can configure the system by enabling it at the config, there are two checks:
1.- Arena.Cheated = 1. With this u enable the control system
2.- Arena.Cheated.OnlyLOG = 1. With this u control if u want to log only (default) or log & remove awarded points for the arena.

There are two variables doing the control stuff
1) Establishes a % of activity in the looser team. It means, at last, they gave fight. In a real arena it is impossible no to do at least some damage and some heal.
By default in 2v2 players should have done 50%. Heal + Damage should be at last 50% of the total hit points in the winer team.
By default 3v3 is 66%.
By default 5v5 is 75%.
2) Establishes the minimum damage (sum of the health of each player in the winer team) the looser team should do before consider it was cheating.
By default 2v2 is 10%.
By default 3v3 is 10%.
By default 5v5 is 10%.

@Runico

good system :+1:

@Fateswhisper

a very good idea

@Spp-

You need to fix the codestyle.

@Warpten
Collaborator

Totally broken if an 1500 mmr team faces a 2000+ if ratings in queue decrease over time to ensure a match to happen. There are legit cases where it can happen. IMHO it would be more reliable to count matchups

src/server/game/Battlegrounds/Battleground.cpp
((18 lines not shown))
+ }
+ float factorLooser = dmgLoser*100/maxHealthWinner; //did looser team gave fight?
+ float factor = (counted+0.0) / GetPlayersSize();
+ switch ( m_ArenaType )
+ {
+ case 2: //Arena 2v2. Half players (or more) done 0dmg, 0heal || At least looser team did 10%dmg [Default values]
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_2v2) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_2v2);
+ break;
+ case 3:
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_3v3) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_3v3);
+ break;
+ case 5:
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_5v5) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_5v5);
+ break;
+ default:
+ return 0;
@jackpoz Collaborator
jackpoz added a note

please return a boolean value

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
src/server/game/Battlegrounds/Battleground.cpp
((20 lines not shown))
+ float factor = (counted+0.0) / GetPlayersSize();
+ switch ( m_ArenaType )
+ {
+ case 2: //Arena 2v2. Half players (or more) done 0dmg, 0heal || At least looser team did 10%dmg [Default values]
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_2v2) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_2v2);
+ break;
+ case 3:
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_3v3) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_3v3);
+ break;
+ case 5:
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_5v5) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_5v5);
+ break;
+ default:
+ return 0;
+ }
+ return 0;
@jackpoz Collaborator
jackpoz added a note

please return a boolean value

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
src/server/game/Battlegrounds/Battleground.cpp
((10 lines not shown))
+ if (!GetPlayersCountByTeam(ALLIANCE) || !GetPlayersCountByTeam(HORDE)) return 0;
+ for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr)
+ if (!itr->second->DamageDone && !itr->second->HealingDone) ++counted;
+ else
+ if (Player* player = ObjectAccessor::FindPlayer(itr->first))
+ {
+ if ((player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3) == winTeam)) maxHealthWinner += player->GetMaxHealth();
+ else dmgLoser += itr->second->DamageDone;
+ }
+ float factorLooser = dmgLoser*100/maxHealthWinner; //did looser team gave fight?
+ float factor = (counted+0.0) / GetPlayersSize();
+ switch ( m_ArenaType )
+ {
+ case 2: //Arena 2v2. Half players (or more) done 0dmg, 0heal || At least looser team did 10%dmg [Default values]
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_2v2) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_2v2);
+ break;
@jackpoz Collaborator
jackpoz added a note

Will a static analyzer complain about "break;" being dead code ? Please check it so we don't get any new warning

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Takenbacon

A good idea, but heavily flawed.

@Yelvann

Thx jackpoz, going to correct all this stuff.
Warpten: I cannot see any ligit case in which u should do 0 damge or heal. Anyway u can disable it.
Takenbacon: Comment the flaws, I'll try to fix'em.

@mory

affects player leaving arena before arena starts ?

@digz6666

Good, but 1 flaw, there's chance that the loser team cannot do any damage, for example if skill difference between 2 teams are huge or winner team owns the loser in chain crowd control etc.
I think @Warpten's idea is to count matches between same teams, if same team played certain games (for example 3 games) in certain minutes (for example in 5 minutes), the game not counts and no rating change happens. Am I correct?

@Yelvann

mory: No, it does not affect players leaving the arena.
digz6666: Yup, i inderstand but with trinket and spells it is almost impossible to do nothing at all, even with pr0 vs newbie teams. We (this idea comes from Aokromes originally) thought of that too, but in low populated clones u could find a short queue for arenas... in that way u can find yrself fighting against same teams... in a "short" term. Maybe we could mix it all.. but this could take tons and tons of coding just to satisfy everyone. Of course this is not for high populated clones, but for low ones. And it is a first aproach ;) maybe we can find a way to improve it.

@ghost Show outdated diff Hide outdated diff Unknown commented on an outdated diff
src/server/game/Battlegrounds/Battleground.cpp
@@ -715,6 +715,42 @@ void Battleground::UpdateWorldStateForPlayer(uint32 field, uint32 value, Player*
player->SendDirectMessage(&data);
}
+bool Battleground::CheckCheatArena(uint32 winTeam)
+{
+ uint8 counted = 0; // Player did nothing?, nor heal nor dmg ... weird...
+ uint32 maxHealthWinner = 1;
+ uint32 dmgLoser = 0;
+
+ if (!GetPlayersCountByTeam(ALLIANCE) || !GetPlayersCountByTeam(HORDE))
+ return 0;
@ghost
ghost added a note

return false

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Takenbacon

I believe a better option would be to just have an out message saying "Possible arena cheater xxxxx", rather than preventing the win/points received, due to the fact that this could be triggered by legit arenas, that way you'd know it was win trading if it happens multiple times for the same person(s).

@bieleib92

I'm agree @Takenbacon, it would be a better way.

@Runico

it would be better if system do its job automatically. but with more optional options make it more sensitive.

@Takenbacon

@Runico I suppose he can add a config option that allows you to switch the feature from passive monitoring to active. Just remember, it would be rare, but this could false positive

@Yelvann

Ok, now there is an option to enable/disable partially the punish system in case of cheat. If enable there will be no change on rating and a log record will be written, if disable it will only log it.

@Demonid

What about IP Check's? Wintraders usually Que with the same IP Several times.

IMHO it would be more reliable to count matchups. +1

Btw, nice job, hope you finish this ^^

@2010phenix

what for IP?? start proxy or some tor and check useless

src/server/worldserver/worldserver.conf.dist
@@ -2322,6 +2322,44 @@ Arena.ArenaStartMatchmakerRating = 1500
ArenaLog.ExtendedInfo = 0
#
+# Arena.Cheated
+# Description: Check if players are cheating in the arena.
+# Default: 0 - (Disabled)
+# 1 - (Enabled)
+Arena.Cheated = 0
+
+#
+# Arena.Cheated.OnlyLOG
+# Description: Check if should report only on Log file/console, allowing the system to award arena points.
+# Default: 1 - (Enabled: Only reports if cheat detected)
+# 0 - (Disabled: Reports and changes the award points to 0 if cheat detected)

Tabs2Spaces

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
src/server/worldserver/worldserver.conf.dist
((9 lines not shown))
+
+#
+# Arena.Cheated.OnlyLOG
+# Description: Check if should report only on Log file/console, allowing the system to award arena points.
+# Default: 1 - (Enabled: Only reports if cheat detected)
+# 0 - (Disabled: Reports and changes the award points to 0 if cheat detected)
+Arena.Cheated.OnlyLOG = 1
+
+#
+# Arena.Cheated.Rating.2v2
+# Arena.Cheated.Rating.3v3
+# Arena.Cheated.Rating.5v5
+# Description: Sets the threshold of minimum activity (heal+dmg) for the arenas
+# Default: 2v2 - Default 50%
+# 3v3 - Default 66%
+# 5v5 - Default 75%

Also Tabs2Spaces. Below there are some more issues

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@ghost

A bit missleading configs..

@jackpoz jackpoz commented on the diff
src/server/game/Battlegrounds/Battleground.cpp
@@ -715,6 +715,42 @@ void Battleground::UpdateWorldStateForPlayer(uint32 field, uint32 value, Player*
player->SendDirectMessage(&data);
}
+bool Battleground::CheckCheatArena(uint32 winTeam)
+{
+ uint8 counted = 0; // Player did nothing?, nor heal nor dmg ... weird...
+ uint32 maxHealthWinner = 1;
+ uint32 dmgLoser = 0;
+
+ if (!GetPlayersCountByTeam(ALLIANCE) || !GetPlayersCountByTeam(HORDE))
+ return false;
+
+ for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr)
+ {
+ if (!itr->second->DamageDone && !itr->second->HealingDone) ++counted;
+ else if (Player* player = ObjectAccessor::FindPlayer(itr->first))
+ {
+ if ((player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3) == winTeam)) maxHealthWinner += player->GetMaxHealth();
@jackpoz Collaborator
jackpoz added a note

there must be a more readable way to write this, even better if magic numbers aren't used

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
@Yelvann

I'll try to code it in a different way. Thx.
May u point me which magic numbers? Maybe i can try to explain it or code in a propper way.
Anyway, just made use of something already coded just some lines below, 785->792, on original battleground.cpp

@Yelvann Yelvann closed this
@Yelvann Yelvann reopened this
@Yelvann

wrong button :S

@somataras

Good idea overall, but who said that they will not do any dmg/heal at all? a better solution can be a system that can detect multi wins in a row versus specific team/players at a short time period for example we have:
Team1 and Team2 if team1 win 3-5times in a row the team2 in less than 1minute(the minutes can be calculated based on a server type and the bracket) you will log the situation and staff can investigate those suspicious teams. I am just sharing my idea on that matter because i found it interesting:)

@L30m4nc3r

If you exit without starting a fight, give the enemy victory. (critical, please fix +0 [team1] +0 -mmr [team2])
need add check plrcount++

wowscrnshot_022614_120357
wowscrnshot_022614_120402
wowscrnshot_022614_120421
wowscrnshot_022614_120411

and not work damage calculation:
http://i051.radikal.ru/1402/05/8499fb3448fa.jpg
http://s020.radikal.ru/i705/1402/bf/30fa48e43601.jpg

@L30m4nc3r

stopped?

@Yelvann
@2010phenix

and what is this Artister ?
you have better realization? or know how to do this more correct... or just lol....

@Shauren Shauren closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 13, 2014
  1. @Yelvann

    Arena anticheat system

    Yelvann authored
Commits on Feb 18, 2014
  1. @Yelvann

    Tab to spaces.

    Yelvann authored
Commits on Feb 20, 2014
  1. @Yelvann

    Typo fixed.

    Yelvann authored
This page is out of date. Refresh to see the latest.
View
113 src/server/game/Battlegrounds/Battleground.cpp
@@ -715,6 +715,42 @@ void Battleground::UpdateWorldStateForPlayer(uint32 field, uint32 value, Player*
player->SendDirectMessage(&data);
}
+bool Battleground::CheckCheatArena(uint32 winTeam)
+{
+ uint8 counted = 0; // Player did nothing?, nor heal nor dmg ... weird...
+ uint32 maxHealthWinner = 1;
+ uint32 dmgLoser = 0;
+
+ if (!GetPlayersCountByTeam(ALLIANCE) || !GetPlayersCountByTeam(HORDE))
+ return false;
+
+ for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr)
+ {
+ if (!itr->second->DamageDone && !itr->second->HealingDone) ++counted;
+ else if (Player* player = ObjectAccessor::FindPlayer(itr->first))
+ {
+ if ((player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3) == winTeam)) maxHealthWinner += player->GetMaxHealth();
@jackpoz Collaborator
jackpoz added a note

there must be a more readable way to write this, even better if magic numbers aren't used

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ else dmgLoser += itr->second->DamageDone;
+ }
+ }
+
+ float factorLooser = dmgLoser * 100 / maxHealthWinner; // did looser team gave fight?
+ float factor = (counted + 0.0) / GetPlayersSize();
+
+ switch (m_ArenaType)
+ {
+ case 2: // Arena 2v2. Half players (or more) done 0 dmg, 0 heal || At least looser team did 10% dmg [Default values]?
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_2v2) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_2v2);
+ case 3:
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_3v3) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_3v3);
+ case 5:
+ return factor >= sWorld->getFloatConfig(CONFIG_ARENA_CHECK_CHEATERS_5v5) || factorLooser <= sWorld->getIntConfig(CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_5v5);
+ default:
+ return false;
+ }
+ return false;
+}
+
void Battleground::EndBattleground(uint32 winner)
{
RemoveFromBGFreeSlotQueue();
@@ -763,48 +799,59 @@ void Battleground::EndBattleground(uint32 winner)
{
winnerArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(winner));
loserArenaTeam = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamIdForTeam(GetOtherTeam(winner)));
-
- if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam)
+ if (sWorld->getBoolConfig(CONFIG_ARENA_CHECK_CHEATERS) && CheckCheatArena(GetArenaTeamIdForTeam(winner)))
{
- if (winner != WINNER_NONE)
+ if (!sWorld->getBoolConfig(CONFIG_ARENA_CHECK_CHEATERS_ONLYLOG))
{
- loserTeamRating = loserArenaTeam->GetRating();
- loserMatchmakerRating = GetArenaMatchmakerRating(GetOtherTeam(winner));
- winnerTeamRating = winnerArenaTeam->GetRating();
- winnerMatchmakerRating = GetArenaMatchmakerRating(winner);
- winnerMatchmakerChange = winnerArenaTeam->WonAgainst(winnerMatchmakerRating, loserMatchmakerRating, winnerChange);
- loserMatchmakerChange = loserArenaTeam->LostAgainst(loserMatchmakerRating, winnerMatchmakerRating, loserChange);
- TC_LOG_DEBUG("bg.arena", "match Type: %u --- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", m_ArenaType, winnerTeamRating, winnerChange, winnerMatchmakerRating,
- winnerMatchmakerChange, loserTeamRating, loserChange, loserMatchmakerRating, loserMatchmakerChange);
- SetArenaMatchmakerRating(winner, winnerMatchmakerRating + winnerMatchmakerChange);
- SetArenaMatchmakerRating(GetOtherTeam(winner), loserMatchmakerRating + loserMatchmakerChange);
- SetArenaTeamRatingChangeForTeam(winner, winnerChange);
- SetArenaTeamRatingChangeForTeam(GetOtherTeam(winner), loserChange);
- TC_LOG_DEBUG("bg.arena", "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", m_ArenaType, m_ArenaTeamIds[TEAM_ALLIANCE], m_ArenaTeamIds[TEAM_HORDE], winnerArenaTeam->GetId(), winnerChange, loserChange);
- if (sWorld->getBoolConfig(CONFIG_ARENA_LOG_EXTENDED_INFO))
- for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr)
- if (Player* player = ObjectAccessor::FindPlayer(itr->first))
- {
- TC_LOG_DEBUG("bg.arena", "Statistics match Type: %u for %s (GUID: " UI64FMTD ", Team: %d, IP: %s): %u damage, %u healing, %u killing blows",
- m_ArenaType, player->GetName().c_str(), itr->first, player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3),
+ SetArenaTeamRatingChangeForTeam(ALLIANCE, 0);
+ SetArenaTeamRatingChangeForTeam(HORDE, 0);
+ }
+ TC_LOG_INFO("arena.cheat", "Arena cheated, score is 0 for teams IDs %u and %u", winnerArenaTeam->GetId(),loserArenaTeam->GetId());
+ }
+ else
+ {
+ if (winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam)
+ {
+ if (winner != WINNER_NONE)
+ {
+ loserTeamRating = loserArenaTeam->GetRating();
+ loserMatchmakerRating = GetArenaMatchmakerRating(GetOtherTeam(winner));
+ winnerTeamRating = winnerArenaTeam->GetRating();
+ winnerMatchmakerRating = GetArenaMatchmakerRating(winner);
+ winnerMatchmakerChange = winnerArenaTeam->WonAgainst(winnerMatchmakerRating, loserMatchmakerRating, winnerChange);
+ loserMatchmakerChange = loserArenaTeam->LostAgainst(loserMatchmakerRating, winnerMatchmakerRating, loserChange);
+ TC_LOG_DEBUG("bg.arena", "match Type: %u --- Winner: old rating: %u, rating gain: %d, old MMR: %u, MMR gain: %d --- Loser: old rating: %u, rating loss: %d, old MMR: %u, MMR loss: %d ---", m_ArenaType, winnerTeamRating, winnerChange, winnerMatchmakerRating,
+ winnerMatchmakerChange, loserTeamRating, loserChange, loserMatchmakerRating, loserMatchmakerChange);
+ SetArenaMatchmakerRating(winner, winnerMatchmakerRating + winnerMatchmakerChange);
+ SetArenaMatchmakerRating(GetOtherTeam(winner), loserMatchmakerRating + loserMatchmakerChange);
+ SetArenaTeamRatingChangeForTeam(winner, winnerChange);
+ SetArenaTeamRatingChangeForTeam(GetOtherTeam(winner), loserChange);
+ TC_LOG_DEBUG("bg.arena", "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", m_ArenaType, m_ArenaTeamIds[TEAM_ALLIANCE], m_ArenaTeamIds[TEAM_HORDE], winnerArenaTeam->GetId(), winnerChange, loserChange);
+ if (sWorld->getBoolConfig(CONFIG_ARENA_LOG_EXTENDED_INFO))
+ for (Battleground::BattlegroundScoreMap::const_iterator itr = GetPlayerScoresBegin(); itr != GetPlayerScoresEnd(); ++itr)
+ if (Player* player = ObjectAccessor::FindPlayer(itr->first))
+ {
+ TC_LOG_DEBUG("bg.arena", "Statistics match Type: %u for %s (GUID: " UI64FMTD ", Team: %d, IP: %s): %u damage, %u healing, %u killing blows",
+ m_ArenaType, player->GetName().c_str(), itr->first, player->GetArenaTeamId(m_ArenaType == 5 ? 2 : m_ArenaType == 3),
player->GetSession()->GetRemoteAddress().c_str(), itr->second->DamageDone, itr->second->HealingDone,
itr->second->KillingBlows);
- }
+ }
+ }
+ // Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes
+ else
+ {
+ SetArenaTeamRatingChangeForTeam(ALLIANCE, ARENA_TIMELIMIT_POINTS_LOSS);
+ SetArenaTeamRatingChangeForTeam(HORDE, ARENA_TIMELIMIT_POINTS_LOSS);
+ winnerArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS);
+ loserArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS);
+ }
}
- // Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes
else
{
- SetArenaTeamRatingChangeForTeam(ALLIANCE, ARENA_TIMELIMIT_POINTS_LOSS);
- SetArenaTeamRatingChangeForTeam(HORDE, ARENA_TIMELIMIT_POINTS_LOSS);
- winnerArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS);
- loserArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS);
+ SetArenaTeamRatingChangeForTeam(ALLIANCE, 0);
+ SetArenaTeamRatingChangeForTeam(HORDE, 0);
}
}
- else
- {
- SetArenaTeamRatingChangeForTeam(ALLIANCE, 0);
- SetArenaTeamRatingChangeForTeam(HORDE, 0);
- }
}
WorldPacket pvpLogData;
View
1  src/server/game/Battlegrounds/Battleground.h
@@ -465,6 +465,7 @@ class Battleground
void CheckArenaAfterTimerConditions();
void CheckArenaWinConditions();
void UpdateArenaWorldState();
+ bool CheckCheatArena(uint32 winTeam);
// Triggers handle
// must be implemented in BG subclass
View
8 src/server/game/World/World.cpp
@@ -1041,6 +1041,14 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_ARENA_START_MATCHMAKER_RATING] = sConfigMgr->GetIntDefault ("Arena.ArenaStartMatchmakerRating", 1500);
m_bool_configs[CONFIG_ARENA_SEASON_IN_PROGRESS] = sConfigMgr->GetBoolDefault("Arena.ArenaSeason.InProgress", true);
m_bool_configs[CONFIG_ARENA_LOG_EXTENDED_INFO] = sConfigMgr->GetBoolDefault("ArenaLog.ExtendedInfo", false);
+ m_bool_configs[CONFIG_ARENA_CHECK_CHEATERS] = sConfigMgr->GetBoolDefault("Arena.Cheated", false);
+ m_bool_configs[CONFIG_ARENA_CHECK_CHEATERS_ONLYLOG] = sConfigMgr->GetBoolDefault("Arena.Cheated.OnlyLOG", true);
+ m_float_configs[CONFIG_ARENA_CHECK_CHEATERS_2v2] = sConfigMgr->GetFloatDefault("Arena.Cheated.Rating.2v2", 0.5f);
+ m_float_configs[CONFIG_ARENA_CHECK_CHEATERS_3v3] = sConfigMgr->GetFloatDefault("Arena.Cheated.Rating.3v3", 0.66f);
+ m_float_configs[CONFIG_ARENA_CHECK_CHEATERS_5v5] = sConfigMgr->GetFloatDefault("Arena.Cheated.Rating.5v5", 0.75f);
+ m_int_configs[CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_2v2] = sConfigMgr->GetIntDefault ("Arena.Cheated.Minimum.Damage.2v2", 10);
+ m_int_configs[CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_3v3] = sConfigMgr->GetIntDefault ("Arena.Cheated.Minimum.Damage.3v3", 10);
+ m_int_configs[CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_5v5] = sConfigMgr->GetIntDefault ("Arena.Cheated.Minimum.Damage.5v5", 10);
m_bool_configs[CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN] = sConfigMgr->GetBoolDefault("OffhandCheckAtSpellUnlearn", true);
View
8 src/server/game/World/World.h
@@ -128,6 +128,8 @@ enum WorldBoolConfigs
CONFIG_ARENA_QUEUE_ANNOUNCER_PLAYERONLY,
CONFIG_ARENA_SEASON_IN_PROGRESS,
CONFIG_ARENA_LOG_EXTENDED_INFO,
+ CONFIG_ARENA_CHECK_CHEATERS,
+ CONFIG_ARENA_CHECK_CHEATERS_ONLYLOG,
CONFIG_OFFHAND_CHECK_AT_SPELL_UNLEARN,
CONFIG_VMAP_INDOOR_CHECK,
CONFIG_START_ALL_SPELLS,
@@ -183,6 +185,9 @@ enum WorldFloatConfigs
CONFIG_STATS_LIMITS_PARRY,
CONFIG_STATS_LIMITS_BLOCK,
CONFIG_STATS_LIMITS_CRIT,
+ CONFIG_ARENA_CHECK_CHEATERS_2v2,
+ CONFIG_ARENA_CHECK_CHEATERS_3v3,
+ CONFIG_ARENA_CHECK_CHEATERS_5v5,
FLOAT_CONFIG_VALUE_COUNT
};
@@ -287,6 +292,9 @@ enum WorldIntConfigs
CONFIG_ARENA_START_RATING,
CONFIG_ARENA_START_PERSONAL_RATING,
CONFIG_ARENA_START_MATCHMAKER_RATING,
+ CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_2v2,
+ CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_3v3,
+ CONFIG_ARENA_CHECK_CHEATERS_MIN_DMG_5v5,
CONFIG_MAX_WHO,
CONFIG_HONOR_AFTER_DUEL,
CONFIG_PVP_TOKEN_MAP_TYPE,
View
38 src/server/worldserver/worldserver.conf.dist
@@ -2322,6 +2322,44 @@ Arena.ArenaStartMatchmakerRating = 1500
ArenaLog.ExtendedInfo = 0
#
+# Arena.Cheated
+# Description: Check if players are cheating in the arena.
+# Default: 0 - (Disabled)
+# 1 - (Enabled)
+Arena.Cheated = 0
+
+#
+# Arena.Cheated.OnlyLOG
+# Description: Check if should report only on Log file/console, allowing the system to award arena points.
+# Default: 1 - (Enabled: Only reports if cheat detected)
+# 0 - (Disabled: Reports and changes awarded points to 0 if cheat detected)
+Arena.Cheated.OnlyLOG = 1
+
+#
+# Arena.Cheated.Rating.2v2
+# Arena.Cheated.Rating.3v3
+# Arena.Cheated.Rating.5v5
+# Description: Sets the threshold of minimum activity (heal+dmg) for the arenas. The % is calculated based on the max HP of the whole winner team.
+# Default: 2v2 - Default 50%
+# 3v3 - Default 66%
+# 5v5 - Default 75%
+Arena.Cheated.Rating.2v2 = 0.5
+Arena.Cheated.Rating.3v3 = 0.66
+Arena.Cheated.Rating.5v5 = 0.75
+
+#
+# Arena.Cheated.Minimum.Damage.2v2
+# Arena.Cheated.Minimum.Damage.3v3
+# Arena.Cheated.Minimum.Damage.5v5
+# Description: Sets minimum damage the Looser team (in %) on an Arena has to deal to winner team it will be considered cheating.
+# Default: 2v2 - Default 10%
+# 3v3 - Default 10%
+# 5v5 - Default 10%
+Arena.Cheated.Minimum.Damage.2v2 = 10
+Arena.Cheated.Minimum.Damage.3v3 = 10
+Arena.Cheated.Minimum.Damage.5v5 = 10
+
+#
###################################################################################################
###################################################################################################
Something went wrong with that request. Please try again.