PDA

Просмотр полной версии : Баг с аренами (по 1 чел. с тима)


Dimitrius
12.03.2010, 07:56
Ревизия 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
Dimitrius, а в конфигах относительно бг и арен всё поумолчанию?
Да, чистый конфиг пробовали юзать.

Rage Hunter
12.03.2010, 14:34
Да, чистый конфиг пробовали юзать.
Тут дело не в конфиге! Проблема в том, что регистрация на арену должна работать только в группе, а сейчас она работает и в рейде!

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/commit/07247432865d9dd04ee18de8410779f228865936

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

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

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

diff --git a/Group.cpp b/Group.cpp
index 4afb7d6..8851fb4 100644
--- a/Group.cpp
+++ b/Group.cpp
@@ -1483,6 +1483,9 @@ uint32 Group::CanJoinBattleGroundQueue(BattleGround const* bgOrTemplate, BattleG
// 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 вариант - усложненный перебор

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* bgOrTemplate, BattleG
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 != NULL; itr = 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 : прощайте, тупые багеры арен)