private void CheckRocketLauncherCount(RocketLauncherAmmunition rlAmmo, int count, out int currentCount) { PlayerController.Account.Vault.RocketLauncherAmmunitions.TryGetValue(rlAmmo.ID, out currentCount); currentCount -= count; PlayerController.Account.Vault.RocketLauncherAmmunitions[rlAmmo.ID] = currentCount; }
private void CalculateHellstormDamage(RocketLauncherAmmunition rlAmmo, int count, out double damage, out double shieldDamage) { if (rlAmmo.ID == RocketLauncherAmmunition.UBR_100.ID && !(PlayerController.Locked is PlayerController)) // pve { damage = Noise(rlAmmo.Damage * 1.8) * count; shieldDamage = Noise(rlAmmo.ShieldDamage * 1.8) * count; } else { damage = Noise(rlAmmo.Damage) * count; // normal damage shieldDamage = Noise(rlAmmo.ShieldDamage) * count; // sab damage (sab / cbo) } }
internal static ClientUISlotBarCategoryItemStatusModule RocketLauncherState(PlayerController controller, out bool loaded) { string selectedRLAmmo = "equipment_weapon_rocketlauncher_hst-2"; int count = 0; loaded = true; ClientUITooltipsCommand tooltips = new ClientUITooltipsCommand(new List <ClientUITooltipModule> { new ClientUITooltipModule( ClientUITooltipModule.STANDARD, "ttip_rocketlauncher", new ClientUITooltipTextFormatModule(ClientUITooltipTextFormatModule.LOCALIZED), new List <MessageWildcardReplacementModule> { new MessageWildcardReplacementModule("%TYPE%", "equipment_weapon_rocketlauncher_hst", new ClientUITooltipTextFormatModule(ClientUITooltipTextFormatModule.LOCALIZED) ) } ), new ClientUITooltipModule( ClientUITooltipModule.STANDARD, "ttip_rocketlauncher_loadcount", new ClientUITooltipTextFormatModule(ClientUITooltipTextFormatModule.LOCALIZED), new List <MessageWildcardReplacementModule> { new MessageWildcardReplacementModule("%COUNT%", count.ToString(), new ClientUITooltipTextFormatModule(ClientUITooltipTextFormatModule.PLAIN) ), new MessageWildcardReplacementModule("%TYPE%", selectedRLAmmo, new ClientUITooltipTextFormatModule(ClientUITooltipTextFormatModule.const_3135) ) } ), }); if (controller.Account.CurrentHangar.Selection.RocketLauncher != 0) { RocketLauncherAmmunition rocketLauncherAmmunition = controller.Account.CurrentHangar.Selection.RocketLauncher.FromRocketLauncherAmmunitions(); selectedRLAmmo = rocketLauncherAmmunition.Name; count = controller.Account.CurrentHangar.Selection.RocketLauncherLoadedCount; loaded = true; } return(new ClientUISlotBarCategoryItemStatusModule(true, true, "equipment_weapon_rocketlauncher_hst", tooltips, tooltips, false, controller.HangarAssembly.Ship.RocketLauncherSlots * 5, count, ClientUISlotBarCategoryItemStatusModule.BLUE, selectedRLAmmo, true, false, false )); }
private async void RocketLauncherDelayedAttack(EntityControllerBase target, RocketLauncherAmmunition rlAmmo, int hitCount) { await Task.Delay(750); try { if (target == null || PlayerController.Locked == null || PlayerController.Locked.ID != target.ID) { return; } CalculateHellstormDamage(rlAmmo, hitCount, out double damage, out double shieldDamage); if (shieldDamage > 0) { shieldDamage = Math.Abs(target.HangarAssembly.ChangeShield(-(int)shieldDamage, false)); PlayerController.HangarAssembly.ChangeShield((int)shieldDamage); } double shieldDamageDealt = shieldDamage; double hitpointsDamageDealt = 0; if (damage > 0) { double shieldAbsorption = Math.Max(0, Math.Min(1, target.BoosterAssembly.Get(BoosterType.SHIELD_ABSORBATION))); int damageShield = Math.Abs(target.HangarAssembly.ChangeShield(-(int)(damage * shieldAbsorption), false)); int damageHitpoints = Math.Abs(target.HangarAssembly.ChangeHitpoints(-(int)(damage - damageShield), false)); shieldDamageDealt += damageShield; hitpointsDamageDealt += damageHitpoints; } // set stats target.AttackTraceAssembly.LogAttack(PlayerController, (int)shieldDamageDealt, (int)hitpointsDamageDealt); target.HangarAssembly.CheckDeath(); if (target != null) { ICommand damageCommand = PacketBuilder.AttackCommand(PlayerController, target, AttackTypeModule.ROCKET, (int)(shieldDamage + damage)); target.Send(damageCommand); // send to player target.EntitiesLocked(y => y.Send(damageCommand)); // send to all who have him in lock } } catch (Exception e) { GameContext.Logger.LogError(e); } }
private void RocketLauncherTimer(ref int lapCount, RocketLauncherAmmunition rlAmmo) { lock (_rocketLauncherRocketLock) { if (!RocketLauncherCooldown()) { return; } if (PlayerController.Account.CurrentHangar.Selection.RocketLauncherLoadedCount < PlayerController.HangarAssembly.Ship.RocketLauncherSlots * 5) { if (!PlayerController.Account.Vault.RocketLauncherAmmunitions.TryGetValue(PlayerController.Account.CurrentHangar.Selection.RocketLauncher, out int count) || count == PlayerController.Account.CurrentHangar.Selection.RocketLauncherLoadedCount) { if (count == 0) // wenn eine rakete geladen wurde, und ein angriff stattfindet, dann soll diese auch verschossen werden { return; } } else { if (!RocketLauncherRocketCooldown(ref lapCount)) { return; } PlayerController.Account.CurrentHangar.Selection.RocketLauncherLoadedCount++; PlayerController.Send(PacketBuilder.Slotbar.RocketLauncherStateCommand(PlayerController)); return; } } if (_attackRunning && PlayerController.Account.CurrentHangar.Selection.AutoRocketLauncherCpu) { RocketLauncherAttack(PlayerController.Account.CurrentHangar.Selection.RocketLauncherLoadedCount, rlAmmo); // trigger attack } } }
public void RocketLauncherAttack(int count, RocketLauncherAmmunition rlAmmo) { lock (_rocketLauncherLock) { #region {[ CHECKING ]} if (PlayerController.Locked == null || PlayerController.Locked.MovementAssembly.ActualPosition() .DistanceTo(PlayerController.MovementAssembly.ActualPosition()) > 650 || count <= 0) { return; } if (PlayerController.Locked.ZoneAssembly.IsInDMZ) { PlayerController.Send(PacketBuilder.Messages.PeaceArea()); return; } if (!RocketLauncherCooldown()) { return; } CheckRocketLauncherCount(rlAmmo, count, out int currentCount); #endregion LastAttack = PlayerController.CurrentClock.ElapsedMilliseconds; _lastRocketLauncherAttack = PlayerController.CurrentClock.ElapsedMilliseconds; PlayerController.Account.CurrentHangar.Selection.RocketLauncherLoadedCount = 0; ICommand attackCommand = PacketBuilder.AttackHellstormCommand(PlayerController, PlayerController.Locked, count, (short)rlAmmo.ID); PlayerController.Send( attackCommand, PacketBuilder.Slotbar.RocketLauncherStateCommand(PlayerController), PacketBuilder.Slotbar.ItemCooldownCommand("equipment_weapon_rocketlauncher_hst", (int)(3000 * PlayerController.BoosterAssembly.Get(BoosterType.ROCKET_LAUNCHER_COOLDOWN))), PacketBuilder.Slotbar.RocketItemStatus(rlAmmo.Name, currentCount, false) ); PlayerController.EntitesInRange(x => x.Send(attackCommand)); int hitCount = 0; for (int i = 0; i < count; i++) { if (!Miss()) { hitCount++; } } if (PlayerController.Locked.EffectsAssembly.HasProtection || (rlAmmo.ID != RocketLauncherAmmunition.HSTRM_01.ID && PlayerController.Locked is PlayerController lockedPlayerController && lockedPlayerController.SpecialItemsAssembly.IsInvicible) || hitCount == 0) { PlayerController.Locked.AttackTraceAssembly.LogAttack(PlayerController, 0, 0); ICommand missCommand = new AttackMissedCommand(new AttackTypeModule(AttackTypeModule.LASER), PlayerController.Locked.ID, 0); PlayerController.Locked.Send(new AttackMissedCommand(new AttackTypeModule(AttackTypeModule.LASER), PlayerController.Locked.ID, 1)); PlayerController.Locked.EntitiesLocked(x => x.Send(missCommand)); return; } RocketLauncherDelayedAttack(PlayerController.Locked, rlAmmo, hitCount); } }