Dimensional (#1140)
* add: Temporamancy tree with new shadow swap spell * feat: Increased tempo loadout to 2 * feat: Remove most popups from swap spell * fix: Swap with no mob entities * feat: Add CanCast to spell effect * fix: Handeling cancaled event & swap state * feat: Add UseCustomCastConditions * feat: Add swap to magic shadow staff * feat: Add tempo essence & magic type * feat: Add Tempo type to all dimension spells * fix: Magic shadow staff tempo manacost modify * fix: Spell type local * feat: Add touhou lore * fix: Review * feat: Add target dead block component * feat: Remove checking access * feat: Add RequireCanInteract * feat: Remove essence * fix: Review * fuck * fuck part 2 * Update Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.DelayedActions.cs * Update dimension.png * minor nitpick * fix --------- Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Ed <edwardxperia2000@gmail.com>
This commit is contained in:
@@ -3,7 +3,8 @@ using Content.Shared._CP14.MagicSpell.Events;
|
||||
using Content.Shared.CombatMode.Pacification;
|
||||
using Content.Shared.Damage.Components;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Instruments;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Speech.Muting;
|
||||
|
||||
@@ -11,6 +12,8 @@ namespace Content.Shared._CP14.MagicSpell;
|
||||
|
||||
public abstract partial class CP14SharedMagicSystem
|
||||
{
|
||||
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||
|
||||
private void InitializeChecks()
|
||||
{
|
||||
SubscribeLocalEvent<CP14MagicEffectSomaticAspectComponent, CP14CastMagicEffectAttemptEvent>(OnSomaticCheck);
|
||||
@@ -18,6 +21,7 @@ public abstract partial class CP14SharedMagicSystem
|
||||
SubscribeLocalEvent<CP14MagicEffectManaCostComponent, CP14CastMagicEffectAttemptEvent>(OnManaCheck);
|
||||
SubscribeLocalEvent<CP14MagicEffectStaminaCostComponent, CP14CastMagicEffectAttemptEvent>(OnStaminaCheck);
|
||||
SubscribeLocalEvent<CP14MagicEffectPacifiedBlockComponent, CP14CastMagicEffectAttemptEvent>(OnPacifiedCheck);
|
||||
SubscribeLocalEvent<CP14MagicEffectAliveTargetRequiredComponent, CP14CastMagicEffectAttemptEvent>(OnMobStateCheck);
|
||||
|
||||
//Verbal speaking
|
||||
SubscribeLocalEvent<CP14MagicEffectVerbalAspectComponent, CP14StartCastMagicEffectEvent>(OnVerbalAspectStartCast);
|
||||
@@ -37,7 +41,8 @@ public abstract partial class CP14SharedMagicSystem
|
||||
//First - trying get mana from item
|
||||
if (_magicEffectQuery.TryComp(ent, out var magicEffect))
|
||||
{
|
||||
if (magicEffect.SpellStorage is not null && _magicContainerQuery.TryComp(magicEffect.SpellStorage, out var magicContainer))
|
||||
if (magicEffect.SpellStorage is not null &&
|
||||
_magicContainerQuery.TryComp(magicEffect.SpellStorage, out var magicContainer))
|
||||
requiredMana = MathF.Max(0, (float)(requiredMana - magicContainer.Energy));
|
||||
}
|
||||
|
||||
@@ -53,22 +58,27 @@ public abstract partial class CP14SharedMagicSystem
|
||||
}
|
||||
|
||||
if (!_magicEnergy.HasEnergy(args.Performer, requiredMana, playerMana, true) && _net.IsServer)
|
||||
_popup.PopupEntity(Loc.GetString($"cp14-magic-spell-not-enough-mana-cast-warning-{_random.Next(5)}"), args.Performer, args.Performer, PopupType.SmallCaution);
|
||||
_popup.PopupEntity(Loc.GetString($"cp14-magic-spell-not-enough-mana-cast-warning-{_random.Next(5)}"),
|
||||
args.Performer,
|
||||
args.Performer,
|
||||
PopupType.SmallCaution);
|
||||
}
|
||||
|
||||
private void OnStaminaCheck(Entity<CP14MagicEffectStaminaCostComponent> ent, ref CP14CastMagicEffectAttemptEvent args)
|
||||
private void OnStaminaCheck(Entity<CP14MagicEffectStaminaCostComponent> ent,
|
||||
ref CP14CastMagicEffectAttemptEvent args)
|
||||
{
|
||||
if (!TryComp<StaminaComponent>(args.Performer, out var staminaComp))
|
||||
return;
|
||||
|
||||
if (staminaComp.Critical)
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-stamina-not-enough"));
|
||||
args.Cancel();
|
||||
}
|
||||
if (!staminaComp.Critical)
|
||||
return;
|
||||
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-stamina-not-enough"));
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
private void OnSomaticCheck(Entity<CP14MagicEffectSomaticAspectComponent> ent, ref CP14CastMagicEffectAttemptEvent args)
|
||||
private void OnSomaticCheck(Entity<CP14MagicEffectSomaticAspectComponent> ent,
|
||||
ref CP14CastMagicEffectAttemptEvent args)
|
||||
{
|
||||
if (TryComp<HandsComponent>(args.Performer, out var hands) || hands is not null)
|
||||
{
|
||||
@@ -78,32 +88,68 @@ public abstract partial class CP14SharedMagicSystem
|
||||
if (hand.Value.IsEmpty)
|
||||
freeHand++;
|
||||
}
|
||||
|
||||
if (freeHand >= ent.Comp.FreeHandRequired)
|
||||
return;
|
||||
}
|
||||
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-need-somatic-component"));
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
private void OnVerbalCheck(Entity<CP14MagicEffectVerbalAspectComponent> ent, ref CP14CastMagicEffectAttemptEvent args)
|
||||
private void OnVerbalCheck(Entity<CP14MagicEffectVerbalAspectComponent> ent,
|
||||
ref CP14CastMagicEffectAttemptEvent args)
|
||||
{
|
||||
if (HasComp<MutedComponent>(args.Performer))
|
||||
if (!HasComp<MutedComponent>(args.Performer))
|
||||
return;
|
||||
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-need-verbal-component"));
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
private void OnPacifiedCheck(Entity<CP14MagicEffectPacifiedBlockComponent> ent,
|
||||
ref CP14CastMagicEffectAttemptEvent args)
|
||||
{
|
||||
if (!HasComp<PacifiedComponent>(args.Performer))
|
||||
return;
|
||||
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-pacified"));
|
||||
args.Cancel();
|
||||
}
|
||||
|
||||
private void OnMobStateCheck(Entity<CP14MagicEffectAliveTargetRequiredComponent> ent,
|
||||
ref CP14CastMagicEffectAttemptEvent args)
|
||||
{
|
||||
if (args.Target is not { } target)
|
||||
return;
|
||||
|
||||
if (!TryComp<MobStateComponent>(target, out var mobStateComp))
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-need-verbal-component"));
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-target-not-mob"));
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ent.Comp.Inverted)
|
||||
{
|
||||
if (_mobState.IsDead(target, mobStateComp))
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-target-dead"));
|
||||
args.Cancel();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_mobState.IsDead(target, mobStateComp))
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-target-alive"));
|
||||
args.Cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPacifiedCheck(Entity<CP14MagicEffectPacifiedBlockComponent> ent, ref CP14CastMagicEffectAttemptEvent args)
|
||||
{
|
||||
if (HasComp<PacifiedComponent>(args.Performer))
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-pacified"));
|
||||
args.Cancel();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnVerbalAspectStartCast(Entity<CP14MagicEffectVerbalAspectComponent> ent, ref CP14StartCastMagicEffectEvent args)
|
||||
private void OnVerbalAspectStartCast(Entity<CP14MagicEffectVerbalAspectComponent> ent,
|
||||
ref CP14StartCastMagicEffectEvent args)
|
||||
{
|
||||
var ev = new CP14SpellSpeechEvent
|
||||
{
|
||||
@@ -114,7 +160,8 @@ public abstract partial class CP14SharedMagicSystem
|
||||
RaiseLocalEvent(ent, ref ev);
|
||||
}
|
||||
|
||||
private void OnVerbalAspectAfterCast(Entity<CP14MagicEffectVerbalAspectComponent> ent, ref CP14MagicEffectConsumeResourceEvent args)
|
||||
private void OnVerbalAspectAfterCast(Entity<CP14MagicEffectVerbalAspectComponent> ent,
|
||||
ref CP14MagicEffectConsumeResourceEvent args)
|
||||
{
|
||||
if (_net.IsClient)
|
||||
return;
|
||||
|
||||
@@ -36,6 +36,7 @@ public abstract partial class CP14SharedMagicSystem
|
||||
BlockDuplicate = true,
|
||||
BreakOnDropItem = fromItem,
|
||||
NeedHand = fromItem,
|
||||
RequireCanInteract = delayedEffect.RequireCanInteract,
|
||||
};
|
||||
|
||||
if (_doAfter.TryStartDoAfter(doAfterEventArgs, out var doAfterId))
|
||||
@@ -56,31 +57,30 @@ public abstract partial class CP14SharedMagicSystem
|
||||
_action.CP14StartCustomDelay(action, TimeSpan.FromSeconds(cooldown.Value));
|
||||
}
|
||||
|
||||
private void UseDelayedAction(ICP14DelayedMagicEffect delayedEffect, Entity<CP14MagicEffectComponent> action, DoAfterEvent doAfter, EntityUid performer, EntityUid? target = null, EntityCoordinates? worldTarget = null)
|
||||
private bool UseDelayedAction(ICP14DelayedMagicEffect delayedEffect, Entity<CP14MagicEffectComponent> action, DoAfterEvent doAfter, EntityUid performer, EntityUid? target = null, EntityCoordinates? worldTarget = null)
|
||||
{
|
||||
if (!CanCastSpell(action, performer))
|
||||
return;
|
||||
// Event may return an empty entity with id = 0, which causes bugs
|
||||
var currentTarget = target;
|
||||
if (currentTarget is not null && currentTarget == EntityUid.Invalid)
|
||||
currentTarget = null;
|
||||
|
||||
// event may return an empty entity with id = 0, which causes bugs
|
||||
var _target = target;
|
||||
if (_target is not null && _target.Value.Id == 0)
|
||||
_target = null;
|
||||
var spellArgs = new CP14SpellEffectBaseArgs(performer, action.Comp.SpellStorage, currentTarget, worldTarget);
|
||||
if (!CanCastSpell(action, spellArgs))
|
||||
return false;
|
||||
|
||||
if (_doAfter.IsRunning(action.Comp.ActiveDoAfter))
|
||||
_doAfter.Cancel(action.Comp.ActiveDoAfter);
|
||||
else
|
||||
{
|
||||
if (TryStartDelayedAction(delayedEffect, doAfter, action, _target, performer))
|
||||
{
|
||||
var evStart = new CP14StartCastMagicEffectEvent(performer);
|
||||
RaiseLocalEvent(action, ref evStart);
|
||||
|
||||
var spellArgs =
|
||||
new CP14SpellEffectBaseArgs(performer, action.Comp.SpellStorage, _target, worldTarget);
|
||||
|
||||
CastTelegraphy(action, spellArgs);
|
||||
}
|
||||
_doAfter.Cancel(action.Comp.ActiveDoAfter);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!TryStartDelayedAction(delayedEffect, doAfter, action, currentTarget, performer))
|
||||
return false;
|
||||
|
||||
var evStart = new CP14StartCastMagicEffectEvent(performer);
|
||||
RaiseLocalEvent(action, ref evStart);
|
||||
CastTelegraphy(action, spellArgs);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -98,7 +98,9 @@ public abstract partial class CP14SharedMagicSystem
|
||||
return;
|
||||
|
||||
var doAfter = new CP14DelayedInstantActionDoAfterEvent(args.Cooldown);
|
||||
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Performer);
|
||||
|
||||
if (!UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Performer))
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
@@ -121,7 +123,9 @@ public abstract partial class CP14SharedMagicSystem
|
||||
EntityManager.GetNetCoordinates(args.Coords),
|
||||
EntityManager.GetNetEntity(args.Entity),
|
||||
args.Cooldown);
|
||||
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Entity, args.Coords);
|
||||
|
||||
if (!UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Entity, args.Coords))
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
@@ -141,7 +145,9 @@ public abstract partial class CP14SharedMagicSystem
|
||||
return;
|
||||
|
||||
var doAfter = new CP14DelayedEntityTargetActionDoAfterEvent(EntityManager.GetNetEntity(args.Target), args.Cooldown);
|
||||
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Target);
|
||||
|
||||
if (!UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Target))
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
@@ -21,11 +21,10 @@ public abstract partial class CP14SharedMagicSystem
|
||||
if (!TryComp<CP14MagicEffectComponent>(args.Action, out var magicEffect))
|
||||
return;
|
||||
|
||||
if (!CanCastSpell((args.Action, magicEffect), args.Performer))
|
||||
return;
|
||||
var spellArgs = new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, args.Performer, Transform(args.Performer).Coordinates);
|
||||
|
||||
var spellArgs =
|
||||
new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, args.Performer, Transform(args.Performer).Coordinates);
|
||||
if (!CanCastSpell((args.Action, magicEffect), spellArgs))
|
||||
return;
|
||||
|
||||
CastSpell((args.Action, magicEffect), spellArgs);
|
||||
_action.CP14StartCustomDelay(args.Action, args.Cooldown);
|
||||
@@ -39,11 +38,10 @@ public abstract partial class CP14SharedMagicSystem
|
||||
if (!TryComp<CP14MagicEffectComponent>(args.Action, out var magicEffect))
|
||||
return;
|
||||
|
||||
if (!CanCastSpell((args.Action, magicEffect), args.Performer))
|
||||
return;
|
||||
var spellArgs = new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, args.Entity, args.Coords);
|
||||
|
||||
var spellArgs =
|
||||
new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, args.Entity, args.Coords);
|
||||
if (!CanCastSpell((args.Action, magicEffect), spellArgs))
|
||||
return;
|
||||
|
||||
CastSpell((args.Action, magicEffect), spellArgs);
|
||||
_action.CP14StartCustomDelay(args.Action, args.Cooldown);
|
||||
@@ -57,11 +55,10 @@ public abstract partial class CP14SharedMagicSystem
|
||||
if (!TryComp<CP14MagicEffectComponent>(args.Action, out var magicEffect))
|
||||
return;
|
||||
|
||||
if (!CanCastSpell((args.Action, magicEffect), args.Performer))
|
||||
return;
|
||||
var spellArgs = new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, args.Target, Transform(args.Target).Coordinates);
|
||||
|
||||
var spellArgs =
|
||||
new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, args.Target, Transform(args.Target).Coordinates);
|
||||
if (!CanCastSpell((args.Action, magicEffect), spellArgs))
|
||||
return;
|
||||
|
||||
CastSpell((args.Action, magicEffect), spellArgs);
|
||||
_action.CP14StartCustomDelay(args.Action, args.Cooldown);
|
||||
|
||||
@@ -36,7 +36,7 @@ public abstract partial class CP14SharedMagicSystem
|
||||
var spellArgs =
|
||||
new CP14SpellEffectBaseArgs(toggled.Performer, effect.SpellStorage, toggled.EntityTarget, toggled.WorldTarget);
|
||||
|
||||
if (!CanCastSpell((uid, effect), toggled.Performer.Value))
|
||||
if (!CanCastSpell((uid, effect), spellArgs))
|
||||
{
|
||||
if (_doAfter.IsRunning(toggled.DoAfterId))
|
||||
_doAfter.Cancel(toggled.DoAfterId);
|
||||
@@ -116,7 +116,8 @@ public abstract partial class CP14SharedMagicSystem
|
||||
|
||||
private void ToggleToggleableAction(ICP14ToggleableMagicEffect toggleable, DoAfterEvent doAfter, Entity<CP14MagicEffectComponent> action, EntityUid performer, EntityUid? entityTarget = null, EntityCoordinates? worldTarget = null)
|
||||
{
|
||||
if (!CanCastSpell(action, performer))
|
||||
var spellArgs = new CP14SpellEffectBaseArgs(performer, entityTarget, entityTarget, worldTarget);
|
||||
if (!CanCastSpell(action, spellArgs))
|
||||
return;
|
||||
|
||||
if (_doAfter.IsRunning(action.Comp.ActiveDoAfter))
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Content.Shared._CP14.MagicEnergy;
|
||||
using Content.Shared._CP14.MagicEnergy.Components;
|
||||
@@ -118,7 +119,7 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem
|
||||
|
||||
if (_proto.TryIndex(ent.Comp.MagicType, out var indexedMagic))
|
||||
{
|
||||
sb.Append($"\n{Loc.GetString("cp14-magic-magic-type")}: [color={indexedMagic.Color.ToHex()}]{Loc.GetString(indexedMagic.Name)}[/color]");
|
||||
sb.Append($"\n{Loc.GetString("cp14-magic-type")}: [color={indexedMagic.Color.ToHex()}]{Loc.GetString(indexedMagic.Name)}[/color]");
|
||||
}
|
||||
|
||||
if (TryComp<CP14MagicEffectVerbalAspectComponent>(ent, out var verbal))
|
||||
@@ -148,20 +149,23 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem
|
||||
/// <summary>
|
||||
/// Checking to see if the spell can be used at all
|
||||
/// </summary>
|
||||
private bool CanCastSpell(Entity<CP14MagicEffectComponent> ent, EntityUid performer)
|
||||
private bool CanCastSpell(Entity<CP14MagicEffectComponent> ent, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
var ev = new CP14CastMagicEffectAttemptEvent(performer);
|
||||
RaiseLocalEvent(ent, ref ev);
|
||||
if (ev.Reason != string.Empty && _net.IsServer)
|
||||
{
|
||||
_popup.PopupEntity(ev.Reason, performer, performer);
|
||||
}
|
||||
if (args.User is not { } performer)
|
||||
return true;
|
||||
|
||||
var ev = new CP14CastMagicEffectAttemptEvent(performer, args.Used, args.Target, args.Position);
|
||||
RaiseLocalEvent(ent, ev);
|
||||
|
||||
if (ev.Reason != string.Empty)
|
||||
_popup.PopupPredicted(ev.Reason, performer, performer);
|
||||
|
||||
return !ev.Cancelled;
|
||||
}
|
||||
|
||||
private void CastTelegraphy(Entity<CP14MagicEffectComponent> ent, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
if (!_net.IsServer)
|
||||
if (_net.IsClient)
|
||||
return;
|
||||
|
||||
foreach (var effect in ent.Comp.TelegraphyEffects)
|
||||
@@ -175,12 +179,12 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem
|
||||
var ev = new CP14MagicEffectConsumeResourceEvent(args.User);
|
||||
RaiseLocalEvent(ent, ref ev);
|
||||
|
||||
if (_net.IsServer)
|
||||
if (_net.IsClient)
|
||||
return;
|
||||
|
||||
foreach (var effect in ent.Comp.Effects)
|
||||
{
|
||||
foreach (var effect in ent.Comp.Effects)
|
||||
{
|
||||
effect.Effect(EntityManager, args);
|
||||
}
|
||||
effect.Effect(EntityManager, args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Allows you to limit the use of a spell based on the target's alive/dead status
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class CP14MagicEffectAliveTargetRequiredComponent : Component
|
||||
{
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool Inverted = false;
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
using Content.Shared._CP14.MagicRitual.Prototypes;
|
||||
using Content.Shared._CP14.MagicSpell.Components;
|
||||
using Content.Shared._CP14.MagicSpell.Spells;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Inventory;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Events;
|
||||
@@ -9,19 +11,24 @@ namespace Content.Shared._CP14.MagicSpell.Events;
|
||||
/// <summary>
|
||||
/// Called first to verify that all conditions are met and the spell can be performed.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public sealed class CP14CastMagicEffectAttemptEvent : CancellableEntityEventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// The Performer of the event, to check if they meet the requirements.
|
||||
/// </summary>
|
||||
public EntityUid Performer { get; init; }
|
||||
public readonly EntityUid Performer;
|
||||
public readonly EntityUid? Used;
|
||||
public readonly EntityUid? Target;
|
||||
public readonly EntityCoordinates? Position;
|
||||
|
||||
public string Reason = string.Empty;
|
||||
|
||||
public CP14CastMagicEffectAttemptEvent(EntityUid performer)
|
||||
public CP14CastMagicEffectAttemptEvent(EntityUid performer, EntityUid? used, EntityUid? target, EntityCoordinates? position)
|
||||
{
|
||||
Performer = performer;
|
||||
Used = used;
|
||||
Target = target;
|
||||
Position = position;
|
||||
}
|
||||
|
||||
public void PushReason(string reason)
|
||||
|
||||
@@ -17,7 +17,9 @@ public interface ICP14DelayedMagicEffect
|
||||
|
||||
public float DistanceThreshold { get; }
|
||||
|
||||
public bool Hidden{ get; }
|
||||
public bool Hidden { get; }
|
||||
|
||||
public bool RequireCanInteract { get; }
|
||||
}
|
||||
|
||||
public sealed partial class CP14DelayedEntityWorldTargetActionEvent : EntityWorldTargetActionEvent,
|
||||
@@ -40,6 +42,9 @@ public sealed partial class CP14DelayedEntityWorldTargetActionEvent : EntityWorl
|
||||
|
||||
[DataField]
|
||||
public bool Hidden { get; private set; } = false;
|
||||
|
||||
[DataField]
|
||||
public bool RequireCanInteract { get; private set; } = true;
|
||||
}
|
||||
|
||||
//Entity Target
|
||||
@@ -63,6 +68,9 @@ public sealed partial class CP14DelayedEntityTargetActionEvent : EntityTargetAct
|
||||
|
||||
[DataField]
|
||||
public bool Hidden { get; private set; } = false;
|
||||
|
||||
[DataField]
|
||||
public bool RequireCanInteract { get; private set; } = true;
|
||||
}
|
||||
|
||||
public sealed partial class CP14DelayedInstantActionEvent : InstantActionEvent, ICP14DelayedMagicEffect
|
||||
@@ -84,6 +92,9 @@ public sealed partial class CP14DelayedInstantActionEvent : InstantActionEvent,
|
||||
|
||||
[DataField]
|
||||
public bool Hidden { get; private set; } = false;
|
||||
|
||||
[DataField]
|
||||
public bool RequireCanInteract { get; private set; } = true;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace Content.Shared._CP14.MagicSpell.Spells;
|
||||
|
||||
public sealed partial class CP14SpellCasterSwap : CP14SpellEffect
|
||||
{
|
||||
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
if (args.User is not { } user || args.Target is not { } target)
|
||||
return;
|
||||
|
||||
var transform = entManager.System<SharedTransformSystem>();
|
||||
var userPosition = transform.GetMoverCoordinates(user);
|
||||
var targetPosition = transform.GetMoverCoordinates(target);
|
||||
|
||||
transform.SetCoordinates(user, targetPosition);
|
||||
transform.SetCoordinates(target, userPosition);
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ public abstract partial class CP14SpellEffect
|
||||
public abstract void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args);
|
||||
}
|
||||
|
||||
public record class CP14SpellEffectBaseArgs
|
||||
public record CP14SpellEffectBaseArgs
|
||||
{
|
||||
public EntityUid? User;
|
||||
public EntityUid? Used;
|
||||
|
||||
@@ -8,6 +8,7 @@ cp14-magic-spell-not-enough-mana-cast-warning-2 = Your hands are shaking...
|
||||
cp14-magic-spell-not-enough-mana-cast-warning-3 = Your throat starts to lump...
|
||||
cp14-magic-spell-not-enough-mana-cast-warning-4 = Your head becomes heavy...
|
||||
|
||||
cp14-magic-type = Type
|
||||
cp14-magic-verbal-aspect = Requires the ability to speak
|
||||
cp14-magic-somatic-aspect = Requires a free hand:
|
||||
cp14-magic-music-aspect = You must play a musical instrument
|
||||
@@ -17,4 +18,8 @@ cp14-magic-spell-need-somatic-component = You don't have your hands free.
|
||||
|
||||
cp14-magic-spell-stamina-not-enough = You don't have the energy to do it.
|
||||
cp14-magic-staminacost = Stamina cost
|
||||
cp14-magic-spell-pacified = It could hurt someone!
|
||||
cp14-magic-spell-pacified = It could hurt someone!
|
||||
|
||||
cp14-magic-spell-target-not-mob = The target must be a living thing!
|
||||
cp14-magic-spell-target-dead = Can't be used on the dead!
|
||||
cp14-magic-spell-target-alive = Can't be used on the living!
|
||||
@@ -22,4 +22,4 @@ cp14-essence-magic = Praecantatio
|
||||
|
||||
cp14-magic-manacost = Manacost
|
||||
cp14-magic-essence = Magic type
|
||||
cp14-magic-essence-title = From here, essences can be extracted:
|
||||
cp14-magic-essence-title = From here, essences can be extracted:
|
||||
|
||||
@@ -40,7 +40,7 @@ cp14-reagent-desc-essence-poison = The liquid embodiment of the elements of pois
|
||||
|
||||
cp14-reagent-name-essence-void = Vacuos essence
|
||||
cp14-reagent-desc-essence-void = The liquid embodiment of the elements of emptiness, obscurity, and secrecy.
|
||||
|
||||
|
||||
cp14-reagent-name-essence-life = Victus essence
|
||||
cp14-reagent-desc-essence-life = The liquid embodiment of the elements of life, food, and sustenance.
|
||||
|
||||
@@ -51,8 +51,3 @@ cp14-reagent-desc-essence-crystal = The liquid embodiment of the elements of gla
|
||||
|
||||
cp14-reagent-name-essence-magic = Praecantatio essence
|
||||
cp14-reagent-desc-essence-magic = The liquid embodiment of the elements of magic, enchantment and sorcery.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +16,9 @@ cp14-skill-tree-illusion-desc = Explore the nature of light to create illusions,
|
||||
cp14-skill-tree-healing-name = Lifecation
|
||||
cp14-skill-tree-healing-desc = Explore the ways in which magic affects living creatures.
|
||||
|
||||
cp14-skill-tree-dimension-name = Dimensium
|
||||
cp14-skill-tree-dimension-desc = Immerse yourself in the nature of space and void.
|
||||
|
||||
# Body
|
||||
|
||||
cp14-skill-tree-atlethic-name = Atlethic
|
||||
|
||||
@@ -8,6 +8,7 @@ cp14-magic-spell-not-enough-mana-cast-warning-2 = Ваши руки дрожат
|
||||
cp14-magic-spell-not-enough-mana-cast-warning-3 = К горлу подступает ком...
|
||||
cp14-magic-spell-not-enough-mana-cast-warning-4 = Голова наливается свинцом...
|
||||
|
||||
cp14-magic-type = Тип
|
||||
cp14-magic-verbal-aspect = Требуется возможность говорить
|
||||
cp14-magic-somatic-aspect = Требуются свободные руки:
|
||||
cp14-magic-music-aspect = Вы должны играть на музыкальном инструменте
|
||||
@@ -17,4 +18,8 @@ cp14-magic-spell-need-somatic-component = Вам не хватает свобо
|
||||
|
||||
cp14-magic-spell-stamina-not-enough = Вам не хватает сил, чтобы сделать это.
|
||||
cp14-magic-staminacost = Затраты энергии
|
||||
cp14-magic-spell-pacified = Это может навредить кому либо!
|
||||
cp14-magic-spell-pacified = Это может навредить кому либо!
|
||||
|
||||
cp14-magic-spell-target-not-mob = Цель должна быть живым существом!
|
||||
cp14-magic-spell-target-dead = Нельзя использовать на мертвых!
|
||||
cp14-magic-spell-target-alive = Нельзя использовать на живых!
|
||||
@@ -22,4 +22,4 @@ cp14-essence-magic = Praecantatio
|
||||
|
||||
cp14-magic-manacost = Затраты маны
|
||||
cp14-magic-essence = Тип магии
|
||||
cp14-magic-essence-title = Отсюда можно извлечь эссенции:
|
||||
cp14-magic-essence-title = Отсюда можно извлечь эссенции:
|
||||
|
||||
@@ -40,7 +40,7 @@ cp14-reagent-desc-essence-poison = Жидкое воплощение стихи
|
||||
|
||||
cp14-reagent-name-essence-void = Эссенция Vacuos
|
||||
cp14-reagent-desc-essence-void = Жидкое воплощение стихии пустоты, неизвестности и скрытности.
|
||||
|
||||
|
||||
cp14-reagent-name-essence-life = Эссенция Victus
|
||||
cp14-reagent-desc-essence-life = Жидкое воплощение стихии жизни, еды и пропитания.
|
||||
|
||||
@@ -50,4 +50,4 @@ cp14-reagent-desc-essence-crystal = Жидкое воплощение стихи
|
||||
# Complex tier 2
|
||||
|
||||
cp14-reagent-name-essence-magic = Эссенция Praecantatio
|
||||
cp14-reagent-desc-essence-magic = Жидкое воплощение магии, чар и колдовства.
|
||||
cp14-reagent-desc-essence-magic = Жидкое воплощение магии, чар и колдовства.
|
||||
|
||||
@@ -18,7 +18,10 @@ cp14-skill-tree-illusion-desc = Исследуйте природу света,
|
||||
cp14-skill-tree-healing-name = Жизнетворение
|
||||
cp14-skill-tree-healing-desc = Изучайте способы влияния магии на живые создания.
|
||||
|
||||
cp14-skill-tree-dimension-name = Дименсиум
|
||||
cp14-skill-tree-dimension-desc = Погрузитесь в природу пространства и пустоты.
|
||||
|
||||
# Body
|
||||
|
||||
cp14-skill-tree-atlethic-name = Атлетика
|
||||
cp14-skill-tree-atlethic-desc = Развивайте свое тело, расширяя границы доступного.
|
||||
cp14-skill-tree-atlethic-desc = Развивайте свое тело, расширяя границы доступного.
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
speedMultiplier: 0.2
|
||||
- type: CP14MagicEffectManaCost
|
||||
manaCost: 100
|
||||
- type: CP14MagicEffectAliveTargetRequired
|
||||
inverted: true
|
||||
- type: CP14MagicEffect
|
||||
telegraphyEffects:
|
||||
- !type:CP14SpellSpawnEntityOnTarget
|
||||
|
||||
@@ -60,4 +60,4 @@
|
||||
components:
|
||||
- type: CP14SpellStorage
|
||||
spells:
|
||||
- CP14ActionSpellDemiplaneInfiltration
|
||||
- CP14ActionSpellDemiplaneInfiltration
|
||||
|
||||
@@ -73,4 +73,4 @@
|
||||
components:
|
||||
- type: CP14SpellStorage
|
||||
spells:
|
||||
- CP14ActionSpellMonolithWarp
|
||||
- CP14ActionSpellMonolithWarp
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
sprite: _CP14/Actions/Spells/dimension.rsi
|
||||
state: shadow_grab
|
||||
- type: CP14MagicEffectManaCost
|
||||
manaCost: 10
|
||||
- type: CP14MagicEffect
|
||||
telegraphyEffects:
|
||||
- !type:CP14SpellSpawnEntityOnTarget
|
||||
@@ -58,4 +57,4 @@
|
||||
components:
|
||||
- type: CP14SpellStorage
|
||||
spells:
|
||||
- CP14ActionSpellShadowGrab
|
||||
- CP14ActionSpellShadowGrab
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
- type: entity
|
||||
id: CP14ActionSpellShadowSwap
|
||||
name: Shadow swap
|
||||
description: A warp of space between two living beings
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _CP14/Actions/Spells/dimension.rsi
|
||||
state: shadow_swap
|
||||
- type: CP14MagicEffectCastSlowdown
|
||||
speedMultiplier: 0.8
|
||||
- type: CP14MagicEffectManaCost
|
||||
manaCost: 20
|
||||
- type: CP14MagicEffect
|
||||
telegraphyEffects:
|
||||
- !type:CP14SpellSpawnEntityOnUser
|
||||
spawns:
|
||||
- CP14ImpactEffectShadowStep
|
||||
- !type:CP14SpellSpawnEntityOnTarget
|
||||
spawns:
|
||||
- CP14ImpactEffectShadowStep
|
||||
effects:
|
||||
- !type:CP14SpellCasterSwap
|
||||
- type: CP14MagicEffectCastingVisual
|
||||
proto: CP14ImpactEffectShadowStep
|
||||
- type: CP14MagicEffectSomaticAspect
|
||||
- type: CP14MagicEffectAliveTargetRequired
|
||||
- type: EntityTargetAction
|
||||
whitelist:
|
||||
components:
|
||||
- MobState
|
||||
range: 5
|
||||
itemIconStyle: BigAction
|
||||
interactOnMiss: false
|
||||
sound: !type:SoundPathSpecifier
|
||||
path: /Audio/Magic/rumble.ogg
|
||||
icon:
|
||||
sprite: _CP14/Actions/Spells/dimension.rsi
|
||||
state: shadow_swap
|
||||
event: !type:CP14DelayedEntityTargetActionEvent
|
||||
cooldown: 45
|
||||
hidden: true
|
||||
breakOnMove: false
|
||||
requireCanInteract: false
|
||||
@@ -51,4 +51,4 @@
|
||||
components:
|
||||
- type: CP14SpellStorage
|
||||
spells:
|
||||
- CP14ActionSpellShadowStep
|
||||
- CP14ActionSpellShadowStep
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
- type: Sprite
|
||||
sprite: _CP14/Clothing/Cloak/Roles/General/maid_apron.rsi
|
||||
- type: Clothing
|
||||
sprite: _CP14/Clothing/Cloak/Roles/General/maid_apron.rsi
|
||||
sprite: _CP14/Clothing/Cloak/Roles/General/maid_apron.rsi
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
id: CP14ClothingWarriorsGarbDress
|
||||
name: warrior's garb
|
||||
description: show your strength.
|
||||
components:
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _CP14/Clothing/Shirt/Roles/General/Dress/warrior_garb.rsi
|
||||
- type: Clothing
|
||||
@@ -286,8 +286,8 @@
|
||||
parent: CP14ClothingShirtBase
|
||||
id: CP14ClothinShirtMaidDress
|
||||
name: maid's dress
|
||||
components:
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _CP14/Clothing/Shirt/Roles/General/Dress/maid_dress.rsi
|
||||
- type: Clothing
|
||||
sprite: _CP14/Clothing/Shirt/Roles/General/Dress/maid_dress.rsi
|
||||
sprite: _CP14/Clothing/Shirt/Roles/General/Dress/maid_dress.rsi
|
||||
|
||||
@@ -286,4 +286,4 @@
|
||||
maxVol: 1
|
||||
reagents:
|
||||
- ReagentId: CP14EssenceMagic
|
||||
Quantity: 1
|
||||
Quantity: 1
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
- type: Wieldable
|
||||
- type: IncreaseDamageOnWield
|
||||
damage:
|
||||
types:
|
||||
types:
|
||||
Blunt: 3
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
@@ -80,15 +80,16 @@
|
||||
categories: [ DoNotMap ]
|
||||
suffix: Artifact
|
||||
components:
|
||||
#- type: CP14MagicManacostModify
|
||||
# modifiers:
|
||||
# Dimension: 1.4
|
||||
# - type: CP14MagicManacostModify
|
||||
# modifiers:
|
||||
# tempus: 1.4
|
||||
- type: CP14SpellStorage
|
||||
spells:
|
||||
- CP14ActionSpellShadowStep
|
||||
- CP14ActionSpellShadowGrab
|
||||
- CP14ActionSpellShadowSwap
|
||||
- CP14ActionSpellDemiplaneInfiltration
|
||||
- type: Sprite
|
||||
sprite: _CP14/Objects/Weapons/Magic/TwoHandedStaff/shadow_staff.rsi
|
||||
- type: Clothing
|
||||
sprite: _CP14/Objects/Weapons/Magic/TwoHandedStaff/shadow_staff.rsi
|
||||
sprite: _CP14/Objects/Weapons/Magic/TwoHandedStaff/shadow_staff.rsi
|
||||
|
||||
@@ -10,8 +10,7 @@
|
||||
- CP14SkillTreeIllusion
|
||||
- CP14SkillTreeHealing
|
||||
- CP14SkillTreeAtlethic
|
||||
|
||||
|
||||
- CP14SkillTreeDimension
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreePyrokineticLoadoutDummy
|
||||
@@ -28,8 +27,6 @@
|
||||
skillTree:
|
||||
Pyrokinetic: 2
|
||||
|
||||
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreeHydrosophistryLoadoutDummy
|
||||
name: Hydrosophistry
|
||||
@@ -45,7 +42,6 @@
|
||||
skillTree:
|
||||
Hydrosophistry: 2
|
||||
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreeIllusionLoadoutDummy
|
||||
name: Illusion
|
||||
@@ -61,7 +57,6 @@
|
||||
skillTree:
|
||||
Illusion: 2
|
||||
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreeMetamagicLoadoutDummy
|
||||
name: Metamagic
|
||||
@@ -77,7 +72,6 @@
|
||||
skillTree:
|
||||
Metamagic: 2
|
||||
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreeHealingLoadoutDummy
|
||||
name: Healing
|
||||
@@ -93,7 +87,6 @@
|
||||
skillTree:
|
||||
Healing: 2
|
||||
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreeAtlethicLoadoutDummy
|
||||
name: Atlethic
|
||||
@@ -107,4 +100,20 @@
|
||||
id: CP14SkillTreeAtlethic
|
||||
dummyEntity: CP14SkillTreeAtlethicLoadoutDummy
|
||||
skillTree:
|
||||
Atlethic: 2
|
||||
Atlethic: 2
|
||||
|
||||
- type: entity
|
||||
id: CP14SkillTreeDimensionLoadoutDummy
|
||||
name: Dimension
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _CP14/Actions/skill_tree.rsi
|
||||
state: dimension
|
||||
|
||||
- type: loadout
|
||||
id: CP14SkillTreeDimension
|
||||
dummyEntity: CP14SkillTreeDimensionLoadoutDummy
|
||||
skillTree:
|
||||
Dimension: 2
|
||||
|
||||
|
||||
@@ -190,4 +190,4 @@
|
||||
color: "#5497d6"
|
||||
tileReactions:
|
||||
- !type:CreateEntityTileReaction
|
||||
entity: CP14EssenceMagic
|
||||
entity: CP14EssenceMagic
|
||||
|
||||
31
Resources/Prototypes/_CP14/Skill/dimension.yml
Normal file
31
Resources/Prototypes/_CP14/Skill/dimension.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
- type: cp14Skill
|
||||
id: CP14ActionSpellShadowGrab
|
||||
skillUiPosition: 0, 0
|
||||
tree: Dimension
|
||||
icon:
|
||||
sprite: _CP14/Actions/Spells/dimension.rsi
|
||||
state: shadow_grab
|
||||
effect: !type:AddAction
|
||||
action: CP14ActionSpellShadowGrab
|
||||
|
||||
- type: cp14Skill
|
||||
id: CP14ActionSpellShadowSwap
|
||||
skillUiPosition: 0, 2
|
||||
tree: Dimension
|
||||
icon:
|
||||
sprite: _CP14/Actions/Spells/dimension.rsi
|
||||
state: shadow_swap
|
||||
effect: !type:AddAction
|
||||
action: CP14ActionSpellShadowSwap
|
||||
|
||||
- type: cp14Skill
|
||||
id: CP14ActionSpellShadowStep
|
||||
skillUiPosition: 0, 4
|
||||
learnCost: 2
|
||||
tree: Dimension
|
||||
icon:
|
||||
sprite: _CP14/Actions/Spells/dimension.rsi
|
||||
state: shadow_step
|
||||
effect: !type:AddAction
|
||||
action: CP14ActionSpellShadowStep
|
||||
|
||||
@@ -50,4 +50,13 @@
|
||||
color: "#b32e37"
|
||||
icon:
|
||||
sprite: _CP14/Actions/skill_tree.rsi
|
||||
state: atlethic
|
||||
state: atlethic
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Dimension
|
||||
name: cp14-skill-tree-dimension-name
|
||||
desc: cp14-skill-tree-dimension-desc
|
||||
color: "#ac66be"
|
||||
icon:
|
||||
sprite: _CP14/Actions/skill_tree.rsi
|
||||
state: dimension
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"y": 32
|
||||
},
|
||||
"license": "All right reserved",
|
||||
"copyright": "Created by TheShuEd. Shadow step and Shadow grab created by .kreks.",
|
||||
"copyright": "Created by TheShuEd. Shadow step and Shadow grab created by .kreks. Shadow swap created by TornadoTech.",
|
||||
"states": [
|
||||
{
|
||||
"name": "demi_arrow"
|
||||
@@ -21,6 +21,9 @@
|
||||
},
|
||||
{
|
||||
"name": "shadow_step"
|
||||
},
|
||||
{
|
||||
"name": "shadow_swap"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 509 B |
BIN
Resources/Textures/_CP14/Actions/skill_tree.rsi/dimension.png
Normal file
BIN
Resources/Textures/_CP14/Actions/skill_tree.rsi/dimension.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 820 B |
@@ -10,6 +10,9 @@
|
||||
{
|
||||
"name": "atlethic"
|
||||
},
|
||||
{
|
||||
"name": "dimension"
|
||||
},
|
||||
{
|
||||
"name": "heal"
|
||||
},
|
||||
@@ -26,4 +29,4 @@
|
||||
"name": "water"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user