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(); } } }
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); } } } } }