コード例 #1
0
        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);
            });
        }
コード例 #2
0
        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);
        }