private void ApplyBuff(MeleeArc arc, string buff) { if (buff != null) { if (!BuffRegistry.All.TryGetValue(buff, out var info)) { Log.Error($"Unknown buff {buff}"); return; } arc.Color = info.Effect.GetColor(); arc.OnHurt += (p, e) => { if (e.TryGetComponent <BuffsComponent>(out var buffs)) { var b = BuffRegistry.Create(buff); if (InfiniteBuff) { b.Infinite = true; } else { b.TimeLeft = b.Duration = BuffDuration; } buffs.Add(b); } }; } }
public void ModifyProjectile(MeleeArc arc) { if (Rnd.Float() > Chance + Run.Luck * 0.2f) { return; } arc.Mines = Mine; arc.Damage *= Damage; if (Math.Abs(Scale - 1) > 0.01f) { arc.Width *= Scale; arc.Height *= Scale; // arc.AdjustSize(); } if (RandomEffect) { if (lastEffect == -1 || (EffectChangeSpeed > 0 && Engine.Time - lastEffectTime >= EffectChangeSpeed)) { lastEffect = Rnd.Int(effects.Length); lastEffectTime = Engine.Time; } ApplyBuff(arc, effects[lastEffect]); return; } if (BuffToApply != null) { ApplyBuff(arc, BuffToApply); } }
public override void Use(Entity entity, Item item) { entity.GetComponent <AudioEmitterComponent>().EmitRandomizedPrefixed(AttackSound, 4); var arc = new MeleeArc { Owner = entity, LifeTime = LifeTime, Damage = Damage * (item.Scourged ? 1.5f : 1), Width = W, Height = H, Sound = HitSound, Position = entity.Center, Knockback = Knockback, Angle = entity.AngleTo(entity.GetComponent <AimComponent>().RealAim) + Angle }; entity.HandleEvent(new MeleeArc.CreatedEvent { Arc = arc, Owner = entity, By = item }); entity.Area.Add(arc); }
IEnumerator CoUpdate() { myTransform = this.transform; baseYPosition = myTransform.localPosition.y; if(meleeRange == null) meleeRange = myTransform.GetComponentInChildren(typeof(MeleeArc)) as MeleeArc; if(seek == null) seek = GetComponent(typeof(AIFollow)) as AIFollow; if(movement == null) movement = GetComponent(typeof(CharacterController)) as CharacterController; yield return new WaitForSeconds(2f); //Initialize AI while(true) { if(myHealth.IsDead) { behave = AIBehavior.die; } else { Vector3 horizontalVelocity = new Vector3(movement.velocity.x, 0, movement.velocity.z); if(horizontalVelocity.magnitude > 0.1f ) { if(horizontalVelocity.magnitude > 2.5f) animations.CrossFade(runAnimation); else animations.CrossFade(walkAnimation); } else animations.CrossFade(idleAninimation); if(CanSeePlayer() || myTarget != null) { stillLooking = true; if(CanSeePlayer() ) { countTilLostTarget = 0; } if(!CanSeePlayer() || !InMeleeRange()) FlipForward(); else behave = AIBehavior.attack; } if(!CanSeePlayer() && myTarget != null && stillLooking && switchedDirections) { StartCoroutine(FlipDirectionDelay() ); switchedDirections = false; forwardDirection.eulerAngles = new Vector3(0, forwardDirection.eulerAngles.y*yRotationMod, 0); if( (forwardDirection.eulerAngles.y < -80 || forwardDirection.eulerAngles.y > 240) && forwardDirection.eulerAngles.z < 100) { forwardDirection.eulerAngles = new Vector3(0, forwardDirection.eulerAngles.y, 180); } else { forwardDirection.eulerAngles = new Vector3(0, forwardDirection.eulerAngles.y, 0); } } else if(countTilLostTarget >= lostTargetNumber) { myTarget = null; } forwardDirection.position = myTransform.position; } //Debug.Log("State: "+ ((AIBehavior) behave).ToString("F") ); switch(behave) { case AIBehavior.idle: StartCoroutine(Idle() ); break; case AIBehavior.pursue: StartCoroutine(Pursue() ); break; case AIBehavior.attack: StartCoroutine(Attack() ); break; case AIBehavior.flee: StartCoroutine(Flee() ); break; case AIBehavior.die: StartCoroutine(Die() ); break; } yield return new WaitForSeconds(updateDelayTime); } }