Показать сообщение отдельно
Старый 16.06.2017, 01:45  
g00dw1n
Эксперт
Аватар для g00dw1n
OFFLINE
Регистрация: 30.01.2016
Возраст: 32
Сообщений: 2,265
Благодарностей:
355 всего
Мнения: + 1104
Репутация: 1066
Отправить сообщение для g00dw1n с помощью Skype™

Чтож, ехаем дальше, сегодня речь про дюп-квестов.

Функция:
Код:
CPlayer::Emb_CreateNPCQuest
Когда у нас достигнут лимит по квестам от NPC, то квест добавляется вот в сюды (запоминаем этот финт):
Код:
this->m_QuestMgr.m_pTempHappenEvent
Размер ограничен 3 элементами.

После освобождения места для квеста, мы, как честные граждане РФ, берём этот квест, но мы же помним кто корейцы, да? Поэтому обращаем наш взор на функцию, которая отвечает за диалог, в нашем случае это завершение квеста и получение следующего:
Код:
CPlayer::Emb_CompleteQuest
Где-то внизу функции видим имеем такой псевдокод:
Код:
if ( pNextQuestFld )
      {
        pSlotData = &this->m_Param.m_QuestDB.m_List[(unsigned __int8)byQuestDBSlot];
        pSlotData->byQuestType = Dst.byQuestType;
        pSlotData->wIndex = pNextQuestFld->m_dwIndex;
        pSlotData->dwPassSec = 0;
        for ( k = 0; k < 3; ++k )
        {
          if ( pNextQuestFld->m_ActionNode[k].m_nActType != -1 )
            pSlotData->wNum[k] = 0;
        }
        CUserDB::Update_QuestInsert(this->m_pUserDB, byQuestDBSlot, pSlotData);
        CPlayer::SendMsg_InsertNextQuest(this, byQuestDBSlot, pSlotData);
      }
      for ( l = 0; l < 3; ++l )
      {
        if ( _happen_event_cont::isset(&this->m_QuestMgr.m_pTempHappenEvent[l]) )
        {
          memcpy_0(&this->m_QuestMgr.m_LastHappenEvent, &this->m_QuestMgr.m_pTempHappenEvent[l], 0x18ui64);
          CPlayer::Emb_StartQuest(this, -1, &this->m_QuestMgr.m_pTempHappenEvent[l]);
          if ( this->m_QuestMgr.m_pTempHappenEvent[l].m_QtHpType == 8 )
          {
            CPlayerDB::SetMaxLevel(&this->m_Param, 50);
            if ( this->m_pUserDB )
              CUserDB::Update_MaxLevel(this->m_pUserDB, 50);
          }
          _happen_event_cont::init(&this->m_QuestMgr.m_pTempHappenEvent[l]);
        }
      }
И тут мы вспоминаем про тот финт ушами с
Код:
this->m_QuestMgr.m_pTempHappenEvent
и получается что по завершению квеста нам не только отсыпают следующий квест, но и пытаются выдать квесты которые мы пытались взять, но не шмогли. Ну а поскольку мы граждане порядошные, и имеем место для квестов, то нам их выдают.

Как мне кажется, более правильным будет убрать этот финт из функции
Код:
CPlayer::Emb_CreateNPCQuest
Но можно попробовать сделать вот так:
Код:
if ( pNextQuestFld )
      {
        pSlotData = &this->m_Param.m_QuestDB.m_List[(unsigned __int8)byQuestDBSlot];
        pSlotData->byQuestType = Dst.byQuestType;
        pSlotData->wIndex = pNextQuestFld->m_dwIndex;
        pSlotData->dwPassSec = 0;
        for ( k = 0; k < 3; ++k )
        {
          if ( pNextQuestFld->m_ActionNode[k].m_nActType != -1 )
            pSlotData->wNum[k] = 0;
        }
        CUserDB::Update_QuestInsert(this->m_pUserDB, byQuestDBSlot, pSlotData);
        CPlayer::SendMsg_InsertNextQuest(this, byQuestDBSlot, pSlotData);
      }
      else {
      for ( l = 0; l < 3; ++l )
      {
        if ( _happen_event_cont::isset(&this->m_QuestMgr.m_pTempHappenEvent[l]) )
        {
          memcpy_0(&this->m_QuestMgr.m_LastHappenEvent, &this->m_QuestMgr.m_pTempHappenEvent[l], 0x18ui64);
          CPlayer::Emb_StartQuest(this, -1, &this->m_QuestMgr.m_pTempHappenEvent[l]);
          if ( this->m_QuestMgr.m_pTempHappenEvent[l].m_QtHpType == 8 )
          {
            CPlayerDB::SetMaxLevel(&this->m_Param, 50);
            if ( this->m_pUserDB )
              CUserDB::Update_MaxLevel(this->m_pUserDB, 50);
          }
          _happen_event_cont::init(&this->m_QuestMgr.m_pTempHappenEvent[l]);
        }
      }
      }
COMMIT

Добавлено через 21 час 47 минут
// апдейт к мессаджу выше
Корейцы на столько охуевышие, что не проверяют взят ли квест и это даёт размах для этой темы:
http://www.rf-cheats.ru/forum/showthread.php?t=39081

Фиксить нужно эту функцию:
Код:
CPlayer::Emb_StartQuest
Которая вызывается из:
Код:
CPlayer::Emb_CreateNPCQuest
Добавлено через 22 часа 16 минут
ps: хотя я, фиксил всё в
Код:
CPlayer::Emb_CreateNPCQuest

Последний раз редактировалось g00dw1n; 17.06.2017 в 00:02. Причина: Добавлено сообщение
 
Ответить с цитированием
Сказали спасибо:
stopitsot (24.08.2017), DDDD1 (17.06.2017), arka0228 (16.06.2017)