public override void Draw(Player player, SkillData rawdata, PlayerDrawInfo pdi) { SummonDemonData data = (SummonDemonData)rawdata; if (!Main.NPCLoaded[Terraria.ID.NPCID.Demon]) { Main.instance.LoadNPC(Terraria.ID.NPCID.Demon); } if (!Main.NPCLoaded[Terraria.ID.NPCID.VoodooDemon]) { Main.instance.LoadNPC(Terraria.ID.NPCID.VoodooDemon); } float Opacity = 1f; if (data.Time < 60) { Opacity = data.Time * (1f / 60); } else if (data.Time >= (Duration + 1) * 60) { Opacity = (60 - (data.Time - (Duration + 1) * 60)) * (1f / 60); } foreach (SummonDemonData.DemonInfo di in data.DemonMinions) { int DemonID = di.VoodooDemon ? Terraria.ID.NPCID.VoodooDemon : Terraria.ID.NPCID.Demon; Texture2D texture = Main.npcTexture[DemonID]; Rectangle drawrect = new Rectangle(0, 0, texture.Width, texture.Height / Main.npcFrameCount[DemonID]); drawrect.Y = di.FrameID * drawrect.Height; Vector2 Origin = new Vector2(drawrect.Width * 0.5f, drawrect.Height * 0.5f); Terraria.DataStructures.DrawData dd = new Terraria.DataStructures.DrawData(texture, di.Position - Main.screenPosition, drawrect, Lighting.GetColor((int)(di.Position.X * (1f / 16)), (int)(di.Position.Y * (1f / 16)), Color.Cyan) * Opacity, di.Rotation, Origin, 1f, (di.Direction > 0 ? SpriteEffects.FlipHorizontally : SpriteEffects.None), 0); Main.playerDrawData.Insert(0, dd); } }
public override void Update(Player player, SkillData rawdata) { SummonDemonData data = (SummonDemonData)rawdata; if (data.Step == 0 && data.Time == 0) { List <SummonDemonData.DemonInfo> Demons = new List <SummonDemonData.DemonInfo>(); int MaxDemons = (int)(data.Level * 0.3334f + 1); if (MaxDemons > 8) { MaxDemons = 8; } for (int i = 0; i < MaxDemons; i++) { SummonDemonData.DemonInfo d = new SummonDemonData.DemonInfo(); d.VoodooDemon = Main.rand.NextDouble() < 0.05; d.FrameTime = (byte)(i * 2); d.Position = player.Center; d.ShotCooldown = (byte)(8 * (i + 1)); Demons.Add(d); } data.DemonMinions = Demons.ToArray(); } bool CanAttack = data.Time >= 60 && data.Time < (Duration + 1) * 60; const float RadiusAroundPlayer = 1.48353f; float RadiusDistancingPerMob = RadiusAroundPlayer * (1f / data.DemonMinions.Length); const float DistanceFromPlayer = 120; byte MaxShotCooldown = 8; if (data.Level > 6) { MaxShotCooldown--; } if (data.Level > 12) { MaxShotCooldown--; } MaxShotCooldown = (byte)(8 * MaxShotCooldown); for (int i = 0; i < data.DemonMinions.Length; i++) { SummonDemonData.DemonInfo di = data.DemonMinions[i]; Vector2 FinalPosition = player.Center; float MyRadians = -(RadiusAroundPlayer - RadiusDistancingPerMob) * 0.5f + RadiusDistancingPerMob * i - (float)Math.PI;// - 0.785398f; FinalPosition.X += (float)Math.Sin(MyRadians) * DistanceFromPlayer; FinalPosition.Y += (float)Math.Cos(MyRadians) * DistanceFromPlayer; const float FlightSpeed = 0.1f, MaxSpeed = 4f; if (Main.rand.Next(700) == 0) { Main.PlaySound(29, (int)di.Position.X, (int)di.Position.Y, Main.rand.Next(26, 30)); } if (Math.Abs(FinalPosition.X - di.Position.X) < 5) { di.Velocity.X *= 0.8f; } else { if (FinalPosition.X < di.Position.X) { di.Velocity.X -= FlightSpeed; if (di.Velocity.X < -MaxSpeed) { di.Velocity.X = -MaxSpeed; } } else { di.Velocity.X += FlightSpeed; if (di.Velocity.X > MaxSpeed) { di.Velocity.X = MaxSpeed; } } } if (Math.Abs(FinalPosition.Y - di.Position.Y) < 5) { di.Velocity.Y *= 0.8f; } else { if (FinalPosition.Y < di.Position.Y) { di.Velocity.Y -= FlightSpeed; if (di.Velocity.Y < -MaxSpeed) { di.Velocity.Y = -MaxSpeed; } } else { di.Velocity.Y += FlightSpeed; if (di.Velocity.Y > MaxSpeed) { di.Velocity.Y = MaxSpeed; } } } di.Position += di.Velocity; float NearestAttackDistance = 800; int FoundNpc = -1; for (int n = 0; n < 200; n++) { float Distance = 0; if (Main.npc[n].active && !Main.npc[n].friendly && Main.npc[n].CanBeChasedBy() && (Distance = Main.npc[n].Distance(player.Center)) < NearestAttackDistance) { NearestAttackDistance = Distance; FoundNpc = n; FinalPosition = Main.npc[n].Center; } } if (CanAttack && FoundNpc > -1) { di.Direction = (sbyte)(FinalPosition.X < di.Position.X ? -1 : 1); } else { di.Direction = (sbyte)player.direction; } di.ShotCooldown--; if (di.ShotCooldown == 0) { di.ShotCooldown = (byte)(MaxShotCooldown * 4); if (CanAttack && FoundNpc > -1) { Vector2 TargetPosition = FinalPosition - di.Position; TargetPosition.X += Main.rand.Next(-100, 101); TargetPosition.Y += Main.rand.Next(-100, 101); TargetPosition.Normalize(); int ProjPos = Projectile.NewProjectile(di.Position, TargetPosition * 8f, Terraria.ID.ProjectileID.DemonScythe, data.GetSummonDamage(0, 0.55f + 0.02f * data.Level, player), 6f, player.whoAmI); } } //Frame di.Rotation = di.Velocity.X * 0.1f; di.FrameTime++; if (di.FrameTime < 6) { di.FrameID = 0; } else { di.FrameID = 1; if (di.FrameTime >= 11) { di.FrameTime = 0; } } } if (data.Time >= 60 * (Duration + 2)) { data.EndUse(); } }