public override ActorRoot SelectTarget(SkillSlot UseSlot)
 {
     return(Singleton <TargetSearcher> .GetInstance().GetLowestHpTarget(UseSlot.Actor.handle, UseSlot.SkillObj.GetMaxSearchDistance(UseSlot.GetSkillLevel()), TargetPriority.TargetPriority_Hero, UseSlot.SkillObj.cfgData.dwSkillTargetFilter, false, true));
 }
        public override VInt3 SelectTargetDir(SkillSlot UseSlot)
        {
            ActorRoot lowestHpTarget = Singleton <TargetSearcher> .GetInstance().GetLowestHpTarget(UseSlot.Actor.handle, UseSlot.SkillObj.GetMaxSearchDistance(UseSlot.GetSkillLevel()), TargetPriority.TargetPriority_Hero, UseSlot.SkillObj.cfgData.dwSkillTargetFilter, false, true);

            if (lowestHpTarget != null)
            {
                VInt3 vInt = lowestHpTarget.location - UseSlot.Actor.handle.location;
                vInt.y = 0;
                return(vInt.NormalizeTo(1000));
            }
            return(UseSlot.Actor.handle.forward);
        }
        public void ChangeSkillSlot(SkillSlotType _slotType, int _skillID, int _orgSkillID = 0)
        {
            int       num       = 0;
            int       num2      = 0;
            SkillSlot skillSlot = null;

            if (this.sourceActor.handle.SkillControl.TryGetSkillSlot(_slotType, out skillSlot))
            {
                int num3 = 0;
                if (_slotType == SkillSlotType.SLOT_SKILL_7)
                {
                    SLevelContext curLvelContext = Singleton <BattleLogic> .instance.GetCurLvelContext();

                    if (curLvelContext != null)
                    {
                        if ((long)this.sourceActor.handle.SkillControl.ornamentFirstSwitchCdEftTime >= (long)Singleton <FrameSynchr> .instance.LogicFrameTick)
                        {
                            num3 = curLvelContext.m_ornamentFirstSwitchCd;
                        }
                        else
                        {
                            num3 = curLvelContext.m_ornamentSwitchCD;
                        }
                        this.sourceActor.handle.SkillControl.ornamentFirstSwitchCdEftTime = 0;
                    }
                }
                else
                {
                    num3 = skillSlot.CurSkillCD;
                }
                int skillLevel = skillSlot.GetSkillLevel();
                if (skillSlot.SkillObj != null)
                {
                    num = skillSlot.SkillObj.SkillID;
                }
                if (skillSlot.PassiveSkillObj != null)
                {
                    num2 = skillSlot.PassiveSkillObj.SkillID;
                }
                if (_orgSkillID != 0 && num != _orgSkillID)
                {
                    return;
                }
                skillSlot.DestoryIndicatePrefab();
                this.sourceActor.handle.SkillControl.InitSkillSlot((int)_slotType, _skillID, num2);
                if (this.sourceActor.handle.SkillControl.TryGetSkillSlot(_slotType, out skillSlot))
                {
                    skillSlot.CurSkillCD = num3;
                    skillSlot.IsCDReady  = (num3 == 0);
                    skillSlot.SetSkillLevel(skillLevel);
                    DefaultSkillEventParam defaultSkillEventParam = new DefaultSkillEventParam(_slotType, 0, this.sourceActor);
                    Singleton <GameSkillEventSys> .GetInstance().SendEvent <DefaultSkillEventParam>(GameSkillEventDef.Event_UpdateSkillUI, this.sourceActor, ref defaultSkillEventParam, GameSkillEventChannel.Channel_HostCtrlActor);

                    if (this.changeSkillSlot[(int)_slotType].changeCount == 0)
                    {
                        this.changeSkillSlot[(int)_slotType].initSkillID        = num;
                        this.changeSkillSlot[(int)_slotType].initPassiveSkillID = num2;
                    }
                    this.changeSkillSlot[(int)_slotType].changeSkillID = _skillID;
                    ChangeSkillSlot[] array = this.changeSkillSlot;
                    array[(int)_slotType].changeCount = array[(int)_slotType].changeCount + 1;
                }
            }
        }
