Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Баг-репорты

Важная информация

Баг-репорты Описываем проблемы и ошибки работы ядра

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2010, 16:46   #1
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию краш с InstanceMap::Add()

Краш очень древний, я даже не вспомню когда он зародился и я думаю он многим знаком. Наконец таки игроки описали порядок действий, которым создают его, описание будет ниже.
дамп
Код:
#0  0x00eaf410 in __kernel_vsyscall ()
No symbol table info available.
#1  0x004d8df0 in raise () from /lib/libc.so.6
No symbol table info available.
#2  0x004da701 in abort () from /lib/libc.so.6
No symbol table info available.
#3  0x004d226b in __assert_fail () from /lib/libc.so.6
No symbol table info available.
#4  0x0829a3fb in InstanceMap::Add (this=0x6a700018, player=0x829ea9f0)
    at ../../../src/game/Map.cpp:2250
        groupBind = (InstanceGroupBind *) 0x6c4bb938
        pGroup = <value optimized out>
        mapSave = (InstanceSave *) 0x1
        playerBind = <value optimized out>
        __FUNCTION__ = "Add"
        __PRETTY_FUNCTION__ = "virtual bool InstanceMap::Add(Player*)"
#5  0x084d82e6 in WorldSession::HandleMoveWorldportAckOpcode (this=0x1b9f8418)
    at ../../../src/game/MovementHandler.cpp:261
        loc = (WorldLocation &) @0x829ec204: {mapid = 556,
  coord_x = -4.68109989, coord_y = -0.0930795968, coord_z = 0.00620000018,
  orientation = 0.035342399}
        mEntry = (const MapEntry *) 0xa94cae0
        mInstance = (const InstanceTemplate *) 0xac94d98
        corpse = <value optimized out>
#6  0x0846e087 in WorldSession::Update (this=0x1b9f8418)
    at ../../../src/game/WorldSession.cpp:232
        opHandle = (OpcodeHandler &) @0x6251: <error reading variable>
        packet = (WorldPacket *) 0x781eeca0
        currTime = <value optimized out>
#7  0x08465e4e in World::UpdateSessions (this=0xa54b858, diff=77)
    at ../../../src/game/World.cpp:1880
        next = {_M_cur = 0x8cdd9660, _M_ht = 0xa54b8d0}
        sess = (WorldSession *) 0x532fb6
#8  0x08466d91 in World::Update (this=0xa54b858, diff=77)
    at ../../../src/game/World.cpp:1416
        autobroadcaston = 0
#9  0x0815595a in WorldRunnable::run (this=0x9b8c3a90)
    at ../../../src/mangosd/WorldRunnable.cpp:60
        diff = 77
        realCurrTime = 1853525177
        realPrevTime = <value optimized out>
        prevSleepTime = 42
#10 0x0853618d in ACE_Based::Thread::ThreadTask (param=0x9b8c3a90)
    at ../../../src/shared/Threading.cpp:187
No locals.
#11 0x003020d7 in ACE_OS_Thread_Adapter::invoke ()
лог сервера
Код:
2010-05-06 20:40:04 ERROR:InstanceMap::Add: player Фаст(5476689) is being put in instance 556,87,1 but he is in group 46469 which is bound to instance 556,86,1!
2010-05-06 20:40:04 ERROR:MapSave players: 0, group count: 0
2010-05-06 20:40:04 ERROR:GroupBind save players: 0, group count: 1
Падает тут
Код:
                        // cannot jump to a different instance without resetting it
                        if(groupBind->save != mapSave)
                        {
                            sLog.outError("InstanceMap::Add: player %s(%d) is being put in instance %d,%d,%d but he is in group %d which is bound to instance %d,%d,%d!", player->GetName(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), GUID_LOPART(pGroup->GetLeaderGUID()), groupBind->save->GetMapId(), groupBind->save->GetInstanceId(), groupBind->save->GetDifficulty());
                            if(mapSave)
                                sLog.outError("MapSave players: %d, group count: %d", mapSave->GetPlayerCount(), mapSave->GetGroupCount());
                            else
                                sLog.outError("MapSave NULL");
                            if(groupBind->save)
                                sLog.outError("GroupBind save players: %d, group count: %d", groupBind->save->GetPlayerCount(), groupBind->save->GetGroupCount());
                            else
                                sLog.outError("GroupBind save NULL");
                            ASSERT(false);    <--------- тута
                        }
