//处理鼠标输入 public void ProcessInput_Mouse() { CInputSystem input = CInputSystem.Instance; bool bLBtnClick = input.IsLeftMouseClick(); bool bRBtnClick = input.IsRightMouseClick(); //----------------------------------------------------------- //鼠标碰撞上的物体 Vector3 fvMouseHitPlan = Vector3.zero; CObject pSelectObj = CObjectManager.Instance.GetMouseOverObject(input.GetMousePos(), out fvMouseHitPlan); //鼠标是否在ui上空 bool bInUIHover = s_pUISystem != null && s_pUISystem.IsMouseHover() && input.InputCapture != InputCapture.ICS_GAME; //----------------------------------------------------------- //如果左右键都没有按下,计算鼠标命令 ENUM_CURSOR_TYPE LastCursor = ENUM_CURSOR_TYPE.CURSOR_WINBASE; MOUSE_CMD_TYPE mouseType = MOUSE_CMD_TYPE.MCT_NULL; if (!bLBtnClick && !bRBtnClick) { CursorMng.Instance.MouseCommand_Set(bInUIHover, pSelectObj, fvMouseHitPlan, CActionSystem.Instance.GetDefaultAction()); //设置光标类型 SCommand_Mouse cmd = CursorMng.Instance.MouseCommand_GetLeft(); if (bInUIHover) { // 如果在UI上,且没有处于拖拽状态时,默认显示普通鼠标 [2/15/2012 Ivan] if (CursorMng.Instance.m_hUICursor == null) { if (s_pUISystem.CurrHyperlink != null) { CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_HYPERLINK_HOVER); } else { CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_NORMAL); } } } else { LastCursor = CursorMng.Instance.GetCursor(); mouseType = cmd.m_typeMouse; switch (cmd.m_typeMouse) { case MOUSE_CMD_TYPE.MCT_PLAYER_MOVETO: //移动 CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_NORMAL); break; case MOUSE_CMD_TYPE.MCT_PLAYER_SELECT: //选择目标 CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_NORMAL); break; case MOUSE_CMD_TYPE.MCT_SKILL_OBJ: //目标攻击 CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_ATTACK); break; case MOUSE_CMD_TYPE.MCT_SKILL_AREA: //区域攻击 CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_ATTACK); break; case MOUSE_CMD_TYPE.MCT_SKILL_DIR: //方向型技能 CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_ATTACK); break; case MOUSE_CMD_TYPE.MCT_HIT_TRIPPEROBJ: //TripperObj CTripperObject pTripperObj = (CTripperObject)CObjectManager.Instance.FindServerObject(cmd.GetValue <int>(0)); if (pTripperObj != null) { CursorMng.Instance.SetCursor(pTripperObj.Tripper_GetCursor()); } else { CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_NORMAL); } break; case MOUSE_CMD_TYPE.MCT_SPEAK: //对话 CursorMng.Instance.SetCursor(ENUM_CURSOR_TYPE.CURSOR_SPEAK); break; } //显示/隐藏技能范围指示器 if (MOUSE_CMD_TYPE.MCT_SKILL_AREA == cmd.m_typeMouse || (MOUSE_CMD_TYPE.MCT_USE_ITEM == cmd.m_typeMouse && cmd.GetValue <bool>(4))) { if (m_pSkillArea == null) { m_pSkillArea = (CObject_ProjTex_AuraDure)CObjectManager.Instance.NewProjTexAuraDure(-1); m_pSkillArea.Initial(null); } m_pSkillArea.SetShowEnable(true); m_pSkillArea.SetPosition(fvMouseHitPlan); if (MOUSE_CMD_TYPE.MCT_SKILL_AREA == cmd.m_typeMouse) { m_pSkillArea.SetRingRange(cmd.GetValue <float>(5)); } } else if (m_pSkillArea != null && m_pSkillArea.GetShowEnable()) { m_pSkillArea.SetShowEnable(false); } } } //----------------------------------------------------------- //分析事件队列 if (input.IsLeftMouseClick()) { //激活鼠标命令 // if(s_pUISystem && s_pUISystem->IsDragFlag()) // { // s_pUISystem->ChangeDragFlag(false); // } // else if (m_bCameraDraging) // { // //显示鼠标 // CCursorMng::GetMe()->ShowCursor(true); // s_pInputSystem->SetCapture(ICS_NONE); // } // else { if (CursorMng.Instance.MouseCommand_GetLeft().m_typeMouse == MOUSE_CMD_TYPE.MCT_PLAYER_MOVETO) { AutoReleaseSkill.Instance.SetTargetObject(-1); s_pGameInterface.StopAutoHit(); } CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetLeft()); } } else if (input.IsRightMouseClick()) { CursorMng.Instance.MouseCommand_Active(CursorMng.Instance.MouseCommand_GetRight()); } //鼠标滚轮操作 float scrollWheel = input.GetAxis("Mouse ScrollWheel"); GFX.SceneCamera.Instance.setScrollWheel(scrollWheel); if (input.isMouseRightHold() && !bInUIHover)//摄像机旋转操作 { float mouseHorMove = input.GetAxis("Mouse X"); if (Mathf.Abs(mouseHorMove) > 0.0001) { GFX.SceneCamera.Instance.AddDirection(mouseHorMove); } } //----------------------------------------------------------- // 显示鼠标 if (CursorMng.Instance.GetCursor() != LastCursor) { CursorMng.Instance.OnSetCursor(); } }
//激活鼠标命令 public void MouseCommand_Active(SCommand_Mouse cmd) { CObject_PlayerMySelf mySelf = CObjectManager.Instance.getPlayerMySelf(); if (mySelf == null) { return; } switch (cmd.m_typeMouse) { case MOUSE_CMD_TYPE.MCT_PLAYER_MOVETO: { if (uPrevMoveTime == 0 || GameProcedure.s_pTimeSystem.GetTimeNow() > uPrevMoveTime + 100) { //CEventSystem::GetMe()->PushEvent(GE_AUTO_RUNING_CHANGE, 0); uPrevMoveTime = GameProcedure.s_pTimeSystem.GetTimeNow(); float x = cmd.GetValue <float>(0); float z = cmd.GetValue <float>(1); Vector3 targeMove = new Vector3(x, 0, z); GameInterface.Instance.Player_MoveTo(targeMove); } } break; case MOUSE_CMD_TYPE.MCT_PLAYER_SELECT: { GameProcedure.s_pGameInterface.Object_SelectAsMainTarget(cmd.GetValue <int>(0) , CObjectManager.DESTROY_MAIN_TARGET_TYPE.DEL_RIGHT_CLICK); if (m_cmdCurrent_Left.m_typeMouse == MOUSE_CMD_TYPE.MCT_SKILL_DIR || m_cmdCurrent_Left.m_typeMouse == MOUSE_CMD_TYPE.MCT_SKILL_AREA) { m_cmdCurrent_Left.m_typeMouse = MOUSE_CMD_TYPE.MCT_NULL; m_cmdCurrent_Left.SetValue(0, 0); m_cmdCurrent_Left.SetValue(1, 0); //恢复激活技能 CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } // AxTrace(0, 0, "Active: SelectPlayer(ID=%d)", (int)cmd.m_afParam[0]); } break; case MOUSE_CMD_TYPE.MCT_SKILL_OBJ: { //首先选择 GameProcedure.s_pGameInterface.Object_SelectAsMainTarget(cmd.GetValue <int>(1) , CObjectManager.DESTROY_MAIN_TARGET_TYPE.DEL_RIGHT_CLICK); tActionItem pItem = cmd.GetValue <tActionItem>(0); if (pItem == null) { break; } //进入攻击 if (pItem.GetType() == ACTION_OPTYPE.AOT_PET_SKILL) { // 先不实现宠物技能 // int nPetSkillID = ((PET_SKILL*)(((CActionItem_PetSkill*)pItem)->GetImpl()))->m_pDefine->m_nID; // CDataPool::GetMe()->Pet_SendUseSkillMessage(nPetSkillID, // INVALID_ID, cmd.m_afParam[1], cmd.m_afParam[2]); } else { tActionItem skill = cmd.GetValue <tActionItem>(0); GameProcedure.s_pGameInterface.Player_UseSkill((CActionItem_Skill)skill, cmd.GetValue <int>(1)); } } break; case MOUSE_CMD_TYPE.MCT_SKILL_AREA: { tActionItem pItem = cmd.GetValue <tActionItem>(0); if (pItem == null) { break; } if (pItem.GetType() == ACTION_OPTYPE.AOT_PET_SKILL) { // int nPetSkillID = ((PET_SKILL*)(((CActionItem_PetSkill*)pItem)->GetImpl()))->m_pDefine->m_nID; // CDataPool::GetMe()->Pet_SendUseSkillMessage(nPetSkillID, // INVALID_ID, cmd.m_afParam[1], cmd.m_afParam[2]); } else { tActionItem skill = cmd.GetValue <tActionItem>(0); Vector3 pos = new Vector3(cmd.GetValue <float>(1), 0, cmd.GetValue <float>(2)); GameProcedure.s_pGameInterface.Player_UseSkill((CActionItem_Skill)skill, pos); } //恢复激活Action CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } break; case MOUSE_CMD_TYPE.MCT_CANCEL_SKILL: { //恢复激活Action CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } break; case MOUSE_CMD_TYPE.MCT_SKILL_DIR: { // 支持方向攻击 [1/25/2011 ivan edit] tActionItem pItem = cmd.GetValue <tActionItem>(0); if (pItem == null) { break; } if (pItem.GetType() == ACTION_OPTYPE.AOT_PET_SKILL) { //TODO } else { tActionItem skill = cmd.GetValue <tActionItem>(0); float dir = cmd.GetValue <float>(1); GameProcedure.s_pGameInterface.Player_UseSkill((CActionItem_Skill)skill, dir); } //恢复激活Action CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } break; case MOUSE_CMD_TYPE.MCT_HIT_TRIPPEROBJ: { GameProcedure.s_pGameInterface.TripperObj_Active(cmd.GetValue <int>(0)); // AxTrace(0, 0, "Active: TripObj(ID=%d)", (int)cmd.m_adwParam[0]); } break; case MOUSE_CMD_TYPE.MCT_SPEAK: { // 当鼠标点击其他的时候自动寻路结束(临时方案,具体等策划案子) [9/1/2011 edit by ZL] CEventSystem.Instance.PushEvent(GAME_EVENT_ID.GE_AUTO_RUNING_CHANGE); int npcId = cmd.GetValue <int>(0); //首先选择 GameInterface.Instance.Object_SelectAsMainTarget(npcId); //谈话 //CGameProcedure::s_pGameInterface->Player_Speak(cmd.m_adwParam[0]); GameInterface.Instance.Player_Speak(npcId); } break; case MOUSE_CMD_TYPE.MCT_CONTEXMENU: { //首先选择 //CGameProcedure::s_pGameInterface->Object_SelectAsMainTarget((INT)cmd.m_adwParam[0], 1); //显示右键菜单 //CGameProcedure::s_pGameInterface->Object_ShowContexMenu(cmd.m_adwParam[0]); } break; case MOUSE_CMD_TYPE.MCT_REPAIR: { //do nothing... } break; case MOUSE_CMD_TYPE.MCT_CANCLE_REPAIR: { //取消修理 CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } break; case MOUSE_CMD_TYPE.MCT_UI_USE_IDENTIFY: { // 使用鉴定卷轴 break; } case MOUSE_CMD_TYPE.MCT_UI_USE_CANCEL_IDENTIFY: { // 取消使用鉴定卷轴 //CDataPool::GetMe()->Identify_UnLock(); break; } case MOUSE_CMD_TYPE.MCT_UI_USE_EXCHANGE: { // if(TRUE == CObjectManager::GetMe()->GetMySelf()->GetCharacterData()->Get_IsInStall()) // { // CEventSystem::GetMe()->PushEvent(GE_INFO_INTERCOURSE,"你正在摆摊……"); // return ; // } // CGameProcedure::s_pGameInterface->Object_SelectAsMainTarget((INT)cmd.m_adwParam[0]); // CObject* pChar = (CObject*) CObjectManager::GetMe()->GetMainTarget(); // if(pChar && g_theKernel.IsKindOf(pChar->GetClass(), GETCLASS(CObject_PlayerOther))) // { // //先判定距离是不是合法 // if(pChar) // { // const fVector3 pMePos = CObjectManager::GetMe()->GetMySelf()->GetPosition(); // const fVector3 pOtherPos = ((CObject*)pChar)->GetPosition(); // // FLOAT fDistance = // TDU_GetDist(fVector2(pMePos.x, pMePos.z), // fVector2(pOtherPos.x, pOtherPos.z)); // // if( EXCHANGE_MAX_DISTANCE < fDistance ) // { // CEventSystem::GetMe()->PushEvent(GE_INFO_INTERCOURSE,"距离太远,启动交易失败"); // return; // } // } // // //不能向已经死亡的玩家发送交易申请 // if ( ((CObject_Character*)pChar)->CharacterLogic_Get() == CObject_Character::CHARACTER_LOGIC_DEAD ) // { // CEventSystem::GetMe()->PushEvent(GE_INFO_INTERCOURSE,"不能向已经死亡的玩家申请交易"); // return ; // } // // CGExchangeApplyI msg; // msg.SetObjID(pChar->GetServerID()); // CNetManager::GetMe()->SendPacket(&msg); // CEventSystem::GetMe()->PushEvent(GE_INFO_INTERCOURSE,"交易请求已经发送"); // CGameProcedure::s_pGameInterface->Skill_CancelAction(); // return ; // } } break; case MOUSE_CMD_TYPE.MCT_UI_USE_CANCEL_EXCHANGE: { CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); break; } case MOUSE_CMD_TYPE.MCT_SALE: break; case MOUSE_CMD_TYPE.MCT_CANCEL_SALE: { CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); break; } case MOUSE_CMD_TYPE.MCT_BUYMULT: break; case MOUSE_CMD_TYPE.MCT_CANCEL_BUYMULT: { CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); break; } case MOUSE_CMD_TYPE.MCT_UI_USE_ADDFRIEND: { //首先选择 // CGRelation Msg; // Msg.GetRelation()->CleanUp(); // Msg.GetRelation()->m_Type = REQ_ADDFRIEND; // REQUEST_ADD_RELATION_WITH_GROUP* pFriend = &(Msg.GetRelation()->m_AddRelationWithGroup); // pFriend->CleanUp(); // CGameProcedure::s_pGameInterface->Object_SelectAsMainTarget((INT)cmd.m_adwParam[0]); // CObject_Character* pCharObj = (CObject_Character*)CObjectManager::GetMe()->GetMainTarget(); // if( pCharObj == NULL ) // break; // if( pCharObj == CObjectManager::GetMe()->GetMySelf() ) // 如果是自己,就不加 // break; // if( g_theKernel.IsKindOf( pCharObj->GetClass(), GETCLASS(CObject_PlayerOther) ) ) // 如果是玩家 // { // ENUM_RELATION sCamp = CGameInterface::GetMe()->GetCampType( // pCharObj, // (CObject*)CObjectManager::GetMe()->GetMySelf() ); // // // 通过PK模式判断是否为敌人 [8/19/2011 edit by ZL] // if (sCamp != RELATION_ENEMY) { // INT tempRelation = CObjectManager::GetMe()->GetMySelf()->GetRelationOther(pCharObj); // if ( tempRelation != -1 ) // sCamp = (ENUM_RELATION)tempRelation; // } // // if( sCamp != RELATION_FRIEND ) // 如果是同一阵营的 // { // CGameProcedure::s_pEventSystem->PushEvent( GE_INFO_INTERCOURSE, "无效目标"); // break; // } // } // else // { // CGameProcedure::s_pEventSystem->PushEvent( GE_INFO_INTERCOURSE, "无效目标"); // break; // } // pFriend->SetTargetName( pCharObj->GetCharacterData()->Get_Name() ); // //需要重写--Ivan // //pFriend->SetGroup( SCRIPT_SANDBOX::Friend::m_nCurTeam ); // pFriend->SetRelationType( RELATION_TYPE_FRIEND ); // CNetManager::GetMe()->SendPacket( &Msg ); } break; case MOUSE_CMD_TYPE.MCT_UI_USE_CANCEL_ADDFRIEND: CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); break; case MOUSE_CMD_TYPE.MCT_USE_ITEM: { //使用物品 // CGameProcedure::s_pGameInterface->PacketItem_UserItem(( // tActionItem*)cmd.m_apParam[0], // cmd.m_adwParam[1], // fVector2(cmd.m_afParam[2], cmd.m_afParam[3])); //恢复激活Action CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } break; case MOUSE_CMD_TYPE.MCT_CANCEL_USE_ITEM: { //恢复激活Action CActionSystem.Instance.SetDefaultAction(CObjectManager.Instance.getPlayerMySelf().GetActiveSkill()); } break; case MOUSE_CMD_TYPE.MCT_LEAP: { //轻功... //SkillID_t id = CObjectManager::GetMe()->GetMySelf()->GetCharacterData()->GetDefaultFlySkillID(); //CObjectManager::GetMe()->GetMySelf()->CharacterLogic_GetAI()->PushCommand_Fly(id, cmd.m_afParam[0], cmd.m_afParam[1]); } break; case MOUSE_CMD_TYPE.MCT_CATCH_PET: { //CGameProcedure::s_pGameInterface->Player_UseSkill( cmd.m_adwParam[0], int( cmd.m_adwParam[1] ) ); } break; case MOUSE_CMD_TYPE.MCT_ENTER_BUS: { // 进入载具 [8/26/2011 ivan edit] //CGameProcedure::s_pGameInterface->Player_EnterSpecialBus(cmd.m_adwParam[0]); } break; case MOUSE_CMD_TYPE.MCT_EXIT_BUS: { // 离开载具 [8/26/2011 ivan edit] //CGameProcedure::s_pGameInterface->Player_ExitSpecialBus(cmd.m_adwParam[0]); } break; case MOUSE_CMD_TYPE.MCT_HyperLink: { HyperItemBase link = cmd.GetValue <HyperItemBase>(0); link.Click(); } break; case MOUSE_CMD_TYPE.MCT_SKILL_NONE: { tActionItem skill = cmd.GetValue <tActionItem>(0); //无目标技能 CActionItem_Skill curSkill = (CActionItem_Skill)skill; if (curSkill != null) { CObjectManager.Instance.getPlayerMySelf().Player_UseSkill(curSkill.GetDefineID()); } } break; case MOUSE_CMD_TYPE.MCT_SKILL_SELF: { tActionItem skill = cmd.GetValue <tActionItem>(0); //无目标技能 CActionItem_Skill curSkill = (CActionItem_Skill)skill; int ServerID = cmd.GetValue <int>(1); //针对自己的技能; if (curSkill != null) { CObjectManager.Instance.getPlayerMySelf().Player_UseSkill(curSkill.GetDefineID(), ServerID); } } break; default: //AxTrace(0, 0, "Active: ERROR!(%d)", cmd.m_typeMouse); break; } }