Пример #1
0
    public void InitFSM()
    {
        CachEntityAnimation();

        m_FSMSystem = new FSMSystem(this);

        MonsterMoveState moveState = new MonsterMoveState();

        m_FSMSystem.AddState(moveState);
        MonsterIdleState idleState = new MonsterIdleState();

        m_FSMSystem.AddState(idleState);
        m_MonsterAttackState = new MonsterAttackState();
        m_FSMSystem.AddState(m_MonsterAttackState);
        m_MonsterBeAttackState = new MonsterBeAttackState();
        m_FSMSystem.AddState(m_MonsterBeAttackState);
        MonsterDieState dieState = new MonsterDieState();

        m_FSMSystem.AddState(dieState);
        MonsterStandState standState = new MonsterStandState();

        m_FSMSystem.AddState(standState);
        m_MonsterBeHitFlyState = new MonsterBeHitFlyState();
        m_FSMSystem.AddState(m_MonsterBeHitFlyState);
        MonsterBeAdsorbState monsterBeAdsorbState = new MonsterBeAdsorbState();

        m_FSMSystem.AddState(monsterBeAdsorbState);
        m_FSMSystem.AddState(new MonsterBeHordeState());

        m_FSMSystem.PerformTransition(Transition.MonsterToIdle);
    }
Пример #2
0
        public Monster(float chaseRadius, float respawnTime, Vector2 position, float rotation, float radius, UnitType type, Entity root) : base(position, rotation, radius, type, Team.Yellow, 0, root)
        {
            AddInheritedType(typeof(Monster));

            spawnPosition    = position;
            spawnRotation    = rotation;
            this.chaseRadius = chaseRadius;
            this.respawnTime = respawnTime;

            state = MonsterAttackState.Idle;

            timer = respawnTime;
        }
Пример #3
0
    private void ImpactTargetMonster(EntityModel monster, EntityModel ownerData, int affectTarget, int srcLevel, int srcHit)
    {
        MonsterBehaviour mBehavior            = (MonsterBehaviour)monster.Behaviour;
        SMsgPropCreateEntity_SC_Monster mData = (SMsgPropCreateEntity_SC_Monster)monster.EntityDataStruct;
        int  destLevel        = mData.MonsterUnitValues.UNIT_FIELD_LEVEL;
        int  destMiss         = mData.MonsterInvisibleValue.UNIT_FIELD_JOOK;
        bool monsterProtected = (mData.MonsterInvisibleValue.UINT_FILED_PROTECTED == 1);

        CampType monsterCampType = (CampType)(mData.MonsterUnitValues.UNIT_FIELD_FIGHT_HOSTILITY);

        if ((AffectTarget == 1 && monsterCampType != m_ownerCampType) || //作用于敌方阵营,子弹和目标怪物阵营不一致
            (AffectTarget == 2 && monsterCampType == m_ownerCampType) || //作用于己方阵营,子弹和目标怪物阵营一致
            AffectTarget == 3 ||          //所有
            AffectTarget == 6)
        {
            if (IsInShape(monster.GO.transform.position))
            {
                if (!mBehavior.IsDie &&
                    (!(mBehavior.Invincible || monsterProtected))
                    )
                {
                    if (m_ownerCampType == monsterCampType || IsHit(srcLevel, destLevel, srcHit, destMiss))
                    {
                        SendFightEffect(monster.EntityDataStruct.SMsg_Header.uidEntity);
                        if (EctGuideManager.Instance.IsEctypeGuide)
                        {
                            //发出命中消息,目前在副本引导里会进行命中后减速检测
                            RaiseEvent(EventTypeEnum.HitMonsterForGuide.ToString(), new BulletHitData()
                            {
                                BulletId = BulletID, BeFightId = mData.BaseObjectValues.OBJECT_FIELD_ENTRY_ID
                            });
                        }

                        EntityController.Instance.ShowHurtEffect(monster, (uint)BulletID, FormEntityID);
                        EntityController.Instance.ShowHurtUiEffect(ownerData, (uint)BulletID);

                        //新增 移除怪物 结算
                        if (m_impactData.m_damage_type == 3)
                        {
                            DoDestroySelf();
                            return;
                        }

                        if (m_impactData.m_beatBackSpeed == 0 && m_impactData.m_beatBackAcceleration == 0 && m_impactData.m_beatBackDuration != 0)
                        {
                            bool noneFreeze = false;
                            if (mBehavior.FSMSystem.CurrentStateID == StateID.MonsterAttack)
                            {
                                MonsterAttackState attackState = ((MonsterAttackState)mBehavior.FSMSystem.CurrentState);
                                noneFreeze = attackState.CurrentSkillBase != null &&
                                             attackState.CurrentSkillBase.OnFire &&
                                             attackState.CurrentSkillBase.CurrentActionThresHold == CommonDefineManager.Instance.CommonDefine.NoneFreezeIronLevel;
                            }
                            //horde
                            if (!noneFreeze)
                            {
                                Horde(monster.EntityDataStruct.SMsg_Header.uidEntity, monster.GO.transform.position);
                            }
                        }
                        else if (mData.MonsterUnitValues.UNIT_FIELD_SHARD == 0 && !mBehavior.IronBody && mData.MonsterInvisibleValue.UNIT_FIELD_ARMOR != 1)                         //shield broke
                        {
                            Vector3 beatBackDir = Vector3.zero;
                            if (ownerData == null)                           //怪物实体不存在的情况 (死亡子弹)
                            {
                                beatBackDir = GetBeatBackDir(monster.GO.transform, monster.GO.transform);
                            }
                            else
                            {
                                beatBackDir = GetBeatBackDir(ownerData.GO.transform, monster.GO.transform);
                            }


                            if (m_impactData.m_beatFlyLevel > 0)
                            {
                                //fly
                                BeatFly(monster.EntityDataStruct.SMsg_Header.uidEntity, monster.GO.transform.position, beatBackDir);
                            }
                            else if (m_impactData.m_beatBackLevel > 0)
                            {
                                if (m_impactData.m_beatBackDir == 6)
                                {
                                    //absord
                                    Absord(monster.EntityDataStruct.SMsg_Header.uidEntity, monster.GO.transform.position, beatBackDir);
                                }
                                else
                                {
                                    //beat back
                                    BeatBack(monster.EntityDataStruct.SMsg_Header.uidEntity, monster.GO.transform.position, beatBackDir);
                                }
                            }
                        }
                        if (BulletData.m_overParam == 2)
                        {
                            DoDestroySelf();
                        }
                    }
                    else
                    {
                        Miss(monster.EntityDataStruct.SMsg_Header.uidEntity);
                        if (AffectTarget == 6)                       //只结算一次
                        {
                            DoDestroySelf();
                        }
                    }
                }
            }
        }
    }
Пример #4
0
        public override void Step(float deltaTime)
        {
            base.Step(deltaTime);

            if (HP <= 0)
            {
                Cancel(CombatAttribute.Move);
                Cancel(CombatAttribute.Attack);
                state = MonsterAttackState.Idle;

                timer -= deltaTime;
                if (timer <= 0)
                {
                    GetChild <Transform>().Warp(spawnPosition, 0, spawnRotation);
                    Revive();

                    timer = respawnTime;
                }
            }
            else
            {
                if (state == MonsterAttackState.Idle)
                {
                    if (Status.AttackedUnitIDs.Count > 0)
                    {
                        Execute(CombatAttribute.Attack, Status.AttackedUnitIDs[0]);
                        state = MonsterAttackState.Attack;
                    }
                }
                else if (state == MonsterAttackState.Attack)
                {
                    Attack attack = (Attack)GetCombat(CombatAttribute.Attack);
                    if ((attack.IsExecute && (GetChild <Transform>().Position - spawnPosition).Length() >= chaseRadius) || !attack.IsExecute)
                    {
                        Cancel(CombatAttribute.Attack);
                        Execute(CombatAttribute.Move, spawnPosition);
                        state = MonsterAttackState.Back;
                    }
                }
                else
                {
                    if (Status.AttackedUnitIDs.Count > 0)
                    {
                        Cancel(CombatAttribute.Move);
                        Execute(CombatAttribute.Attack, Status.AttackedUnitIDs[0]);
                        state = MonsterAttackState.Attack;
                    }
                    else
                    {
                        Move move = (Move)GetCombat(CombatAttribute.Move);
                        if (!move.IsExecute)
                        {
                            float distance = (GetChild <Transform>().Position - spawnPosition).Length();
                            if (distance >= 0.1f)
                            {
                                Execute(CombatAttribute.Move, spawnPosition);
                            }
                        }
                    }
                }
            }
        }