private void UpdateSuperCharging(float elapsed) { foreach (var player in Game.GetPlayers()) { if (player == Player) { continue; } var position = player.GetWorldPosition(); var angles = new float[] { MathExtension.ToRadians(25), MathExtension.ToRadians(65) }; if (Player.FacingDirection < 0) { angles = ScriptHelper.Flip(angles, FlipDirection.Horizontal); } if (ScriptHelper.IntersectCircle(player.GetAABB(), Position, ChargeHitRange) && !chargedPlayers.Contains(player.UniqueID)) { Game.PlayEffect(EffectName.Electric, position); Game.PlaySound("ElectricSparks", position); var direction = RandomHelper.Direction(angles[0], angles[1], true); player.SetLinearVelocity(direction * 15f); ScriptHelper.ExecuteSingleCommand(player, PlayerCommandType.Fall); chargedPlayers.Add(player.UniqueID); } } var area = Player.GetAABB(); area.Grow(4); foreach (var obj in Game.GetObjectsByArea(area)) { if (obj.UniqueID == Player.UniqueID || chargedObjects.Contains(obj.UniqueID) || ScriptHelper.IsPlayer(obj)) { continue; } if (ScriptHelper.IsDynamicObject(obj) || RayCastHelper.ObjectsBulletCanDestroy.Contains(obj.Name)) { if (ScriptHelper.IntersectCircle(obj.GetWorldPosition(), Position, ChargeHitRange)) { var v = obj.GetLinearVelocity(); obj.SetLinearVelocity(v + Vector2.UnitX * Player.FacingDirection * 25); ScriptHelper.DealDamage(obj, 3); chargedObjects.Add(obj.UniqueID); } } } Game.PlayEffect(EffectName.FireNodeTrailAir, Position + new Vector2(-4, -4)); Game.PlayEffect(EffectName.FireNodeTrailAir, Position + new Vector2(4, -4)); m_chargeTimer += elapsed; if (m_chargeTimer >= 1500) { StopSuperCharge(); m_chargeTimer = 0f; } }
public void OnPlayerDeath(IPlayer player, PlayerDeathArgs args) { if (player.GetHitEffect() == PlayerHitEffect.Metal && args.Removed) { var deathPosition = player.GetWorldPosition(); var effects = new List <Tuple <string, int> >() { Tuple.Create(EffectName.BulletHitMetal, 1), Tuple.Create(EffectName.Steam, 2), Tuple.Create(EffectName.Electric, 4), }; foreach (var effect in effects) { var effectName = effect.Item1; var count = effect.Item2; for (var i = 0; i < count; i++) { var position = player.GetWorldPosition(); position.X += RandomHelper.Between(-10, 10); position.Y += RandomHelper.Between(-10, 10); Game.PlayEffect(effectName, position); } } Game.TriggerExplosion(deathPosition); for (var i = 0; i < 4; i++) { var debrisLinearVelocity = RandomHelper.Direction(15, 165) * 10; var debris = Game.CreateObject(RandomHelper.GetItem(DebrisList), deathPosition, 0f, debrisLinearVelocity, 0f); debris.SetMaxFire(); Game.CreateObject(RandomHelper.GetItem(DebrisList), deathPosition, 0f, debrisLinearVelocity * -Vector2.UnitX, 0f); if (RandomHelper.Between(0, 100) < 50) { Game.CreateObject(RandomHelper.GetItem(WiringTubeList), deathPosition, 0f, RandomHelper.Direction(0, 180) * 6, 0f); } } } }
public override void OnProjectileHit(ProjectileHitArgs args) { base.OnProjectileHit(args); var hitObject = GetObject(args); if (!args.IsPlayer && hitObject.GetBodyType() == BodyType.Static) { return; } var angles = new float[] { MathExtension.ToRadians(35), MathExtension.ToRadians(70) }; var angle = MathExtension.NormalizeAngle(ScriptHelper.GetAngle(Instance.Direction)); if (angle > MathHelper.PIOver2 && angle <= MathExtension.PI_3Over2) { angles = ScriptHelper.Flip(angles, FlipDirection.Horizontal); } var position = Instance.Position; var pushDirection = Instance.Direction; var upDirection = RandomHelper.Direction(angles[0], angles[1], true); var modifiers = GetForceModifier(); var velocity = hitObject.GetLinearVelocity(); if (args.IsPlayer) { velocity += Instance.Direction * 4 + upDirection * 14 * modifiers; hitObject.SetLinearVelocity(MathExtension.ClampMagnitude(velocity, 15)); } else { var mass = hitObject.GetMass(); var magnitude = MathHelper.Clamp(1f / mass / 7f, 3, 30) * modifiers; velocity += Instance.Direction * magnitude + upDirection * magnitude / 10; hitObject.SetLinearVelocity(velocity); //ScriptHelper.LogDebug(hitObject.Name, mass, magnitude); } //if (Game.IsEditorTest) //{ // ScriptHelper.RunIn(() => // { // if (args.IsPlayer) // Game.DrawText(modifiers.ToString(), position); // Game.DrawLine(position, position + pushDirection * 3); // Game.DrawLine(position, position + upDirection * 3, Color.Yellow); // Game.DrawLine(position, position + velocity, Color.Green); // }, 2000); //} }
private void SelfDestruct() { m_destroyed = true; var effects = new List <Tuple <string, int> >() { Tuple.Create(EffectName.BulletHitMetal, 1), Tuple.Create(EffectName.Steam, 2), Tuple.Create(EffectName.Electric, 4), }; foreach (var effect in effects) { var effectName = effect.Item1; var count = effect.Item2; for (var i = 0; i < count; i++) { var position = RandomHelper.WithinArea(Player.GetAABB()); Game.PlayEffect(effectName, position); } } for (var i = 0; i < 4; i++) { var debrisLinearVelocity = RandomHelper.Direction(15, 165) * 10; var debris = Game.CreateObject(RandomHelper.GetItem(DebrisList), Position, 0f, debrisLinearVelocity, 0f); debris.SetMaxFire(); Game.CreateObject(RandomHelper.GetItem(DebrisList), Position, 0f, debrisLinearVelocity * -Vector2.UnitX, 0f); if (RandomHelper.Boolean()) { Game.CreateObject(RandomHelper.GetItem(WiringTubeList), Position, 0f, RandomHelper.Direction(0, 180) * 6, 0f); } } Game.TriggerExplosion(Position); }
private void DeflectBullet(IProjectile projectile, Vector2 normal) { var reflectVec = Vector2.Reflect(projectile.Direction, normal) + RandomHelper.Direction(-65, 65); var direction = projectile.Direction.X > 0 ? 1 : -1; var position = projectile.Position - direction * Vector2.UnitX * 5; var powerup = ProjectilePowerup.None; if (projectile.PowerupBounceActive) { powerup = ProjectilePowerup.Bouncing; } if (projectile.PowerupFireActive) { powerup = ProjectilePowerup.Fire; } Game.SpawnProjectile(projectile.ProjectileItem, position, reflectVec, powerup); }