ORESULT SCLIENT_SKILL::IsCanUse( INT idUser, INT idTargetObj, FLOAT fTargetX, FLOAT fTargetZ, FLOAT fDir )const { ORESULT oResult; oResult = IsCanUse_Leaned(); // 是否已经学会 if ( OR_FAILED( oResult ) ) return oResult; oResult = IsCanUse_CheckCoolDown(); // 冷却 if ( OR_FAILED( oResult ) ) return oResult; oResult = IsCanUse_CheckDeplete( idUser ); // 其他条件判断 if ( OR_FAILED( oResult ) ) return oResult; oResult = IsCanUse_CheckTarget( idUser, idTargetObj, fTargetX, fTargetZ, fDir ); // 对选择目标进行判断 if ( OR_FAILED( oResult ) ) return oResult; return OR_OK; }
UINT CGIssuePetPlacardHandler::Execute( CGIssuePetPlacard* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; Obj_Monster *pNpc = (Obj_Monster*)(pScene->GetObjManager()->GetObj(pPacket->GetNpcID())); if(pNpc != NULL) { PetPlacardSystem *pPetPlacardSystem = pNpc->GetPetPlacardSystem(); if(pPetPlacardSystem == NULL) { pNpc->CreatePetPlacardSystem(); pPetPlacardSystem = pNpc->GetPetPlacardSystem(); } if(pPetPlacardSystem != NULL) { CHAR* pMessage = pPacket->GetMessage(); BYTE nMessageSize = (BYTE)strlen( pMessage ); if( nMessageSize >= PET_PLACARD_ITEM_MESSAGE_SIZE ) nMessageSize = PET_PLACARD_ITEM_MESSAGE_SIZE-1; pMessage[PET_PLACARD_ITEM_MESSAGE_SIZE-1] = 0; ReplaceIllegalString( pMessage, nMessageSize ); ORESULT oResult = pPetPlacardSystem->IssuePlacard(pHuman, pPacket->GetGUID(), pMessage); if(OR_FAILED(oResult)) { pHuman->SendOperateResultMsg(oResult); } } } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGCharMoodStateHandler::Execute( CGCharMoodState* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer != NULL ) ; if ( pGamePlayer == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoodStateHandler: Error (pGamePlayer == NULL) " ) ; return PACKET_EXE_CONTINUE ; } Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman != NULL ) ; if ( pHuman == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoodStateHandler: Error (pHuman == NULL) " ) ; return PACKET_EXE_CONTINUE ; } Scene* pScene = pHuman->getScene() ; Assert( pScene != NULL ) ; if ( pScene == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoodStateHandler: Error Obj = %d (pScene == NULL) ", pHuman->GetID() ) ; return PACKET_EXE_CONTINUE ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; if ( MyGetCurrentThreadID() != pScene->m_ThreadID ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoodStateHandler: Error Obj = %d (MyGetCurrentThreadID() != pScene->m_ThreadID) ", pHuman->GetID() ) ; return PACKET_EXE_CONTINUE ; } ORESULT oResult = pHuman->GetHumanAI()->PushCommand_MoodState(pPacket->getMoodState()); if ( OR_FAILED( oResult ) ) { pHuman->SendOperateResultMsg(oResult); } g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoodStateHandler: ok obj=%d guid=%X scene=%d", pHuman->GetID(), pHuman->GetGUID(), pScene->SceneID() ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
uint CGStallCloseHandler::Execute( CGStallClose* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer ) ; Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman ) ; Scene* pScene = pHuman->getScene() ; if( pScene==NULL ) { Assert(FALSE) ; return PACKET_EXE_ERROR ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; //验证是否有资格摆摊 if(pHuman->m_StallBox.GetStallStatus() != ServerStallBox::STALL_OPEN) {//丢弃 g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGStallCloseHandler::ObjID=%d, != ServerStallBox::STALL_OPEN" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; } pHuman->m_StallBox.GetBBS()->SaveTitle(); //验证完毕,设置摊位盒 pHuman->m_StallBox.CleanUp(); ORESULT oResult = pHuman->GetHumanAI()->PushCommand_Idle( ); if ( OR_FAILED( oResult ) ) { pHuman->SendOperateResultMsg(oResult); } GCStallClose MsgClose; pGamePlayer->SendPacket(&MsgClose); g_pLog->FastSaveLog( LOG_FILE_1, "CGStallCloseHandler::ObjID=%d" ,pHuman->GetID()) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGCharMoveHandler::Execute( CGCharMove* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; if ( pGamePlayer == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler: Error (pGamePlayer == NULL) " ) ; return PACKET_EXE_CONTINUE ; } Obj_Human* pHuman = pGamePlayer->GetHuman() ; if ( pHuman == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler: Error (pHuman == NULL) " ) ; return PACKET_EXE_CONTINUE ; } Scene* pScene = pHuman->getScene() ; if ( pScene == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler: Error Obj = %d (pScene == NULL) ", pHuman->GetID() ) ; return PACKET_EXE_CONTINUE ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; if ( MyGetCurrentThreadID() != pScene->m_ThreadID ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler: Error Obj = %d (MyGetCurrentThreadID() != pScene->m_ThreadID) ", pHuman->GetID() ) ; return PACKET_EXE_CONTINUE ; } const WORLD_POS* pCur = pHuman->getWorldPos(); WORLD_POS posCur = *pCur; pScene->GetMap()->VerifyPos( &posCur ) ; if(pHuman->m_StallBox.GetStallStatus() == ServerStallBox::STALL_OPEN) {//摆摊中 GCCharMoveResult msgResult; msgResult.setResult(OR_CAN_NOT_MOVE_STALL_OPEN); msgResult.setHandleID(pPacket->getHandleID()); pGamePlayer->SendPacket( &msgResult ) ; g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler::摆摊中") ; return PACKET_EXE_CONTINUE ; } ObjID_t ObjID = pHuman->GetID() ; INT nHandleID = pPacket->getHandleID(); WORLD_POS CurPos = *pHuman->getWorldPos() ; WORD wNumPathNode = (WORD)(pPacket->getNumTargetPos()); WORLD_POS *paTarPos = (WORLD_POS *)pPacket->getTargetPos() ; ORESULT oResult = pHuman->GetHumanAI()->PushCommand_Move( nHandleID, wNumPathNode, paTarPos, TRUE ); if ( OR_FAILED( oResult ) ) { GCCharMoveResult msgResult; msgResult.setResult(oResult); msgResult.setHandleID(pPacket->getHandleID()); if( oResult == OR_CUT_PATHROUTE && wNumPathNode > 0 ) { for(WORD w = 0; w < wNumPathNode; w ++ ) { msgResult.addTargetPos(paTarPos+w); } } else { pHuman->GetHumanAI()->PushCommand_Idle( ) ; pHuman->Teleport( &posCur ) ; } pGamePlayer->SendPacket( &msgResult ) ; } if ( wNumPathNode > 0 ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler::ObjID=%d X=%f Y=%f", ObjID, paTarPos[wNumPathNode-1].m_fX, paTarPos[wNumPathNode-1].m_fZ ) ; } else { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharMoveHandler::ObjID=%d , no target pos", ObjID ) ; } return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
UINT CGCharUseSkillHandler::Execute( CGCharUseSkill* pPacket, Player* pPlayer ) { __ENTER_FUNCTION GamePlayer* pGamePlayer = (GamePlayer*)pPlayer ; Assert( pGamePlayer != NULL ) ; if ( pGamePlayer == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error (pGamePlayer == NULL) " ) ; return PACKET_EXE_CONTINUE ; } Obj_Human* pHuman = pGamePlayer->GetHuman() ; Assert( pHuman != NULL ) ; if ( pHuman == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error (pHuman == NULL) " ) ; return PACKET_EXE_CONTINUE ; } Scene* pScene = pHuman->getScene() ; Assert( pScene != NULL ) ; if ( pScene == NULL ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error Obj = %d (pScene == NULL) ", pHuman->GetID() ) ; return PACKET_EXE_CONTINUE ; } //检查线程执行资源是否正确 Assert( MyGetCurrentThreadID()==pScene->m_ThreadID ) ; if ( MyGetCurrentThreadID() != pScene->m_ThreadID ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: Error Obj = %d (MyGetCurrentThreadID() != pScene->m_ThreadID) ", pHuman->GetID() ) ; return PACKET_EXE_CONTINUE ; } ObjID_t ObjID = pHuman->GetID() ; SkillID_t idSkill = pPacket->getSkillDataID() / 100; BYTE nLevel = pPacket->getSkillDataID() % 100; ObjID_t idTarget = pPacket->getTargetID(); WORLD_POS posTarget = pPacket->getTargetPos() ; FLOAT fDir = pPacket->getDir() ; //now the target guid only use to call of human(拉人去指定位置的操作) GUID_t guidTarget = pPacket->getTargetGUID(); Obj_Character *pTarget = (Obj_Character*)(pScene->GetObjManager()->GetObj(idTarget)); if( pTarget ) { //技能 类型 Skill_Module::SkillTemplateData_T const* pSkillTemplate = g_SkillTemplateDataMgr.GetInstanceByID(idSkill); INT SkillType = pSkillTemplate->GetStandFlag(); if (SkillType > 0) { //相同阵营,可以释放 if( pHuman->IsEnemy( pTarget ) == TRUE ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: %s and %s isn't the same camp! ", pHuman->GetName(), pTarget->GetName() ) ; return PACKET_EXE_CONTINUE; } }else if(SkillType < 0) { // 不同阵营,可以释放 if( pHuman->IsEnemy( pTarget ) == FALSE ) { g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: %s and %s is the same camp! ", pHuman->GetName(), pTarget->GetName() ) ; return PACKET_EXE_CONTINUE; } } } else { //g_pLog->FastSaveLog( LOG_FILE_1, "ERROR: CGCharUseSkillHandler::ObjName=%s, ERR_OWNER_INVALID" // ,pHuman->GetName()) ; //return PACKET_EXE_CONTINUE; } if ( pPacket->getObjID() == pHuman->GetID() ) { ORESULT oResult = pHuman->GetHumanAI()->PushCommand_UseSkill( idSkill, nLevel, idTarget, posTarget.m_fX, posTarget.m_fZ, fDir, guidTarget ); if ( OR_FAILED( oResult ) ) { pHuman->SendOperateResultMsg(oResult); } } else { Obj_Pet *pPet = pHuman->GetPet(); if ( pPet != NULL && pPet->GetID() == pPacket->getObjID() ) { ORESULT oResult = pPet->GetPetAI()->PushCommand_UseSkill( idSkill, idTarget, posTarget.m_fX, posTarget.m_fZ, fDir, guidTarget ); if ( OR_FAILED( oResult ) ) { pHuman->SendOperateResultMsg(oResult); } } } g_pLog->FastSaveLog( LOG_FILE_1, "CGCharUseSkillHandler: S:%d D:%d Skill:%d (%f,%f) DIR = %f", pPacket->getObjID(), pPacket->getTargetID(), idSkill, pPacket->getTargetPos().m_fX, pPacket->getTargetPos().m_fZ, fDir ) ; return PACKET_EXE_CONTINUE ; __LEAVE_FUNCTION return PACKET_EXE_ERROR ; }
VOID CActionItem_Skill::DoAction( VOID ) { // 获取将使用的技能 const SCLIENT_SKILL* pSkill = GetSkillImpl(); if( !pSkill ) return; INT idUser = -1; CObject_PlayerMySelf *pMySelf = CObjectManager::GetMe()->GetMySelf(); if( !pMySelf ) return; idUser = pMySelf->GetID(); // 自动打怪,连续施放的技能 if (TRUE == pSkill->m_pDefine->m_bAutoRedo) { tActionItem* pItem = CGameInterface::GetMe()->Skill_GetActive(); // 有激活技能 if (pItem) { // 当前技能正在激活中 if (pItem->GetID() == GetID()) { // 此次操作为关闭操作 CGameInterface::GetMe()->Skill_SetActive( CActionSystem::GetMe()->GetMyDefaultSkillAtion() ); // 关闭自动打怪 CAI_MySelf* pMySelfAI = (CAI_MySelf*)( pMySelf->CharacterLogic_GetAI() ); if( pMySelfAI ) pMySelfAI->m_bCurrSkill = FALSE; return; } else { // 选中状态 AutoKeepOn(); } } // 没有激活技能 else { // 选中状态 AutoKeepOn(); } } // 单次施放的技能 else { // 瞬发技能不会打断自动技能 if (FALSE == pSkill->m_pDefine->m_nImmediately) { CAI_MySelf* pMySelfAI = (CAI_MySelf*)( pMySelf->CharacterLogic_GetAI() ); if( pMySelfAI ) pMySelfAI->m_bCurrSkill = FALSE; } } // 进行技能使用的条件判断 // 是否学会、冷却时间、消耗 { ORESULT oResult; // 是否已经学会 oResult = pSkill->IsCanUse_Leaned(); if( OR_FAILED( oResult ) ) { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( oResult ) ); return ; } // 检查冷却是否结束 oResult = pSkill->IsCanUse_CheckCoolDown(); if( OR_FAILED( oResult ) ) { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( oResult ) ); return ; } // 消耗检测 oResult = pSkill->IsCanUse_CheckDeplete( idUser ); if( OR_FAILED( oResult ) ) { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( oResult ) ); return ; } } //================ // 根据鼠标选择操作类型 switch( pSkill->m_pDefine->m_nSelectType ) // 此类型从表中读出 { case SELECT_TYPE_NONE: // 无需选择,直接施放(以自己为中心的范围自动攻击) { // id,位置,方向 CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), fVector2(pMySelf->GetPosition().x, pMySelf->GetPosition().z), pMySelf->GetFaceDir()); // 恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; case SELECT_TYPE_CHARACTER: // 选择角色 { // 有无选择主目标 if( CObjectManager::GetMe()->GetMainTarget() ) { // id,目标id CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), CObjectManager::GetMe()->GetMainTarget()->GetServerID()); } else { // 无选择目标提示信息 CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( OR_NO_TARGET ) ); } // 恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; case SELECT_TYPE_POS: // 以鼠标的位置为中心的范围攻击 { // id, //CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), fVector2(pMySelf->GetPosition().x, pMySelf->GetPosition().z), pMySelf->GetFaceDir()); // 恢复激活Action CActionSystem::GetMe()->SetDefaultAction(this); } break; case SELECT_TYPE_DIR: // 方向(扇形) // 人物的方向技能使用 //CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), fVector2(pMySelf->GetPosition().x, pMySelf->GetPosition().z), pMySelf->GetFaceDir()); CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); break; case SELECT_TYPE_SELF: // 对自己进行操作 { CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), CObjectManager::GetMe()->GetMySelf()->GetServerID()); // 恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; case SELECT_TYPE_HUMAN_GUID: // 其他玩家 { // 当前是否已经选择了一个队友 GUID_t guid; CObjectManager::GetMe()->GetMainTarget(guid); if(guid == (GUID_t)-1) { // 尚未选择合法的对象 STRING strTemp = NOCOLORMSGFUNC("GMDP_Struct_Skill_Info_Invalidate_Target"); CEventSystem::GetMe()->PushEvent(GE_NEW_DEBUGMESSAGE, strTemp.c_str()); return; } CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), (GUID_t)guid); // 恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; } }
VOID CActionItem_Skill::DoAction(VOID) { const SCLIENT_SKILL* pSkill = GetSkillImpl(); if(!pSkill) return; ORESULT oResult; // oResult = pSkill->IsCanUse_Leaned(); if ( OR_FAILED( oResult ) ) { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( oResult ) ); return ; } ////检查冷却是否结束 oResult = pSkill->IsCanUse_CheckCoolDown(); if ( OR_FAILED( oResult ) ) { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( oResult ) ); return ; } // 消耗检测 INT idUser; CObject_PlayerMySelf *pMySelf = CObjectManager::GetMe()->GetMySelf( ); idUser = (pMySelf)?(pMySelf->GetID()):(INVALID_ID); oResult = pSkill->IsCanUse_CheckDeplete( idUser ); if ( OR_FAILED( oResult ) ) { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( oResult ) ); return ; } //如果是连续的那么就换为选中状态。 AutoKeepOn(); //根据操作类型 switch(pSkill->m_pDefine->m_nSelectType) { case SELECT_TYPE_NONE: { CGameProcedure::s_pGameInterface->Player_UseSkill(GetID()); //恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; case SELECT_TYPE_CHARACTER: { if(CObjectManager::GetMe()->GetMainTarget()) { CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), CObjectManager::GetMe()->GetMainTarget()->GetServerID()); } else { CGameProcedure::s_pEventSystem->PushEvent( GE_NEW_DEBUGMESSAGE, GetOResultText( OR_NO_TARGET ) ); } //恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; case SELECT_TYPE_POS: CActionSystem::GetMe()->SetDefaultAction(this); // CGameProcedure::s_pGameInterface->Skill_SetActive(this); break; case SELECT_TYPE_DIR: CActionSystem::GetMe()->SetDefaultAction(this); // CGameProcedure::s_pGameInterface->Skill_SetActive(this); break; case SELECT_TYPE_SELF: { CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), CObjectManager::GetMe()->GetMySelf()->GetServerID()); //恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; case SELECT_TYPE_HUMAN_GUID: { //当前是否已经选择了一个队友 GUID_t guid; CObjectManager::GetMe()->GetMainTarget(guid); if(guid == (GUID_t)-1) { //尚未选择合法的对象 CEventSystem::GetMe()->PushEvent(GE_NEW_DEBUGMESSAGE, "无效目标"); return; } CGameProcedure::s_pGameInterface->Player_UseSkill(GetID(), (GUID_t)guid); //恢复激活Action CActionSystem::GetMe()->SetDefaultAction(CGameProcedure::s_pGameInterface->Skill_GetActive()); } break; } }