protected override void OnDead(Avatar attacker) { base.OnDead(attacker); GameEntry.Entity.HideEntity(this, 3f); AICom.OnDead(); }
//public GBuff buff; //通过buff挂载的技能 //public int nSlots; //技能修正槽位 public GSkillInitParam(Avatar pOwner, GTargetInfo targetInfo, DRSkillData pSkillData) { m_pOwner = pOwner; m_TargetInfo = targetInfo; m_pSkillData = pSkillData; }
public virtual void SetOwner(Avatar logicObject) { this.Owner = logicObject; }
public bool CheckNotify(GTriggerNotify pNotify) { if (!m_pOwner || m_pSkillData == null || pNotify == null) { return(false); } Avatar pCaster = GetCaster(); if (!pCaster || !pCaster.SkillCom) { return(false); } if (m_pSkillData.IsTargetSelfOnly()) { m_TargetInfo.m_nTargetID = pCaster.Id; m_TargetInfo.m_vSrcPos = pCaster.GetPos(); m_TargetInfo.m_vTarPos = pCaster.GetPos(); m_TargetInfo.m_vAimDir = pCaster.GetDir(); } else { m_TargetInfo.m_nTargetID = pNotify.m_nTargetID; m_TargetInfo.m_vTarPos = pNotify.m_vTarPos; m_TargetInfo.m_vSrcPos = pNotify.m_vSrcPos; if (pNotify.m_vDir == default(Vector3)) { m_TargetInfo.m_vAimDir = m_TargetInfo.m_vTarPos - m_TargetInfo.m_vSrcPos; } else { m_TargetInfo.m_vAimDir = pNotify.m_vDir; } m_TargetInfo.m_vAimDir.Normalize2D(); } //检查cd与消耗 if (!m_pOwner.CDCom || m_pOwner.CDCom.CheckCD(m_pSkillData.MSV_CDGroup)) { return(false); } if (!pCaster.SkillCom.CheckCost(m_pSkillData)) { return(false); } if (!pNotify.CheckTrigger(pCaster, m_pSkillData)) { return(false); } //if(m_pBuff && m_pBuff->IsInvalid()) // return false; if (!PassiveProcessCheck()) { return(false); } return(true); }
public override List <Avatar> GetTargetList(DRSkillData pSkillData, Avatar pCaster, GTargetInfo sTarInfo, HashSet <int> vExcludeList) { List <Avatar> vTargetList = new List <Avatar>(); if (pSkillData == null || !pCaster) { return(vTargetList); } Avatar pTarget = GameEntry.Entity.GetGameEntity(sTarInfo.m_nTargetID) as Avatar; if (!pTarget) { pTarget = pCaster; } int cnt = GetTargetCount(pSkillData /*, vExcludeList*/); int filter = pSkillData.MSV_AreaFilter; float minDis = pSkillData.MSV_AreaParam1; float maxDis = pSkillData.MSV_AreaParam2; float w = pSkillData.MSV_AreaParam3; List <UnityGameFramework.Runtime.Entity> pList = new List <UnityGameFramework.Runtime.Entity>(); GameEntry.Entity.GetAllLoadedEntities(pList); if (pList == null || pList.Count == 0) { return(vTargetList); } Vector3 pos = /*pSkillData.IsAreaUseTarPos() ? sTarInfo.m_vTarPos :*/ sTarInfo.m_vSrcPos; Vector3 dir = sTarInfo.m_vAimDir; Vector3 center = pos + dir * ((minDis + maxDis) / 2); SRect sRect = new SRect(center, maxDis - minDis, w); foreach (var item in pList) { Avatar actor = item.Logic as Avatar; if (actor == null || actor == pCaster) { continue; } SSphere sTarSphere = new SSphere(actor.GetPos(), actor.ModelRadius); if (GCollider.RectCollideCheck(sRect, sTarSphere, dir)) { TryAddTarget(pSkillData, pCaster, actor, vExcludeList); if (vTargetList.Count >= cnt) { if (filter > 0) { UpdateAreaFilter(filter, cnt, vTargetList); } else { return(vTargetList); } } break; } } return(vTargetList); }
protected override void OnDead(Avatar attacker) { GameEntry.Fsm.DestroyFsm(m_fsm); }
public abstract void TickMove(float fFrameTime, Avatar pCaster);
public abstract List <Avatar> GetTargetList(DRSkillData pSkillData, Avatar pCaster, GTargetInfo sTarInfo, HashSet <int> vExcludeList);
public override void TickMove(float fFrameTime, Avatar pCaster) { }
public virtual bool Init(DRSkillData pSkillData, GTargetInfo sTarInfo, SkillAValueData sSkillAValue, Avatar pCaster) { if (pSkillData == null) { return(false); } m_fCurTime = 0; m_pSkillData = pSkillData; m_TargetInfo = sTarInfo; m_fSpeed = m_pSkillData.MSV_ProjectileSpeed; m_fLifeTime = m_pSkillData.MSV_ProjectileTime; m_fFirstEffectTime = m_pSkillData.MSV_ProjectileFirstEffectTime; m_fEffectTime = m_pSkillData.MSV_EffectTime; m_fCurEffectTime = m_fFirstEffectTime; m_vExcludeList = new GSkillExcludeList(); m_vExcludeList.m_nCount = m_pSkillData.MSV_ProjectileEffectCount; m_vExcludeList.m_bCount = (m_vExcludeList.m_nCount > 0); //int nProjectileOffset = m_pSkillData.MSV_ProjectileOffset; //Vector3 vOffset = GSkillProjectileOffsetManager.Instance.GetProjectileOffset(nProjectileOffset); //m_TargetInfo.m_vSrcPos += vOffset; m_TargetInfo.m_vSrcPos += new Vector3(0, 1, 0); m_SkillAValue = sSkillAValue.CloneData(); m_vPreCheckPos = m_TargetInfo.m_vSrcPos; return(true); }
public void ProcessSkillEffect(DRSkillData pSkillData, GTargetInfo sTarInfo, SkillAValueData AValue, GSkillExcludeList vExcludeList) { if (pSkillData == null) { return; } Avatar pCaster = Owner; if (!pCaster) { return; } int nAreaLogic = pSkillData.MSV_AreaLogic; GSkillAreaLogic pAreaLogic = GSkillLogicManager.Instance.GetAreaLogic(nAreaLogic); if (pAreaLogic == null) { return; } if (nAreaLogic != (int)eSkillAreaLogic.SkillArea_Singleton && !pSkillData.IsAreaIncludeSelf()) { vExcludeList.Add(pCaster.Id); } List <Avatar> vTargetList = pAreaLogic.GetTargetList(pSkillData, pCaster, sTarInfo, vExcludeList); if (vTargetList == null || vTargetList.Count == 0) { return; } ////合并攻击方属性 todo合并技能属性集和模板属性集 //RoleAValue sSkillAValue; //sSkillAValue.Copy(sRoleValue); //sSkillAValue.Combine(pSkillData->m_RoleValue); //RoleAValue sCasterRoleValue; //sCasterRoleValue.Copy(sSkillAValue); //sCasterRoleValue.Combine(pCaster->GetRoleAValue()); //属性合并节点 todo 等技能数据包裹修复后 //if(pSkillData->IsCombineEffectNotify()) //{ // PushTriggerNotifyAValue(pSkillData->m_nDataID, 0, NotifyType_CombineEffect, pSkillData->GetIntValue(MSV_EffectType), &sCasterRoleValue); //} int nEffectLogic = pSkillData.MSV_EffectLogic; GSkillEffect pEffectLogic = GSkillLogicManager.Instance.GetEffectLogic(nEffectLogic); if (pEffectLogic == null) { return; } GTargetInfo tempTarInfo; foreach (var pTarget in vTargetList) { if (pTarget == null) { continue; } if (vExcludeList.Contains(pTarget.Id)) { continue; } PlayerAValueData sCasterRoleValue = pCaster.GetRoleAValue(); PlayerAValueData sTargetRoleValue = pTarget.GetRoleAValue(); if (sCasterRoleValue == null || sCasterRoleValue == null) { continue; } GSkillCalculation sCaluation = new GSkillCalculation(); sCaluation.m_pSkillData = pSkillData; sCaluation.m_pCaster = pCaster; sCaluation.m_pTarget = pTarget; sCaluation.m_CasterAValue = sCasterRoleValue.CloneData(); sCaluation.m_TargetAValue = sTargetRoleValue.CloneData(); sCaluation.m_SkillAValue = AValue; sCaluation.TransfromEffectTarget(); tempTarInfo = sTarInfo; tempTarInfo.m_nTargetID = pTarget.Id; tempTarInfo.m_vTarPos = pTarget.GetPos(); if (pEffectLogic.Process(sCaluation, tempTarInfo, AValue)) { //todo 添加log范围 //pAreaLogic.Draw(pSkillData, pCaster, pTarget, sTarInfo); } //填充重复列表 if (pSkillData.IsAreaAddExclude()) { vExcludeList.Add(pTarget.Id); } //减少效果次数 if (vExcludeList.m_nCount > 0) { --vExcludeList.m_nCount; } } }
public override int AimAssist(DRSkillData pSkillData, Avatar pOwner) { if (pOwner == null) { return(0); } Vector3 vPos = pOwner.GetPos(); Vector3 vDir = GameEntry.CameraMgr.GetCamDir().normalized2d(); float fMinActorWeight = 3600000; int nAvatarID = 0; IEntity[] list = GetEnemyGroup(pOwner.Camp); if (list == null || list.Length == 0) { return(0); } foreach (IEntity item in list) { Avatar actor = GameEntry.Entity.GetGameEntity(item.Id) as Avatar; if (actor == null || actor.IsDead) { continue; } if (AIUtility.GetRelation(pOwner.Camp, actor.Camp) != RelationType.Hostile) { continue; } Vector3 vOffestPos = actor.GetPos() - vPos; vOffestPos.y = 0; float fMagnitude = vOffestPos.magnitude + 0.5f; // 排除最远距离外的目标 if (fMagnitude > GetMaxRange(pSkillData)) { continue; } //计算各个角度的权重 以距离为权重 float fCurActorWeight; float angle = Vector3.Angle(vDir, vOffestPos); if (angle <= 45f) { fCurActorWeight = 9000 + fMagnitude; } else if (angle > 45f && angle < 90f) { fCurActorWeight = 18000 + fMagnitude; } else { fCurActorWeight = 36000 + fMagnitude; } if (fCurActorWeight < fMinActorWeight) { fMinActorWeight = fCurActorWeight; nAvatarID = actor.Id; } } return(nAvatarID != 0 ? nAvatarID : 0); }
public abstract int AimAssist(DRSkillData pSkillData, Avatar pOwner);
public override void OnComponentStart() { m_CurTarget = null; m_TargetList = new List <Avatar>(); m_fTimer = fTickTime; }
public void ResetTarget() { m_CurTarget = null; }