INT CActionItem_Skill::GetDefineID(VOID) { const SCLIENT_SKILL* pSkill = GetSkillImpl(); if(!pSkill) return -1; return pSkill->m_pDefine->m_nID; }
LPCTSTR CActionItem_Skill::GetDesc(VOID) { SCLIENT_SKILL* pSkill = const_cast<SCLIENT_SKILL*>(GetSkillImpl()); if( pSkill ) { //第一次做分析 if(m_strTipArray.size() == 0) { SplitStringLevelOne pSplitL1; pSplitL1.Reset(); pSplitL1.Init( '|', NULL ); pSplitL1.DoSplit( pSkill->GetSkillDesc() ); INT iLineCount = pSplitL1.GetResultLineCount(); m_strTipArray.resize(iLineCount+1); for( INT nID = 0; nID< iLineCount; ++nID ) { m_strTipArray[nID] = pSplitL1.GetResultLine(nID); } } if(pSkill->m_nLevel >0 && m_strTipArray.size() >= pSkill->m_nLevel) { return m_strTipArray[pSkill->m_nLevel-1].c_str(); } return pSkill->GetSkillDesc(); }// return ""; }
INT CActionItem_Skill::GetCooldownTime() { SCLIENT_SKILL* pSkill = const_cast<SCLIENT_SKILL*>(GetSkillImpl()); if( pSkill ) { if( m_nCooldownTime.size() == 0 ) { SplitStringLevelOne pSplitL1; pSplitL1.Reset(); pSplitL1.Init( '|', NULL ); pSplitL1.DoSplit( pSkill->GetSkillData()->m_lpsznCoolDownTime); INT iLineCount = pSplitL1.GetResultLineCount(); m_nCooldownTime.resize(iLineCount+1); for( INT nID = 0; nID< iLineCount; ++nID ) { m_nCooldownTime[nID] = atoi( pSplitL1.GetResultLine(nID) ); } } if(pSkill->m_nLevel >0 && m_nCooldownTime.size() >= pSkill->m_nLevel) { return m_nCooldownTime[pSkill->m_nLevel-1]; } if (pSkill->m_nLevel == 0) { return m_nCooldownTime[0]; } } return 0; }
INT CActionItem_Skill::GetPosIndex(VOID) { const SCLIENT_SKILL* pSkill = GetSkillImpl(); if(!pSkill) return -1; return pSkill->m_nPosIndex; }
LPCTSTR CActionItem_Skill::GetDesc(VOID) { SCLIENT_SKILL* pSkill = const_cast<SCLIENT_SKILL*>(GetSkillImpl()); //if(pSkill) //{ // static CHAR szTemp[MAX_PATH]; // _snprintf(szTemp, MAX_PATH, "%s\n-------\n%s\n%s", // pSkill->m_pDefine->m_lpszName, // pSkill->m_pDefine->m_pszDesc, // pSkill->m_bLeaned ? "已经学会" : "未学会"); // return szTemp; //} //else // return "ERROR";// if(pSkill) { return pSkill->GetSkillDesc(); }// static TCHAR szBuf[32]= {0}; return szBuf; }
BOOL CActionItem_Skill::IsPassiveSkill(VOID) { SCLIENT_SKILL * pSkillDefine =(SCLIENT_SKILL*)GetSkillImpl(); if (pSkillDefine && pSkillDefine->m_pDefine) { return pSkillDefine->m_pDefine->m_nPassiveFlag; } return FALSE; }
BOOL CActionItem_Skill::AutoKeepOn(VOID) { const SCLIENT_SKILL* pSkillImpl = GetSkillImpl(); if(!pSkillImpl) return FALSE; //是否能够能够自动进行 if(pSkillImpl->m_pDefine->m_bAutoRedo) { CGameInterface::GetMe()->Skill_SetActive(this); return TRUE; } return FALSE; }
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; } }