shevechco
4级·生命之泉
4级·生命之泉
  • UID17
  • 注册日期2011-05-19
  • 最后登录2018-03-28
  • 粉丝4
  • 关注0
  • 发帖数308
  • QQ
  • 铜币274枚
  • 威望0点
  • 银元433个
阅读:3330回复:7

【源码编辑】阻止崩溃包

楼主#
更多 发布于:2011-12-10 16:03

本帖最后由 shevechco 于 2011-12-10 16:10 编辑

这个代码的用途是,没有添加的话,出现下列情况,服务端直接崩溃。用了的话最多客户端掉线。
服务端地图崩溃
worldserver/DPServer.cpp
找到
      ar >> dwData >> objid >> nPart;
      if( nPart >= MAX_HUMAN_PARTS )  
             return;
后面添加
      CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
      //Crash packet
      if ( nPart > 30 || dwData < 0 || nPart < -1)   {
                    Error( "CDPSrvr::OnDoUseItem : Crash Try -> [Player ID: %07d], [Player Name: %s], [Packet used: %d,%d,%d]",
                                         pUser->m_idPlayer, pUser->GetName(), dwData, objid, nPart );
             return;
      }
然后注释掉下面一行,像这样
//CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );

贸易崩溃
找到
      ar >> cTab >> nId >> nNum >> dwItemId;
      if( cTab >= MAX_VENDOR_INVENTORY_TAB || nNum < 1 )
             return;
下面添加
      CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
      //CRASH
      if( cTab < 0 || nId < 0 || nNum > 9999 || dwItemId < 0 ) {
             Error( "CDPSrvr::OnBuyItem : Crash Try -> [Player ID: %07d], [Player Name: %s], [Packet used: %d,%d,%d,%d]",
                                         pUser->m_idPlayer, pUser->GetName(), cTab, nId, nNum, dwItemId );
             return;
      }
然后注释掉下面一行,像这样
//CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );

个人身上物品导致的崩溃
找到
             ar >> nPocket1 >> nItem >> nNum >> nPocket2;

             if( nPocket1 == nPocket2 )
                    return;
下面添加
             if( nNum <= 0 ) {
                    Error( "CDPSrvr::OnMoveItemOnPocket : Dupe Try -> [Player ID: %07d], [Player Name: %s], [Packet used: %d,%d,%d,%d]",
                                         pUser->m_idPlayer, pUser->GetName(), nPocket1, nItem, nNum, nPocket2 );
                    return;
             }

             //CRASH
             if( nItem < 0 || nPocket2 > 2 || nPocket1 < -1 || nPocket1 > 52 ) {
                    Error( "CDPSrvr::OnMoveItemOnPocket : Crash Try -> [Player ID: %07d], [Player Name: %s], [Packet used: %d,%d,%d,%d]",
                                         pUser->m_idPlayer, pUser->GetName(), nPocket1, nItem, nNum, nPocket2 );
                    return;
             }
然后重新编译源码,并不是所有的崩溃都可以避免,这里只是避免部分错误导致的崩溃。导致服务端的崩溃的可能性很多,还有模型导致的崩溃,还有技能,物品等等,太多了。
小哥
3级·血之光辉
3级·血之光辉
  • UID153
  • 注册日期2011-06-06
  • 最后登录2016-01-16
  • 粉丝6
  • 关注0
  • 发帖数104
  • QQ
  • 铜币118枚
  • 威望0点
  • 银元255个
沙发#
发布于:2011-12-10 21:46
nimazensa
  • UID116
  • 注册日期2011-05-30
  • 最后登录2011-12-12
  • 粉丝0
  • 关注0
  • 发帖数7
  • QQ
  • 铜币6枚
  • 威望0点
  • 银元0个
板凳#
发布于:2011-12-10 23:14
erefsd
nimazensa
  • UID116
  • 注册日期2011-05-30
  • 最后登录2011-12-12
  • 粉丝0
  • 关注0
  • 发帖数7
  • QQ
  • 铜币6枚
  • 威望0点
  • 银元0个
地板#
发布于:2011-12-10 23:14
dfsadfdsffsd
nimazensa
  • UID116
  • 注册日期2011-05-30
  • 最后登录2011-12-12
  • 粉丝0
  • 关注0
  • 发帖数7
  • QQ
  • 铜币6枚
  • 威望0点
  • 银元0个
4楼#
发布于:2011-12-10 23:15
fsdfsd
keyrita1
1级·灵魂力量
1级·灵魂力量
  • UID20042
  • 注册日期2011-12-15
  • 最后登录2020-07-30
  • 粉丝0
  • 关注0
  • 发帖数40
  • QQ
  • 铜币72枚
  • 威望0点
  • 银元71个
5楼#
发布于:2011-12-15 21:21
         
lp1235268
1级·灵魂力量
1级·灵魂力量
  • UID20175
  • 注册日期2011-12-31
  • 最后登录2018-04-08
  • 粉丝1
  • 关注0
  • 发帖数45
  • QQ
  • 铜币49枚
  • 威望0点
  • 银元106个
6楼#
发布于:2012-01-24 01:39
暈~&quot;~
怎麼找到不DPServer.cpp這檔案呀
工作人员
3级·血之光辉
3级·血之光辉
  • UID20605
  • 注册日期2012-02-16
  • 最后登录2012-02-22
  • 粉丝0
  • 关注0
  • 发帖数41
  • QQ
  • 铜币14枚
  • 威望0点
  • 银元55个
7楼#
发布于:2012-02-17 07:01
游客

返回顶部