VOID StdImpact030_T::OnFadeOut(OWN_IMPACT& rImp, Obj_Character& rMe) const { __ENTER_FUNCTION Obj_Character* pTar=NULL; Scene* pScene = rMe.getScene(); if(NULL==pScene) { AssertEx(FALSE, "[StdImpact030_T::OnFadeOut]: Empty scene pointer found!!"); return; } OBJLIST Targets; if(FALSE==ScanUnitForTarget(rImp, rMe, *(rMe.getWorldPos()), (FLOAT)GetScanRadius(rImp), GetEffectedObjCount(rImp), Targets)) { return; } INT nImpact = GetSubImpactIndex(rImp); if(INVALID_ID==nImpact) { return; } // impacts init finished for(INT nIdx=0; Targets.m_Count>nIdx;++nIdx) { pTar = (Obj_Character*)Targets.m_aObj[nIdx]; if(NULL!=pTar) { pScene->GetEventCore().RegisterBeSkillEvent(pTar->GetID(), rMe.GetID(), BEHAVIOR_TYPE_HOSTILITY, 500); g_ImpactCore.SendImpactToUnit(*pTar, nImpact, rMe.GetID(), 500); } } return; __LEAVE_FUNCTION }
VOID StdImpact059_T::DoHitTarget( OWN_IMPACT& rImp, Obj_Character& rMe, OBJLIST& rTargets, HitFlagsForOBJLIST_T& HitFlagList, UINT& nCount ) const { __ENTER_FUNCTION WORLD_POS const* pPos = rMe.getWorldPos(); //搜索目标列表 if(NULL!=pPos) { ScanUnitForTarget( rImp, rMe, pPos->m_fX, pPos->m_fZ, rTargets ); } SkillID_t nSkillID = rImp.GetSkillID(); ////根据技能ID从全局技能模板管理器中获得技能模板实例 //const SkillTemplateData_T* pSkillTemplate = g_SkillTemplateDataMgr.GetInstanceByID( iID ); HitFlagList.ClearAllFlags(); INT nIdx = 0; for(nIdx=0; rTargets.m_Count>nIdx; ++nIdx) { Obj* pTarget = rTargets.m_aObj[nIdx]; if(NULL!=pTarget) { Obj_Character* pChar = (Obj_Character*)pTarget; //如果命中,则把命中与否的列表置为命中 if(TRUE==HitThisTarget(rMe, *pChar, nSkillID)) { //判断小球投送对象身上是否已经有同类型的效果存在,如果有 if( !IsCanSendToUnit( rImp, rMe, pChar ) ) { continue; } ////记录小球投送的对象 //(Obj_Character*)(m_aBallUniqueID[nIdx].m_pCharacter) = pChar; ////记录小球的全局ID //(UINT)(m_aBallUniqueID[nIdx].m_uUniqueID) = g_ImpactCore.GetUniqueID(); //pChar->Impact_SetImpactUniqueID( m_aBallUniqueID[nIdx].m_uUniqueID ); INT nDataIndex = GetSubImpactDataIndexByIndex(rImp, 0); if(0<nDataIndex) { g_ImpactCore.SendImpactToUnit( *pChar, nDataIndex, rMe.GetID(), nSkillID ); } //g_ImpactCore.SendBallImpactToUnit( *pChar, STD_IMPACT_058, rMe.GetID() ); //Mark this Target Hitted HitFlagList.MarkFlagByIndex(nIdx); ++nCount; } } } __LEAVE_FUNCTION }
VOID DS_EMei014_T::OnFadeOut(OWN_IMPACT& rImp, Obj_Character& rMe) const { __ENTER_FUNCTION Obj_Character* pTar=NULL; OBJLIST Targets; if(FALSE==ScanUnitForTarget(rImp, rMe, *(rMe.getWorldPos()), (FLOAT)GetScanRadius(rImp), GetEffectedObjNumber(rImp), Targets)) { return; } // init impact OWN_IMPACT impact; DI_ModifyRage_T const* pImpactLogic = (DI_ModifyRage_T const*)g_ImpactLogicList.GetLogicById(DI_MODIFY_RAGE); if(NULL==pImpactLogic) { AssertEx(FALSE,"[SOT_EMei014_T::OnFadeOut]:Can't find the logic for DI_MODIFY_RAGE. check now."); return; } pImpactLogic->InitStruct(impact); impact.m_nSkillID = rImp.m_nSkillID; impact.m_nCasterID = rMe.GetID(); impact.m_nImpactID = GetSubImpactID(rImp); INT nRage = GetRageModification(rImp); 0<nRage?nRage=-nRage:NULL; pImpactLogic->SetRageModification(impact, nRage); Scene* pScene = rMe.getScene(); if(NULL==pScene) { AssertEx(FALSE,"[SOT_EMei014_T::OnFadeOut]:Empty Scene pointer. check now."); return; } // impacts init finished for(INT nIdx=0; Targets.m_Count>nIdx;++nIdx) { pTar = (Obj_Character*)Targets.m_aObj[nIdx]; if(NULL==pTar) { continue; } pScene->GetEventCore().RegisterBeSkillEvent(pTar->GetID(), rMe.GetID(), BEHAVIOR_TYPE_HOSTILITY, 500); pScene->GetEventCore().RegisterImpactEvent(pTar->GetID(), rMe.GetID(), impact, 500); } return; __LEAVE_FUNCTION }