|
Баг-репорты Описываем проблемы и ошибки работы ядра |
|
Опции темы | Поиск в этой теме | Опции просмотра |
06.05.2010, 16:46 | #1 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
краш с 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); <--------- тута } Игроки описали так, про баг я знаю давно, но не думал что он теперь приводит к падениям :/ 1. Собираем группу хотя бы из двух человек. Возьмем за пример данж Сеттекские Залы. У одного ключ в данж есть (и он лидер группы), у другого нету. Первоначально стоит обычный режим подземелья, не трогаем его пока. 2. Игрок без ключа заходит в данж и жмет ALT+F4 3. Лидер группы меняет сложность подземелья на героик 4. Игрок без ключа заходит в игру и оказывается в героическом режиме (хотя кто первый зашёл - лидер группы или чел без ключа, мне не указали) - *BANG CRASH* Возможные методы исправления: 1) Выпортовывать всех оффлайн игроков ко входу в инстанс при переключении сложности 2) Выпортовывать игроков с "временным" кд ко входу в инстанс при выходе из игры 3) Выпортовывать игроков, которые не соответствуют требованиям инстанса, к его входу при логине. Что-то вроде доп проверки данных таблицы areatrigger_teleport 4) Выпортовывать игроков, которые не соответствуют требованиям инстанса, к его входу при выходе из игры 5) Не позволять переключить сложность инстанса даже если там есть оффлайн члены группы 6) Выпортовывать игроков использующих данный баг ко входу в инст или на кладбище (хаковый) это устаревшая инфа о методах исправления, актуальное в посте №6 Последний раз редактировалось Insider42; 06.05.2010 в 18:48. |
06.05.2010, 16:58 | #2 | |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
|
|
06.05.2010, 17:02 | #3 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
это немного иной баг и он у меня поправлен с помощью одного из патчей, не дающий переключать сложность если есть игроки в инсте.
Вот он (таблетка на ваш баг), автора не помню :/ Код:
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. |
06.05.2010, 17:27 | #4 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Вот ещё один метод исправления, обозначил как №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. |
06.05.2010, 17:44 | #6 | |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Цитата:
В данный момент пытаюсь выцепить кого-нибудь из свой игроков с оффа и узнать какой же из способов указанных в посте №1 темы используется на оффе. Пока подозрения на п5 ДОБАВЛЕНО: Ниоднин из вышеописанных способов не оказался верным. Рассказали игроки оффа: 1) Если в инсте сидят онлайн игроки, а лидер снаружи пытается переключить сложность - сложность не переключается. 2) Если в инсте логнулся не подходящий к требованиям Героик режима игрок, лидер за инстом переключает сложность - при входе того игрока он оказывается в собственной копии инстанса на обычном режиме!!! Причем это "старая" копия. Инст не удалился, а вот для остальных создался новый. Инфа подтверждена двумя игроками с официального сервера. Делом за малым - реализовать. Пункт 1 реализован в посте №3 Пункт 2 буду думать, но для тех кто не хочет ждать - юзайте патч из поста №4 По поводу пункта2: нужно отвязывать игрока от привязки группы в случае несоответствия его к требованиям инста, если же соответствует то пытаться добавить его не в новый инст, а к остальным в групповой. Последний раз редактировалось Insider42; 06.05.2010 в 19:21. |
|
06.05.2010, 18:45 | #7 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
А теперь переходим к основной части этого извращенства. ПОПЫТКА реализации пункта №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. |
06.05.2010, 20:08 | #8 |
Пользователь
Регистрация: 11.03.2010
Адрес: Спб
Сообщений: 35
Сказал(а) спасибо: 5
Поблагодарили 10 раз(а) в 8 сообщениях
|
попавшие в нормальный режим остаются в той же группе или групплидером становится первый вошедший в игру и образуется новая группа??
|
06.05.2010, 20:11 | #9 | |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Цитата:
По крайней мере так должно быть, в моем патче немного иначе вышло... подругому немогу додумать, я думаю запас моих идей иссяк, нужна помощь "извне" |
|
20.05.2010, 11:08 | #10 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Мне кажется, подход не правильный. Надо разобраться, почему, когда игрок уже в инсте, он может оказаться в другой сложности если лидер ее сменит. У него есть временный или перманентный бинд, следовательно после выхода из игры и входа снова он должен оказаться в этой же копии инста. И не надо будет лепить лишние проверки, достаточно будет одной проверки при входе в инст, которая уже имеется.
|
20.05.2010, 13:45 | #11 |
Пользователь
Регистрация: 12.03.2010
Сообщений: 85
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 17 сообщениях
|
if (!pl->IsMeetZoneRequirement(at->target_mapId))
bool Player::IsMeetZoneRequirement(AreaTrigger const* at) судя по функции IsMeetZoneRequirement() должен передаватся at т.е. if (!pl->IsMeetZoneRequirement(at)) и bool Player::IsMeetZoneRequirement(const AreaTrigger at) |
20.05.2010, 14:29 | #12 | |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Цитата:
|
|
20.05.2010, 14:39 | #13 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Вы утверждаете, что близзлайк это любой игрок может логнутся в инсте, другой сменит сложность и 1-й после входа в игру окажется в инсте с другой сложностью?
Последний раз редактировалось zergtmn; 20.05.2010 в 14:45. |
20.05.2010, 14:47 | #14 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
да, он окажется там если подходит требованиям инста, ПРИЧЕМ старый инст не удаляется видимо некоторое время, для того чтобы игрок не подходящий требованиям мог зайти в игру и появится точно в той же копии инста где был, естественно на старой сложности.
|
20.05.2010, 14:52 | #15 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
А если в инсте есть двери, которые открываются только после убийства боссов? Прошел на обычном режиме все двери, дошел до нужного босса, поставил героик - профит
|
20.05.2010, 14:55 | #16 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
Этот случай конечно не учтен, я спрошу по возможности. Но я подозреваю что у близов сохраняются какие-то данные открытым дверям и возможно после перезахода такое не прокатит. А вообще, ещё давно помню говорили, что после такого перезахода игрок появляется внутри инста на входе.
|
20.05.2010, 14:57 | #17 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Вообще-то "на лету" сложность меняется только с героического на нормальный и обратно (НЕ 10 и 25) и только в ЦЛК.
|
20.05.2010, 16:57 | #18 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
А мне рассказывал оффер, что проверял в АМК (Аметистовая крепость, она же Violet Hold). 2 игрока - один 78 лвл, другой 80. Заходит 78й внутрь, логается, 80к меняет сложность на гер. 78й заходит в игру и всё равно остается на норме, когда 80к забегает в инст и оказывается на гере.
|
20.05.2010, 18:33 | #19 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Ну я имею ввиду без логаутов и прочих хитростей...
|
20.05.2010, 18:38 | #20 |
Ученый
Регистрация: 15.03.2010
Сообщений: 261
Сказал(а) спасибо: 84
Поблагодарили 257 раз(а) в 96 сообщениях
|
|
20.05.2010, 20:51 | #21 |
Супер-модератор
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
|
Очень просто, идет по ЦЛК рейд, доходит до какого-то босса, переключает уровень сложности на героик, убивает его. Доходит до следующего, более сложного, босса, переключает режим на нормал и убивает этого босса.
Так, например, частенько делают с кораблями (3-й "босс"), т.к. битва та достаточно банальна, хотя и несет в себе частичку уникальности. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Краш в 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 |