В общем базируется краш на самом элементарном обходе требований ключа в героик данжи БК. Т.е. злоумышленники будут примерно от 55 до 80 уровня (ниже попросту не смогут зайти).
Игроки описали так, про баг я знаю давно, но не думал что он теперь приводит к падениям :/
1. Собираем группу хотя бы из двух человек. Возьмем за пример данж Сеттекские Залы. У одного ключ в данж есть (и он лидер группы), у другого нету. Первоначально стоит обычный режим подземелья, не трогаем его пока.
2. Игрок без ключа заходит в данж и жмет ALT+F4
3. Лидер группы меняет сложность подземелья на героик
4. Игрок без ключа заходит в игру и оказывается в героическом режиме (хотя кто первый зашёл - лидер группы или чел без ключа, мне не указали) - *BANG CRASH*

Возможные методы исправления:
1) Выпортовывать всех оффлайн игроков ко входу в инстанс при переключении сложности
2) Выпортовывать игроков с "временным" кд ко входу в инстанс при выходе из игры
3) Выпортовывать игроков, которые не соответствуют требованиям инстанса, к его входу при логине. Что-то вроде доп проверки данных таблицы areatrigger_teleport
4) Выпортовывать игроков, которые не соответствуют требованиям инстанса, к его входу при выходе из игры
5) Не позволять переключить сложность инстанса даже если там есть оффлайн члены группы
6) Выпортовывать игроков использующих данный баг ко входу в инст или на кладбище (хаковый)

это устаревшая инфа о методах исправления, актуальное в посте №6

Последний раз редактировалось Insider42; 06.05.2010 в 18:48.
Insider42 вне форума   Ответить с цитированием
Старый 06.05.2010, 16:58   #2
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 20 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.
zergtmn вне форума   Ответить с цитированием
Старый 06.05.2010, 17:02   #3
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
*** скрытый текст ***
это немного иной баг и он у меня поправлен с помощью одного из патчей, не дающий переключать сложность если есть игроки в инсте.
Вот он (таблетка на ваш баг), автора не помню :/
Код:
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index fe2ee3c..c7aed3e 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -1433,6 +1433,14 @@ void WorldSession::HandleSetDungeonDifficultyOpcode( WorldPacket & recv_data )
     {
         if(pGroup->IsLeader(_player->GetGUID()))
         {
+            //do not let set dungeon difficulty if any one in this group in dungeon
+            Group::MemberSlotList g_members = pGroup->GetMemberSlots();
+            for (Group::member_citerator itr = g_members.begin(); itr != g_members.end(); itr++)
+            {
+                Player *gm_member = sObjectMgr.GetPlayer(itr->guid);
+                if (gm_member && gm_member->GetMap() && gm_member->GetMap()->IsDungeon())
+                    return;
+            }
             // the difficulty is set even if the instances can't be reset
             //_player->SendDungeonDifficulty(true);
             pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, false, _player);
@@ -1477,6 +1485,14 @@ void WorldSession::HandleSetRaidDifficultyOpcode( WorldPacket & recv_data )
     {
         if(pGroup->IsLeader(_player->GetGUID()))
         {
+            //do not let set dungeon difficulty if any one in this group in dungeon
+            Group::MemberSlotList g_members = pGroup->GetMemberSlots();
+            for (Group::member_citerator itr = g_members.begin(); itr != g_members.end(); itr++)
+            {
+                Player *gm_member = sObjectMgr.GetPlayer(itr->guid);
+                if (gm_member && gm_member->GetMap() && gm_member->GetMap()->IsDungeon())
+                    return;
+            }
             // the difficulty is set even if the instances can't be reset
             //_player->SendDungeonDifficulty(true);
             pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, _player);
Кстати я думаю его можно и довести до ума, чтобы не давал переключать если есть оффлайн игроки. Только как заставить проверять также и оффлайн игроков? Тупо убрать
Код:
gm_member &&
?
Вот только боюсь getmap выдаст краш из-за отстутствующего игрока в мире, или нет?

Одно дело когда багоюзят, другое дело когда портят стабильность сервера, причем нарошно :/

Давайте лучше определимся с методом исправления. Ваши идеи? Кто знает как на оффе с этим обстоит?

Последний раз редактировалось Insider42; 06.05.2010 в 17:19.
Insider42 вне форума   Ответить с цитированием
Старый 06.05.2010, 17:27   #4
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Вот ещё один метод исправления, обозначил как №6
Код:
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index acb66ec..7f7f9cc 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -2410,7 +2410,7 @@ bool InstanceMap::Add(Player *player)
                                 sLog.outError("GroupBind save players: %d, group count: %d", groupBind->save->GetPlayerCount(), groupBind->save->GetGroupCount());
                             else
                                 sLog.outError("GroupBind save NULL");
-                            ASSERT(false);
+                            player->RepopAtGraveyard();
                         }
                         // if the group/leader is permanently bound to the instance
                         // players also become permanently bound when they enter
но он более смахивает на хак (временное решение), т.к. хоть и предотвращает использование бага (перемещает игрока-багоюзера на кладбище), но не предотвращает саму попытку его использования

По сути самый безопасный и простой метод для live-серверов

Последний раз редактировалось Insider42; 06.05.2010 в 17:44.
Insider42 вне форума   Ответить с цитированием
Старый 06.05.2010, 17:39   #5
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Если убрать gm_member && упадет при вызове оператора -> по нулевому указателю на gm_member->GetMap().
Цитата:
Сообщение от Insider42 Посмотреть сообщение
это немного иной баг и он у меня поправлен с помощью одного из патчей, не дающий переключать сложность если есть игроки в инсте.
Сложность переключать не надо.
zergtmn вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Insider42 (06.05.2010)
Старый 06.05.2010, 17:44   #6
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Если убрать gm_member && упадет при вызове оператора -> по нулевому указателю на gm_member->GetMap().

Сложность переключать не надо.
Тогда это ещё один баг у меня так сложностями делали

В данный момент пытаюсь выцепить кого-нибудь из свой игроков с оффа и узнать какой же из способов указанных в посте №1 темы используется на оффе. Пока подозрения на п5

ДОБАВЛЕНО:
Ниоднин из вышеописанных способов не оказался верным. Рассказали игроки оффа:
1) Если в инсте сидят онлайн игроки, а лидер снаружи пытается переключить сложность - сложность не переключается.
2) Если в инсте логнулся не подходящий к требованиям Героик режима игрок, лидер за инстом переключает сложность - при входе того игрока он оказывается в собственной копии инстанса на обычном режиме!!! Причем это "старая" копия. Инст не удалился, а вот для остальных создался новый.

Инфа подтверждена двумя игроками с официального сервера. Делом за малым - реализовать.
Пункт 1 реализован в посте №3
Пункт 2 буду думать, но для тех кто не хочет ждать - юзайте патч из поста №4

По поводу пункта2: нужно отвязывать игрока от привязки группы в случае несоответствия его к требованиям инста, если же соответствует то пытаться добавить его не в новый инст, а к остальным в групповой.

Последний раз редактировалось Insider42; 06.05.2010 в 19:21.
Insider42 вне форума   Ответить с цитированием
Старый 06.05.2010, 18:45   #7
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

А теперь переходим к основной части этого извращенства. ПОПЫТКА реализации пункта №2
Код:
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index acb66ec..51d5052 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -2399,19 +2399,8 @@ bool InstanceMap::Add(Player *player)
                     else
                     {
                         // cannot jump to a different instance without resetting it
-                        if(groupBind->save != mapSave)
-                        {
-                            sLog.outError("InstanceMap::Add: player %s(%d) is being put in instance %d,%d,%d but he is in group %d which is bound to instance %d,%d,%d!", player->GetName(), player->GetGUIDLow(), mapSave->GetMapId(), mapSave->GetInstanceId(), mapSave->GetDifficulty(), GUID_LOPART(pGroup->GetLeaderGUID()), groupBind->save->GetMapId(), groupBind->save->GetInstanceId(), groupBind->save->GetDifficulty());
-                            if(mapSave)
-                                sLog.outError("MapSave players: %d, group count: %d", mapSave->GetPlayerCount(), mapSave->GetGroupCount());
-                            else
-                                sLog.outError("MapSave NULL");
-                            if(groupBind->save)
-                                sLog.outError("GroupBind save players: %d, group count: %d", groupBind->save->GetPlayerCount(), groupBind->save->GetGroupCount());
-                            else
-                                sLog.outError("GroupBind save NULL");
-                            ASSERT(false);
-                        }
+                        if(groupBind->save != mapSave && player->IsMeetZoneRequirement(GetInstanceId()))
+                            mapSave = groupBind->save;
                         // if the group/leader is permanently bound to the instance
                         // players also become permanently bound when they enter
                         if(groupBind->perm)
diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp
index b875b8c..14bf8e5 100644
--- a/src/game/MiscHandler.cpp
+++ b/src/game/MiscHandler.cpp
@@ -742,68 +742,8 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket & recv_data)
     if(!at)
         return;
 
-    if(!GetPlayer()->isGameMaster())
-    {
-        uint32 missingLevel = 0;
-        if(GetPlayer()->getLevel() < at->requiredLevel && !sWorld.getConfig(CONFIG_BOOL_INSTANCE_IGNORE_LEVEL))
-            missingLevel = at->requiredLevel;
-
-        // must have one or the other, report the first one that's missing
-        uint32 missingItem = 0;
-        if(at->requiredItem)
-        {
-            if(!GetPlayer()->HasItemCount(at->requiredItem, 1) &&
-                (!at->requiredItem2 || !GetPlayer()->HasItemCount(at->requiredItem2, 1)))
-                missingItem = at->requiredItem;
-        }
-        else if(at->requiredItem2 && !GetPlayer()->HasItemCount(at->requiredItem2, 1))
-            missingItem = at->requiredItem2;
-
-        MapEntry const* mapEntry = sMapStore.LookupEntry(at->target_mapId);
-        if(!mapEntry)
-            return;
-
-        bool isRegularTargetMap = GetPlayer()->GetDifficulty(mapEntry->IsRaid()) == REGULAR_DIFFICULTY;
-
-        uint32 missingKey = 0;
-        if (!isRegularTargetMap)
-        {
-            if(at->heroicKey)
-            {
-                if(!GetPlayer()->HasItemCount(at->heroicKey, 1) &&
-                    (!at->heroicKey2 || !GetPlayer()->HasItemCount(at->heroicKey2, 1)))
-                    missingKey = at->heroicKey;
-            }
-            else if(at->heroicKey2 && !GetPlayer()->HasItemCount(at->heroicKey2, 1))
-                missingKey = at->heroicKey2;
-        }
-
-        uint32 missingQuest = 0;
-        if (!isRegularTargetMap)
-        {
-            if (at->requiredQuestHeroic && !GetPlayer()->GetQuestRewardStatus(at->requiredQuestHeroic))
-                missingQuest = at->requiredQuestHeroic;
-        }
-        else
-        {
-            if(at->requiredQuest && !GetPlayer()->GetQuestRewardStatus(at->requiredQuest))
-                missingQuest = at->requiredQuest;
-        }
-
-        if(missingLevel || missingItem || missingKey || missingQuest)
-        {
-            // TODO: all this is probably wrong
-            if(missingItem)
-                SendAreaTriggerMessage(GetMangosString(LANG_LEVEL_MINREQUIRED_AND_ITEM), at->requiredLevel, ObjectMgr::GetItemPrototype(missingItem)->Name1);
-            else if(missingKey)
-                GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY, isRegularTargetMap ? DUNGEON_DIFFICULTY_NORMAL : DUNGEON_DIFFICULTY_HEROIC);
-            else if(missingQuest)
-                SendAreaTriggerMessage("%s", at->requiredFailedText.c_str());
-            else if(missingLevel)
-                SendAreaTriggerMessage(GetMangosString(LANG_LEVEL_MINREQUIRED), missingLevel);
-            return;
-        }
-    }
+    if (!pl->IsMeetZoneRequirement(at->target_mapId))
+        return;
 
     GetPlayer()->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT);
 }
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index c317edd..4e70f1f 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -16356,6 +16356,73 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty
         return NULL;
 }
 
+bool Player::IsMeetZoneRequirement()
+{
+    if(!GetPlayer()->isGameMaster())
+    {
+        uint32 missingLevel = 0;
+        if(GetPlayer()->getLevel() < at->requiredLevel && !sWorld.getConfig(CONFIG_BOOL_INSTANCE_IGNORE_LEVEL))
+            missingLevel = at->requiredLevel;
+
+        // must have one or the other, report the first one that's missing
+        uint32 missingItem = 0;
+        if(at->requiredItem)
+        {
+            if(!GetPlayer()->HasItemCount(at->requiredItem, 1) &&
+                (!at->requiredItem2 || !GetPlayer()->HasItemCount(at->requiredItem2, 1)))
+                missingItem = at->requiredItem;
+        }
+        else if(at->requiredItem2 && !GetPlayer()->HasItemCount(at->requiredItem2, 1))
+            missingItem = at->requiredItem2;
+
+        MapEntry const* mapEntry = sMapStore.LookupEntry(at->target_mapId);
+        if(!mapEntry)
+            return false;
+
+        bool isRegularTargetMap = GetPlayer()->GetDifficulty(mapEntry->IsRaid()) == REGULAR_DIFFICULTY;
+
+        uint32 missingKey = 0;
+        if (!isRegularTargetMap)
+        {
+            if(at->heroicKey)
+            {
+                if(!GetPlayer()->HasItemCount(at->heroicKey, 1) &&
+                    (!at->heroicKey2 || !GetPlayer()->HasItemCount(at->heroicKey2, 1)))
+                    missingKey = at->heroicKey;
+            }
+            else if(at->heroicKey2 && !GetPlayer()->HasItemCount(at->heroicKey2, 1))
+                missingKey = at->heroicKey2;
+        }
+
+        uint32 missingQuest = 0;
+        if (!isRegularTargetMap)
+        {
+            if (at->requiredQuestHeroic && !GetPlayer()->GetQuestRewardStatus(at->requiredQuestHeroic))
+                missingQuest = at->requiredQuestHeroic;
+        }
+        else
+        {
+            if(at->requiredQuest && !GetPlayer()->GetQuestRewardStatus(at->requiredQuest))
+                missingQuest = at->requiredQuest;
+        }
+
+        if(missingLevel || missingItem || missingKey || missingQuest)
+        {
+            // TODO: all this is probably wrong
+            if(missingItem)
+                SendAreaTriggerMessage(GetMangosString(LANG_LEVEL_MINREQUIRED_AND_ITEM), at->requiredLevel, ObjectMgr::GetItemPrototype(missingItem)->Name1);
+            else if(missingKey)
+                GetPlayer()->SendTransferAborted(at->target_mapId, TRANSFER_ABORT_DIFFICULTY, isRegularTargetMap ? DUNGEON_DIFFICULTY_NORMAL : DUNGEON_DIFFICULTY_HEROIC);
+            else if(missingQuest)
+                SendAreaTriggerMessage("%s", at->requiredFailedText.c_str());
+            else if(missingLevel)
+                SendAreaTriggerMessage(GetMangosString(LANG_LEVEL_MINREQUIRED), missingLevel);
+            return false;
+        }
+    }
+    return true;
+}
+
 void Player::UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload)
 {
     BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid);
diff --git a/src/game/Player.h b/src/game/Player.h
index 9551ee6..c3ebeed 100644
--- a/src/game/Player.h
+++ b/src/game/Player.h
@@ -2245,6 +2245,7 @@ class MANGOS_DLL_SPEC Player : public Unit
         BoundInstancesMap m_boundInstances[MAX_DIFFICULTY];
         InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty);
         BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; }
+        bool IsMeetZoneRequirement()
         void UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload = false);
         void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false);
         InstancePlayerBind* BindToInstance(InstanceSave *save, bool permanent, bool load = false);
