Some shit (#380)
* telegraphy effects * shadow step spell backend * add component spell * predict sharpening * Update ring.yml * locale sync * Update entities.ftl * icon shadow step
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
using Content.Server._CP14.MeleeWeapon;
|
||||
using Content.Server._CP14.MeleeWeapon.Components;
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Damage.Components;
|
||||
using Content.Server.Weapons.Ranged.Systems;
|
||||
using Content.Shared._CP14.MeleeWeapon.Components;
|
||||
using Content.Shared.Camera;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Damage.Events;
|
||||
@@ -43,7 +42,7 @@ namespace Content.Server.Damage.Systems
|
||||
damage *= sharp.Sharpness;
|
||||
|
||||
var dmg = _damageable.TryChangeDamage(args.Target, damage, component.IgnoreResistances, origin: args.Component.Thrower);
|
||||
//CrystallPunk Melee pgrade end
|
||||
//CrystallPunk Melee upgrade end
|
||||
|
||||
// Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying.
|
||||
if (dmg != null && HasComp<MobStateComponent>(args.Target))
|
||||
|
||||
@@ -16,7 +16,7 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
|
||||
SubscribeLocalEvent<CP14MagicEffectVerbalAspectComponent, CP14VerbalAspectSpeechEvent>(OnSpellSpoken);
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectCastingVisualComponent, CP14StartCastMagicEffectEvent>(OnSpawnMagicVisualEffect);
|
||||
SubscribeLocalEvent<CP14MagicEffectCastingVisualComponent, CP14StopCastMagicEffectEvent>(OnDespawnMagicVisualEffect);
|
||||
SubscribeLocalEvent<CP14MagicEffectCastingVisualComponent, CP14EndCastMagicEffectEvent>(OnDespawnMagicVisualEffect);
|
||||
}
|
||||
|
||||
private void OnSpellSpoken(Entity<CP14MagicEffectVerbalAspectComponent> ent, ref CP14VerbalAspectSpeechEvent args)
|
||||
@@ -32,7 +32,7 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
|
||||
ent.Comp.SpawnedEntity = vfx;
|
||||
}
|
||||
|
||||
private void OnDespawnMagicVisualEffect(Entity<CP14MagicEffectCastingVisualComponent> ent, ref CP14StopCastMagicEffectEvent args)
|
||||
private void OnDespawnMagicVisualEffect(Entity<CP14MagicEffectCastingVisualComponent> ent, ref CP14EndCastMagicEffectEvent args)
|
||||
{
|
||||
QueueDel(ent.Comp.SpawnedEntity);
|
||||
ent.Comp.SpawnedEntity = null;
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
using Content.Shared.Damage;
|
||||
|
||||
namespace Content.Server._CP14.MeleeWeapon.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class CP14MeleeSelfDamageComponent : Component
|
||||
{
|
||||
[DataField(required: true)]
|
||||
public DamageSpecifier DamageToSelf;
|
||||
}
|
||||
@@ -1,16 +1,12 @@
|
||||
using System.Numerics;
|
||||
using Content.Server._CP14.Alchemy;
|
||||
using Content.Server._CP14.MeleeWeapon;
|
||||
using Content.Server._CP14.MeleeWeapon.EntitySystems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared._CP14.MeleeWeapon.EntitySystems;
|
||||
using Content.Shared._CP14.Skills;
|
||||
using Content.Shared._CP14.Skills.Components;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Stunnable;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Weapons.Melee;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
|
||||
@@ -36,6 +36,10 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14BeforeCastMagicEffectEvent>(OnBeforeCastMagicEffect);
|
||||
|
||||
SubscribeLocalEvent<CP14DelayedInstantActionEvent>(OnInstantAction);
|
||||
SubscribeLocalEvent<CP14DelayedEntityTargetActionEvent>(OnEntityTargetAction);
|
||||
SubscribeLocalEvent<CP14DelayedWorldTargetActionEvent>(OnWorldTargetAction);
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedInstantActionDoAfterEvent>(OnDelayedInstantActionDoAfter);
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedEntityTargetActionDoAfterEvent>(OnDelayedEntityTargetDoAfter);
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14DelayedWorldTargetActionDoAfterEvent>(OnDelayedWorldTargetDoAfter);
|
||||
@@ -47,15 +51,132 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEffectComponent, CP14AfterCastMagicEffectEvent>(OnAfterCastMagicEffect);
|
||||
|
||||
SubscribeLocalEvent<CP14DelayedInstantActionEvent>(OnInstantAction);
|
||||
SubscribeLocalEvent<CP14DelayedEntityTargetActionEvent>(OnEntityTargetAction);
|
||||
SubscribeLocalEvent<CP14DelayedWorldTargetActionEvent>(OnWorldTargetAction);
|
||||
}
|
||||
|
||||
private void OnBeforeCastMagicEffect(Entity<CP14MagicEffectComponent> ent, ref CP14BeforeCastMagicEffectEvent args)
|
||||
{
|
||||
if (!TryComp<CP14MagicEnergyContainerComponent>(args.Performer, out var magicContainer))
|
||||
{
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_magicEnergy.HasEnergy(args.Performer, ent.Comp.ManaCost, magicContainer, ent.Comp.Safe))
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-not-enough-mana"));
|
||||
args.Cancel();
|
||||
}
|
||||
else if(!_magicEnergy.HasEnergy(args.Performer, ent.Comp.ManaCost, magicContainer, true) && _net.IsServer)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("cp14-magic-spell-not-enough-mana-cast-warning-"+_random.Next(5)), args.Performer, args.Performer, PopupType.SmallCaution);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnInstantAction(CP14DelayedInstantActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (args is not ICP14DelayedMagicEffect delayedEffect)
|
||||
return;
|
||||
|
||||
if (!TryCastSpell(args.Action, args.Performer))
|
||||
return;
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, new CP14DelayedInstantActionDoAfterEvent(), args.Action)
|
||||
{
|
||||
BreakOnMove = delayedEffect.BreakOnMove,
|
||||
BreakOnDamage = delayedEffect.BreakOnDamage,
|
||||
BlockDuplicate = true,
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doAfterEventArgs);
|
||||
|
||||
//Telegraphy effects
|
||||
if (_net.IsServer && TryComp<CP14MagicEffectComponent>(args.Action, out var magicEffect))
|
||||
{
|
||||
foreach (var effect in magicEffect.TelegraphyEffects)
|
||||
{
|
||||
effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.Performer, args.Performer, Transform(args.Performer).Coordinates));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnWorldTargetAction(CP14DelayedWorldTargetActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (args is not ICP14DelayedMagicEffect delayedEffect)
|
||||
return;
|
||||
|
||||
if (!TryCastSpell(args.Action, args.Performer))
|
||||
return;
|
||||
|
||||
var doAfter = new CP14DelayedWorldTargetActionDoAfterEvent()
|
||||
{
|
||||
Target = EntityManager.GetNetCoordinates(args.Target)
|
||||
};
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, doAfter, args.Action)
|
||||
{
|
||||
BreakOnMove = delayedEffect.BreakOnMove,
|
||||
BreakOnDamage = delayedEffect.BreakOnDamage,
|
||||
BlockDuplicate = true,
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doAfterEventArgs);
|
||||
|
||||
//Telegraphy effects
|
||||
if (_net.IsServer && TryComp<CP14MagicEffectComponent>(args.Action, out var magicEffect))
|
||||
{
|
||||
foreach (var effect in magicEffect.TelegraphyEffects)
|
||||
{
|
||||
effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.Performer, null, args.Target));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnEntityTargetAction(CP14DelayedEntityTargetActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (args is not ICP14DelayedMagicEffect delayedEffect)
|
||||
return;
|
||||
|
||||
if (!TryCastSpell(args.Action, args.Performer))
|
||||
return;
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, new CP14DelayedEntityTargetActionDoAfterEvent(), args.Action, args.Target)
|
||||
{
|
||||
BreakOnMove = delayedEffect.BreakOnMove,
|
||||
BreakOnDamage = delayedEffect.BreakOnDamage,
|
||||
BlockDuplicate = true,
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doAfterEventArgs);
|
||||
|
||||
//Telegraphy effects
|
||||
if (_net.IsServer && TryComp<CP14MagicEffectComponent>(args.Action, out var magicEffect))
|
||||
{
|
||||
foreach (var effect in magicEffect.TelegraphyEffects)
|
||||
{
|
||||
effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(args.Performer, args.Target, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDelayedWorldTargetDoAfter(Entity<CP14MagicEffectComponent> ent, ref CP14DelayedWorldTargetActionDoAfterEvent args)
|
||||
{
|
||||
var stopEv = new CP14StopCastMagicEffectEvent();
|
||||
RaiseLocalEvent(ent, ref stopEv);
|
||||
var endEv = new CP14EndCastMagicEffectEvent();
|
||||
RaiseLocalEvent(ent, ref endEv);
|
||||
|
||||
if (args.Cancelled || !_net.IsServer)
|
||||
return;
|
||||
@@ -71,8 +192,8 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
|
||||
private void OnDelayedEntityTargetDoAfter(Entity<CP14MagicEffectComponent> ent, ref CP14DelayedEntityTargetActionDoAfterEvent args)
|
||||
{
|
||||
var stopEv = new CP14StopCastMagicEffectEvent();
|
||||
RaiseLocalEvent(ent, ref stopEv);
|
||||
var endEv = new CP14EndCastMagicEffectEvent();
|
||||
RaiseLocalEvent(ent, ref endEv);
|
||||
|
||||
if (args.Cancelled || !_net.IsServer)
|
||||
return;
|
||||
@@ -88,8 +209,8 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
|
||||
private void OnDelayedInstantActionDoAfter(Entity<CP14MagicEffectComponent> ent, ref CP14DelayedInstantActionDoAfterEvent args)
|
||||
{
|
||||
var stopEv = new CP14StopCastMagicEffectEvent();
|
||||
RaiseLocalEvent(ent, ref stopEv);
|
||||
var endEv = new CP14EndCastMagicEffectEvent();
|
||||
RaiseLocalEvent(ent, ref endEv);
|
||||
|
||||
if (args.Cancelled || !_net.IsServer)
|
||||
return;
|
||||
@@ -154,80 +275,6 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
RaiseLocalEvent(ent, ref ev);
|
||||
}
|
||||
|
||||
private void OnInstantAction(CP14DelayedInstantActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (args is not ICP14DelayedMagicEffect delayedEffect)
|
||||
return;
|
||||
|
||||
if (!TryCastSpell(args.Action, args.Performer))
|
||||
return;
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, new CP14DelayedInstantActionDoAfterEvent(), args.Action)
|
||||
{
|
||||
BreakOnMove = delayedEffect.BreakOnMove,
|
||||
BreakOnDamage = delayedEffect.BreakOnDamage,
|
||||
BlockDuplicate = true,
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doAfterEventArgs);
|
||||
}
|
||||
|
||||
private void OnWorldTargetAction(CP14DelayedWorldTargetActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (args is not ICP14DelayedMagicEffect delayedEffect)
|
||||
return;
|
||||
|
||||
if (!TryCastSpell(args.Action, args.Performer))
|
||||
return;
|
||||
|
||||
var doAfter = new CP14DelayedWorldTargetActionDoAfterEvent()
|
||||
{
|
||||
Target = EntityManager.GetNetCoordinates(args.Target)
|
||||
};
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, doAfter, args.Action)
|
||||
{
|
||||
BreakOnMove = delayedEffect.BreakOnMove,
|
||||
BreakOnDamage = delayedEffect.BreakOnDamage,
|
||||
BlockDuplicate = true,
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doAfterEventArgs);
|
||||
}
|
||||
|
||||
private void OnEntityTargetAction(CP14DelayedEntityTargetActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (args is not ICP14DelayedMagicEffect delayedEffect)
|
||||
return;
|
||||
|
||||
if (!TryCastSpell(args.Action, args.Performer))
|
||||
return;
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Performer, delayedEffect.Delay, new CP14DelayedEntityTargetActionDoAfterEvent(), args.Action, args.Target)
|
||||
{
|
||||
BreakOnMove = delayedEffect.BreakOnMove,
|
||||
BreakOnDamage = delayedEffect.BreakOnDamage,
|
||||
BlockDuplicate = true,
|
||||
};
|
||||
|
||||
_doAfter.TryStartDoAfter(doAfterEventArgs);
|
||||
}
|
||||
|
||||
private bool TryCastSpell(EntityUid spell, EntityUid performer)
|
||||
{
|
||||
var ev = new CP14BeforeCastMagicEffectEvent
|
||||
@@ -251,25 +298,6 @@ public partial class CP14SharedMagicSystem : EntitySystem
|
||||
return !ev.Cancelled;
|
||||
}
|
||||
|
||||
private void OnBeforeCastMagicEffect(Entity<CP14MagicEffectComponent> ent, ref CP14BeforeCastMagicEffectEvent args)
|
||||
{
|
||||
if (!TryComp<CP14MagicEnergyContainerComponent>(args.Performer, out var magicContainer))
|
||||
{
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_magicEnergy.HasEnergy(args.Performer, ent.Comp.ManaCost, magicContainer, ent.Comp.Safe))
|
||||
{
|
||||
args.PushReason(Loc.GetString("cp14-magic-spell-not-enough-mana"));
|
||||
args.Cancel();
|
||||
}
|
||||
else if(!_magicEnergy.HasEnergy(args.Performer, ent.Comp.ManaCost, magicContainer, true) && _net.IsServer)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("cp14-magic-spell-not-enough-mana-cast-warning-"+_random.Next(5)), args.Performer, args.Performer, PopupType.SmallCaution);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnAfterCastMagicEffect(Entity<CP14MagicEffectComponent> ent, ref CP14AfterCastMagicEffectEvent args)
|
||||
{
|
||||
if (_net.IsClient)
|
||||
|
||||
@@ -15,6 +15,12 @@ public sealed partial class CP14MagicEffectComponent : Component
|
||||
[DataField]
|
||||
public bool Safe = false;
|
||||
|
||||
/// <summary>
|
||||
/// Effects that will trigger at the beginning of the cast, before mana is spent. Should have no gameplay importance, just special effects, popups and sounds.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public List<CP14SpellEffect> TelegraphyEffects = new();
|
||||
|
||||
[DataField]
|
||||
public List<CP14SpellEffect> Effects = new();
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public sealed class CP14StartCastMagicEffectEvent : EntityEventArgs
|
||||
/// is invoked on the spell itself when the spell process has been completed or interrupted
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public sealed class CP14StopCastMagicEffectEvent : EntityEventArgs
|
||||
public sealed class CP14EndCastMagicEffectEvent : EntityEventArgs
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Spells;
|
||||
|
||||
public sealed partial class CP14SpellAddComponent : CP14SpellEffect
|
||||
{
|
||||
[DataField]
|
||||
public ComponentRegistry Components = new();
|
||||
|
||||
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
if (args.Target is null)
|
||||
return;
|
||||
|
||||
entManager.AddComponents(args.Target.Value, Components);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Spells;
|
||||
|
||||
public sealed partial class CP14SpellCasterTeleport : CP14SpellEffect
|
||||
{
|
||||
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
EntityCoordinates? targetPoint = null;
|
||||
if (args.Position is not null)
|
||||
targetPoint = args.Position.Value;
|
||||
else if (args.Target is not null && entManager.TryGetComponent<TransformComponent>(args.Target.Value, out var transformComponent))
|
||||
targetPoint = transformComponent.Coordinates;
|
||||
|
||||
if (targetPoint is null || args.User is null)
|
||||
return;
|
||||
|
||||
var transform = entManager.System<SharedTransformSystem>();
|
||||
|
||||
transform.SetCoordinates(args.User.Value, targetPoint.Value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using Content.Shared.Damage;
|
||||
|
||||
namespace Content.Shared._CP14.MeleeWeapon.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class CP14MeleeSelfDamageComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public DamageSpecifier DamageToSelf = new()
|
||||
{
|
||||
DamageDict = new()
|
||||
{
|
||||
{ "Blunt", 1 },
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
using Content.Shared._CP14.MeleeWeapon.EntitySystems;
|
||||
|
||||
using Content.Server._CP14.MeleeWeapon.EntitySystems;
|
||||
|
||||
namespace Content.Server._CP14.MeleeWeapon.Components;
|
||||
namespace Content.Shared._CP14.MeleeWeapon.Components;
|
||||
|
||||
/// <summary>
|
||||
/// allows the object to become blunt with use
|
||||
@@ -1,8 +1,8 @@
|
||||
using Content.Server._CP14.MeleeWeapon.EntitySystems;
|
||||
using Content.Shared._CP14.MeleeWeapon.EntitySystems;
|
||||
using Content.Shared.Damage;
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Server._CP14.MeleeWeapon.Components;
|
||||
namespace Content.Shared._CP14.MeleeWeapon.Components;
|
||||
|
||||
/// <summary>
|
||||
/// component allows you to sharpen objects by restoring their damage.
|
||||
@@ -34,7 +34,7 @@ public sealed partial class CP14SharpeningStoneComponent : Component
|
||||
{
|
||||
DamageDict = new()
|
||||
{
|
||||
{ "Blunt", 1 }
|
||||
{ "Blunt", 1 },
|
||||
}
|
||||
};
|
||||
|
||||
@@ -46,7 +46,7 @@ public sealed partial class CP14SharpeningStoneComponent : Component
|
||||
{
|
||||
DamageDict = new()
|
||||
{
|
||||
{ "Blunt", 1 }
|
||||
{ "Blunt", 1 },
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
using Content.Server._CP14.MeleeWeapon.Components;
|
||||
using Content.Shared._CP14.MeleeWeapon.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
|
||||
namespace Content.Server._CP14.MeleeWeapon.EntitySystems;
|
||||
namespace Content.Shared._CP14.MeleeWeapon.EntitySystems;
|
||||
|
||||
public sealed class CP14MeleeSelfDamageSystem : EntitySystem
|
||||
{
|
||||
@@ -1,21 +1,23 @@
|
||||
using System.Linq;
|
||||
using Content.Server._CP14.MeleeWeapon.Components;
|
||||
using Content.Shared._CP14.MeleeWeapon.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Placeable;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Timing;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Content.Shared.Wieldable;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
|
||||
namespace Content.Server._CP14.MeleeWeapon.EntitySystems;
|
||||
namespace Content.Shared._CP14.MeleeWeapon.EntitySystems;
|
||||
|
||||
public sealed class CP14SharpeningSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
|
||||
[Dependency] private readonly UseDelaySystem _useDelay = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -87,6 +89,9 @@ public sealed class CP14SharpeningSystem : EntitySystem
|
||||
_damageableSystem.TryChangeDamage(target, stone.Comp.TargetDamage);
|
||||
|
||||
component.Sharpness = MathHelper.Clamp01(component.Sharpness + stone.Comp.SharpnessHeal);
|
||||
|
||||
if (component.Sharpness >= 0.99)
|
||||
_popup.PopupEntity(Loc.GetString("sharpening-ready"), target, user);
|
||||
}
|
||||
|
||||
_useDelay.TryResetDelay(stone);
|
||||
@@ -7,3 +7,5 @@ damage-weapon-1 = Looks completely intact
|
||||
damage-weapon-2 = Covered in a couple of scratches.
|
||||
damageable-weapon-3 = Looks worn.
|
||||
damageable-weapon-4 = It's about to break.
|
||||
|
||||
sharpening-ready = Perfectly sharpened
|
||||
|
||||
@@ -27,12 +27,21 @@ ent-CP14BaseLock = стальной замок
|
||||
ent-CP14LockTavern = замок от таверны
|
||||
.desc = { ent-CP14BaseLock.desc }
|
||||
|
||||
ent-CP14BaseMagicRune = magic rune
|
||||
.desc = manifestation of magical energy in the physical plane
|
||||
|
||||
ent-CP14BaseMagicImpact = magic impact
|
||||
.desc = manifestation of magical energy in the physical plane
|
||||
|
||||
ent-CP14ClothingCloakArmoredRed = бронированная красная накидка
|
||||
.desc = Огромные металлические наплечники дают дополнительную защиту от отрубания головы.
|
||||
|
||||
ent-CP14ClothingCloakBlacksmithArpon = фартук кузнеца
|
||||
.desc = Свободные кожанные полоски, все еще фактически являющиеся одеждой.
|
||||
|
||||
ent-CP14ClothingCloakMaidArpon = фартук горничной
|
||||
.desc = Чистота, порядок и послушание - вот основные черты хорошей горничной.
|
||||
|
||||
ent-CP14ClothingCloakFurcapeBlack = меховая накидка
|
||||
.desc = Брутальная, выделанная из шерсти, накидка на плечи.
|
||||
|
||||
@@ -108,6 +117,21 @@ ent-CP14ClothingPantsAristocratic = штаны аристократа
|
||||
ent-CP14ClothingPantsLoincloth = набедренная повязка
|
||||
.desc = Свободные, ничего не мешает, да еще и выглядят экстремально брутально
|
||||
|
||||
ent-CP14ClothingDressBlack = черное платье
|
||||
.desc = Просторная женское платье
|
||||
|
||||
ent-CP14ClothingRingIceDagger = conductive ring
|
||||
.desc = A standard mana-conductive ring that allows the user to summon ice daggers.
|
||||
.suffix = Ice Dagger
|
||||
|
||||
ent-CP14ClothingRingFlameCreation = conductive ring
|
||||
.desc = A standard mana-conductive ring that allows the user to summon artificial flames.
|
||||
.suffix = Flame creation
|
||||
|
||||
ent-CP14ClothingRingCureWounds = conductive ring
|
||||
.desc = A standard mana-conductive ring that allows the user to heal physical injuries.
|
||||
.suffix = Cure Wounds
|
||||
|
||||
ent-CP14ClothingShirtCottonBlue = хлопковая синяя рубаха
|
||||
.desc = { ent-CP14ClothingShirtCottonBlue.desc }
|
||||
|
||||
@@ -143,6 +167,9 @@ ent-CP14Mist = облако
|
||||
ent-CP14MistVitalExtract = { ent-CP14Mist }
|
||||
.desc = { ent-CP14Mist.desc }
|
||||
|
||||
ent-CP14AuraNodeBase = aura node
|
||||
.desc = An energy node that affects the elemental energy in the surrounding space.
|
||||
|
||||
ent-CP14ExpeditionShipTargetPoint = пункт назначения экспедиционного судна
|
||||
.desc = Один из возможных пунктов прибытия корабля с игроками.
|
||||
|
||||
@@ -150,6 +177,8 @@ ent-CP14SpawnPointAdventurer = авантюрист
|
||||
|
||||
ent-CP14SpawnPointAlchemist = алхимик
|
||||
|
||||
ent-CP14SpawnPointCaptain = капитан
|
||||
|
||||
ent-CP14ConstrainedSpawnerBase = None
|
||||
.desc = lol
|
||||
|
||||
@@ -267,6 +296,41 @@ ent-CP14WalletFilledTest = { ent-CP14Wallet }
|
||||
.desc = { ent-CP14Wallet.desc }
|
||||
.suffix = Filled test
|
||||
|
||||
ent-CP14CopperBar1 = медный слиток
|
||||
.desc = Тяжелый, слегка зеленый кусок обработанной меди.
|
||||
.suffix = 1
|
||||
|
||||
ent-CP14CopperBar5 = { ent-CP14CopperBar1 }
|
||||
.desc = { ent-CP14CopperBar1.desc }
|
||||
.suffix = 5
|
||||
|
||||
ent-CP14CopperBar10 = { ent-CP14CopperBar1 }
|
||||
.desc = { ent-CP14CopperBar1.desc }
|
||||
.suffix = 10
|
||||
|
||||
ent-CP14IronBar1 = iron bar
|
||||
.desc = A heavy piece of refined iron
|
||||
.suffix = 1
|
||||
|
||||
ent-CP14IronBar5 = { ent-CP14IronBar1 }
|
||||
.desc = { ent-CP14IronBar1.desc }
|
||||
.suffix = 5
|
||||
|
||||
ent-CP14IronBar10 = { ent-CP14IronBar1 }
|
||||
.desc = { ent-CP14IronBar1.desc }
|
||||
.suffix = 10
|
||||
|
||||
ent-CP14GoldBar1 = золотой слиток
|
||||
.desc = Теплый на ощупь, мягкий кусок изысканного золота.
|
||||
|
||||
ent-CP14GoldBar5 = { ent-CP14GoldBar1 }
|
||||
.desc = { ent-CP14GoldBar1.desc }
|
||||
.suffix = 5
|
||||
|
||||
ent-CP14GoldBar10 = { ent-CP14GoldBar1 }
|
||||
.desc = { ent-CP14GoldBar1.desc }
|
||||
.suffix = 10
|
||||
|
||||
ent-CP14DirtBlock1 = блок земли
|
||||
.desc = Блок великолепной плодородной почвы.
|
||||
|
||||
@@ -345,6 +409,36 @@ ent-CP14VialSmallLumiMushroom = { ent-CP14VialTiny }
|
||||
.desc = { ent-CP14VialTiny.desc }
|
||||
.suffix = Люмигриб
|
||||
|
||||
ent-CP14MeltingMoldBase = форма для выплавки
|
||||
.desc = Деревянная доска для заливки металла в необходимые формы.
|
||||
|
||||
ent-CP14MeltingMoldBlank = форма для выплавки заготовок
|
||||
.desc = Пустая форма для литья металла. Вы можете вырезать в ней любую нужную форму на столе для резки деталей.
|
||||
|
||||
ent-CP14MeltingMoldDaggers = форма для кинжала
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldNails = форма для гвоздей
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldPickaxe = форма для кирки
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldShovel = форма для лопаты
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldSickle = форма для серпа
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldSword = форма для меча
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldThrowableSpear = форма для метательного копья
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14MeltingMoldTwoHandedSword = форма для двуручного меча
|
||||
.desc = { ent-CP14MeltingMoldBase.desc }
|
||||
|
||||
ent-CP14Wheat = сноп пшеницы
|
||||
.desc = У вас есть выбор: посадить семена обратно в землю, либо пустить их в муку.
|
||||
|
||||
@@ -367,9 +461,9 @@ ent-CP14LumiMushroom = люмигриб
|
||||
.desc = Слабо светящийся гриб. Часто используется алхимиками как средство для концентрации растворов.
|
||||
|
||||
ent-CP14EnergyCrystalBase = None
|
||||
.desc = Обработанные кристаллы кварца являются прекрасными хранителями магической энергии. А специальные разъемы позволяют удобно вставлять их в магические устройства, превращая в энергетические батарейки.
|
||||
.desc = Shards of one of the Khyber dragon, used to bind and control elemental energy.
|
||||
|
||||
ent-CP14EnergyCrystalSmall = маленький энергокристалл
|
||||
ent-CP14EnergyCrystalSmall = small Khyber shard
|
||||
.desc = { ent-CP14EnergyCrystalBase.desc }
|
||||
.suffix = Full
|
||||
|
||||
@@ -377,7 +471,7 @@ ent-CP14EnergyCrystalSmallEmpty = { ent-CP14EnergyCrystalSmall }
|
||||
.desc = { ent-CP14EnergyCrystalSmall.desc }
|
||||
.suffix = Empty
|
||||
|
||||
ent-CP14EnergyCrystalMedium = энергокристалл
|
||||
ent-CP14EnergyCrystalMedium = Khyber shard
|
||||
.desc = { ent-CP14EnergyCrystalBase.desc }
|
||||
.suffix = Full
|
||||
|
||||
@@ -385,9 +479,12 @@ ent-CP14EnergyCrystalMediumEmpty = { ent-CP14EnergyCrystalMedium }
|
||||
.desc = { ent-CP14EnergyCrystalMedium.desc }
|
||||
.suffix = Empty
|
||||
|
||||
ent-CP14AuraScanner = сканер ауры
|
||||
.desc = Сканирует полярность потоков элементальной энергии в этом месте.
|
||||
|
||||
ent-CP14Bucket = ведро
|
||||
.desc = Старое скучное ведро
|
||||
.suffix = CP14!
|
||||
.suffix = CP14
|
||||
|
||||
ent-CP14OldLantern = Старая Лампа
|
||||
.desc = Пережиток прошлого техномагии. Большой, тяжелый, непрактичный. Таким приятно разве что бить по голове.
|
||||
@@ -443,28 +540,12 @@ ent-CP14BasePickaxe = кирка
|
||||
ent-CP14BaseShovel = лопата
|
||||
.desc = Орудие для вскапывания земли, рытья грядок или могил.
|
||||
|
||||
ent-CP14WeaponRevolverNavy = револьвер "Марин"
|
||||
.desc = Увесистый капсюльный револьвер серии "Марин". В настоящее время револьверы серии "Марин" стоят баснословные деньги, и их могут позволить себе исключительно преуспевающие моряки и торговцы.
|
||||
|
||||
ent-CP14BaseLightCrossbow = легкий арбалет
|
||||
.desc = Небольшой, компактный арбалет, который удобно держать одной рукой. Не слишком меткий с обратной стороны.
|
||||
|
||||
ent-CP14WeaponRifleCrush = крушитель
|
||||
.desc = Легкая, дорогая и непростая в обращении винтовка.
|
||||
|
||||
ent-CP14WeaponRifleDurandal = дюрандаль
|
||||
.desc = Винтовка среднего размера, дорогая и не очень удобная в использовании.
|
||||
|
||||
ent-CP14WeaponRifleLebel = лебел
|
||||
.desc = Тяжелая, дорогая и не очень удобная в использовании винтовка.
|
||||
|
||||
ent-CP14Crossbolt = арбалетный болт
|
||||
.desc = Стержень с заостренным концом. Без оперения, это вам не лук.
|
||||
|
||||
ent-CP14CartridgeBulletRifle = винтовочный патрон
|
||||
|
||||
ent-CP14BulletRifle = винтовочная пуля
|
||||
|
||||
ent-CP14DungeonEntrance = спуск в подземелье
|
||||
.desc = Темные глубины подземного мира зовут вас.
|
||||
|
||||
@@ -477,6 +558,22 @@ ent-CP14BaseSharpeningStoneStructure = стационарный точильны
|
||||
ent-CP14Mannequin = манекен
|
||||
.desc = Удобная подставка для одежды или доспехов.
|
||||
|
||||
ent-CP14StatueGob = статуя Гоба
|
||||
.desc = Он прекрасен.
|
||||
.suffix = Нормальная
|
||||
|
||||
ent-CP14StatueGobVines = статуя Гоба
|
||||
.desc = { ent-CP14StatueGob.desc }
|
||||
.suffix = Нормальная. Заросшая
|
||||
|
||||
ent-CP14StatueGobRuined = разрушенная статуя Гоба
|
||||
.desc = { ent-CP14StatueGob.desc }
|
||||
.suffix = Разрушенная
|
||||
|
||||
ent-CP14StatueGobRuinedVines = разрушенная статуя Гоба
|
||||
.desc = { ent-CP14StatueGob.desc }
|
||||
.suffix = Разрушенная. Заросшая
|
||||
|
||||
ent-CP14WallmountWoodenBoards = доски
|
||||
.desc = Прибиты к стене. Зачем? не совсем ясно.
|
||||
|
||||
@@ -738,6 +835,9 @@ ent-CP14WallmountBarShelfB = { ent-CP14WallmountBarShelfA }
|
||||
ent-CP14Workbench = верстак
|
||||
.desc = Стол для создания различного базового инструментария.
|
||||
|
||||
ent-CP14WorkbenchMeltingMolds = стол для резки форм
|
||||
.desc = Специализированный стол, позволяющий вырезать формы для выплавки металла.
|
||||
|
||||
ent-CP14FrameWooden = каркас деревянной стены
|
||||
.desc = Деревянный каркас для деревянных стен любых видов.
|
||||
|
||||
@@ -789,6 +889,9 @@ ent-CP14GatherableLumiMushroom = люмигрибы
|
||||
.desc = Слабо светящийся гриб. Часто используется алхимиками как средство для концентрации растворов.
|
||||
.suffix = Gatherable
|
||||
|
||||
ent-CP14ElementalReactor = elemental reactor
|
||||
.desc = A work of art created by the dwarves of Zilagro and House Lyrandar, controlling the fire elemental and allowing it to produce vast amounts of energy.
|
||||
|
||||
ent-CP14ChestGeneric = сундук
|
||||
.desc = Chest.
|
||||
|
||||
@@ -804,6 +907,15 @@ ent-CP14BrassChest = латунный сундук
|
||||
ent-CP14CrateCoffin = гроб
|
||||
.desc = Удобный и красивый гроб, чтобы с удобствами дождаться своего воскрешения.
|
||||
|
||||
ent-CP14BaseSmallCrate = { ent-CP14BaseCrate }
|
||||
.desc = { ent-CP14BaseCrate.desc }
|
||||
|
||||
ent-CP14LargeWoodenCrate = большой деревянный ящик
|
||||
.desc = Ящик из дерева.
|
||||
|
||||
ent-CP14SmallWoodenCrate = малый деревянный ящик
|
||||
.desc = Ящик из дерева.
|
||||
|
||||
ent-CP14Cliff = обрыв
|
||||
.desc = Серьезные неровности природного ландшафта.
|
||||
.suffix = Прямой
|
||||
@@ -858,6 +970,14 @@ ent-CP14BaseWall = стена
|
||||
ent-CP14WallStonebrick = каменная кирпичная стена
|
||||
.desc = { ent-CP14BaseWall.desc }
|
||||
|
||||
ent-CP14WallStonebrickCrushedMedium = каменная кирпичная стена
|
||||
.desc = { ent-CP14BaseCrushed.desc }
|
||||
.suffix = CrushedMedium
|
||||
|
||||
ent-CP14WallStonebrickCrushedLow = каменная кирпичная стена
|
||||
.desc = { ent-CP14BaseCrushed.desc }
|
||||
.suffix = CrushedLow
|
||||
|
||||
ent-CP14WallWhitebrick = белая кирпичная стена
|
||||
.desc = { ent-CP14BaseWall.desc }
|
||||
|
||||
@@ -957,22 +1077,6 @@ ent-CP14CaveStoneWallGoldOre = { ent-CP14CaveStoneWall }
|
||||
ent-CP14CardboardWall = стена из картона
|
||||
.desc = Тонкая, непрочная стена из бумаги и картона. Пользуется популярностью в теплых странах.
|
||||
|
||||
ent-CP14StatueGob = статуя Гоба
|
||||
.desc = Он прекрасен.
|
||||
.suffix = Нормальная
|
||||
|
||||
ent-CP14StatueGobVines = статуя Гоба
|
||||
.desc = { ent-CP14StatueGob.desc }
|
||||
.suffix = Нормальная. Заросшая
|
||||
|
||||
ent-CP14StatueGobRuined = разрушенная статуя Гоба
|
||||
.desc = { ent-CP14StatueGob.desc }
|
||||
.suffix = Разрушенная
|
||||
|
||||
ent-CP14StatueGobRuinedVines = разрушенная статуя Гоба
|
||||
.desc = { ent-CP14StatueGob.desc }
|
||||
.suffix = Разрушенная. Заросшая
|
||||
|
||||
ent-CPBaseSharpeningStoneStructure = стационарный точильный камень
|
||||
.desc = прочный, долговечный точильный камень, способный затачивать оружие без особого вреда для него.
|
||||
|
||||
|
||||
@@ -6,4 +6,6 @@ sharpening-examined-25 = Выглядит крайне сильно затупи
|
||||
damageable-weapon-1 = Выглядит полностью целым
|
||||
damageable-weapon-2 = Покрыт парой царапин
|
||||
damageable-weapon-3 = Выглядит изношенным
|
||||
damageable-weapon-4 = Он вот-вот сломается
|
||||
damageable-weapon-4 = Он вот-вот сломается
|
||||
|
||||
sharpening-ready = Идеально заточен
|
||||
@@ -5,6 +5,10 @@
|
||||
components:
|
||||
- type: CP14MagicEffect
|
||||
manaCost: 15
|
||||
telegraphyEffects:
|
||||
- !type:CP14SpellSpawnEntity
|
||||
spawns:
|
||||
- CP14ImpactEffectCureWounds
|
||||
effects:
|
||||
- !type:CP14SpellSpawnEntity
|
||||
spawns:
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
- type: entity
|
||||
id: CP14ActionSpellShadowStep
|
||||
name: Shadow step
|
||||
description: A step through the gash of reality that allows you to cover a lot of distance quickly
|
||||
components:
|
||||
- type: CP14MagicEffect
|
||||
manaCost: 40
|
||||
telegraphyEffects:
|
||||
- !type:CP14SpellSpawnEntity
|
||||
spawns:
|
||||
- CP14ImpactEffectShadowStep
|
||||
effects:
|
||||
- !type:CP14SpellSpawnEntity
|
||||
spawns:
|
||||
- CP14ImpactEffectShadowStep
|
||||
- !type:CP14SpellCasterTeleport
|
||||
- type: CP14MagicEffectVerbalAspect
|
||||
startSpeech: "Tenebrae, accipe me..."
|
||||
endSpeech: "in alium locum"
|
||||
- type: WorldTargetAction
|
||||
useDelay: 15
|
||||
range: 10
|
||||
checkCanAccess: false
|
||||
itemIconStyle: BigAction
|
||||
sound: !type:SoundPathSpecifier
|
||||
path: /Audio/Magic/rumble.ogg
|
||||
icon:
|
||||
sprite: _CP14/Effects/Magic/spells_icons.rsi
|
||||
state: shadow_step
|
||||
event: !type:CP14DelayedWorldTargetActionEvent
|
||||
delay: 1
|
||||
|
||||
- type: entity
|
||||
id: CP14ImpactEffectShadowStep
|
||||
parent: CP14BaseMagicImpact
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: particles_up
|
||||
color: "#79b330"
|
||||
shader: unshaded
|
||||
@@ -15,6 +15,7 @@
|
||||
id: CP14ClothingRingIceDagger
|
||||
parent: CP14ClothingRingBase
|
||||
name: conductive ring
|
||||
suffix: Ice Dagger
|
||||
description: A standard mana-conductive ring that allows the user to summon ice daggers.
|
||||
components:
|
||||
- type: Sprite
|
||||
@@ -33,6 +34,7 @@
|
||||
parent: CP14ClothingRingBase
|
||||
name: conductive ring
|
||||
description: A standard mana-conductive ring that allows the user to summon artificial flames.
|
||||
suffix: Flame creation
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
@@ -50,6 +52,7 @@
|
||||
parent: CP14ClothingRingBase
|
||||
name: conductive ring
|
||||
description: A standard mana-conductive ring that allows the user to heal physical injuries.
|
||||
suffix: Cure Wounds
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
},
|
||||
{
|
||||
"name": "ice_dagger"
|
||||
},
|
||||
{
|
||||
"name": "shadow_step"
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
Reference in New Issue
Block a user