Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Баг-репорты (http://mangos.ytdb.ru/forumdisplay.php?f=27)
-   -   Баг с аренами (по 1 чел. с тима) (http://mangos.ytdb.ru/showthread.php?t=252)

Dimitrius 12.03.2010 07:56

Баг с аренами (по 1 чел. с тима)
 
Ревизия 9535, YTDB 537
Суть бага заключается в том, что игроки на арене умудряются играть не 2х2 а 1х1, тоесть по 1 чел. с комманды, тем самым сливая друг другу и накапливая поинты.

nix 12.03.2010 09:37

Dimitrius, а в конфигах относительно бг и арен всё поумолчанию?

VENOM 12.03.2010 11:13

Да некоторые игроки сделали это на моем сервере
Я понятия не имею как они это сделали
:mad:

Dimitrius 12.03.2010 12:38

Цитата:

Сообщение от nix (Сообщение 1519)
Dimitrius, а в конфигах относительно бг и арен всё поумолчанию?

Да, чистый конфиг пробовали юзать.

Rage Hunter 12.03.2010 14:34

Цитата:

Сообщение от Dimitrius (Сообщение 1567)
Да, чистый конфиг пробовали юзать.

Тут дело не в конфиге! Проблема в том, что регистрация на арену должна работать только в группе, а сейчас она работает и в рейде!

Ranger 14.03.2010 11:02

ИМХО, недостаточность проверок количества участников в файле Group.cpp в функции Group::CanJoinBattleGroundQueue

Код:

    // check for min / max count
    uint32 memberscount = GetMembersCount();
    if(memberscount < MinPlayerCount)
        return BG_JOIN_ERR_GROUP_NOT_ENOUGH;

Необходимо учесть, что функция GetMembersCount() возвращает общее количество участников, в том числе и offline-участников. Таким образом, проверка if(memberscount < MinPlayerCount) проходит на ура.

Логично предположить, что необходимо добавить ещё одну проверку на количество online-участников, и, если их не достаточно, возвращать ошибку типа BG_JOIN_ERR_OFFLINE_MEMBER

P.S. Моё ИМХО.

Добавлено:
Вот это меня вводит в заблуждение:
Код:

        Player *member = itr->getSource();
        // offline member? don't let join
        if(!member)
            return BG_JOIN_ERR_OFFLINE_MEMBER;

Попробуйте добавить условие или !member->IsInWorld()
Код:

        Player *member = itr->getSource();
        // offline member? don't let join
        if(!member || !member->IsInWorld())
            return BG_JOIN_ERR_OFFLINE_MEMBER;

может быть баг уйдёт.

zergtmn 15.03.2010 11:45

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 100 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.

Попытался исправить так:
http://github.com/zergtmn/mangos/com...0779f228865936

MaS0n 15.03.2010 12:40

->Ranger
С проверкой все норм, просто перебор ведется...мягко говоря, неполный, по 1 группе

Как обойти эту проверку, берем тиму 5х5, инвайтим игроков, создаем рейд, раскидываем участников по разным подгруппам, офаем 4 человек и вуаля - 1 человек будет играть, причем он всегда будет попадать на такого же 1-ого, несмотря на дифференс

Попробуйте 2 варианта
1. просто запрещать рейдам рег на арены - ошибку брал от балды, какую хотите
выводите
PHP код:

diff --git a/Group.cpp b/Group.cpp
index 4afb7d6
..8851fb4 100644
--- a/Group.cpp
+++ b/Group.cpp
@@ -1483,+1483,@@ uint32 Group::CanJoinBattleGroundQueue(BattleGround const* bgOrTemplateBattleG
         
// don't allow cross-faction join as group
         
if(member->GetTeam() != team)
             return 
BG_JOIN_ERR_MIXED_FACTION;
+        
// don't allow join as raid on arenas
+        if (isRated && member->GetGroup()->isRaidGroup())
+            return 
BG_JOIN_ERR_GROUP_TOO_MANY;
         
// not in the same battleground level braket, don't let join
         
PvPDifficultyEntry const* memberBracketEntry GetBattlegroundBracketByLevel(bracketEntry->mapId,member->getLevel());
         if(
memberBracketEntry != bracketEntry

2 вариант - усложненный перебор
PHP код:

diff --git a/Group.cpp b/Group.cpp
index 4afb7d6
..474dc4d 100644
--- a/Group.cpp
+++ b/Group.cpp
@@ -1473,10 +1473,11 @@ uint32 Group::CanJoinBattleGroundQueue(BattleGround const* bgOrTemplateBattleG
     uint32 arenaTeamId 
reference->GetArenaTeamId(arenaSlot);
     
uint32 team reference->GetTeam();
 
-    
// check every member of the group to be able to join
-    for(GroupReference *itr GetFirstMember(); itr != NULLitr itr->next())
+    
// check every member of the group and raid to be able to join
+    Group::MemberSlotList members GetMemberSlots();
+    for (
Group::member_citerator itr members.begin(); itr != members.end(); itr++)
     {
-        
Player *member itr->getSource();
+        
Player *member objmgr.GetPlayer(itr->guid);
         
// offline member? don't let join
         
if(!member)
             return 
BG_JOIN_ERR_OFFLINE_MEMBER

+ я еще в установлениии очереди сразу запрещал рейды, т.е рейдом ты не встанешь никогда на арену...обновлюсь - выложу, если кому надо будет

ПС : почти так же, как и у zergtmn'a

ПС2 : прощайте, тупые багеры арен)


Текущее время: 15:32. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS