public BeamWeapon(World world, WeaponInit init) : base(world, init) { projectile = (BeamProjectile)Type.Projectile; rayPhysics = new RayPhysics(world) { Target = TargetPosition, TargetHeight = TargetHeight }; originPos = init.Convert("OriginPosition", TargetPosition); originHeight = init.Convert("OriginHeight", TargetHeight); setPosition(); impactInterval = init.Convert("ImpactInterval", projectile.ImpactInterval); duration = init.Convert("Duration", Type.ShootDuration); buildupduration = init.Convert("BuildupDuration", projectile.StartupDuration); endduration = init.Convert("EndDuration", projectile.CooldownDuration); if (buildupduration > 0 && projectile.BeamStartUp != null) { useTexture(projectile.BeamStartUp); } else { useTexture(projectile.Beam); } if (projectile.BeamSound != null) { sound = new Sound(projectile.BeamSound); sound.Play(originPos, true); } }
public BeamWeapon(World world, WeaponType type, Target target, Actor origin, uint id) : base(world, type, target, origin, id) { projectile = (BeamProjectile)type.Projectile; impactInterval = projectile.ImpactInterval; rayPhysics = new RayPhysics(world) { Target = TargetPosition, TargetHeight = TargetHeight }; setPosition(); duration = type.ShootDuration; buildupduration = projectile.StartupDuration; endduration = projectile.CooldownDuration; if (buildupduration > 0 && projectile.BeamStartUp != null) { useTexture(projectile.BeamStartUp); } else { useTexture(projectile.Beam); } if (projectile.BeamSound != null) { sound = new Sound(projectile.BeamSound); sound.Play(originPos, true); } }
public MagicWeapon(World world, WeaponType type, Target target, Actor origin, uint id) : base(world, type, target, origin, id) { projectile = (MagicProjectile)type.Projectile; Angle = (Position - TargetPosition).FlatAngle; calculateSpeed(); TargetPosition += getInaccuracy(projectile.Inaccuracy); rayPhysics = new RayPhysics(world); }
public MagicWeapon(World world, WeaponInit init) : base(world, init) { projectile = (MagicProjectile)Type.Projectile; speed = init.Convert("Speed", Vector.Zero); speedLeft = init.Convert("SpeedLeft", Vector.Zero); if (speed == Vector.Zero) { calculateSpeed(); } rayPhysics = new RayPhysics(world); }
public BulletWeapon(World world, WeaponType type, Target target, Actor origin, uint id) : base(world, type, target, origin, id) { projectile = (BulletProjectile)type.Projectile; Angle = (Position - TargetPosition).FlatAngle; TargetPosition += getInaccuracy(projectile.Inaccuracy); calculateStartSpeed(); if (projectile.OrientateToTarget) { Rotation = new VAngle(0, 0, Angle); } rayPhysics = new RayPhysics(world); }
public BulletWeapon(World world, WeaponInit init) : base(world, init) { projectile = (BulletProjectile)Type.Projectile; speed = init.Convert("Speed", Vector.Zero); speedLeft = init.Convert("SpeedLeft", Vector.Zero); if (speed == Vector.Zero) { calculateStartSpeed(); } if (projectile.OrientateToTarget) { Rotation = new VAngle(0, 0, Angle); } rayPhysics = new RayPhysics(world); }
public override void Tick() { if (World.Game.Editor) { return; } if (Program.SharedRandom.NextDouble() > projectile.HitChance) { Dispose(); return; } var physics = new RayPhysics(World) { Start = Position, StartHeight = Height, Target = Target.Position, TargetHeight = Target.Height }; physics.CalculateEnd(ignoreActors: true); if ((physics.End - Position).Dist < (Position - Target.Position).Dist) { Detonate(new Target(physics.End, physics.EndHeight)); } else if (projectile.Splash) { Detonate(new Target(Target.Position, Target.Height)); } else { Detonate(Target); } }
public void Impact(World world, Weapon weapon, Target target) { if (Acceleration != 0) { var physics = new RayPhysics(world); var maxDist = maxRange * weapon.DamageRangeModifier; var sectors = world.ActorLayer.GetSectors(target.Position, (int)maxDist); foreach (var sector in sectors) { foreach (var actor in world.ActorLayer.Actors) { if (!actor.IsAlive || actor.Health == null || actor == weapon.Origin) { continue; } if (actor.Team == weapon.Team) { continue; } var dist = (target.Position - actor.Position).FlatDist; if (dist > maxRange * weapon.DamageRangeModifier) { continue; } if (dist < 1f) { dist = 1; } float multiplier = FalloffHelper.GetMultiplier(Falloff, RangeSteps, dist, weapon.DamageRangeModifier); physics.Start = actor.Position; physics.Target = target.Position; var pen = physics.GetWallPenetrationValue(); if (pen == 0f) { continue; } if (Acceleration != 0) { var acceleration = (int)Math.Floor(multiplier * Acceleration * weapon.DamageModifier * pen); if (acceleration != 0) { actor.Push((target.Position - actor.Position).FlatAngle, acceleration); } } if (HeightAcceleration != 0) { var heightAcceleration = (int)Math.Floor(multiplier * HeightAcceleration * weapon.DamageModifier * pen); if (heightAcceleration != 0) { actor.Lift(heightAcceleration); } } } } } }
public void Impact(World world, Weapon weapon, Target target) { if (Probability != 0 && Spell != null) { if (target.Type == TargetType.ACTOR) { target.Actor.CastSpell(Spell); return; } var physics = new RayPhysics(world); var maxDist = maxRange * weapon.DamageRangeModifier; var sectors = world.ActorLayer.GetSectors(target.Position, (int)maxDist); foreach (var sector in sectors) { foreach (var actor in world.ActorLayer.Actors) { if (!actor.IsAlive || actor.Health == null || actor == weapon.Origin) { continue; } if (actor.Team == weapon.Team) { continue; } var dist = (target.Position - actor.Position).FlatDist; if (dist > maxRange * weapon.DamageRangeModifier) { continue; } if (dist < 1f) { dist = 1; } var probability = Probability * FalloffHelper.GetMultiplier(ProbabilityFalloff, RangeSteps, dist, weapon.DamageRangeModifier); if (!IgnoreWalls) { physics.Start = actor.Position; physics.Target = target.Position; var pen = physics.GetWallPenetrationValue(); if (pen == 0f) { continue; } probability *= Probability; } if (probability == 0 || Program.SharedRandom.NextDouble() > probability) { continue; } actor.CastSpell(Spell); } } } }
public void Impact(World world, Weapon weapon, Target target) { if (Damage == 0) { return; } var maxDist = maxRange * weapon.DamageRangeModifier; if (!AgainstWalls) { if (target.Type == TargetType.ACTOR) { damageActor(world, weapon, target.Actor, Damage); return; } var physics = new RayPhysics(world); var sectors = world.ActorLayer.GetSectors(target.Position, (int)maxDist); foreach (var sector in sectors) { foreach (var actor in sector.Actors) { if (!actor.IsAlive || actor.Health == null || actor == weapon.Origin) { continue; } if (actor.Team == weapon.Team) { continue; } var dist = (target.Position - actor.Position).FlatDist; if (dist > maxDist) { continue; } if (dist < 1f) { dist = 1; } float damagemultiplier = FalloffHelper.GetMultiplier(Falloff, RangeSteps, dist, weapon.DamageRangeModifier); physics.Start = actor.Position; physics.Target = target.Position; var pen = physics.GetWallPenetrationValue(); if (pen == 0f) { continue; } var damage = (int)Math.Floor(damagemultiplier * Damage * weapon.DamageModifier * pen); damageActor(world, weapon, actor, damage); } } } else { foreach (var wall in world.WallLayer.GetRange(target.Position, (int)maxDist)) { if (wall == null || wall.Type.Invincible) { continue; } var dist = (target.Position - wall.Position).FlatDist; if (dist > maxDist) { continue; } if (dist < 1) { dist = 1; } float damagemultiplier = FalloffHelper.GetMultiplier(Falloff, RangeSteps, dist, weapon.DamageRangeModifier); var damage = (int)Math.Floor(damagemultiplier * Damage * weapon.DamageModifier); if (ArmorModifiers.ContainsKey(wall.Type.Armor)) { damage = (int)(damage * ArmorModifiers[wall.Type.Armor]); } if (damage == 0) { continue; } wall.Damage(damage); } } }