From 4d09ed9245aeefd71ca5a936f999f36a4a9342e3 Mon Sep 17 00:00:00 2001 From: Aviu00 <93730715+Aviu00@users.noreply.github.com> Date: Tue, 11 Jun 2024 20:07:47 +0000 Subject: [PATCH] Spellblade update (#346) * - tweak: Don't close eui too quickly. * - add: Spellblade update. * - fix: Cult teleport spell. --- ...ortSpellEui.cs => CultTeleportSpellEui.cs} | 17 ++- .../_White/Wizard/SpellBlade/SpellBladeBUI.cs | 57 +++++++++ .../Wizard/SpellBlade/SpellBladeSystem.cs | 7 ++ ...tSpellEui.cs => WizardTeleportSpellEui.cs} | 4 +- .../Atmos/EntitySystems/FlammableSystem.cs | 26 +++- .../Temperature/Systems/TemperatureSystem.cs | 27 +++- .../LowTemperatureSlowdownSystem.cs | 7 +- .../Cult/Runes/Systems/CultSystem.Actions.cs | 2 +- .../Cult/Runes/Systems/CultSystem.Rune.cs | 18 ++- ...ortSpellEui.cs => CultTeleportSpellEui.cs} | 8 +- .../_White/Wizard/Magic/WizardSpellsSystem.cs | 2 +- .../Wizard/SpellBlade/FireAspectComponent.cs | 6 + .../Wizard/SpellBlade/FrostAspectComponent.cs | 13 ++ .../SpellBlade/LightningAspectComponent.cs | 22 ++++ .../Wizard/SpellBlade/SpellBladeSystem.cs | 79 ++++++++++++ ...tSpellEui.cs => WizardTeleportSpellEui.cs} | 12 +- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 5 + .../_White/BetrayalDagger/BlinkComponent.cs | 3 +- ...iState.cs => CultTeleportSpellEuiState.cs} | 2 +- .../SpellBlade/SharedSpellBladeSystem.cs | 115 ++++++++++++++++++ .../Wizard/SpellBlade/SpellBladeComponent.cs | 39 ++++++ ...tate.cs => WizardTeleportSpellEuiState.cs} | 2 +- .../Audio/White/Magic/spellblade-aspect.ogg | Bin 0 -> 43378 bytes .../Prototypes/Entities/Effects/lightning.yml | 13 ++ .../Weapons/Guns/Projectiles/magic.yml | 41 +++++++ .../Objects/Weapons/chaplain_weapons.yml | 26 ---- .../Prototypes/_White/Wizard/magic_items.yml | 30 +++++ .../Prototypes/_White/Wizard/spellblade.yml | 49 ++++++++ .../_White/Wizard/spellbook_catalog.yml | 13 ++ .../Magic/magicactions.rsi/icebeam_active.png | Bin 0 -> 294 bytes .../Objects/Magic/magicactions.rsi/meta.json | 3 + 31 files changed, 583 insertions(+), 65 deletions(-) rename Content.Client/_White/Cult/UI/TeleportSpell/{TeleportSpellEui.cs => CultTeleportSpellEui.cs} (71%) create mode 100644 Content.Client/_White/Wizard/SpellBlade/SpellBladeBUI.cs create mode 100644 Content.Client/_White/Wizard/SpellBlade/SpellBladeSystem.cs rename Content.Client/_White/Wizard/TeleportSpell/{TeleportSpellEui.cs => WizardTeleportSpellEui.cs} (89%) rename Content.Server/_White/Cult/UI/{TeleportSpellEui.cs => CultTeleportSpellEui.cs} (95%) create mode 100644 Content.Server/_White/Wizard/SpellBlade/FireAspectComponent.cs create mode 100644 Content.Server/_White/Wizard/SpellBlade/FrostAspectComponent.cs create mode 100644 Content.Server/_White/Wizard/SpellBlade/LightningAspectComponent.cs create mode 100644 Content.Server/_White/Wizard/SpellBlade/SpellBladeSystem.cs rename Content.Server/_White/Wizard/Teleport/{TeleportSpellEui.cs => WizardTeleportSpellEui.cs} (88%) rename Content.Shared/_White/Cult/UI/{TeleportSpellEuiState.cs => CultTeleportSpellEuiState.cs} (84%) create mode 100644 Content.Shared/_White/Wizard/SpellBlade/SharedSpellBladeSystem.cs create mode 100644 Content.Shared/_White/Wizard/SpellBlade/SpellBladeComponent.cs rename Content.Shared/_White/Wizard/Teleport/{TeleportSpellEuiState.cs => WizardTeleportSpellEuiState.cs} (84%) create mode 100644 Resources/Audio/White/Magic/spellblade-aspect.ogg create mode 100644 Resources/Prototypes/_White/Wizard/spellblade.yml create mode 100644 Resources/Textures/Objects/Magic/magicactions.rsi/icebeam_active.png diff --git a/Content.Client/_White/Cult/UI/TeleportSpell/TeleportSpellEui.cs b/Content.Client/_White/Cult/UI/TeleportSpell/CultTeleportSpellEui.cs similarity index 71% rename from Content.Client/_White/Cult/UI/TeleportSpell/TeleportSpellEui.cs rename to Content.Client/_White/Cult/UI/TeleportSpell/CultTeleportSpellEui.cs index a6e921263e..c46f264af5 100644 --- a/Content.Client/_White/Cult/UI/TeleportSpell/TeleportSpellEui.cs +++ b/Content.Client/_White/Cult/UI/TeleportSpell/CultTeleportSpellEui.cs @@ -3,23 +3,19 @@ using Content.Client._White.Cult.UI.TeleportRunesList; using Content.Client.Eui; using Content.Shared.Eui; using Content.Shared._White.Cult.UI; +using JetBrains.Annotations; namespace Content.Client._White.Cult.UI.TeleportSpell; -public sealed class TeleportSpellEui : BaseEui +[UsedImplicitly] +public sealed class CultTeleportSpellEui : BaseEui { - - private TeleportRunesListWindow _window; - - public TeleportSpellEui() - { - _window = new TeleportRunesListWindow(); - } + private readonly TeleportRunesListWindow _window = new(); public override void Opened() { _window.OpenCentered(); - _window.ItemSelected += (index, _) => SendMessage(new TeleportSpellTargetRuneSelected(){RuneUid = index}); + _window.ItemSelected += (index, _) => SendMessage(new TeleportSpellTargetRuneSelected {RuneUid = index}); _window.OnClose += () => SendMessage(new CloseEuiMessage()); base.Opened(); @@ -33,7 +29,8 @@ public sealed class TeleportSpellEui : BaseEui public override void HandleState(EuiStateBase state) { - if(state is not TeleportSpellEuiState cast) return; + if (state is not CultTeleportSpellEuiState cast) + return; _window.Clear(); _window.PopulateList(cast.Runes.Keys.ToList(), cast.Runes.Values.ToList()); diff --git a/Content.Client/_White/Wizard/SpellBlade/SpellBladeBUI.cs b/Content.Client/_White/Wizard/SpellBlade/SpellBladeBUI.cs new file mode 100644 index 0000000000..b9fa571196 --- /dev/null +++ b/Content.Client/_White/Wizard/SpellBlade/SpellBladeBUI.cs @@ -0,0 +1,57 @@ +using Content.Client._White.UserInterface.Radial; +using Content.Shared._White.Wizard.SpellBlade; +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Shared.Prototypes; + +namespace Content.Client._White.Wizard.SpellBlade; + +[UsedImplicitly] +// ReSharper disable once InconsistentNaming +public sealed class SpellBladeBUI(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey) +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + + private RadialContainer? _aspectSelector; + + protected override void Open() + { + base.Open(); + + if (!_entityManager.TryGetComponent(Owner, out SpellBladeComponent? spellBlade) || + spellBlade.ChosenAspect != string.Empty) + return; + + var spriteSystem = _entityManager.System(); + _aspectSelector = new RadialContainer(); + + _aspectSelector.Closed += Close; + + foreach (var aspect in spellBlade.Aspects) + { + if (!_prototypeManager.TryIndex(aspect, out var proto)) + continue; + + var button = _aspectSelector.AddButton(proto.Name, + spriteSystem.GetPrototypeIcon(proto).Default); + button.Tooltip = proto.Description; + + button.Controller.OnPressed += _ => + { + SendMessage(new SpellBladeSystemMessage(aspect)); + _aspectSelector.Close(); + }; + + } + + _aspectSelector.OpenAttachedLocalPlayer(); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + _aspectSelector?.Close(); + } +} diff --git a/Content.Client/_White/Wizard/SpellBlade/SpellBladeSystem.cs b/Content.Client/_White/Wizard/SpellBlade/SpellBladeSystem.cs new file mode 100644 index 0000000000..53905772c3 --- /dev/null +++ b/Content.Client/_White/Wizard/SpellBlade/SpellBladeSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared._White.Wizard.SpellBlade; + +namespace Content.Client._White.Wizard.SpellBlade; + +public sealed class SpellBladeSystem : SharedSpellBladeSystem +{ +} diff --git a/Content.Client/_White/Wizard/TeleportSpell/TeleportSpellEui.cs b/Content.Client/_White/Wizard/TeleportSpell/WizardTeleportSpellEui.cs similarity index 89% rename from Content.Client/_White/Wizard/TeleportSpell/TeleportSpellEui.cs rename to Content.Client/_White/Wizard/TeleportSpell/WizardTeleportSpellEui.cs index ddbf1f63f2..613983a238 100644 --- a/Content.Client/_White/Wizard/TeleportSpell/TeleportSpellEui.cs +++ b/Content.Client/_White/Wizard/TeleportSpell/WizardTeleportSpellEui.cs @@ -8,7 +8,7 @@ using JetBrains.Annotations; namespace Content.Client._White.Wizard.TeleportSpell; [UsedImplicitly] -public sealed class TeleportSpellEui : BaseEui +public sealed class WizardTeleportSpellEui : BaseEui { private readonly TeleportRunesListWindow _window = new(); @@ -30,7 +30,7 @@ public sealed class TeleportSpellEui : BaseEui public override void HandleState(EuiStateBase state) { - if (state is not TeleportSpellEuiState cast) + if (state is not WizardTeleportSpellEuiState cast) return; _window.Clear(); diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index 72835e7819..84f7616675 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -1,3 +1,4 @@ +using Content.Server._White.Wizard.SpellBlade; using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.IgnitionSource; @@ -49,6 +50,7 @@ namespace Content.Server.Atmos.EntitySystems [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SpellBladeSystem _spellBlade = default!; // WD public const float MinimumFireStacks = -10f; public const float MaximumFireStacks = 20f; @@ -84,13 +86,19 @@ namespace Content.Server.Atmos.EntitySystems private void OnMeleeHit(EntityUid uid, IgniteOnMeleeHitComponent component, MeleeHitEvent args) { + // WD START + var fireStacks = component.FireStacks; + if (args.Direction != null) // Heavy attack + fireStacks *= 0.5f; + // WD END + foreach (var entity in args.HitEntities) { if (!TryComp(entity, out var flammable)) continue; - AdjustFireStacks(entity, component.FireStacks, flammable); - if (component.FireStacks >= 0) + AdjustFireStacks(entity, fireStacks, flammable); // WD EDIT + if (fireStacks >= 0) // WD EDIT Ignite(entity, args.Weapon, flammable, args.User); } } @@ -203,8 +211,15 @@ namespace Content.Server.Atmos.EntitySystems if (!flammable.OnFire && !otherFlammable.OnFire) return; // Neither are on fire + // WD START + var weHold = _spellBlade.IsHoldingItemWithComponent(uid); + var theyHold = _spellBlade.IsHoldingItemWithComponent(otherUid); + // WD END + if (flammable.OnFire && otherFlammable.OnFire) { + if (weHold && !theyHold || theyHold && !weHold) // WD + return; // Both are on fire -> equalize fire stacks. var avg = (flammable.FireStacks + otherFlammable.FireStacks) / 2; flammable.FireStacks = flammable.CanExtinguish ? avg : Math.Max(flammable.FireStacks, avg); @@ -217,6 +232,8 @@ namespace Content.Server.Atmos.EntitySystems // Only one is on fire -> attempt to spread the fire. if (flammable.OnFire) { + if (theyHold) // WD + return; otherFlammable.FireStacks += flammable.FireStacks / 2; Ignite(otherUid, uid, otherFlammable); if (flammable.CanExtinguish) @@ -227,6 +244,8 @@ namespace Content.Server.Atmos.EntitySystems } else { + if (weHold) // WD + return; flammable.FireStacks += otherFlammable.FireStacks / 2; Ignite(uid, otherUid, flammable); if (otherFlammable.CanExtinguish) @@ -436,7 +455,8 @@ namespace Content.Server.Atmos.EntitySystems if (TryComp(uid, out TemperatureComponent? temp)) _temperatureSystem.ChangeHeat(uid, 12500 * damageScale, false, temp); - _damageableSystem.TryChangeDamage(uid, flammable.Damage * damageScale, interruptsDoAfters: false); + if (!_spellBlade.IsHoldingItemWithComponent(uid)) // WD EDIT + _damageableSystem.TryChangeDamage(uid, flammable.Damage * damageScale, interruptsDoAfters: false); AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable); } diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index 685874624e..bc44304679 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using Content.Server._White.Wizard.SpellBlade; using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; @@ -22,6 +23,7 @@ public sealed class TemperatureSystem : EntitySystem [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly SpellBladeSystem _spellBlade = default!; // WD /// /// All the components that will have their damage updated at the end of the tick. @@ -266,6 +268,17 @@ public sealed class TemperatureSystem : EntitySystem if (temperature.CurrentTemperature >= heatDamageThreshold) { + // WD START + if (_spellBlade.IsHoldingItemWithComponent(uid)) + { + if (!temperature.TakingDamage) + return; + _adminLogger.Add(LogType.Temperature, + $"{ToPrettyString(uid):entity} stopped taking temperature damage"); + temperature.TakingDamage = false; + return; + } + // WD END if (!temperature.TakingDamage) { _adminLogger.Add(LogType.Temperature, $"{ToPrettyString(uid):entity} started taking high temperature damage"); @@ -278,7 +291,8 @@ public sealed class TemperatureSystem : EntitySystem } else if (temperature.CurrentTemperature <= coldDamageThreshold) { - if (TryComp(uid, out VoidAdaptationComponent? voidAdaptation)) // WD + // WD START + if (TryComp(uid, out VoidAdaptationComponent? voidAdaptation)) { if (temperature.TakingDamage) { @@ -291,6 +305,17 @@ public sealed class TemperatureSystem : EntitySystem return; } + if (_spellBlade.IsHoldingItemWithComponent(uid)) + { + if (!temperature.TakingDamage) + return; + _adminLogger.Add(LogType.Temperature, + $"{ToPrettyString(uid):entity} stopped taking temperature damage"); + temperature.TakingDamage = false; + return; + } + // WD END + if (!temperature.TakingDamage) { _adminLogger.Add(LogType.Temperature, $"{ToPrettyString(uid):entity} started taking low temperature damage"); diff --git a/Content.Server/_White/ChangeTemperatureOnCollide/LowTemperatureSlowdownSystem.cs b/Content.Server/_White/ChangeTemperatureOnCollide/LowTemperatureSlowdownSystem.cs index cb1c676496..ac43c5dcef 100644 --- a/Content.Server/_White/ChangeTemperatureOnCollide/LowTemperatureSlowdownSystem.cs +++ b/Content.Server/_White/ChangeTemperatureOnCollide/LowTemperatureSlowdownSystem.cs @@ -1,3 +1,4 @@ +using Content.Server._White.Wizard.SpellBlade; using Content.Server.Temperature.Components; using Content.Server.Temperature.Systems; using Content.Shared.Changeling; @@ -10,6 +11,7 @@ namespace Content.Server._White.ChangeTemperatureOnCollide; public sealed class LowTemperatureSlowdownSystem : EntitySystem { [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; + [Dependency] private readonly SpellBladeSystem _spellBlade = default!; public override void Initialize() { @@ -22,7 +24,8 @@ public sealed class LowTemperatureSlowdownSystem : EntitySystem private void OnMoveSpeedRefresh(EntityUid uid, TemperatureComponent component, RefreshMovementSpeedModifiersEvent args) { - var modifier = HasComp(uid) || HasComp(uid) || !component.Slowdown + var modifier = _spellBlade.IsHoldingItemWithComponent(uid) || + HasComp(uid) || HasComp(uid) || !component.Slowdown ? 1f : GetSpeedModifier(component.CurrentTemperature); args.ModifySpeed(modifier, modifier); @@ -32,7 +35,7 @@ public sealed class LowTemperatureSlowdownSystem : EntitySystem OnTemperatureChangeEvent args) { // ReSharper disable once CompareOfFloatsByEqualityOperator - if(GetSpeedModifier(args.LastTemperature) == GetSpeedModifier(args.CurrentTemperature)) + if (GetSpeedModifier(args.LastTemperature) == GetSpeedModifier(args.CurrentTemperature)) return; _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(uid, component); diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs index e1fe8b31cc..6004d21a1b 100644 --- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs +++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Actions.cs @@ -148,7 +148,7 @@ public partial class CultSystem _bloodstreamSystem.TryModifyBloodLevel(uid, -5, bloodstream, createPuddle: false); - var eui = new TeleportSpellEui(args.Performer, args.Target); + var eui = new CultTeleportSpellEui(args.Performer, args.Target); _euiManager.OpenEui(eui, actor.PlayerSession); eui.StateDirty(); diff --git a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs index 3cf9396574..0aecf9b99c 100644 --- a/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs +++ b/Content.Server/_White/Cult/Runes/Systems/CultSystem.Rune.cs @@ -631,6 +631,18 @@ public sealed partial class CultSystem : EntitySystem } private bool Teleport(EntityUid rune, EntityUid user, List? victims = null) + { + if (!OpenTeleportUi(user, rune)) + return false; + + _entityManager.EnsureComponent(user, out var providerComponent); + providerComponent.Targets = victims; + providerComponent.BaseRune = rune; + + return true; + } + + private bool OpenTeleportUi(EntityUid user, EntityUid? exceptRune = null) { var runesQuery = EntityQueryEnumerator(); var list = new List(); @@ -641,7 +653,7 @@ public sealed partial class CultSystem : EntitySystem if (teleportComponent.Label == null) continue; - if (runeUid == rune) + if (runeUid == exceptRune) continue; if (!int.TryParse(runeUid.ToString(), out var intValue)) @@ -665,10 +677,6 @@ public sealed partial class CultSystem : EntitySystem return false; } - _entityManager.EnsureComponent(user, out var providerComponent); - providerComponent.Targets = victims; - providerComponent.BaseRune = rune; - _ui.SetUiState(ui, new TeleportRunesListWindowBUIState(list, labels)); if (_ui.IsUiOpen(user, ui.UiKey)) diff --git a/Content.Server/_White/Cult/UI/TeleportSpellEui.cs b/Content.Server/_White/Cult/UI/CultTeleportSpellEui.cs similarity index 95% rename from Content.Server/_White/Cult/UI/TeleportSpellEui.cs rename to Content.Server/_White/Cult/UI/CultTeleportSpellEui.cs index 0947aec86a..8d568dc7cc 100644 --- a/Content.Server/_White/Cult/UI/TeleportSpellEui.cs +++ b/Content.Server/_White/Cult/UI/CultTeleportSpellEui.cs @@ -10,7 +10,7 @@ using Robust.Shared.Timing; namespace Content.Server._White.Cult.UI; -public sealed class TeleportSpellEui : BaseEui +public sealed class CultTeleportSpellEui : BaseEui { [Dependency] private readonly EntityManager _entityManager = default!; private readonly SharedTransformSystem _transformSystem; @@ -22,7 +22,7 @@ public sealed class TeleportSpellEui : BaseEui private bool _used; - public TeleportSpellEui(EntityUid performer, EntityUid target) + public CultTeleportSpellEui(EntityUid performer, EntityUid target) { IoCManager.InjectDependencies(this); @@ -39,7 +39,7 @@ public sealed class TeleportSpellEui : BaseEui public override EuiStateBase GetNewState() { var runesQuery = _entityManager.EntityQueryEnumerator(); - var state = new TeleportSpellEuiState(); + var state = new CultTeleportSpellEuiState(); while (runesQuery.MoveNext(out var runeUid, out var rune)) { @@ -110,4 +110,4 @@ public sealed class TeleportSpellEui : BaseEui _transformSystem.SetCoordinates(_target, runeTransform.Coordinates); Close(); } -} \ No newline at end of file +} diff --git a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs index 5a1c0ef886..6c0dec15af 100644 --- a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs +++ b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs @@ -105,7 +105,7 @@ public sealed class WizardSpellsSystem : EntitySystem if (!TryComp(msg.Performer, out ActorComponent? actor)) return; - var eui = new TeleportSpellEui(msg.Performer); + var eui = new WizardTeleportSpellEui(msg.Performer); _euiManager.OpenEui(eui, actor.PlayerSession); eui.StateDirty(); diff --git a/Content.Server/_White/Wizard/SpellBlade/FireAspectComponent.cs b/Content.Server/_White/Wizard/SpellBlade/FireAspectComponent.cs new file mode 100644 index 0000000000..9c787a3d86 --- /dev/null +++ b/Content.Server/_White/Wizard/SpellBlade/FireAspectComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Server._White.Wizard.SpellBlade; + +[RegisterComponent] +public sealed partial class FireAspectComponent : Component +{ +} diff --git a/Content.Server/_White/Wizard/SpellBlade/FrostAspectComponent.cs b/Content.Server/_White/Wizard/SpellBlade/FrostAspectComponent.cs new file mode 100644 index 0000000000..8c3f6dd5fa --- /dev/null +++ b/Content.Server/_White/Wizard/SpellBlade/FrostAspectComponent.cs @@ -0,0 +1,13 @@ +using Content.Shared.Atmos; + +namespace Content.Server._White.Wizard.SpellBlade; + +[RegisterComponent] +public sealed partial class FrostAspectComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public float TemperatureOnHit = 100; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public float MinTemperature = Atmospherics.TCMB; +} diff --git a/Content.Server/_White/Wizard/SpellBlade/LightningAspectComponent.cs b/Content.Server/_White/Wizard/SpellBlade/LightningAspectComponent.cs new file mode 100644 index 0000000000..597a1531b5 --- /dev/null +++ b/Content.Server/_White/Wizard/SpellBlade/LightningAspectComponent.cs @@ -0,0 +1,22 @@ +namespace Content.Server._White.Wizard.SpellBlade; + +[RegisterComponent] +public sealed partial class LightningAspectComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public float Range = 2f; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public int BoltCount = 3; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string LightningPrototype = "WeakWizardLightning"; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public int ArcDepth = 2; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan ShockRate = TimeSpan.FromSeconds(10); + + public TimeSpan NextShock; +} diff --git a/Content.Server/_White/Wizard/SpellBlade/SpellBladeSystem.cs b/Content.Server/_White/Wizard/SpellBlade/SpellBladeSystem.cs new file mode 100644 index 0000000000..64df84d8fe --- /dev/null +++ b/Content.Server/_White/Wizard/SpellBlade/SpellBladeSystem.cs @@ -0,0 +1,79 @@ +using Content.Server.Atmos.Components; +using Content.Server.Lightning; +using Content.Server.Temperature.Components; +using Content.Server.Temperature.Systems; +using Content.Shared._White.Wizard.SpellBlade; +using Content.Shared.Weapons.Melee.Events; +using Robust.Shared.Timing; + +namespace Content.Server._White.Wizard.SpellBlade; + +public sealed class SpellBladeSystem : SharedSpellBladeSystem +{ + [Dependency] private readonly TemperatureSystem _temperature = default!; + [Dependency] private readonly LightningSystem _lightning = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnFrostMeleeHit); + SubscribeLocalEvent(OnLightningMeleeHit); + } + + private void OnLightningMeleeHit(Entity ent, ref MeleeHitEvent args) + { + if (args.Direction != null || args.HitEntities.Count != 1) + return; + + if (ent.Comp.NextShock > _timing.CurTime) + return; + + ent.Comp.NextShock = _timing.CurTime + ent.Comp.ShockRate; + + _lightning.ShootRandomLightnings(args.HitEntities[0], ent.Comp.Range, ent.Comp.BoltCount, + ent.Comp.LightningPrototype, ent.Comp.ArcDepth, false, args.User); + } + + private void OnFrostMeleeHit(Entity ent, ref MeleeHitEvent args) + { + var temp = ent.Comp.TemperatureOnHit; + if (args.Direction != null) // Heavy attack + temp *= 0.5f; + + foreach (var entity in args.HitEntities) + { + if (!TryComp(entity, out var temperature)) + continue; + + var curTemp = temperature.CurrentTemperature; + var newTemp = curTemp - temp; + + newTemp = curTemp < ent.Comp.MinTemperature + ? MathF.Min(curTemp, newTemp) + : Math.Max(newTemp, ent.Comp.MinTemperature); + + _temperature.ForceChangeTemperature(entity, newTemp, temperature); + } + } + + protected override void ApplyFireAspect(EntityUid uid) + { + var ignite = EnsureComp(uid); + ignite.FireStacks = 2f; + EnsureComp(uid); + } + + protected override void ApplyFrostAspect(EntityUid uid) + { + var ignite = EnsureComp(uid); + ignite.FireStacks = -5f; + EnsureComp(uid); + } + + protected override void ApplyLightningAspect(EntityUid uid) + { + EnsureComp(uid); + } +} diff --git a/Content.Server/_White/Wizard/Teleport/TeleportSpellEui.cs b/Content.Server/_White/Wizard/Teleport/WizardTeleportSpellEui.cs similarity index 88% rename from Content.Server/_White/Wizard/Teleport/TeleportSpellEui.cs rename to Content.Server/_White/Wizard/Teleport/WizardTeleportSpellEui.cs index f9bb440233..2aa84f1f22 100644 --- a/Content.Server/_White/Wizard/Teleport/TeleportSpellEui.cs +++ b/Content.Server/_White/Wizard/Teleport/WizardTeleportSpellEui.cs @@ -1,14 +1,12 @@ -using System.Linq; -using Content.Server.EUI; +using Content.Server.EUI; using Content.Server.Popups; using Content.Shared._White.Wizard.Teleport; using Content.Shared.Eui; using Robust.Shared.Timing; -using TeleportSpellEuiState = Content.Shared._White.Wizard.Teleport.TeleportSpellEuiState; namespace Content.Server._White.Wizard.Teleport; -public sealed class TeleportSpellEui : BaseEui +public sealed class WizardTeleportSpellEui : BaseEui { [Dependency] private readonly EntityManager _entityManager = default!; private readonly SharedTransformSystem _transformSystem; @@ -19,7 +17,7 @@ public sealed class TeleportSpellEui : BaseEui private bool _used; - public TeleportSpellEui(EntityUid performer) + public WizardTeleportSpellEui(EntityUid performer) { IoCManager.InjectDependencies(this); @@ -29,13 +27,13 @@ public sealed class TeleportSpellEui : BaseEui _performer = performer; - Timer.Spawn(TimeSpan.FromSeconds(10), Close); + Timer.Spawn(TimeSpan.FromSeconds(60), Close); } public override EuiStateBase GetNewState() { var locationQuery = _entityManager.EntityQueryEnumerator(); - var state = new TeleportSpellEuiState(); + var state = new WizardTeleportSpellEuiState(); while (locationQuery.MoveNext(out var locationUid, out var locationComponent, out var transformComponent)) { diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index ca5db48c8d..873e3eeaa6 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -533,6 +533,11 @@ public abstract partial class SharedGunSystem : EntitySystem Dirty(gun); } // WD EDIT + public void SetUseKey(GunComponent gun, bool useKey) + { + gun.UseKey = useKey; + } + public void SetProjectileSpeed(EntityUid weapon, float projectileSpeed) { if(!TryComp(weapon, out var gunComponent)) diff --git a/Content.Shared/_White/BetrayalDagger/BlinkComponent.cs b/Content.Shared/_White/BetrayalDagger/BlinkComponent.cs index 64163d0284..b75684b977 100644 --- a/Content.Shared/_White/BetrayalDagger/BlinkComponent.cs +++ b/Content.Shared/_White/BetrayalDagger/BlinkComponent.cs @@ -1,10 +1,11 @@ using System.Numerics; using Robust.Shared.Audio; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared._White.BetrayalDagger; -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class BlinkComponent : Component { [DataField, ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Shared/_White/Cult/UI/TeleportSpellEuiState.cs b/Content.Shared/_White/Cult/UI/CultTeleportSpellEuiState.cs similarity index 84% rename from Content.Shared/_White/Cult/UI/TeleportSpellEuiState.cs rename to Content.Shared/_White/Cult/UI/CultTeleportSpellEuiState.cs index 4d7a0831de..33dc445049 100644 --- a/Content.Shared/_White/Cult/UI/TeleportSpellEuiState.cs +++ b/Content.Shared/_White/Cult/UI/CultTeleportSpellEuiState.cs @@ -4,7 +4,7 @@ using Robust.Shared.Serialization; namespace Content.Shared._White.Cult.UI; [Serializable, NetSerializable] -public sealed class TeleportSpellEuiState : EuiStateBase +public sealed class CultTeleportSpellEuiState : EuiStateBase { public Dictionary Runes = new(); } diff --git a/Content.Shared/_White/Wizard/SpellBlade/SharedSpellBladeSystem.cs b/Content.Shared/_White/Wizard/SpellBlade/SharedSpellBladeSystem.cs new file mode 100644 index 0000000000..af0f27fa46 --- /dev/null +++ b/Content.Shared/_White/Wizard/SpellBlade/SharedSpellBladeSystem.cs @@ -0,0 +1,115 @@ +using System.Linq; +using Content.Shared._White.BetrayalDagger; +using Content.Shared.Examine; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Popups; +using Content.Shared.UserInterface; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; + +namespace Content.Shared._White.Wizard.SpellBlade; + +public abstract class SharedSpellBladeSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedGunSystem _gun = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMessage); + SubscribeLocalEvent(OnOpenAttempt); + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if (ent.Comp.ChosenAspect == string.Empty) + { + args.PushMarkup("Аспект не выбран."); + return; + } + + var proto = _prototypeManager.Index(ent.Comp.ChosenAspect); + + args.PushMarkup($"Выбранный аспект: {proto.Name}"); + } + + private void OnOpenAttempt(Entity ent, ref ActivatableUIOpenAttemptEvent args) + { + if (ent.Comp.ChosenAspect == string.Empty) + return; + + _popup.PopupEntity("Аспект уже выбран.", args.User, args.User); + args.Cancel(); + } + + private void OnMessage(Entity ent, ref SpellBladeSystemMessage args) + { + if (ent.Comp.ChosenAspect != string.Empty) + return; + + switch (args.ProtoId) + { + case "AspectFire": + ApplyFireAspect(ent); + break; + case "AspectFrost": + ApplyFrostAspect(ent); + break; + case "AspectLightning": + ApplyLightningAspect(ent); + break; + case "AspectBluespace": + ApplyBluespaceAspect(ent); + break; + case "AspectMagicMissile": + ApplyMagicMissileAspect(ent); + break; + default: + return; + } + + ent.Comp.ChosenAspect = args.ProtoId; + + _audio.PlayPvs(ent.Comp.AspectChosenSound, ent); + + + Dirty(ent); + } + + protected virtual void ApplyFireAspect(EntityUid uid) { } + + protected virtual void ApplyFrostAspect(EntityUid uid) { } + + protected virtual void ApplyLightningAspect(EntityUid uid) { } + + private void ApplyBluespaceAspect(EntityUid uid) + { + var blink = EnsureComp(uid); + blink.Distance = 15f; + blink.BlinkRate = 1f; + } + + private void ApplyMagicMissileAspect(EntityUid uid) + { + var gun = EnsureComp(uid); + _gun.SetUseKey(gun, false); + _gun.SetSound(uid, new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/Magic/staff_healing.ogg")); + _gun.SetFireRate(uid, 1.2f); + var ammoProvider = EnsureComp(uid); + ammoProvider.Proto = "ProjectileMagicMissile"; + } + + public bool IsHoldingItemWithComponent(EntityUid uid) where T : Component + { + return _hands.EnumerateHeld(uid).Any(HasComp); + } +} diff --git a/Content.Shared/_White/Wizard/SpellBlade/SpellBladeComponent.cs b/Content.Shared/_White/Wizard/SpellBlade/SpellBladeComponent.cs new file mode 100644 index 0000000000..ff1fc59b31 --- /dev/null +++ b/Content.Shared/_White/Wizard/SpellBlade/SpellBladeComponent.cs @@ -0,0 +1,39 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.Wizard.SpellBlade; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SpellBladeComponent : Component +{ + [ViewVariables, AutoNetworkedField] + public string ChosenAspect = string.Empty; + + [DataField] + public List Aspects = new() + { + "AspectFire", + "AspectFrost", + "AspectLightning", + "AspectBluespace", + "AspectMagicMissile" + }; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier AspectChosenSound = new SoundPathSpecifier("/Audio/White/Magic/spellblade-aspect.ogg"); +} + +[Serializable, NetSerializable] +public sealed class SpellBladeSystemMessage(EntProtoId protoId) : BoundUserInterfaceMessage +{ + public EntProtoId ProtoId = protoId; +} + + +[Serializable, NetSerializable] +public enum SpellBladeUiKey : byte +{ + Key +} diff --git a/Content.Shared/_White/Wizard/Teleport/TeleportSpellEuiState.cs b/Content.Shared/_White/Wizard/Teleport/WizardTeleportSpellEuiState.cs similarity index 84% rename from Content.Shared/_White/Wizard/Teleport/TeleportSpellEuiState.cs rename to Content.Shared/_White/Wizard/Teleport/WizardTeleportSpellEuiState.cs index 7161f85018..26d6a3e236 100644 --- a/Content.Shared/_White/Wizard/Teleport/TeleportSpellEuiState.cs +++ b/Content.Shared/_White/Wizard/Teleport/WizardTeleportSpellEuiState.cs @@ -4,7 +4,7 @@ using Robust.Shared.Serialization; namespace Content.Shared._White.Wizard.Teleport; [Serializable, NetSerializable] -public sealed class TeleportSpellEuiState : EuiStateBase +public sealed class WizardTeleportSpellEuiState : EuiStateBase { public Dictionary Locations = new(); } diff --git a/Resources/Audio/White/Magic/spellblade-aspect.ogg b/Resources/Audio/White/Magic/spellblade-aspect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2df5431748c55312ac6b9f36f4536d6997cbb412 GIT binary patch literal 43378 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json index 193f4b82e9..b84afefb47 100644 --- a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json +++ b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json @@ -54,6 +54,9 @@ }, { "name": "teleport" + }, + { + "name": "icebeam_active" } ] }