阅读:3330回复:7
【源码编辑】阻止崩溃包
本帖最后由 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; } 然后重新编译源码,并不是所有的崩溃都可以避免,这里只是避免部分错误导致的崩溃。导致服务端的崩溃的可能性很多,还有模型导致的崩溃,还有技能,物品等等,太多了。 |
|
100% |
沙发#
发布于:2011-12-10 21:46
|
|
板凳#
发布于:2011-12-10 23:14
erefsd
|
|
地板#
发布于:2011-12-10 23:14
dfsadfdsffsd
|
|
4楼#
发布于:2011-12-10 23:15
fsdfsd
|
|
5楼#
发布于:2011-12-15 21:21
|
|
6楼#
发布于:2012-01-24 01:39
暈~"~
怎麼找到不DPServer.cpp這檔案呀 |
|
7楼#
发布于:2012-02-17 07:01
|
|