Pelf

Pelf instance system 1

May 7th, 2012
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.30 KB | None | 0 0
  1. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  2. index 26d5f41..f3d5719 100644
  3. --- a/src/server/game/Entities/Player/Player.cpp
  4. +++ b/src/server/game/Entities/Player/Player.cpp
  5. @@ -18162,13 +18162,47 @@ void Player::SendRaidInfo()
  6.          {
  7.              if (itr->second.perm)
  8.              {
  9. -                InstanceSave *save = itr->second.save;
  10. +                /*InstanceSave *save = itr->second.save;
  11.                  data << uint32(save->GetMapId());           // map id
  12.                  data << uint32(save->GetDifficulty());      // difficulty
  13.                  data << uint64(save->GetInstanceId());      // instance id
  14.                  data << uint8(1);                           // expired = 0
  15.                  data << uint8(0);                           // extended = 1
  16.                  data << uint32(save->GetResetTime() - now); // reset time
  17. +                ++counter;*/
  18. +               InstanceSave *save = itr->second.save;
  19. +                uint32 completedEncounterMask = sInstanceSaveMgr->GetCompletedEncounters(save->GetInstanceId());
  20. +                MapEntry const* mapEntry = sMapStore.LookupEntry(save->GetMapId());
  21. +                Difficulty difficulty = save->GetDifficulty();
  22. +                bool isHeroic = false;
  23. +                if (mapEntry && mapEntry->IsRaid())
  24. +                {
  25. +                    switch (difficulty)
  26. +                    {
  27. +                    case RAID_DIFFICULTY_10MAN_HEROIC:
  28. +                        difficulty = RAID_DIFFICULTY_10MAN_NORMAL;
  29. +                        isHeroic = true;
  30. +                        break;
  31. +                    case RAID_DIFFICULTY_25MAN_HEROIC:
  32. +                        difficulty = RAID_DIFFICULTY_25MAN_NORMAL;
  33. +                        isHeroic = true;
  34. +                        break;
  35. +                    }
  36. +                }
  37. +                // NOTE: not sure about DUNGEON_DIFFICULTY_EPIC
  38. +                //else
  39. +                //{
  40. +                //    if (difficulty == DUNGEON_DIFFICULTY_EPIC)
  41. +                //        difficulty = DUNGEON_DIFFICULTY_NORMAL;
  42. +                //}
  43. +                data << uint32(save->GetMapId());           // map id
  44. +                data << uint32(difficulty);                 // difficulty
  45. +                data << uint32(isHeroic);                   // is heroic
  46. +                data << uint64(save->GetInstanceId());      // instance id
  47. +                data << uint8(1);                           // expired = 0
  48. +                data << uint8(0);                           // extended = 1
  49. +                data << uint32(save->GetResetTime() - now); // reset time
  50. +                data << uint32(completedEncounterMask);     // completed encounter mask
  51.                  ++counter;
  52.              }
  53.          }
  54. diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
  55. index 5d162e5..cf0e79c 100644
  56. --- a/src/server/game/Globals/ObjectMgr.h
  57. +++ b/src/server/game/Globals/ObjectMgr.h
  58. @@ -854,8 +854,15 @@ class ObjectMgr
  59.          DungeonEncounterList const* GetDungeonEncounterList(uint32 mapId, Difficulty difficulty)
  60.          {
  61.              UNORDERED_MAP<uint32, DungeonEncounterList>::const_iterator itr = mDungeonEncounters.find(MAKE_PAIR32(mapId, difficulty));
  62. -            if (itr != mDungeonEncounters.end())
  63. +           //hack for cataclysm dangeons
  64. +           if (itr != mDungeonEncounters.end())
  65.                  return &itr->second;
  66. +            else
  67. +           {
  68. +               UNORDERED_MAP<uint32, DungeonEncounterList>::const_iterator itr = mDungeonEncounters.find(MAKE_PAIR32(mapId, -1));
  69. +               if (itr != mDungeonEncounters.end())
  70. +                   return &itr->second;
  71. +           }
  72.              return NULL;
  73.          }
  74.  
  75. diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
  76. index 86a33b0..846d89a 100644
  77. --- a/src/server/game/Instances/InstanceSaveMgr.cpp
  78. +++ b/src/server/game/Instances/InstanceSaveMgr.cpp
  79. @@ -265,6 +265,12 @@ void InstanceSaveManager::LoadInstances()
  80.  
  81.      sLog->outString(">> Loaded instances in %u ms", GetMSTimeDiffToNow(oldMSTime));
  82.      sLog->outString();
  83. +
  84. +   oldMSTime = getMSTime();
  85. +    sInstanceSaveMgr->LoadCompletedEncounters();
  86. +
  87. +    sLog->outString(">> Loaded instance completed encounters in %u ms", GetMSTimeDiffToNow(oldMSTime));
  88. +    sLog->outString();
  89.  }
  90.  
  91.  void InstanceSaveManager::LoadResetTimes()
  92. @@ -416,6 +422,30 @@ void InstanceSaveManager::LoadResetTimes()
  93.      }
  94.  }
  95.  
  96. +void InstanceSaveManager::LoadCompletedEncounters()
  97. +{
  98. +    m_completedEncounters.clear();
  99. +
  100. +    QueryResult result = CharacterDatabase.Query("SELECT id, map, difficulty, completedEncounters FROM instance");
  101. +    if (result)
  102. +    {
  103. +        do
  104. +        {
  105. +            Field* fields = result->Fetch();
  106. +
  107. +            uint32 instanceId = fields[0].GetUInt32();
  108. +            uint32 mapid = fields[1].GetUInt16();
  109. +            uint32 difficulty = fields[2].GetUInt8();
  110. +            uint32 completedEncounters = fields[3].GetUInt32();
  111. +
  112. +            InstanceEncounter encounter(mapid, Difficulty(difficulty), completedEncounters);
  113. +
  114. +            m_completedEncounters.insert(InstanceCompletedEncounters::value_type(instanceId, encounter));
  115. +        }
  116. +        while (result->NextRow());
  117. +    }
  118. +}
  119. +
  120.  void InstanceSaveManager::ScheduleReset(bool add, time_t time, InstResetEvent event)
  121.  {
  122.      if (!add)
  123. diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h
  124. index d38f60e..3fba1fb 100644
  125. --- a/src/server/game/Instances/InstanceSaveMgr.h
  126. +++ b/src/server/game/Instances/InstanceSaveMgr.h
  127. @@ -144,6 +144,40 @@ class InstanceSaveManager
  128.          };
  129.          typedef std::multimap<time_t /*resetTime*/, InstResetEvent> ResetTimeQueue;
  130.  
  131. +        struct InstanceEncounter
  132. +        {
  133. +            uint16 mapid;
  134. +            Difficulty difficulty:16;
  135. +            uint32 completedEncounters;
  136. +            InstanceEncounter() : mapid(0), difficulty(DUNGEON_DIFFICULTY_NORMAL), completedEncounters(0) {}
  137. +            InstanceEncounter(uint32 m, Difficulty d, uint32 e) : mapid(m), difficulty(d), completedEncounters(e) {}
  138. +        };
  139. +        typedef std::map<uint32, InstanceEncounter> InstanceCompletedEncounters;
  140. +
  141. +        void LoadCompletedEncounters();
  142. +        uint32 GetCompletedEncounters(uint32 instanceId)
  143. +        {
  144. +            InstanceCompletedEncounters::const_iterator itr = m_completedEncounters.find(instanceId);
  145. +            return itr != m_completedEncounters.end() ? itr->second.completedEncounters : 0;
  146. +        }
  147. +        void SetCompletedEncounters(uint32 instanceId, uint16 mapid, uint32 difficulty, uint32 encounters)
  148. +        {
  149. +            InstanceCompletedEncounters::iterator itr = m_completedEncounters.find(instanceId);
  150. +            if (itr != m_completedEncounters.end())
  151. +                itr->second.completedEncounters = encounters;
  152. +            else
  153. +            {
  154. +                InstanceEncounter encounter(mapid, Difficulty(difficulty), encounters);
  155. +                m_completedEncounters.insert(InstanceCompletedEncounters::value_type(instanceId, encounter));
  156. +            }
  157. +        }
  158. +        void DeleteCompletedEncounters(uint32 instanceId)
  159. +        {
  160. +            InstanceCompletedEncounters::iterator itr = m_completedEncounters.find(instanceId);
  161. +            if (itr != m_completedEncounters.end())
  162. +                m_completedEncounters.erase(itr);
  163. +        }
  164. +
  165.          void LoadInstances();
  166.  
  167.          void LoadResetTimes();
  168. @@ -190,6 +224,7 @@ class InstanceSaveManager
  169.          // fast lookup for reset times (always use existed functions for access/set)
  170.          ResetTimeByMapDifficultyMap m_resetTimeByMapDifficulty;
  171.          ResetTimeQueue m_resetTimeQueue;
  172. +       InstanceCompletedEncounters m_completedEncounters;
  173.  };
  174.  
  175.  #define sInstanceSaveMgr ACE_Singleton<InstanceSaveManager, ACE_Thread_Mutex>::instance()
  176. diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
  177. index ad781dd..c138b07 100644
  178. --- a/src/server/game/Server/Protocol/Opcodes.h
  179. +++ b/src/server/game/Server/Protocol/Opcodes.h
  180. @@ -337,7 +337,7 @@ enum Opcodes
  181.      SMSG_AI_REACTION                                 = 0x031CC, // 4.0.6a 13623
  182.      CMSG_SET_SELECTION                               = 0x06488, // 4.0.6a 13623
  183.      CMSG_EQUIPMENT_SET_DELETE                        = 0x0AEA0, // 4.0.6a 13623
  184. -    CMSG_INSTANCE_LOCK_WARNING_RESPONSE              = 0x0E476, //
  185. +    CMSG_INSTANCE_LOCK_WARNING_RESPONSE              = 0x034C4, // 0x0E476, //
  186.      CMSG_UNUSED2                                     = 0x10058, //
  187.      CMSG_ATTACKSWING                                 = 0x074A8, // 4.0.6a 13623
  188.      CMSG_ATTACKSTOP                                  = 0x062C4, // 4.0.6a 13623
  189. @@ -345,7 +345,7 @@ enum Opcodes
  190.      SMSG_ATTACKSTOP                                  = 0x06DCC, // 4.0.6a 13623
  191.      SMSG_ATTACKSWING_NOTINRANGE                      = 0x036C4, // 4.0.6a 13623
  192.      SMSG_ATTACKSWING_BADFACING                       = 0x067A8, // 4.0.6a 13623
  193. -    SMSG_INSTANCE_LOCK_WARNING_QUERY                 = 0x0B574, //
  194. +    SMSG_INSTANCE_LOCK_WARNING_QUERY                 = 0x07488,  // 0x0B574, //
  195.      SMSG_ATTACKSWING_DEADTARGET                      = 0x0A7C4, // 4.0.6a 13623
  196.      SMSG_ATTACKSWING_CANT_ATTACK                     = 0x06188, // 4.0.6a 13623
  197.      SMSG_ATTACKERSTATEUPDATE                         = 0x0BBC0, // 4.0.6a 13623
  198. @@ -718,7 +718,7 @@ enum Opcodes
  199.      CMSG_MOVE_SPLINE_DONE                            = 0x069E8, // 4.0.6a 13623
  200.      CMSG_MOVE_FALL_RESET                             = 0x100E6, //
  201.      SMSG_INSTANCE_SAVE_CREATED                       = 0x0BBC4, // 4.0.6a 13623
  202. -    SMSG_RAID_INSTANCE_INFO                          = 0x100E7, // 4.0.6a 13623
  203. +    SMSG_RAID_INSTANCE_INFO                          = 0x0A18C,  // 0x100E7, // 4.0.6a 13623
  204.      CMSG_REQUEST_RAID_INFO                           = 0x03DE4, // 4.0.6a 13623
  205.      CMSG_MOVE_TIME_SKIPPED                           = 0x0E180, // 4.0.6a 13623
  206.      CMSG_MOVE_FEATHER_FALL_ACK                       = 0x06EA8, // 4.0.6a 13623
  207. @@ -835,7 +835,7 @@ enum Opcodes
  208.      SMSG_CHARACTER_PROFILE                           = 0x1012D, //
  209.      SMSG_CHARACTER_PROFILE_REALM_CONNECTED           = 0x1012E, //
  210.      SMSG_DEFENSE_MESSAGE                             = 0x065EC, // 4.0.6a 13623
  211. -    SMSG_INSTANCE_DIFFICULTY                         = 0x0A55E, //
  212. +    SMSG_INSTANCE_DIFFICULTY                         = 0x0FFE4, // 0x0A55E, //
  213.      MSG_GM_RESETINSTANCELIMIT                        = 0x1012F, //
  214.      SMSG_MOTD                                        = 0x077C0, // 4.0.6a 13623
  215.      SMSG_MOVE_SET_FLIGHT                             = 0x0C57F, //
  216. @@ -866,7 +866,7 @@ enum Opcodes
  217.      CMSG_BATTLEMASTER_JOIN_ARENA                     = 0x00311, // 4.0.6a 13623
  218.      MSG_MOVE_START_ASCEND                            = 0x0BDC0, // 4.0.6a 13623
  219.      MSG_MOVE_STOP_ASCEND                             = 0x0FCA8, // 4.0.6a 13623
  220. -    SMSG_ARENA_TEAM_STATS                            = 0x09F5F, //
  221. +    SMSG_ARENA_TEAM_STATS                            = 0x0FA80,  // 0x09F5F, //
  222.      CMSG_LFG_JOIN                                    = 0x063C0, // 4.0.6a 13623
  223.      CMSG_LFG_LEAVE                                   = 0x03688, // 4.0.6a 13623
  224.      CMSG_SEARCH_LFG_JOIN                             = 0x061CC, // 4.0.6a 13623
Advertisement
Add Comment
Please, Sign In to add comment