arena system

Hi there,

imho arena system that is implemented in core has two errors:

  1. Rating difference calculation should be based on

team rating instead of MMR rating.

  1. Current implementation tries to boost teams with

team rating under 1000 with double gain on wins and

with 1 - 2 x gain for rating between 1000 and 1300.

Instead of increasing gain it should decrease losing.

Here comes my solution, that will be considered as

a custom code I guess, that makes following effect:

teams with teamrating under 1000 don’t lose more

team rating and teams with team rating between 1000

and 1300 lose half of it.

Here’s the patch that solves it:

[CODE]arena system

— a/src/server/game/Battlegrounds/ArenaTeam.cpp

+++ b/src/server/game/Battlegrounds/ArenaTeam.cpp

@@ -613,19 +621,16 @@

 // Calculate the rating modification

 // Simulation on how it works. Not much info on how it really works
  • float mod;

  • if (won && !calculateMatchMakerRating)

  • {

  •    if (ownRating < 1000)
    
  •        mod = 48.0f * (won_mod - chance);
    
  •    else if (ownRating < 1300)
    
  •        mod = (24.0f + (24.0f * (1300.0f - int32(ownRating)) / 300.0f)) * (won_mod - chance);
    
  •    else
    
  •        mod = 24.0f * (won_mod - chance);
    
  • float mod = 32.0f * (won_mod - chance); // correct value of K is 32 says wowwiki

  • // if it’s loss and it’s not calculation of MMR

  • if(!won && !calculateMatchMakerRating){

  •    if(ownRating < 1000){ // team rating shouldn't decrease if it's already bellow 1000
    
  •        mod = 0;    
    
  •    }else if(ownRating <= 1300){
    
  •        mod /= 2;
    
  •    }
    

    }

  • else

  •    mod = 24.0f * (won_mod - chance);
    

    return (int32)ceil(mod);

}

@@ -675,7 +680,7 @@

{

 // Called when the team has won

 // Own team rating versus opponents matchmaker rating
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, true);
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, true, false);

    // Modify the team stats accordingly

    FinishGame(mod);

@@ -692,7 +697,7 @@

{

 // Called when the team has lost

 // Own team rating versus opponents matchmaker rating
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, false);
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, false, false);

    // Modify the team stats accordingly

    FinishGame(mod);

— a/src/server/game/Battlegrounds/Battleground.cpp

+++ b/src/server/game/Battlegrounds/Battleground.cpp

@@ -700,8 +700,8 @@

             loser_matchmaker_rating = GetArenaMatchmakerRating(GetOtherTeam(winner));

             winner_team_rating = winner_arena_team->GetRating();

             winner_matchmaker_rating = GetArenaMatchmakerRating(winner);
  •            winner_change = winner_arena_team->WonAgainst(loser_matchmaker_rating);
    
  •            loser_change = loser_arena_team->LostAgainst(winner_matchmaker_rating);
    
  •            winner_change = winner_arena_team->WonAgainst(loser_team_rating);
    
  •            loser_change = loser_arena_team->LostAgainst(winner_team_rating);
    
               sLog->outArena("--- Winner rating: %u, Loser rating: %u, Winner MMR: %u, Loser MMR: %u, Winner change: %d, Loser change: %d ---", winner_team_rating, loser_team_rating,
    
                   winner_matchmaker_rating, loser_matchmaker_rating, winner_change, loser_change);
    
               SetArenaTeamRatingChangeForTeam(winner, winner_change);
    

[/CODE]

If I’m wrong, just say so /emoticons/default_wink.png

I ain’t sure if teams were starting on

1500 team rating on 3.3.5a patch already.

LihO

I love you, only one bug.

Arena.RatingDiscardTimer & Arena.MaxRatingDifference

I think not works, ignore rating alltime.

Thx.

It’s ok, teams play against each other thanks to MMR

that connects them… so matches 1100 vs 1700 rating

are ok even if you set 200 max difference in your config…

Hello, I think to work call to arena with team rating add:

src/server/game/Battlegrounds/ArenaTeam.cpp

[CODE]uint32 ArenaTeam::GetAverageMMR(Group* group) const

