public override void Setup(JsonValue settings) { base.Setup(settings); var ac = 0.1f; SpawnProjectile = (entity, item) => { var aim = entity.GetComponent <AimComponent>(); var from = aim.Center; var am = aim.RealAim; var a = MathUtils.Angle(am.X - from.X, am.Y - from.Y); entity.GetComponent <AudioEmitterComponent>().EmitRandomized("item_laser_player"); var cnt = 1; var accurate = false; if (entity is Player pl) { var e = new PlayerShootEvent { Player = pl }; entity.HandleEvent(e); cnt += e.Times - 1; accurate = e.Accurate; } for (var i = 0; i < cnt; i++) { var addition = 0f; if (accurate) { addition = (i - (int)(cnt * 0.5f)) * 0.2f + Rnd.Float(-ac / 2f, ac / 2f); } else if (cnt == 1 || i > 0) { addition = Rnd.Float(-ac / 2f, ac / 2f); } var laser = Laser.Make(entity, a, addition, item, damage: (item.Scourged ? 1.5f : 1f)); laser.Position = from; laser.PlayerRotated = true; laser.Damage *= 1.2f; laser.Recalculate(); } }; }
public override void Update(float dt) { base.Update(dt); if (!Attract) { return; } foreach (var p in Area.Tagged[Tags.Player]) { var dx = p.DxTo(this); var dy = p.DyTo(this); var d = MathUtils.Distance(dx, dy); if (d <= 24) { AnimationUtil.Explosion(Center); Done = true; Callback(); Camera.Instance.Shake(20); Engine.Instance.Flash = 2; var ba = GetComponent <SensorBodyComponent>(); ba.Velocity = ba.Knockback = Vector2.Zero; var bb = p.GetComponent <SensorBodyComponent>(); bb.Velocity = bb.Knockback = Vector2.Zero; return; } var a = MathUtils.Angle(dx, dy); var force = 360 * dt; if (d <= 64) { force *= 2; } p.GetComponent <RectBodyComponent>().Velocity += new Vector2((float)Math.Cos(a) * force, (float)Math.Sin(a) * force); a += (float)Math.PI; GetComponent <SensorBodyComponent>().Velocity += new Vector2((float)Math.Cos(a) * force, (float)Math.Sin(a) * force); } }
public override void Setup(JsonValue settings) { base.Setup(settings); modifiers = Items.ParseUses(settings["modifiers"]); if (modifiers != null) { foreach (var m in modifiers) { m.Item = Item; } } damage = settings["damage"].Number(1); speed = settings["speed"].Number(6); speedMax = settings["speedm"].Number(10); range = settings["range"].Number(0) * 0.5f; scaleMin = settings["scale"].Number(1); scaleMax = settings["scalem"].Number(1); slice = settings["texture"].String("rect"); toCursor = settings["cursor"].Bool(false); toEnemy = settings["tomb"].Bool(false); sfx = settings["sfx"].String("item_gun_fire"); sfx_number = settings["sfxn"].Int(0); ReloadSfx = settings["rsfx"].Bool(false); manaUsage = settings["mana"].Int(0); color = settings["color"].String(""); angleAdd = settings["ang"].Number(0); if (manaUsage > 0) { manaDrop = settings["mdr"].Int(0); } if (slice == "default") { slice = "rect"; } accuracy = settings["accuracy"].Number(0).ToRadians(); count = settings["amount"].Int(1); prefab = settings["prefab"].String(""); light = settings["light"].Bool(true); knockback = settings["knockback"].Number(1); rect = settings["rect"].Bool(false); wait = settings["wait"].Bool(false); disableBoost = settings["dsb"].Bool(false); shells = settings["shells"].Bool(true); emeralds = settings["emeralds"].Bool(false); SpawnProjectile = (entity, item) => { if (manaUsage > 0) { var mana = entity.GetComponent <ManaComponent>(); if (mana.Mana < manaUsage) { AnimationUtil.ActionFailed(); return; } mana.ModifyMana(-manaUsage); } if (emeralds) { if (GlobalSave.Emeralds == 0) { AnimationUtil.ActionFailed(); TextParticle.Add(entity, Locale.Get("no_emeralds")); return; } GlobalSave.Emeralds--; } var bad = entity is Creature c && !c.IsFriendly(); var sl = slice; if (bad) { sl = "small"; } entity.TryGetComponent <StatsComponent>(out var stats); if (sfx == "item_gun_fire") { entity.GetComponent <AudioEmitterComponent>().EmitRandomizedPrefixed(sfx, 2, 0.5f, sz: 0.2f); } else { if (sfx_number == 0) { entity.GetComponent <AudioEmitterComponent>().EmitRandomized(sfx, 0.5f, sz: 0.25f); } else { entity.GetComponent <AudioEmitterComponent>().EmitRandomizedPrefixed(sfx, sfx_number, 0.5f, sz: 0.25f); } } var aim = entity.GetComponent <AimComponent>(); var from = toCursor ? entity.Center : aim.Center; var am = toCursor ? entity.GetComponent <CursorComponent>().Cursor.GamePosition : aim.RealAim; if (toEnemy) { var target = entity.Area.FindClosest(from, Tags.MustBeKilled, e => true); if (target != null) { am = target.Center; } } var a = MathUtils.Angle(am.X - from.X, am.Y - from.Y); var pr = prefab.Length == 0 ? null : ProjectileRegistry.Get(prefab); var ac = accuracy; if (stats != null) { ac /= stats.Accuracy; } var cnt = count; var accurate = false; if (entity is Player pl) { var e = new PlayerShootEvent { Player = (Player)entity }; entity.HandleEvent(e); cnt += e.Times - 1; accurate = e.Accurate; if (sl == "rect") { sl = pl.ProjectileTexture; } } for (var i = 0; i < cnt; i++) { var angle = a; if (accurate) { angle += (i - (int)(cnt * 0.5f)) * 0.2f + Rnd.Float(-ac / 2f, ac / 2f); } else if (cnt == 1 || i > 0) { angle += Rnd.Float(-ac / 2f, ac / 2f); } angle += angleAdd * (float)Math.PI * 2; var antiAngle = angle - (float)Math.PI; var projectile = Projectile.Make(entity, sl, angle, Rnd.Float(speed, speedMax), !rect, 0, null, Rnd.Float(scaleMin, scaleMax), damage * (item.Scourged ? 1.5f : 1f), Item); projectile.Boost = !disableBoost; projectile.Item = item; Camera.Instance.Push(antiAngle, 4f); entity.GetComponent <RectBodyComponent>()?.KnockbackFrom(antiAngle, 0.4f * knockback); var clr = bad ? Projectile.RedLight : ProjectileColor.Yellow; if (!string.IsNullOrEmpty(color) && ProjectileColor.Colors.TryGetValue(color, out clr)) { projectile.Color = clr; } if (light) { projectile.AddLight(32f, clr); } projectile.FlashTimer = 0.05f; if (range > 0.01f) { if (Math.Abs(projectile.Range - (-1)) < 0.1f) { projectile.Range = range / speed; } else { projectile.Range += range / speed; } } projectile.Center = from; if (modifiers != null) { foreach (var m in modifiers) { if (m is ModifyProjectilesUse mpu) { mpu.ModifyProjectile(projectile); } } } pr?.Invoke(projectile); if (wait && i == 0) { ProjectileDied = false; if (prefab == "bk:axe") { projectile.OnDeath += (prj, e, t) => { prj.OnDeath += (prj2, e2, t2) => ProjectileDied = true; }; } else { projectile.OnDeath += (prj, e, t) => ProjectileDied = true; } } if (manaUsage > 0) { if (manaDrop == 0) { projectile.OnDeath += (prj, e, t) => { PlaceMana(entity.Area, prj.Center); }; } else if (manaDrop == 1) { PlaceMana(entity.Area, entity.Center); } else { var where = entity.Center; projectile.OnDeath += (prj, e, t) => { PlaceMana(entity.Area, where); }; } } } if (shells) { Timer.Add(() => { var p = new ShellParticle(new Particle(Controllers.Destroy, new TexturedParticleRenderer { Region = CommonAse.Particles.GetSlice("shell") })); p.Position = entity.Center; p.Y += Rnd.Float(-4, 10); entity.Area.Add(p); var f = (entity.CenterX > entity.GetComponent <CursorComponent>().Cursor.GamePosition.X ? 1 : -1); p.Particle.Velocity = new Vector2(f * Rnd.Float(40, 60), 0) + entity.GetAnyComponent <BodyComponent>().Velocity; p.Particle.Angle = 0; p.Particle.Zv = Rnd.Float(1.5f, 2.5f); p.Particle.AngleVelocity = f * Rnd.Float(40, 70); p.AddShadow(); }, 0.2f); } }; }
public override void Render(bool atBack, bool paused, float dt, bool shadow, int offset) { if (Hidden) { return; } var region = Item.Region; var owner = Item.Owner; if (!atBack && !paused && !shadow) { var to = owner.GetComponent <AimComponent>().Aim; /*var dx = Nozzle.X - Origin.X; * var dy = Nozzle.Y - Origin.Y; * * var a = MathUtils.Angle(dx, dy) + lastAngle; * var d = MathUtils.Distance(dx, dy); * * to -= MathUtils.CreateVector(a, d);*/ lastAngle = MathUtils.LerpAngle(lastAngle, owner.AngleTo(to) + Math.PI * 0.5f, dt * 24f); } var angle = atBack ? (float)Math.PI * (owner.GraphicsComponent.Flipped ? 0.25f : -0.25f) : (float)lastAngle; if (horizontal) { angle -= (float)Math.PI * 0.5f; } var pos = new Vector2( owner.CenterX + (owner.GraphicsComponent.Flipped ? -5 : 5) + (horizontal ? 0 : (region.Width / 2f) * (owner.GraphicsComponent.Flipped ? -1 : 1)), owner.CenterY + offset + (shadow ? owner.Height : 0) ); var or = Origin + new Vector2(0, currentMove); var fangle = shadow ? -angle : angle; var sc = new Vector2(scale.X, shadow ? -scale.Y : scale.Y); if (!shadow && !atBack) { var dx = Nozzle.X - or.X; var dy = Nozzle.Y - or.Y; var a = MathUtils.Angle(dx, dy) + angle; var d = MathUtils.Distance(dx, dy); var aim = owner.GetComponent <AimComponent>(); aim.Center = pos + MathUtils.CreateVector(a, d); d = (aim.Aim - pos).Length(); aim.RealAim = aim.Center + MathUtils.CreateVector(angle - (horizontal ? 0 : Math.PI / 2), d); } if (Item.Scourged) { var shader = Shaders.Entity; Shaders.Begin(shader); shader.Parameters["flash"].SetValue(1f); shader.Parameters["flashReplace"].SetValue(1f); shader.Parameters["flashColor"].SetValue(ItemGraphicsComponent.ScourgedColor); foreach (var d in MathUtils.Directions) { Graphics.Render(region, pos + d, fangle, or, sc); } Shaders.End(); } Graphics.Render(region, pos, fangle, or, sc); }
public override void Render(bool shadow) { if (Hidden) { return; } var o = (shadow ? -1 : 1) * (offsets[Math.Min(offsets.Length - 1, Animation.Frame + Animation.StartFrame)] - 11); var s = GetComponent <StateComponent>().StateInstance; var w = !(s is Player.RollState || s is Player.SleepingState); var z = GetComponent <ZComponent>(); // Render wings if (((Player)Entity).HasFlight) { var a = (float)(Math.Sin(Engine.Time * 5f) * 0.5f) * (shadow ? -1 : 1); if (!shadow) { z.Z = -a * 3 + 4; } a -= (float)Math.PI / 4 * (shadow ? -1 : 1); var wy = shadow ? Entity.Height : 0; wy += GetComponent <ZComponent>().Z *(shadow ? 1 : -1); Graphics.Render(wing, Entity.Center + new Vector2(-1, wy), a, new Vector2(8), shadow ? MathUtils.InvertY : Vector2.One); Graphics.Render(wing, Entity.Center + new Vector2(1, wy), -a, new Vector2(8), shadow ? MathUtils.InvertXY : MathUtils.InvertX); } var g = shadow ? 0 : (int)z.Z; if (w) { GetComponent <WeaponComponent>().Render(shadow, o - g); } if (!shadow && InGameState.Multiplayer) { var pos = Entity.Position + Offset; var shader = Shaders.Entity; Shaders.Begin(shader); shader.Parameters["flash"].SetValue(1f); shader.Parameters["flashReplace"].SetValue(1f); shader.Parameters["flashColor"].SetValue(Player.VectorTints[Entity.GetComponent <InputComponent>().Index]); foreach (var d in MathUtils.Directions) { CallRender(pos + d, false); } Shaders.End(); } var stopShader = StartShaders(); SimpleRender(shadow); if (stopShader) { Shaders.End(); } if (!shadow) { var aim = GetComponent <AimComponent>(); if (aim.ShowLaserLine) { var from = aim.Center; var to = aim.RealAim; var min = 1f; var closest = MathUtils.CreateVector(MathUtils.Angle(to.X - from.X, to.Y - from.Y), Display.UiWidth) + from; Physics.World.RayCast((fixture, point, normal, fraction) => { if (min > fraction && fixture.Body.UserData is BodyComponent b && RayShouldCollide(b.Entity)) { min = fraction; closest = point; } return(min); }, from, to); Graphics.Batch.FillRectangle((int)closest.X - 1, (int)closest.Y - 1, 3, 3, AimLineColor); Graphics.Batch.DrawLine(from, new Vector2((int)closest.X, (int)closest.Y), AimLineColor, 1); } } if (w) { GetComponent <ActiveWeaponComponent>().Render(shadow, o - g); } }
public override void Render(bool atBack, bool paused, float dt, bool shadow, int offset) { if (Hidden) { return; } var s = dt * 10f; sx += (1 - sx) * s; sy += (1 - sy) * s; ox += (-ox) * s; oy += (-oy) * s; var region = Item.Region; var owner = Item.Owner; var of = owner.GraphicsComponent.Flipped; var flipped = false; var angle = MathUtils.Mod((of ? -Angle : Angle) + (atBack ? ((InvertBack ? -1 : 1) * (of ? -Math.PI / 4 : Math.PI / 4)) : lastAngle), Math.PI * 2); var vf = angle > Math.PI * 0.5f && angle < Math.PI * 1.5f; if (!atBack && !paused && !shadow) { var to = owner.GetComponent <AimComponent>().Aim; /*var dx = Nozzle.X - Origin.X; * var dy = Nozzle.Y - Origin.Y; * * if (vf) { * dy *= -1; * } * * var a = MathUtils.Angle(dx, dy) + lastAngle - AddedAngle - SwingAngle; * var d = MathUtils.Distance(dx, dy); * to -= MathUtils.CreateVector(a, d); * * owner.GetComponent<AimComponent>().Aim = to;*/ lastAngle = MathUtils.LerpAngle(lastAngle, owner.AngleTo(to), dt * 24f); } if (atBack) { flipped = !flipped; } else { angle += (SwingAngle + AddedAngle) * (of ? -1 : 1); } var pos = new Vector2(owner.CenterX + (of ? -5 : 5), owner.CenterY + offset + (shadow ? owner.Height : 0)); var or = Origin + new Vector2(ox, oy); var sc = new Vector2(flipped ? -sx : sx, (shadow ^ vf) ? -sy : sy); var fangle = (float)angle * (shadow ? -1 : 1); if (!shadow && !atBack) { var dx = Nozzle.X - or.X; var dy = Nozzle.Y - or.Y; if (vf) { dy *= -1; } var a = MathUtils.Angle(dx, dy) + angle; var d = MathUtils.Distance(dx, dy); var aim = owner.GetComponent <AimComponent>(); aim.Center = pos + MathUtils.CreateVector(a, d); d = (aim.Aim - pos).Length(); aim.RealAim = aim.Center + MathUtils.CreateVector(angle - AddedAngle - SwingAngle, d); } if (Item.Scourged) { var shader = Shaders.Entity; Shaders.Begin(shader); shader.Parameters["flash"].SetValue(1f); shader.Parameters["flashReplace"].SetValue(1f); shader.Parameters["flashColor"].SetValue(ItemGraphicsComponent.ScourgedColor); foreach (var d in MathUtils.Directions) { Graphics.Render(region, pos + d, fangle, or, sc); } Shaders.End(); } Graphics.Render(region, pos, fangle, or, sc); }