Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
        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);
                            }
                        }
                    }
                }
            }
        }
Пример #9
0
        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);
                    }
                }
            }
        }
Пример #10
0
        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);
                }
            }
        }