Exemple #1
0
        public void LaserAttack()
        {
            var enemy = Character.Selected;

            if (!AssembleEnemy(enemy))
            {
                return;
            }

            var isRsb = (Character as Player)?.Settings.CurrentAmmo.LootId == "ammunition_laser_rsb-75" || (Character as Pet)?.GetOwner().Settings.CurrentAmmo.LootId == "ammunition_laser_rsb-75";

            if (isRsb)
            {
                if (Character is Player)
                {
                    if (RSBCooldownEnd > DateTime.Now)
                    {
                        return;
                    }

                    var cld = new RSBCooldown();
                    Character.Cooldowns.Add(cld);
                    cld.Send(((Player)Character).GetGameSession());
                    RSBCooldownEnd = cld.EndTime;
                }
                else
                {
                    var cld = Character.Cooldowns.CooldownDictionary.FirstOrDefault(x => x.Value is RSBCooldown);
                    if (cld.Value != null)
                    {
                        if (cld.Value.EndTime > DateTime.Now)
                        {
                            return;
                        }
                    }

                    var newCld = new RSBCooldown();
                    Character.Cooldowns.Add(newCld);
                }
            }
            else
            {
                if (LastLaserAttack.AddMilliseconds(750) > DateTime.Now)
                {
                    return;
                }
                LastLaserAttack = DateTime.Now;
            }

            var damage     = Character.Damage;
            var absDamage  = 0; //This variable will be used for ammo that absobrs shield too
            var laserColor = 0;

            if (Character is Player)
            {
                var gameSession = World.StorageManager.GetGameSession(Character.Id);
                if (gameSession.Player.Equipment.LaserCount() == 0)
                {
                    Attacking = false; // Will stop attacking if there are no lasers equipped.
                    Packet.Builder.LegacyModule(gameSession, "0|A|STM|no_lasers_on_board");
                    return;
                }

                var shootingAmmo = gameSession.Player.Settings.CurrentAmmo.Shoot();
                if (shootingAmmo == 0)
                {
                    // NOTHING TO SHOOT
                    Packet.Builder.LegacyModule(gameSession, "0|A|STD|No more ammo (todo: find a proper STM message)");
                    var getAmmo = gameSession.Player.Information.Ammunitions.Keys.ToList();
                    if (gameSession.Player.Settings.CurrentAmmo.LootId == getAmmo[0])
                    {
                        Attacking = false;
                        return;
                    }
                    var index = getAmmo.FindIndex(x => x == gameSession.Player.Settings.CurrentAmmo.LootId) - 1;
                    gameSession.Player.Settings.CurrentAmmo =
                        gameSession.Player.Information.Ammunitions[getAmmo[index]];
                    gameSession.Player.Settings.OldClientShipSettingsCommand.selectedLaser = index;
                    Packet.Builder.SendSlotbars(gameSession);
                }
                gameSession.Player.Skylab.ReduceLaserOre(shootingAmmo);

                var laserTypes = gameSession.Player.Equipment.LaserTypes();
                switch (gameSession.Player.Settings.CurrentAmmo.LootId)
                {
                case "ammunition_laser_lcb-10":
                    if (laserTypes == 3)
                    {
                        laserColor = 1;
                    }
                    break;

                case "ammunition_laser_mcb-25":
                    damage *= 2;
                    if (laserTypes == 3)
                    {
                        laserColor = 1;
                    }
                    break;

                case "ammunition_laser_mcb-50":
                    damage *= 3;
                    if (laserTypes == 3)
                    {
                        laserColor = 2;
                    }
                    break;

                case "ammunition_laser_ucb-100":
                    damage    *= 4;
                    laserColor = 3;
                    break;

                case "ammunition_laser_sab-50":
                    absDamage  = damage * 2;
                    damage    *= 0;
                    laserColor = 4;
                    break;

                case "ammunition_laser_cbo-100":
                    absDamage  = damage;
                    damage     = damage * 2;
                    laserColor = 8;
                    break;

                case "ammunition_laser_rsb-75":
                    damage    *= 6;
                    laserColor = 6;
                    break;

                case "ammunition_laser_job-100":
                    damage    *= 4;
                    laserColor = 9;
                    break;
                }

                if (enemy is Character)
                {
                    UpdateAttacker(enemy as Character, gameSession.Player);
                }
            }
            else if (Character is Pet)
            {
                var pet = (Pet)Character;
                if (pet.GetOwner() == null)
                {
                    return;
                }
                var gameSession = World.StorageManager.GetGameSession(pet.GetOwner().Id);

                if (gameSession.Player.Settings.CurrentAmmo.Shoot("pet") == 0)
                {
                    // NOTHING TO SHOOT
                    Packet.Builder.LegacyModule(gameSession,
                                                "0|A|STD|No more ammo (todo: find a proper STM message)");
                    var getAmmo = gameSession.Player.Information.Ammunitions.Keys.ToList();
                    if (gameSession.Player.Settings.CurrentAmmo.LootId == getAmmo[0])
                    {
                        Attacking = false;
                        return;
                    }
                    var index = getAmmo.FindIndex(x => x == gameSession.Player.Settings.CurrentAmmo.LootId) - 1;
                    gameSession.Player.Settings.CurrentAmmo =
                        gameSession.Player.Information.Ammunitions[getAmmo[index]];
                    gameSession.Player.Settings.OldClientShipSettingsCommand.selectedLaser = index;
                    Packet.Builder.SendSlotbars(gameSession);
                }

                var laserTypes = gameSession.Player.Equipment.LaserTypes();
                switch (gameSession.Player.Settings.CurrentAmmo.LootId)
                {
                case "ammunition_laser_lcb-10":
                    break;

                case "ammunition_laser_mcb-25":
                    damage *= 2;
                    if (laserTypes == 3)
                    {
                        laserColor = 1;
                    }
                    break;

                case "ammunition_laser_mcb-50":
                    damage *= 3;
                    if (laserTypes == 3)
                    {
                        laserColor = 2;
                    }
                    break;

                case "ammunition_laser_ucb-100":
                    damage    *= 4;
                    laserColor = 3;
                    break;

                case "ammunition_laser_sab-50":
                    absDamage  = damage * 2;
                    damage    *= 0;
                    laserColor = 4;
                    break;

                case "ammunition_laser_cbo-100":
                    absDamage  = damage;
                    damage     = damage * 2;
                    laserColor = 8;
                    break;

                case "ammunition_laser_rsb-75":
                    damage    *= 6;
                    laserColor = 6;
                    break;

                case "ammunition_laser_job-100":
                    damage    *= 4;
                    laserColor = 9;
                    break;
                }
            }

            damage    = RandomizeDamage(damage);
            absDamage = RandomizeDamage(absDamage);

            GameClient.SendToPlayerView(Character,
                                        netty.commands.old_client.AttackLaserRunCommand.write(Character.Id, enemy.Id, laserColor, enemy is Player,
                                                                                              Character.Skills.HasFatLasers()), true);
            GameClient.SendToPlayerView(Character,
                                        netty.commands.new_client.AttackLaserRunCommand.write(Character.Id, enemy.Id, laserColor, enemy is Player,
                                                                                              Character.Skills.HasFatLasers()), true);

            Controller.Damage?.Laser(enemy, damage, absDamage);
            //Controller.Damage?.Laser(enemy, absDamage, true);

            if (Character is Player player)
            {
                if (player.State.LoginProtection)
                {
                    player.State.EndLoginProtection();
                }

                if (player.Settings.CurrentAmmo.LootId != "ammunition_laser_sab-50")
                {
                    if (player.Techs.ContainsKey(Techs.ENERGY_LEECH))
                    {
                        var energyLeech = player.Techs[Techs.ENERGY_LEECH] as EnergyLeech;
                        energyLeech?.ExecuteHeal(damage);
                    }
                }

                if (player.Controller.CPUs.Active.Contains(CPU.Types.AUTO_ROK))
                {
                    LaunchMissle(player.Settings.CurrentRocket.LootId);
                }

                if (player.Controller.CPUs.Active.Contains(CPU.Types.AUTO_ROCKLAUNCHER))
                {
                    LaunchRocketLauncher();
                }
            }
        }
Exemple #2
0
        public void LaserAttack()
        {
            var enemy = Character.Selected;

            if (!AssembleEnemy(enemy))
            {
                return;
            }

            var isRsb = (Character as Player)?.Settings.CurrentAmmo.LootId == "ammunition_laser_rsb-75";

            if (isRsb)
            {
                if (RSBCooldownEnd > DateTime.Now)
                {
                    return;
                }

                var cld = new RSBCooldown();
                cld.Send(((Player)Character).GetGameSession());
                Character.Cooldowns.Add(cld);
                RSBCooldownEnd = cld.EndTime;
            }
            else
            {
                if (LastLaserAttack.AddMilliseconds(750) > DateTime.Now)
                {
                    return;
                }
                LastLaserAttack = DateTime.Now;
            }

            var damage    = Character.Damage;
            var absDamage = 0; //This variable will be used for ammo that absobrs shield too

            var laserColor = 0;

            if (Character is Player)
            {
                var gameSession = World.StorageManager.GetGameSession(Character.Id);
                if (gameSession.Player.Equipment.LaserCount() == 0)
                {
                    Attacking = false; // Will stop attacking if there are no lasers equipped.
                    //TODO: fix
                    //Packet.Builder.LegacyModule(gameSession, "0|A|STM|no_lasers_on_board");
                    return;
                }

                if (gameSession.Player.Settings.CurrentAmmo.Shoot() == 0)
                {
                    // NOTHING TO SHOOT
                    //TODO: fix
                    //Packet.Builder.LegacyModule(gameSession, "0|A|STD|No more ammo (todo: find a proper STM message)");
                    var getAmmo = gameSession.Player.Information.Ammunitions.Keys.ToList();
                    if (gameSession.Player.Settings.CurrentAmmo.LootId == getAmmo[0])
                    {
                        Attacking = false;
                        return;
                    }
                    var index = getAmmo.FindIndex(x => x == gameSession.Player.Settings.CurrentAmmo.LootId) - 1;
                    gameSession.Player.Settings.CurrentAmmo =
                        gameSession.Player.Information.Ammunitions[getAmmo[index]];
                    //gameSession.Player.Settings.OldClientShipSettingsCommand.selectedLaser = index;
                    //TODO: Fix
                    //Packet.Builder.SendSlotbars(gameSession);
                }

                var laserTypes = gameSession.Player.Equipment.LaserTypes();
                switch (gameSession.Player.Settings.CurrentAmmo.LootId)
                {
                case "ammunition_laser_mcb-25":
                    damage *= 2;
                    if (laserTypes == 3)
                    {
                        laserColor = 1;
                    }
                    break;

                case "ammunition_laser_mcb-50":
                    damage *= 3;
                    if (laserTypes == 3)
                    {
                        laserColor = 2;
                    }
                    break;

                case "ammunition_laser_ucb-100":
                    damage    *= 4;
                    laserColor = 3;
                    break;

                case "ammunition_laser_sab-50":
                    absDamage  = damage * 2;
                    damage    *= 0;
                    laserColor = 4;
                    break;

                case "ammunition_laser_cbo-100":
                    absDamage  = damage;
                    damage     = damage * 2;
                    laserColor = 8;
                    break;

                case "ammunition_laser_rsb-75":
                    damage    *= 6;
                    laserColor = 6;
                    break;

                case "ammunition_laser_job-100":
                    damage    *= 4;
                    laserColor = 9;
                    break;
                }

                //TODO: RECODE!!!
                if (gameSession.Player.Controller.IsAutoRocketCpuActive())
                {
                    LaunchMissle(gameSession.Player.Settings.CurrentRocket.LootId);
                }

                if (gameSession.Player.Controller.IsAutoLauncherCpuActive())
                {
                    var rocketLauncher = Character.RocketLauncher;
                    if (rocketLauncher != null && rocketLauncher.Launchers.Length > 0)
                    {
                        if (rocketLauncher.CurrentLoad != rocketLauncher.GetMaxLoad())
                        {
                            rocketLauncher.Reload();
                        }
                        else
                        {
                            LaunchRocketLauncher();
                            rocketLauncher.Reload();
                        }
                    }
                }

                if (enemy is Character)
                {
                    UpdateAttacker(enemy as Character, gameSession.Player);
                }
            }
            else if (Character is Pet)
            {
                var pet = (Pet)Character;
                if (pet.GetOwner() == null)
                {
                    return;
                }
                var gameSession = World.StorageManager.GetGameSession(pet.GetOwner().Id);

                if (gameSession.Player.Settings.CurrentAmmo.Shoot() == 0)
                {
                    // NOTHING TO SHOOT
                    //TODO fix
                    //Packet.Builder.LegacyModule(gameSession,
                    //    "0|A|STD|No more ammo (todo: find a proper STM message)");
                    var getAmmo = gameSession.Player.Information.Ammunitions.Keys.ToList();
                    if (gameSession.Player.Settings.CurrentAmmo.LootId == getAmmo[0])
                    {
                        Attacking = false;
                        return;
                    }
                    var index = getAmmo.FindIndex(x => x == gameSession.Player.Settings.CurrentAmmo.LootId) - 1;
                    gameSession.Player.Settings.CurrentAmmo =
                        gameSession.Player.Information.Ammunitions[getAmmo[index]];
                    //gameSession.Player.Settings.OldClientShipSettingsCommand.selectedLaser = index;
                    //todo : fix
                    //Packet.Builder.SendSlotbars(gameSession);
                }

                var laserTypes = gameSession.Player.Equipment.LaserTypes();
                switch (gameSession.Player.Settings.CurrentAmmo.LootId)
                {
                case "ammunition_laser_mcb-25":
                    damage *= 2;
                    if (laserTypes == 3)
                    {
                        laserColor = 1;
                    }
                    break;

                case "ammunition_laser_mcb-50":
                    damage *= 3;
                    if (laserTypes == 3)
                    {
                        laserColor = 2;
                    }
                    break;

                case "ammunition_laser_ucb-100":
                    damage    *= 4;
                    laserColor = 3;
                    break;

                case "ammunition_laser_sab-50":
                    absDamage  = damage * 2;
                    damage    *= 0;
                    laserColor = 4;
                    break;

                case "ammunition_laser_cbo-100":
                    absDamage  = damage;
                    damage     = damage * 2;
                    laserColor = 8;
                    break;

                case "ammunition_laser_rsb-75":
                    damage    *= 6;
                    laserColor = 6;
                    break;

                case "ammunition_laser_job-100":
                    damage    *= 4;
                    laserColor = 9;
                    break;
                }
            }

            damage    = RandomizeDamage(damage);
            absDamage = RandomizeDamage(absDamage);
            //todo: fix
            //GameClient.SendToPlayerView(Character,
            //    netty.commands.new_client.AttackLaserRunCommand.write(Character.Id, enemy.Id, laserColor, enemy is Player,
            //        Character is Player), true);

            Controller.Damage?.Laser(enemy, damage, false);
            Controller.Damage?.Laser(enemy, absDamage, true);

            if (Character is Player)
            {
                var player = (Player)Character;
                if (player.Settings.CurrentAmmo.LootId != "ammunition_laser_sab-50")
                {
                    foreach (var tech in player.Techs)
                    {
                        if (tech is EnergyLeech)
                        {
                            var energyLeech = (EnergyLeech)tech;
                            energyLeech.ExecuteHeal(damage);
                        }
                    }
                }
            }
        }