Пока что это просто макет
ошибки компиляции гарантированы, наша (да да, я не один должен горбатить ) задача их устранить

Но тут же новая загвоздка - если там было всё таки 2 игрока не подходящих по требованиям... я опять опросил игроков с оффа, говорят что они будут вместе в старом инсте. Т.е. при переключении сложности инст обнуляется ТОЛЬКО для игроков подходящих к требованиям. Судя по всему нужно переносить проверки немного в другое место и не давать обнулять инст, а всего лишь создавать новый инст для остальных.
В текущем патче для не подходящих к требованиям игроков создается отдельный инст каждому
Жду поддержки

Последний раз редактировалось Insider42; 06.05.2010 в 19:37.
Insider42 вне форума   Ответить с цитированием
Старый 06.05.2010, 20:08   #8
wk23
Пользователь
 
Регистрация: 11.03.2010
Адрес: Спб
Сообщений: 35
Сказал(а) спасибо: 5
Поблагодарили 10 раз(а) в 8 сообщениях
wk23 На верном пути
По умолчанию

попавшие в нормальный режим остаются в той же группе или групплидером становится первый вошедший в игру и образуется новая группа??
wk23 вне форума   Ответить с цитированием
Старый 06.05.2010, 20:11   #9
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от wk23 Посмотреть сообщение
попавшие в нормальный режим остаются в той же группе или групплидером становится первый вошедший в игру и образуется новая группа??
Попавшие в нормальный режим остаются в той же группе, но они в старом инсте, остальные же получают новый инст.
По крайней мере так должно быть, в моем патче немного иначе вышло... подругому немогу додумать, я думаю запас моих идей иссяк, нужна помощь "извне"
Insider42 вне форума   Ответить с цитированием
Старый 20.05.2010, 11:08   #10
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Мне кажется, подход не правильный. Надо разобраться, почему, когда игрок уже в инсте, он может оказаться в другой сложности если лидер ее сменит. У него есть временный или перманентный бинд, следовательно после выхода из игры и входа снова он должен оказаться в этой же копии инста. И не надо будет лепить лишние проверки, достаточно будет одной проверки при входе в инст, которая уже имеется.
zergtmn вне форума   Ответить с цитированием
Старый 20.05.2010, 13:45   #11
zhenya
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 85
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 17 сообщениях
zhenya Скоро придёт к известности
По умолчанию

if (!pl->IsMeetZoneRequirement(at->target_mapId))
bool Player::IsMeetZoneRequirement(AreaTrigger const* at)
судя по функции IsMeetZoneRequirement() должен передаватся at

т.е.
if (!pl->IsMeetZoneRequirement(at))
и
bool Player::IsMeetZoneRequirement(const AreaTrigger at)
zhenya вне форума   Ответить с цитированием
Старый 20.05.2010, 14:29   #12
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Мне кажется, подход не правильный. Надо разобраться, почему, когда игрок уже в инсте, он может оказаться в другой сложности если лидер ее сменит. У него есть временный или перманентный бинд, следовательно после выхода из игры и входа снова он должен оказаться в этой же копии инста. И не надо будет лепить лишние проверки, достаточно будет одной проверки при входе в инст, которая уже имеется.
Но мы же делаем близзлайк, я уже и так максимально выбил информации со своих знакомых с оффа в этой теме всё описано, попытки исправлениея тоже... но опять же это только попытки
Insider42 вне форума   Ответить с цитированием
Старый 20.05.2010, 14:39   #13
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Цитата:
Сообщение от Insider42 Посмотреть сообщение
Но мы же делаем близзлайк, я уже и так максимально выбил информации со своих знакомых с оффа в этой теме всё описано, попытки исправлениея тоже... но опять же это только попытки
Вы утверждаете, что близзлайк это любой игрок может логнутся в инсте, другой сменит сложность и 1-й после входа в игру окажется в инсте с другой сложностью?