Exemple #4
0
        public override uint SelectSkillTarget(SkillSlot _slot)
        {
            uint               num             = this.lockTargetID;
            SelectEnemyType    selectEnemyType = SelectEnemyType.SelectLowHp;
            Player             ownerPlayer     = ActorHelper.GetOwnerPlayer(ref this.actorPtr);
            SkillSelectControl instance        = Singleton <SkillSelectControl> .GetInstance();

            Skill skill = (_slot.NextSkillObj != null) ? _slot.NextSkillObj : _slot.SkillObj;
            uint  dwSkillTargetFilter = skill.cfgData.dwSkillTargetFilter;

            if (skill.cfgData.bSkillTargetRule == 2)
            {
                num = this.actor.ObjID;
            }
            else if (skill.cfgData.bSkillTargetRule == 5)
            {
                ActorRoot actorRoot = instance.SelectTarget(SkillTargetRule.NextSkillTarget, _slot);
                if (actorRoot != null)
                {
                    num = actorRoot.ObjID;
                    if (this.IsValidLockTargetID(num))
                    {
                        Singleton <NetLockAttackTarget> .GetInstance().SendLockAttackTarget(num);
                    }
                }
            }
            else
            {
                ActorRoot useSkillTargetLockAttackMode = _slot.skillIndicator.GetUseSkillTargetLockAttackMode();
                if (useSkillTargetLockAttackMode != null)
                {
                    if (this.IsValidLockTargetID(useSkillTargetLockAttackMode.ObjID))
                    {
                        num = useSkillTargetLockAttackMode.ObjID;
                        Singleton <NetLockAttackTarget> .GetInstance().SendLockAttackTarget(num);
                    }
                }
                else if (!this.IsValidLockTargetID(this.lockTargetID))
                {
                    if (ownerPlayer != null)
                    {
                        selectEnemyType = ownerPlayer.AttackTargetMode;
                    }
                    int srchR;
                    if (skill.AppointType == SkillRangeAppointType.Target)
                    {
                        srchR = skill.GetMaxSearchDistance(_slot.GetSkillLevel());
                    }
                    else
                    {
                        srchR = skill.cfgData.iMaxAttackDistance;
                    }
                    if (selectEnemyType == SelectEnemyType.SelectLowHp)
                    {
                        num = Singleton <AttackModeTargetSearcher> .GetInstance().SearchLowestHpTarget(ref this.actorPtr, srchR, dwSkillTargetFilter, true, SearchTargetPriority.CommonAttack);
                    }
                    else
                    {
                        num = Singleton <AttackModeTargetSearcher> .GetInstance().SearchNearestTarget(ref this.actorPtr, srchR, dwSkillTargetFilter, true, SearchTargetPriority.CommonAttack);
                    }
                    if (this.IsValidLockTargetID(num))
                    {
                        Singleton <NetLockAttackTarget> .GetInstance().SendLockAttackTarget(num);
                    }
                }
                else if (!this.IsValidSkillTargetID(num, dwSkillTargetFilter))
                {
                    num = 0u;
                }
            }
            return(num);
        }
        private bool UseImpl(PoolObjHandle <ActorRoot> user)
        {
            if (this.skillContext == null || !this.skillContext.TargetActor || this.cfgData == null)
            {
                return(false);
            }
            BuffHolderComponent buffHolderComp = this.skillContext.TargetActor.handle.BuffHolderComp;

            if (buffHolderComp == null)
            {
                return(false);
            }
            if (!this.CheckUseRule(this.skillContext))
            {
                return(false);
            }
            if (!buffHolderComp.overlayRule.CheckOverlay(this))
            {
                return(false);
            }
            bool  flag  = false;
            bool  flag2 = false;
            VInt3 value = VInt3.forward;

            switch (this.skillContext.AppointType)
            {
            case SkillRangeAppointType.Pos:
                flag = true;
                break;

            case SkillRangeAppointType.Directional:
                flag2 = true;
                value = this.skillContext.UseVector;
                if (this.skillContext.TargetID != 0u)
                {
                    PoolObjHandle <ActorRoot> actor = Singleton <GameObjMgr> .GetInstance().GetActor(this.skillContext.TargetID);

                    if (actor)
                    {
                        VInt3 vInt = actor.handle.location - user.handle.location;
                        vInt.y = 0;
                        vInt.Normalize();
                        value = vInt;
                    }
                }
                break;

            case SkillRangeAppointType.Track:
                flag  = true;
                flag2 = true;
                value = this.skillContext.EndVector - this.skillContext.UseVector;
                if (value.sqrMagnitudeLong < 1L)
                {
                    value = VInt3.forward;
                }
                break;
            }
            GameObject gameObject  = this.skillContext.Originator ? this.skillContext.Originator.handle.gameObject : null;
            GameObject gameObject2 = this.skillContext.TargetActor ? this.skillContext.TargetActor.handle.gameObject : null;

            this.curAction = new PoolObjHandle <Action>(ActionManager.Instance.PlayAction(this.ActionName, true, false, new GameObject[]
            {
                gameObject,
                gameObject2
            }));
            if (!this.curAction)
            {
                return(false);
            }
            this.curAction.handle.onActionStop += new ActionStopDelegate(this.OnActionStoped);
            this.curAction.handle.refParams.AddRefParam("SkillObj", this);
            this.curAction.handle.refParams.AddRefParam("SkillContext", this.skillContext);
            this.curAction.handle.refParams.AddRefParam("TargetActor", this.skillContext.TargetActor);
            this.curAction.handle.refParams.SetRefParam("_BulletPos", this.skillContext.EffectPos);
            this.curAction.handle.refParams.SetRefParam("_BulletDir", this.skillContext.EffectDir);
            if (flag)
            {
                this.curAction.handle.refParams.SetRefParam("_TargetPos", this.skillContext.UseVector);
            }
            if (flag2)
            {
                this.curAction.handle.refParams.SetRefParam("_TargetDir", value);
            }
            if (this.cfgData != null)
            {
                int num = this.cfgData.iDuration;
                if (this.cfgData.iDurationGrow > 0)
                {
                    SkillSlotType skillSlotType = this.skillContext.SlotType;
                    int           num2          = (int)(this.cfgData.bGrowthType % 10);
                    int           num3          = (int)(this.cfgData.bGrowthType / 10);
                    if ((skillSlotType >= SkillSlotType.SLOT_SKILL_1 && skillSlotType <= SkillSlotType.SLOT_SKILL_3) || (skillSlotType == SkillSlotType.SLOT_SKILL_0 && num2 > 0))
                    {
                        int num4 = 1;
                        if (this.skillContext.Originator && this.skillContext.Originator.handle.SkillControl != null && this.skillContext.Originator.handle.ValueComponent != null)
                        {
                            SkillSlot skillSlot = null;
                            if (num2 == 1)
                            {
                                num4 = this.skillContext.Originator.handle.ValueComponent.actorSoulLevel;
                            }
                            else
                            {
                                if (num2 - 1 >= 1 && num2 - 1 <= 3)
                                {
                                    skillSlotType = (SkillSlotType)(num2 - 1);
                                }
                                this.skillContext.Originator.handle.SkillControl.TryGetSkillSlot(skillSlotType, out skillSlot);
                                if (skillSlot != null)
                                {
                                    num4 = skillSlot.GetSkillLevel();
                                }
                            }
                        }
                        num4 = ((num4 < 1) ? 1 : num4);
                        num3 = ((num3 < 1) ? 1 : num3);
                        num += (num4 - 1) / num3 * this.cfgData.iDurationGrow;
                    }
                }
                if (this.skillContext.Originator && this.skillContext.Originator.handle != null && this.skillContext.Originator.handle.TheActorMeta.ActorType == ActorTypeDef.Actor_Type_Hero && this.skillContext.Originator.handle.TheStaticData.TheHeroOnlyInfo.AttackDistanceType == 2 && this.cfgData.iLongRangeReduction > 0)
                {
                    num = num * this.cfgData.iLongRangeReduction / 10000;
                }
                this.curAction.handle.ResetLength(num, false);
                if (this.cfgData.bEffectType == 2)
                {
                    this.DealTenacity(this.skillContext.TargetActor);
                }
            }
            bool flag3 = true;

            if (this.cfgData.bShowType != 0 || this.cfgData.bFloatTextID > 0)
            {
                if (!this.skillContext.TargetActor || this.skillContext.TargetActor.handle == null || this.skillContext.TargetActor.handle.BuffHolderComp == null || this.skillContext.TargetActor.handle.BuffHolderComp.SpawnedBuffList == null)
                {
                    return(false);
                }
                for (int i = 0; i < this.skillContext.TargetActor.handle.BuffHolderComp.SpawnedBuffList.get_Count(); i++)
                {
                    BuffSkill buffSkill = this.skillContext.TargetActor.handle.BuffHolderComp.SpawnedBuffList.get_Item(i);
                    if (buffSkill != null && buffSkill.cfgData != null && buffSkill.cfgData.iCfgID == this.cfgData.iCfgID)
                    {
                        flag3 = false;
                        break;
                    }
                }
                if (flag3)
                {
                    SpawnBuffEventParam spawnBuffEventParam = new SpawnBuffEventParam((uint)this.cfgData.bShowType, (uint)this.cfgData.bFloatTextID, this.skillContext.TargetActor);
                    Singleton <GameSkillEventSys> .GetInstance().SendEvent <SpawnBuffEventParam>(GameSkillEventDef.Event_SpawnBuff, this.skillContext.TargetActor, ref spawnBuffEventParam, GameSkillEventChannel.Channel_HostCtrlActor);
                }
            }
            this.skillContext.TargetActor.handle.BuffHolderComp.AddBuff(this);
            if (this.cfgData.bEffectType == 2 && this.cfgData.bShowType != 2)
            {
                LimitMoveEventParam limitMoveEventParam = new LimitMoveEventParam(base.CurAction.handle.length, this.SkillID, this.skillContext.TargetActor);
                Singleton <GameSkillEventSys> .GetInstance().SendEvent <LimitMoveEventParam>(GameSkillEventDef.AllEvent_LimitMove, this.skillContext.TargetActor, ref limitMoveEventParam, GameSkillEventChannel.Channel_AllActor);
            }
            if (this.bAgeImmeExcute)
            {
                this.curAction.handle.UpdateLogic((int)Singleton <FrameSynchr> .GetInstance().FrameDelta);
            }
            return(true);
        }