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); }
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; }
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(); } } } } } }
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); } } } } } }