Последний раз редактировалось zergtmn; 20.05.2010 в 14:45.
zergtmn вне форума   Ответить с цитированием
Старый 20.05.2010, 14:47   #14
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
Вы утверждаете, что близзлайк это любой игрок может логнутся в инсте, другой сменит сложность и 1-й после входа в игру окажется в инсте с другой сложностью?
да, он окажется там если подходит требованиям инста, ПРИЧЕМ старый инст не удаляется видимо некоторое время, для того чтобы игрок не подходящий требованиям мог зайти в игру и появится точно в той же копии инста где был, естественно на старой сложности.
Insider42 вне форума   Ответить с цитированием
Старый 20.05.2010, 14:52   #15
zergtmn
MaNGOS Dev
 
Аватар для zergtmn
 
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
zergtmn Обладатель прекрасной аурыzergtmn Обладатель прекрасной ауры
По умолчанию

Цитата:
Сообщение от Insider42 Посмотреть сообщение
да, он окажется там если подходит требованиям инста, ПРИЧЕМ старый инст не удаляется видимо некоторое время, для того чтобы игрок не подходящий требованиям мог зайти в игру и появится точно в той же копии инста где был, естественно на старой сложности.
А если в инсте есть двери, которые открываются только после убийства боссов? Прошел на обычном режиме все двери, дошел до нужного босса, поставил героик - профит
zergtmn вне форума   Ответить с цитированием
Старый 20.05.2010, 14:55   #16
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от zergtmn Посмотреть сообщение
А если в инсте есть двери, которые открываются только после убийства боссов? Прошел на обычном режиме все двери, дошел до нужного босса, поставил героик - профит
Этот случай конечно не учтен, я спрошу по возможности. Но я подозреваю что у близов сохраняются какие-то данные открытым дверям и возможно после перезахода такое не прокатит. А вообще, ещё давно помню говорили, что после такого перезахода игрок появляется внутри инста на входе.
Insider42 вне форума   Ответить с цитированием
Старый 20.05.2010, 14:57   #17
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Вообще-то "на лету" сложность меняется только с героического на нормальный и обратно (НЕ 10 и 25) и только в ЦЛК.
LordJZ вне форума   Ответить с цитированием
Старый 20.05.2010, 16:57   #18
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
Вообще-то "на лету" сложность меняется только с героического на нормальный и обратно (НЕ 10 и 25) и только в ЦЛК.
А мне рассказывал оффер, что проверял в АМК (Аметистовая крепость, она же Violet Hold). 2 игрока - один 78 лвл, другой 80. Заходит 78й внутрь, логается, 80к меняет сложность на гер. 78й заходит в игру и всё равно остается на норме, когда 80к забегает в инст и оказывается на гере.
Insider42 вне форума   Ответить с цитированием
Старый 20.05.2010, 18:33   #19
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Ну я имею ввиду без логаутов и прочих хитростей...
LordJZ вне форума   Ответить с цитированием
Старый 20.05.2010, 18:38   #20
Insider42
Ученый
 
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
Insider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранитаInsider42 Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от LordJZ Посмотреть сообщение
Ну я имею ввиду без логаутов и прочих хитростей...
Это да, я уже выкладывал патч (автора не помню) выше на это дело. Если в инсте игроки онлайн - сложность переключать нельзя. Насчёт ЦЛК не знал, хотя я не могу представить как такое вообще возможно :/
Insider42 вне форума   Ответить с цитированием
Старый 20.05.2010, 20:51   #21
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Очень просто, идет по ЦЛК рейд, доходит до какого-то босса, переключает уровень сложности на героик, убивает его. Доходит до следующего, более сложного, босса, переключает режим на нормал и убивает этого босса.

Так, например, частенько делают с кораблями (3-й "босс"), т.к. битва та достаточно банальна, хотя и несет в себе частичку уникальности.
LordJZ вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Краш в Map.h PSZ Баг-репорты 2 01.09.2011 12:39
Краш на выгрузке xex Баг-репорты 18 03.05.2011 11:53
Краш в ObjectGridLoader.cpp Most Баг-репорты 0 01.12.2010 17:47
краш lovepsone Баг-репорты 47 09.08.2010 03:25
Краш xmolex Баг-репорты 2 04.05.2010 18:37


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot