📄 handler_cg_sync.cpp
字号:
// 备秦柳 弥辆 规氢栏肺 10m 捞悼
wvFinalDir = wvFinalDir * 10.0f;
// 弥辆 格利瘤 谅钎啊 蜡瓤茄瘤 眉农
WzVector vDestPos = pRecvMsg->wvCurPos + wvFinalDir;
if( !_finite(vDestPos.x) || !_finite(vDestPos.y) || !_finite(vDestPos.z) )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_SYNC::OnCG_SYNC_KBMOVE_SYN] DestPos is Invalid! x[%f] y[%f] z[%f]", vDestPos.x, vDestPos.y, vDestPos.z );
SendMoveNakMsg( pPlayer, RC::RC_SYNC_DEST_POSITION_IS_INVALID );
return;
}
// 加档 搬沥
if( pRecvMsg->m_byMoveState & KEYBOARDMOVE_FOWARD )
{
pPlayer->SetMoveState( CMS_RUN );
}
else if( pRecvMsg->m_byMoveState & KEYBOARDMOVE_BACKWARD )
{
pPlayer->SetMoveState( CMS_BACKSTEP );
}
else
{
pPlayer->SetMoveState( CMS_SIDESTEP );
}
pField->FindPathThrust( pPlayer, &wvFinalDir );
if( !pPlayer->IsMoving() )
{
// printf( "努扼捞攫飘 ID:%d 啊 焊辰 虐焊靛 Thrust 角菩", pPlayer->GetObjectKey() );
}
}
// 促弗 敲饭捞绢甸俊霸 宏肺靛 某胶泼
MSG_CG_SYNC_KBMOVE_BRD sendMsg;
sendMsg.m_byCategory = CG_SYNC;
sendMsg.m_byProtocol = CG_SYNC_KBMOVE_BRD;
sendMsg.m_wPlayerKey = (WORD)pPlayer->GetObjectKey();
sendMsg.wvCurPos = pRecvMsg->wvCurPos;
sendMsg.m_wAngle = pRecvMsg->m_wAngle;
sendMsg.m_byMoveState = pRecvMsg->m_byMoveState;
pPlayer->SendPacketAround( &sendMsg, (WORD)sendMsg.GetSize(), FALSE );
}
// 敲饭捞绢 沥瘤
VOID Handler_CG_SYNC::OnCG_SYNC_STOP_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
MSG_CG_SYNC_STOP_SYN *pRecvMsg = (MSG_CG_SYNC_STOP_SYN*)pMsg;
Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
//ASSERT( pPlayer );
if( !pPlayer ) return ; //< 敲饭捞绢 技记捞 谗绢脸阑 锭
// 敲饭捞绢啊 乐绰 鞘靛 器牢磐啊 蜡瓤茄瘤 八荤
Field* pField = pPlayer->GetField();
if( !pField ) return;
WzVector wvPlayerPos, wvChangePos;
pPlayer->GetPos( &wvPlayerPos );
// 泅犁 谅钎啊 蜡瓤茄瘤 眉农
if( !_finite(pRecvMsg->wvCurPos.x) || !_finite(pRecvMsg->wvCurPos.y) || !_finite(pRecvMsg->wvCurPos.z) )
{
wvChangePos = wvPlayerPos;
SUNLOG( eCRITICAL_LOG, "[Handler_CG_SYNC::OnCG_SYNC_STOP_SYN] CurPos is Invalid! x[%f] y[%f] z[%f]", pRecvMsg->wvCurPos.x, pRecvMsg->wvCurPos.y, pRecvMsg->wvCurPos.z );
}
else
{
wvChangePos = pRecvMsg->wvCurPos;
pPlayer->SetPos( &pRecvMsg->wvCurPos );
}
// 菩哦俊 乐绰 捞悼 矫累 困摹啊 泅犁 辑滚啊 啊柳 困摹客 竭蹲嘎霸 促福搁 立加阑 谗绰促.
float fCSDist = Math_VectorLength( wvPlayerPos, wvChangePos );
if( fCSDist >= 5.0f )
{
// 菩哦俊 乐绰 捞悼 矫累 困摹啊 泅犁 辑滚啊 啊柳 困摹客 竭蹲嘎霸 促福搁 立加阑 谗绰促.
// SUNLOG( eFULL_LOG, "[OnCG_SYNC_STOP_SYN] 谅钎啊 5m 捞惑 瞒捞巢: serverPos=%s, clientPos=%s, dist=%fm", ToString(wvPlayerPos).c_str(), ToString(pRecvMsg->wvCurPos).c_str(), fCSDist);
}
pPlayer->StopMoving();
// 促弗 敲饭捞绢甸俊霸 宏肺靛 某胶泼
MSG_CG_SYNC_STOP_BRD sendMsg;
sendMsg.m_byCategory = CG_SYNC;
sendMsg.m_byProtocol = CG_SYNC_STOP_BRD;
sendMsg.dwObjectKey = pPlayer->GetObjectKey();
sendMsg.wvCurPos = wvChangePos;
pPlayer->SendPacketAround( &sendMsg, (WORD)sendMsg.GetSize(), FALSE );
}
VOID Handler_CG_SYNC::OnCG_SYNC_FAST_KBMOVE_SYN( ServerSession * pServerSession, MSG_BASE * pMsg, WORD wSize )
{
MSG_CG_SYNC_FAST_KBMOVE_SYN*pRecvMsg = (MSG_CG_SYNC_FAST_KBMOVE_SYN*)pMsg;
Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
if( !pPlayer ) return ; //< 敲饭捞绢 技记捞 谗绢脸阑 锭
RC::eSYNC_RESULT rcResult = KBMoveCommon( pPlayer, pRecvMsg->m_wvCurPos );
if( rcResult != RC::RC_SYNC_SUCCESS )
{
SendMoveNakMsg( pPlayer, rcResult );
return;
}
// 捞悼惑怕啊 漂荐捞悼(剪措矫, 备福扁) 惑怕啊 嘎绰瘤 眉农
if( pRecvMsg->m_byCmsMoveState < CMS_TUMBLING_FRONT || pRecvMsg->m_byCmsMoveState > CMS_MAX )
{
SUNLOG( eCRITICAL_LOG, "[OnCG_SYNC_FAST_KBMOVE_SYN] Invalid CmsMoveState[%d]!", pRecvMsg->m_byCmsMoveState );
SendMoveNakMsg( pPlayer, RC::RC_SYNC_INVALID_MOVESATE );
return;
}
// 弥辆 规氢阑 备茄促.
WzVector wvFinalDir;
CalcFinalDir( wvFinalDir, pRecvMsg->m_wAngle, TRUE, pRecvMsg->m_byCmsMoveState );
// 加档 搬沥
pPlayer->SetMoveState( (eCHAR_MOVE_STATE)pRecvMsg->m_byCmsMoveState );
float fMoveSpeed = pPlayer->GetMoveStateControl()->GetMoveSpeed();
// 备秦柳 弥辆 规氢栏肺 捞悼芭府 备窍扁
float fMoveDistance = GetMoveTimeAsState( pRecvMsg->m_byCmsMoveState ) * fMoveSpeed;
wvFinalDir = wvFinalDir * fMoveDistance;
// 弥辆 格利瘤 谅钎啊 蜡瓤茄瘤 眉农
if( !_finite(wvFinalDir.x) || !_finite(wvFinalDir.y) || !_finite(wvFinalDir.z) )
{
SUNLOG( eCRITICAL_LOG, "[OnCG_SYNC_FAST_KBMOVE_SYN] DestPos is Invalid! x[%f] y[%f] z[%f]", wvFinalDir.x, wvFinalDir.y, wvFinalDir.z );
SendMoveNakMsg( pPlayer, RC::RC_SYNC_DEST_POSITION_IS_INVALID );
return;
}
if( !pPlayer->GetField()->FindPathThrust( pPlayer, &wvFinalDir ) )
{
SUNLOG( eMIDDLE_LOG, "[OnCG_SYNC_FAST_KBMOVE_SYN] FindPathThrust Fail!" );
}
// 促弗 敲饭捞绢甸俊霸 宏肺靛 某胶泼
MSG_CG_SYNC_FAST_KBMOVE_BRD brdMsg;
brdMsg.m_wPlayerKey = (WORD)pPlayer->GetObjectKey();
brdMsg.m_wvCurPos = pRecvMsg->m_wvCurPos;
brdMsg.m_wAngle = pRecvMsg->m_wAngle;
brdMsg.m_byCmsMoveState = pRecvMsg->m_byCmsMoveState;
pPlayer->SendPacketAround( &brdMsg, sizeof(brdMsg), FALSE );
}
RC::eSYNC_RESULT Handler_CG_SYNC::KBMoveCommon( Player *pPlayer, WzVector &wvCurPos )
{
// 敲饭捞绢啊 乐绰 鞘靛 器牢磐啊 蜡瓤茄瘤 八荤
Field* pField = pPlayer->GetField();
if( !pField ) return RC::RC_SYNC_FIELD_IS_NULL;
pPlayer->GetStatusManager()->Move();
// 敲饭捞绢啊 混酒乐瘤 臼栏搁 府畔
if( !pPlayer->IsAlive() ) return RC::RC_SYNC_PLAYER_IS_DEAD;
// 捞悼啊瓷茄瘤 眉农
if( !pPlayer->CanMove() ) return RC::RC_SYNC_PLAYER_IS_UNMOVABLE_STATE;
WzVector wvPlayerPos; pPlayer->GetPos( &wvPlayerPos );
// 菩哦俊 乐绰 捞悼 矫累 困摹啊 泅犁 辑滚啊 啊柳 困摹客 竭蹲嘎霸 促福搁 立加阑 谗绰促.
float fCSDist = Math_VectorLength( wvPlayerPos, wvCurPos );
if( fCSDist >= 5.0f )
{
// SUNLOG( eFULL_LOG, "[KBMoveCommon] 谅钎啊 5m 捞惑 瞒捞巢: serverPos=%s, clientPos=%s, dist=%fm", ToString(wvPlayerPos).c_str(), ToString(wvCurPos).c_str(), fCSDist );
}
// 泅犁 谅钎啊 蜡瓤茄瘤 眉农
if( !_finite(wvCurPos.x) || !_finite(wvCurPos.y) || !_finite(wvCurPos.z) )
{
SUNLOG( eCRITICAL_LOG, "[Handler_CG_SYNC::OnCG_SYNC_KBMOVE_SYN] CurPos is Invalid! x[%f] y[%f] z[%f]", wvCurPos.x, wvCurPos.y, wvCurPos.z );
return RC::RC_SYNC_CUR_POSITION_IS_INVALID;
}
// 捞力 努扼捞攫飘啊 焊辰 谅钎甫 瓜绰促.
pPlayer->SetPos( &wvCurPos );
// 捞悼樊 眉农甫 困秦 穿利
if( !pPlayer->GetMovementChecker()->AddMovement( wvCurPos ) )
{
SUNLOG( eCRITICAL_LOG, "[KBMoveCommon] Speed hack! ObjectKey(%d) Name(%s)", pPlayer->GetObjectKey(), pPlayer->GetCharName() );
//pPlayer->ForceDisconnect( SPEED_HACK );
}
return RC::RC_SYNC_SUCCESS;
}
VOID Handler_CG_SYNC::CalcFinalDir( WzVector &vFinalDir, WORD wAngle, BOOL bFastMove, BYTE byMoveState )
{
wAngle = wAngle % 360;
vFinalDir.x = FSIN(wAngle); vFinalDir.y = -FCOS(wAngle); vFinalDir.z = 0.0f;
WzVector wvDir1, wvDir2;
SetVector( &wvDir1, 0.0f, 0.0f, 0.0f ); // 傈饶柳 氦磐
SetVector( &wvDir2, 0.0f, 0.0f, 0.0f ); // 谅快 氦磐
if( bFastMove )
{
if( byMoveState == CMS_TUMBLING_RIGHT )
{
wvDir2.x = vFinalDir.y;
wvDir2.y = -vFinalDir.x;
}
else if( byMoveState == CMS_TUMBLING_LEFT )
{
wvDir2.x = -vFinalDir.y;
wvDir2.y = vFinalDir.x;
}
else if( byMoveState == CMS_TUMBLING_BACK )
{
wvDir1 = -vFinalDir;
}
// 傈柳 剪措矫
else
{
wvDir1 = vFinalDir;
}
}
else
{
// 傈饶柳 氦磐吝 急琶
if( byMoveState & KEYBOARDMOVE_FOWARD )
{
// 傈柳
wvDir1 = vFinalDir;
}
else if( byMoveState & KEYBOARDMOVE_BACKWARD )
{
// 饶柳
wvDir1 = -vFinalDir;
}
// 谅霸吧澜, 快霸吧澜 氦磐吝 急琶
if( byMoveState & KEYBOARDMOVE_RIGHTSTEP )
{
wvDir2.x = vFinalDir.y; // sin(a - 90) = -cos(a) = wvDir.y;
wvDir2.y = -vFinalDir.x; // -cos(a - 90) = -sin(a) = -wvDir.x;
}
else if( byMoveState & KEYBOARDMOVE_LEFTSTEP )
{
wvDir2.x = -vFinalDir.y; // sin(a + 90) = cos(a) = -wvDir.y;
wvDir2.y = vFinalDir.x; // -cos(a + 90) = sin(a) = wvDir.x;
}
}
// 傈饶柳 氦磐客 谅快 氦磐甫 歹茄 氦磐甫 畴钢扼捞令 茄 巴捞 弥辆 规氢
WzVector addVec = wvDir1 + wvDir2;
VectorNormalize( &vFinalDir, &addVec );
}
VOID Handler_CG_SYNC::SendMoveNakMsg( Player * pPlayer, RC::eSYNC_RESULT eErrorCode )
{
MSG_CG_SYNC_MOVE_NAK NakMsg;
pPlayer->GetPos( &NakMsg.m_wvCurPos);
NakMsg.m_byErrorCode = eErrorCode;
pPlayer->SendPacket( &NakMsg, sizeof(NakMsg) );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -