public override void AddComponents() { Slice = "missile"; base.AddComponents(); AlwaysVisible = true; AlwaysActive = true; var graphics = new ProjectileGraphicsComponent("projectiles", Slice); AddComponent(graphics); var w = graphics.Sprite.Source.Width; var h = graphics.Sprite.Source.Height; Width = w; Height = h; Center = Owner.Center; AddComponent(BodyComponent = new RectBodyComponent(0, 0, w, h)); BodyComponent.Body.IsBullet = true; BodyComponent.Body.LinearVelocity = new Vector2(0, -100f); Owner.HandleEvent(new ProjectileCreatedEvent { Owner = Owner, Projectile = this }); Depth = Layers.TileLights; CollisionFilterComponent.Add(this, (p, e) => { if (e is Level || e is Prop) { return(CollisionResult.Disable); } return(CollisionResult.Default); }); }
public static Projectile Make(Entity owner, string slice, double angle = 0, float speed = 0, bool circle = true, int bounce = 0, Projectile parent = null, float scale = 1, float damage = 1, Item item = null, float range = -1) { if (slice == "default") { slice = "rect"; } var projectile = new Projectile(); owner.Area.Add(projectile); if (owner is Mob && Rnd.Chance(MobDestrutionChance)) { projectile.Done = true; return(projectile); } projectile.Range = range; if (parent != null) { projectile.Color = parent.Color; } else if (owner is Player) { projectile.Color = ProjectileColor.Yellow; } projectile.Boost = owner is Player; projectile.Damage = damage; projectile.Scale = scale; projectile.Slice = slice; projectile.Parent = parent; projectile.Owner = owner; projectile.StarterOwner = owner; projectile.BounceLeft = bounce; var graphics = new ProjectileGraphicsComponent("projectiles", slice); projectile.AddComponent(graphics); if (graphics.Sprite == null) { Log.Error($"Not found projectile slice {slice}"); projectile.Done = true; return(projectile); } owner.HandleEvent(new ProjectileCreatedEvent { Owner = owner, Item = item, Projectile = projectile }); scale = projectile.Scale; var w = graphics.Sprite.Source.Width * scale; var h = graphics.Sprite.Source.Height * scale; projectile.Width = w; projectile.Height = h; projectile.Center = owner.Center; if (owner is Mob m && m.HasPrefix) { projectile.Scourged = true; projectile.Color = ProjectileColor.Black; projectile.AddLight(64, ProjectileColor.Black); } if (circle) { projectile.AddComponent(projectile.BodyComponent = new CircleBodyComponent(0, 0, w / 2f, BodyType.Dynamic, false, true)); } else { projectile.AddComponent(projectile.BodyComponent = new RectBodyComponent(0, 0, w, h, BodyType.Dynamic, false, true)); } projectile.BodyComponent.Body.Restitution = 1; projectile.BodyComponent.Body.Friction = 0; projectile.BodyComponent.Body.IsBullet = true; projectile.BodyComponent.Body.Rotation = (float)angle; if (owner.TryGetComponent <BuffsComponent>(out var buffs) && buffs.Has <SlowBuff>()) { speed *= 0.5f; } speed *= 10f; if (Math.Abs(speed) > 0.01f) { projectile.BodyComponent.Velocity = new Vector2((float)(Math.Cos(angle) * speed), (float)(Math.Sin(angle) * speed)); } if (parent != null && parent.TryGetComponent <LightComponent>(out var l)) { projectile.AddLight(l.Light.Radius, l.Light.Color); } return(projectile); }