{

if (!group)

    return 0;

uint32 matchMakerRating = 0;

uint32 playerDivider = 0;

for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr)

{

    // Skip if player is not online

    if (!ObjectAccessor::FindPlayer(itr->Guid))

            continue;


    // Skip if player is not member of group

    if (!group->IsMember(itr->Guid))				 

            continue;
  •    matchMakerRating += itr->MatchMakerRating;
    
  •    ++playerDivider;
    

    }

    // x/0 = crash

    if (playerDivider == 0)

      playerDivider = 1;
    
  • matchMakerRating /= playerDivider;

  • return matchMakerRating;

  • return Stats.Rating;

}[/CODE]

[/SPOILER]

if you want to hack core to force arena system to be based on team rating,

then you can delete whole GetAverageMMR function to look like this:

[CODE]uint32 ArenaTeam::GetAverageMMR(Group* group) const

{

return Stats.Rating;

}[/CODE]
… i just don’t see the reason why would you do that, because MMR works fine

Your first post patch seems correct to me although I wonder where did you get this piece of info :

Instead of increasing gain it should decrease losing.

Arena - Wowpedia - Your wiki guide to the World of Warcraft :

"The K value used by Blizzard is 32. So each match,

the maximum rating gain/loss will be 32pts. And if you

play with a team with same rating, you will gain/lose

exactly 16pts."

… so boosting team ratings on win is against wowwiki

a question:

can put that time to win or lose rating, take the value of personal rating instead of team rating?

But example:

Team (1400 rating)

  • Char A (1400 rating)

  • Char A2 (1400 rating)

  • Char A3 (1000 rating)

EquipB (1000 rating)

Team Win with Char A + Char A3

Char A = +1 rating

Char A3 = +1 rating (should be +16 not?)

thx

maybe that call of GetRatingMod should

explicitly tell that MMR won’t be calculated:

[CODE]@@ -675,7 +680,7 @@

{

 // Called when the team has won

 // Own team rating versus opponents matchmaker rating
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, true);
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, true, false);

    // Modify the team stats accordingly

    FinishGame(mod);

@@ -692,7 +697,7 @@

{

 // Called when the team has lost

 // Own team rating versus opponents matchmaker rating
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, false);
  • int32 mod = GetRatingMod(Stats.Rating, againstRating, false, false);

    // Modify the team stats accordingly

    FinishGame(mod);

[/CODE]
that I added into patch in first post too,

try that one, if team rating change is

wrong anyway it will be cuz your custom

modification of it… for me it works great

hi, could you explain how it works MMR?

But example, in worldserver.conf put MMR = 1, and update character_arena_stats MMR = 0, But when to win / lose one count arena since 1500, ie, those who win get 1516 MMR and losers 1484.

So I think ignore rating and you today fix not works because MMR, because I do not work properly, not if I explained, believe it or do not quite understand the operation of MMR or not it can be.

Thx

true, but calling functions with default

arguments is bad practice anyway…

it’s much better when you explicitly list

them

I tried your patch with this setup :

  • Team A

RatingA : ~1000

Member B1 MMR : 2200

Member B2 MMR : 2200

  • Team B

RatingB : ~1000

Member B1 MMR : 1500

Member B2 MMR : 1500

Team A wins : RatingA += 31 and RatingB -= 29

I think MMR should be taken in account for rating calculation.

There are too :

Team A rating : 2000

Member A rating : 2000, MMR 2100

Member B rating : 0, MMR 2000

the member A and B win 10 points whereas member B has got 0 rating. ( for example)

//

any news to can put that time to win or lose rating, take the value of personal rating instead of team rating?

Thx.

the same problem in original TC system :X

max rating difference is handled in BG Queue or Mgr…

… anyway for me it works good /emoticons/default_unsure.png/emoticons/default_blink.png

its true, [SIZE=12px][FONT=helvetica]Arena.RatingDiscardTimer & Arena.MaxRatingDifference not work[/FONT][/SIZE]

[LEFT]http://www.google.com/uds/css/small-logo.png

[/LEFT]

— Canned message start —

You smell that? It was this thread rotting.

You just played:

http://img227.imageshack.us/img227/8899/threadnecromancerji6.jpg

— Canned message end —