关灯
开启左侧

魔兽私服模拟器:防止无限刷副本BUG的修改代码-参考

  [复制链接]
admin实名认证 发表于 2016-4-18 22:34:00 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
Index: MiscHandler.cpp===================================================================
--- MiscHandler.cpp        (revision 573)
+++ MiscHandler.cpp        (working copy)
@@ -1442,12 +1442,35 @@
{
     sLog.outDebug("WORLD: CMSG_RESET_INSTANCES");

-    if(Group *pGroup = _player->GetGroup())
+    Map *map = _player->GetMap();
+    Group *pGroup = _player->GetGroup(); //防止无限刷副本BUG Fiver
+    if(pGroup)
     {
         if(pGroup->IsLeader(_player->GetGUID()))
         {
-            pGroup->ResetInstances(INSTANCE_RESET_ALL, false, _player);
-            pGroup->ResetInstances(INSTANCE_RESET_ALL, true,_player);
+            for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+            { //防止无限刷副本BUG Fiver
+                Player* pGroupGuy = itr->getSource();
+                if(!pGroupGuy)
+                    continue;
+
+                if(!pGroupGuy->IsInMap(pGroupGuy))
+                    break;
+
+                map = pGroupGuy->GetMap();
+                if(map && map->IsRaidOrHeroicDungeon() )
+                {
+                    sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode:MgCore_1: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                    //KickPlayer();
+                                        break;
+                }
+                                else
+                                {
+                                        sLog.outError("Still reset ?? strange_3");
+                    pGroup->ResetInstances(INSTANCE_RESET_ALL, false, _player);
+                    pGroup->ResetInstances(INSTANCE_RESET_ALL, true,_player);
+                                }
+                        }
         }
     }
     else
@@ -1484,14 +1507,37 @@
     if(_player->getLevel() < LEVELREQUIREMENT_HEROIC)
         return;

-    if(Group *pGroup = _player->GetGroup())
+    Group *pGroup = _player->GetGroup(); //防止无限刷副本BUG Fiver
+    if(pGroup)
     {
         if(pGroup->IsLeader(_player->GetGUID()))
         {
-            // the difficulty is set even if the instances can't be reset
-            //_player->SendDungeonDifficulty(true);
-            pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, false, _player);
-            pGroup->SetDungeonDifficulty(Difficulty(mode));
+            for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+            { //防止无限刷副本BUG Fiver
+                Player* pGroupGuy = itr->getSource();
+                if(!pGroupGuy)
+                    continue;
+
+                if(!pGroupGuy->IsInMap(pGroupGuy))
+                    break;
+
+                map = pGroupGuy->GetMap();
+                if(map && map->IsRaidOrHeroicDungeon() )
+                {
+                    sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode:MgCore: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                    //KickPlayer();
+                                        break;
+                }
+                                else if (!map->IsRaidOrHeroicDungeon())
+                                {
+                                        sLog.outError("Still reset ?? strange_2");
+                   // the difficulty is set even if the instances can't be reset
+                   //_player->SendDungeonDifficulty(true);
+                   pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, false, _player);
+                   pGroup->SetDungeonDifficulty(Difficulty(mode));
+                                   break;
+                                }
+            } //防止无限刷副本BUG Fiver           
         }
     }
     else
@@ -1528,14 +1574,38 @@
     if(_player->getLevel() < LEVELREQUIREMENT_HEROIC)
         return;

-    if(Group *pGroup = _player->GetGroup())
+    Group *pGroup = _player->GetGroup();
+    if(pGroup) //防止无限刷副本BUG Fiver
     {
         if(pGroup->IsLeader(_player->GetGUID()))
         {
-            // the difficulty is set even if the instances can't be reset
-            //_player->SendDungeonDifficulty(true);
-            pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, _player);
-            pGroup->SetRaidDifficulty(Difficulty(mode));
+            for(GroupReference *itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
+            { //防止无限刷副本BUG Fiver
+                Player* pGroupGuy = itr->getSource();
+                if(!pGroupGuy)
+                    continue;
+
+                if(!pGroupGuy->IsInMap(pGroupGuy))
+                    break;
+
+                map = pGroupGuy->GetMap();
+                if( map && map->IsRaidOrHeroicDungeon() )
+                {
+                    sLog.outError("WorldSession::HandleSetDungeonDifficultyOpcode::MgCore_2: player %d tried to reset the instance while inside!", _player->GetGUIDLow());
+                    //KickPlayer();
+                                        break;
+                }
+                                else if (!map->IsRaidOrHeroicDungeon())
+                                {
+                    sLog.outError("Still reset ?? straing");
+                   // the difficulty is set even if the instances can't be reset
+                   //_player->SendDungeonDifficulty(true);
+                   pGroup->ResetInstances(INSTANCE_RESET_CHANGE_DIFFICULTY, true, _player);
+                   pGroup->SetRaidDifficulty(Difficulty(mode));
+                                   break;
+                                }
+            } //防止无限刷副本BUG Fiver            
+
         }
     }
     else
@@ -1579,9 +1649,10 @@
     recv_data.read_skip<uint32>();                          // unk

     MovementInfo movementInfo;
+    movementInfo.guid = guid;
     ReadMovementInfo(recv_data, &movementInfo);

-    recv_data.read_skip<uint32>();                          // unk2
+    recv_data.read_skip<float>();                           // unk2

     _player->m_movementInfo.SetMovementFlags(movementInfo.GetMovementFlags());
}
@@ -1621,3 +1692,11 @@
     data << uint32(time(NULL));
     SendPacket(&data);
}
+
+void WorldSession::HandleReadyForAccountDataTimes(WorldPacket& recv_data)
+{
+    // empty opcode
+    sLog.outDebug("WORLD: CMSG_READY_FOR_ACCOUNT_DATA_TIMES");
+
+    SendAccountDataTimes(GLOBAL_CACHE_MASK);
+}

 
VIP介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 最佳新人

    注册账号后积极发帖的会员
  • 活跃会员

    经常参与各类话题的讨论,发帖内容较有主见
  • 热心会员

    经常帮助其他会员答疑
  • 推广达人

    积极宣传本站,为本站带来更多注册会员
  • 宣传达人

    积极宣传本站,为本站带来更多的用户访问量
  • 灌水之王

    经常在论坛发帖,且发帖量较大
  • 突出贡献

    长期对论坛的繁荣而不断努力,或多次提出建设性意见
  • 优秀版主

    活跃且尽责职守的版主
  • 荣誉管理

    曾经为论坛做出突出贡献目前已离职的版主
  • 论坛元老

    为论坛做出突出贡献的会员

0关注

5粉丝

3421帖子

排行榜
作者专栏

QQ交流群&&微信订阅号

QQ交流群

微信订阅号

吾爱尚玩资源基地永久域名:

Www.523Play.Com

在线管理员QQ:1589479632

邮箱:Email@523play.com

QQ交流群:558936238

Copyright   ©2015-2116  吾爱尚玩资源基地|523play.comPowered by©523Pplay.Com技术支持:吾爱尚玩资源基地