QoL говно и типа того, улучшены потоки в Razor, Paintе и Sharpening. И еще разбор причины в ghostkicke на сдачу. By rechka
This commit is contained in:
parent
a04bd9a754
commit
560d78176c
4 changed files with 142 additions and 156 deletions
|
|
@ -56,16 +56,18 @@ public sealed class GhostKickCommand : LocalizedEntityCommands
|
|||
{
|
||||
if (args.Length < 1)
|
||||
{
|
||||
shell.WriteError(Loc.GetString($"shell-need-exactly-one-argument"));
|
||||
shell.WriteError(Loc.GetString("shell-need-exactly-one-argument"));
|
||||
return;
|
||||
}
|
||||
|
||||
var playerName = args[0];
|
||||
var reason = args.Length > 1 ? args[1] : Loc.GetString($"cmd-ghostkick-default-reason");
|
||||
var reason = args.Length > 1
|
||||
? string.Join(' ', args[1..])
|
||||
: Loc.GetString("cmd-ghostkick-default-reason");
|
||||
|
||||
if (!_playerManager.TryGetSessionByUsername(playerName, out var player))
|
||||
{
|
||||
shell.WriteError(Loc.GetString($"shell-target-player-does-not-exist"));
|
||||
shell.WriteError(Loc.GetString("shell-target-player-does-not-exist"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public sealed class PaintSystem : SharedPaintSystem
|
|||
if (args.Target is not { Valid: true } target)
|
||||
return;
|
||||
|
||||
PrepPaint(uid, component, target, args.User);
|
||||
TryStartPaint(uid, component, target, args.User);
|
||||
}
|
||||
|
||||
private void OnPaintVerb(EntityUid uid, PaintComponent component, GetVerbsEvent<UtilityVerb> args)
|
||||
|
|
@ -60,7 +60,7 @@ public sealed class PaintSystem : SharedPaintSystem
|
|||
{
|
||||
Act = () =>
|
||||
{
|
||||
PrepPaint(uid, component, args.Target, args.User);
|
||||
TryStartPaint(uid, component, args.Target, args.User);
|
||||
},
|
||||
|
||||
Text = paintText,
|
||||
|
|
@ -68,7 +68,8 @@ public sealed class PaintSystem : SharedPaintSystem
|
|||
};
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
private void PrepPaint(EntityUid uid, PaintComponent component, EntityUid target, EntityUid user)
|
||||
|
||||
private void TryStartPaint(EntityUid uid, PaintComponent component, EntityUid target, EntityUid user)
|
||||
{
|
||||
|
||||
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, component.Delay, new PaintDoAfterEvent(), uid, target: target, used: uid)
|
||||
|
|
@ -79,8 +80,7 @@ public sealed class PaintSystem : SharedPaintSystem
|
|||
BreakOnHandChange = true
|
||||
};
|
||||
|
||||
if (!_doAfterSystem.TryStartDoAfter(doAfterEventArgs))
|
||||
return;
|
||||
_doAfterSystem.TryStartDoAfter(doAfterEventArgs);
|
||||
}
|
||||
|
||||
private void OnPaint(Entity<PaintComponent> entity, ref PaintDoAfterEvent args)
|
||||
|
|
@ -106,63 +106,60 @@ public sealed class PaintSystem : SharedPaintSystem
|
|||
return;
|
||||
}
|
||||
|
||||
if (entity.Comp.Blacklist != null && _whitelist.IsValid(entity.Comp.Blacklist, target) || HasComp<HumanoidAppearanceComponent>(target) || HasComp<SubFloorHideComponent>(target))
|
||||
if ((entity.Comp.Blacklist != null && _whitelist.IsValid(entity.Comp.Blacklist, target)) ||
|
||||
HasComp<HumanoidAppearanceComponent>(target) ||
|
||||
HasComp<SubFloorHideComponent>(target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("paint-failure", ("target", args.Target)), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (TryPaint(entity, target))
|
||||
{
|
||||
EnsureComp<SprayPaintedComponent>(target, out SprayPaintedComponent? paint);
|
||||
EnsureComp<AppearanceComponent>(target);
|
||||
|
||||
paint.Color = entity.Comp.Color; // set the target color to the color specified in the spray paint yml.
|
||||
_audio.PlayPvs(entity.Comp.Spray, entity);
|
||||
paint.Enabled = true;
|
||||
|
||||
if (HasComp<InventoryComponent>(target)) // Paint any clothing the target is wearing.
|
||||
{
|
||||
if (_inventory.TryGetSlots(target, out var slotDefinitions))
|
||||
{
|
||||
foreach (var slot in slotDefinitions)
|
||||
{
|
||||
if (!_inventory.TryGetSlotEntity(target, slot.Name, out var slotEnt))
|
||||
continue;
|
||||
|
||||
if (slotEnt == null)
|
||||
return;
|
||||
|
||||
if (HasComp<SprayPaintedComponent>(slotEnt.Value) || entity.Comp.Blacklist != null &&
|
||||
_whitelist.IsValid(entity.Comp.Blacklist,
|
||||
slotEnt.Value)
|
||||
|| HasComp<RandomSpriteComponent>(slotEnt.Value) ||
|
||||
HasComp<HumanoidAppearanceComponent>(
|
||||
slotEnt.Value))
|
||||
return;
|
||||
|
||||
EnsureComp<SprayPaintedComponent>(slotEnt.Value, out SprayPaintedComponent? slotpaint);
|
||||
EnsureComp<AppearanceComponent>(slotEnt.Value);
|
||||
slotpaint.Color = entity.Comp.Color;
|
||||
_appearanceSystem.SetData(slotEnt.Value, PaintVisuals.Painted, true);
|
||||
Dirty(slotEnt.Value, slotpaint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("paint-success", ("target", args.Target)), args.User, args.User, PopupType.Medium);
|
||||
_appearanceSystem.SetData(target, PaintVisuals.Painted, true);
|
||||
Dirty(target, paint);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryPaint(entity, target))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("paint-empty", ("used", args.Used)), args.User, args.User, PopupType.Medium);
|
||||
return;
|
||||
}
|
||||
|
||||
EnsureComp<SprayPaintedComponent>(target, out SprayPaintedComponent? paint);
|
||||
EnsureComp<AppearanceComponent>(target);
|
||||
|
||||
paint.Color = entity.Comp.Color; // set the target color to the color specified in the spray paint yml.
|
||||
_audio.PlayPvs(entity.Comp.Spray, entity);
|
||||
paint.Enabled = true;
|
||||
|
||||
if (HasComp<InventoryComponent>(target)) // Paint any clothing the target is wearing.
|
||||
{
|
||||
if (_inventory.TryGetSlots(target, out var slotDefinitions))
|
||||
{
|
||||
foreach (var slot in slotDefinitions)
|
||||
{
|
||||
if (!_inventory.TryGetSlotEntity(target, slot.Name, out var slotEnt) ||
|
||||
slotEnt == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (HasComp<SprayPaintedComponent>(slotEnt.Value) ||
|
||||
(entity.Comp.Blacklist != null && _whitelist.IsValid(entity.Comp.Blacklist, slotEnt.Value)) ||
|
||||
HasComp<RandomSpriteComponent>(slotEnt.Value) ||
|
||||
HasComp<HumanoidAppearanceComponent>(slotEnt.Value))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
EnsureComp<SprayPaintedComponent>(slotEnt.Value, out SprayPaintedComponent? slotpaint);
|
||||
EnsureComp<AppearanceComponent>(slotEnt.Value);
|
||||
slotpaint.Color = entity.Comp.Color;
|
||||
_appearanceSystem.SetData(slotEnt.Value, PaintVisuals.Painted, true);
|
||||
Dirty(slotEnt.Value, slotpaint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("paint-success", ("target", args.Target)), args.User, args.User, PopupType.Medium);
|
||||
_appearanceSystem.SetData(target, PaintVisuals.Painted, true);
|
||||
Dirty(target, paint);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private bool TryPaint(Entity<PaintComponent> reagent, EntityUid target)
|
||||
|
|
@ -173,12 +170,9 @@ public sealed class PaintSystem : SharedPaintSystem
|
|||
if (_solutionContainer.TryGetSolution(reagent.Owner, reagent.Comp.Solution, out _, out var solution))
|
||||
{
|
||||
var quantity = solution.RemoveReagent(reagent.Comp.Reagent, reagent.Comp.ConsumptionUnit);
|
||||
if (quantity > 0)// checks quantity of solution is more than 0.
|
||||
return true;
|
||||
|
||||
if (quantity < 1)
|
||||
return false;
|
||||
return quantity > 0; // checks quantity of solution is more than 0.
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ using Content.Shared.Humanoid;
|
|||
using Content.Shared.Humanoid.Markings;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared._Sunrise.Razor;
|
||||
using Robust.Packaging.AssetProcessing;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
|
|
@ -17,6 +16,8 @@ namespace Content.Server._Sunrise.Razor;
|
|||
|
||||
public sealed class RazorSystem : SharedRazorSystem
|
||||
{
|
||||
private const string BarberChairPrototype = "ChairBarber";
|
||||
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
|
||||
[Dependency] private readonly MarkingManager _markings = default!;
|
||||
|
|
@ -46,8 +47,7 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
if (component.Target is not { } target)
|
||||
return;
|
||||
|
||||
_doAfterSystem.Cancel(component.DoAfter);
|
||||
component.DoAfter = null;
|
||||
CancelCurrentDoAfter(component);
|
||||
|
||||
var doAfter = new RazorSelectDoAfterEvent()
|
||||
{
|
||||
|
|
@ -56,16 +56,7 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
Marking = message.Marking,
|
||||
};
|
||||
|
||||
var time = component.AddSlotTime;
|
||||
if (TryComp<BuckleComponent>(component.Target, out var buckleComponent))
|
||||
{
|
||||
if (buckleComponent.BuckledTo != null)
|
||||
{
|
||||
var proto = Prototype(buckleComponent.BuckledTo.Value);
|
||||
if (proto is { ID: "ChairBarber" })
|
||||
time *= 0.5f;
|
||||
}
|
||||
}
|
||||
var time = GetDoAfterTime(target, component.SelectSlotTime);
|
||||
|
||||
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, time, doAfter, uid, target: target, used: uid)
|
||||
{
|
||||
|
|
@ -83,25 +74,16 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
|
||||
private void OnSelectSlotDoAfter(EntityUid uid, RazorComponent component, RazorSelectDoAfterEvent args)
|
||||
{
|
||||
component.DoAfter = null;
|
||||
|
||||
if (args.Handled || args.Target == null || args.Cancelled)
|
||||
return;
|
||||
|
||||
if (component.Target != args.Target)
|
||||
return;
|
||||
|
||||
MarkingCategories category;
|
||||
|
||||
switch (args.Category)
|
||||
{
|
||||
case RazorCategory.Hair:
|
||||
category = MarkingCategories.Hair;
|
||||
break;
|
||||
case RazorCategory.FacialHair:
|
||||
category = MarkingCategories.FacialHair;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
if (!TryGetMarkingCategory(args.Category, out var category))
|
||||
return;
|
||||
|
||||
_humanoid.SetMarkingId(component.Target.Value, category, args.Slot, args.Marking);
|
||||
|
||||
|
|
@ -113,8 +95,7 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
if (component.Target is not { } target)
|
||||
return;
|
||||
|
||||
_doAfterSystem.Cancel(component.DoAfter);
|
||||
component.DoAfter = null;
|
||||
CancelCurrentDoAfter(component);
|
||||
|
||||
var doAfter = new RazorRemoveSlotDoAfterEvent()
|
||||
{
|
||||
|
|
@ -122,18 +103,7 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
Slot = message.Slot,
|
||||
};
|
||||
|
||||
var time = component.AddSlotTime;
|
||||
|
||||
Log.Debug($"id: {component.Target}");
|
||||
if (TryComp<BuckleComponent>(component.Target, out var buckleComponent))
|
||||
{
|
||||
if (buckleComponent.BuckledTo != null)
|
||||
{
|
||||
var proto = Prototype(buckleComponent.BuckledTo.Value);
|
||||
if (proto is { ID: "ChairBarber" })
|
||||
time *= 0.5f;
|
||||
}
|
||||
}
|
||||
var time = GetDoAfterTime(target, component.RemoveSlotTime);
|
||||
|
||||
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, time, doAfter, uid, target: target, used: uid)
|
||||
{
|
||||
|
|
@ -150,25 +120,16 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
|
||||
private void OnRemoveSlotDoAfter(EntityUid uid, RazorComponent component, RazorRemoveSlotDoAfterEvent args)
|
||||
{
|
||||
component.DoAfter = null;
|
||||
|
||||
if (args.Handled || args.Target == null || args.Cancelled)
|
||||
return;
|
||||
|
||||
if (component.Target != args.Target)
|
||||
return;
|
||||
|
||||
MarkingCategories category;
|
||||
|
||||
switch (args.Category)
|
||||
{
|
||||
case RazorCategory.Hair:
|
||||
category = MarkingCategories.Hair;
|
||||
break;
|
||||
case RazorCategory.FacialHair:
|
||||
category = MarkingCategories.FacialHair;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
if (!TryGetMarkingCategory(args.Category, out var category))
|
||||
return;
|
||||
|
||||
_humanoid.RemoveMarking(component.Target.Value, category, args.Slot);
|
||||
|
||||
|
|
@ -180,26 +141,14 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
if (component.Target == null)
|
||||
return;
|
||||
|
||||
_doAfterSystem.Cancel(component.DoAfter);
|
||||
component.DoAfter = null;
|
||||
CancelCurrentDoAfter(component);
|
||||
|
||||
var doAfter = new RazorAddSlotDoAfterEvent()
|
||||
{
|
||||
Category = message.Category,
|
||||
};
|
||||
|
||||
var time = component.AddSlotTime;
|
||||
|
||||
Log.Debug($"id: {component.Target}");
|
||||
if (TryComp<BuckleComponent>(component.Target, out var buckleComponent))
|
||||
{
|
||||
if (buckleComponent.BuckledTo != null)
|
||||
{
|
||||
var proto = Prototype(buckleComponent.BuckledTo.Value);
|
||||
if (proto is { ID: "ChairBarber" })
|
||||
time *= 0.5f;
|
||||
}
|
||||
}
|
||||
var time = GetDoAfterTime(component.Target.Value, component.AddSlotTime);
|
||||
|
||||
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, time, doAfter, uid, target: component.Target.Value, used: uid)
|
||||
{
|
||||
|
|
@ -215,31 +164,23 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
}
|
||||
private void OnAddSlotDoAfter(EntityUid uid, RazorComponent component, RazorAddSlotDoAfterEvent args)
|
||||
{
|
||||
if (args.Handled || args.Target == null || args.Cancelled || !TryComp(component.Target, out HumanoidAppearanceComponent? humanoid))
|
||||
component.DoAfter = null;
|
||||
|
||||
if (args.Handled || args.Target == null || args.Cancelled || component.Target != args.Target)
|
||||
return;
|
||||
|
||||
MarkingCategories category;
|
||||
|
||||
switch (args.Category)
|
||||
{
|
||||
case RazorCategory.Hair:
|
||||
category = MarkingCategories.Hair;
|
||||
break;
|
||||
case RazorCategory.FacialHair:
|
||||
category = MarkingCategories.FacialHair;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
if (!TryGetMarkingCategory(args.Category, out var category) ||
|
||||
!TryComp<HumanoidAppearanceComponent>(args.Target.Value, out var humanoid))
|
||||
return;
|
||||
|
||||
var marking = _markings.MarkingsByCategoryAndSpecies(category, humanoid.Species).Keys.FirstOrDefault();
|
||||
|
||||
if (string.IsNullOrEmpty(marking))
|
||||
return;
|
||||
|
||||
_humanoid.AddMarking(component.Target.Value, marking, Color.Black);
|
||||
_humanoid.AddMarking(args.Target.Value, marking, Color.Black);
|
||||
|
||||
UpdateInterface(uid, component.Target.Value, component);
|
||||
UpdateInterface(uid, args.Target.Value, component);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -248,4 +189,38 @@ public sealed class RazorSystem : SharedRazorSystem
|
|||
ent.Comp.Target = null;
|
||||
Dirty(ent);
|
||||
}
|
||||
|
||||
private void CancelCurrentDoAfter(RazorComponent component)
|
||||
{
|
||||
_doAfterSystem.Cancel(component.DoAfter);
|
||||
component.DoAfter = null;
|
||||
}
|
||||
|
||||
private TimeSpan GetDoAfterTime(EntityUid target, TimeSpan baseTime)
|
||||
{
|
||||
if (!TryComp<BuckleComponent>(target, out var buckleComponent) ||
|
||||
buckleComponent.BuckledTo == null)
|
||||
{
|
||||
return baseTime;
|
||||
}
|
||||
|
||||
var proto = Prototype(buckleComponent.BuckledTo.Value);
|
||||
return proto is { ID: BarberChairPrototype } ? baseTime * 0.5f : baseTime;
|
||||
}
|
||||
|
||||
private static bool TryGetMarkingCategory(RazorCategory category, out MarkingCategories markingCategory)
|
||||
{
|
||||
switch (category)
|
||||
{
|
||||
case RazorCategory.Hair:
|
||||
markingCategory = MarkingCategories.Hair;
|
||||
return true;
|
||||
case RazorCategory.FacialHair:
|
||||
markingCategory = MarkingCategories.FacialHair;
|
||||
return true;
|
||||
default:
|
||||
markingCategory = default;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,13 +3,16 @@ using Content.Shared.Interaction;
|
|||
using Content.Shared.Item;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Weapons.Melee;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
|
||||
namespace Content.Server._Sunrise.SharpeningSystem;
|
||||
|
||||
public sealed class SharpeningSystem : EntitySystem
|
||||
{
|
||||
private const string SlashDamageType = "Slash";
|
||||
private const string PiercingDamageType = "Piercing";
|
||||
|
||||
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
|
||||
|
|
@ -17,12 +20,12 @@ public sealed class SharpeningSystem : EntitySystem
|
|||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<SharpenerComponent, AfterInteractEvent>(OnSharping);
|
||||
SubscribeLocalEvent<SharpenerComponent, AfterInteractEvent>(OnSharpening);
|
||||
|
||||
SubscribeLocalEvent<SharpenedComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
}
|
||||
|
||||
private void OnSharping(EntityUid uid, SharpenerComponent component, AfterInteractEvent args)
|
||||
private void OnSharpening(EntityUid uid, SharpenerComponent component, AfterInteractEvent args)
|
||||
{
|
||||
if (!args.Target.HasValue)
|
||||
return;
|
||||
|
|
@ -40,8 +43,7 @@ public sealed class SharpeningSystem : EntitySystem
|
|||
_popupSystem.PopupEntity(Loc.GetString("sharpening-failed"), target, args.User);
|
||||
return;
|
||||
}
|
||||
/// Sunrise - Edit
|
||||
if (!meleeWeaponComponent.Damage.DamageDict.ContainsKey("Slash") && !meleeWeaponComponent.Damage.DamageDict.ContainsKey("Piercing"))
|
||||
if (!TryGetDamageBonus(component, meleeWeaponComponent, out var damageBonus))
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("sharpening-failed-blade"), target, args.User);
|
||||
return;
|
||||
|
|
@ -59,14 +61,6 @@ public sealed class SharpeningSystem : EntitySystem
|
|||
return;
|
||||
}
|
||||
|
||||
/// Sunrise - Edit
|
||||
var damageBonus = new DamageSpecifier();
|
||||
|
||||
if (meleeWeaponComponent.Damage.DamageDict.ContainsKey("Piercing"))
|
||||
damageBonus = component.PiercingDamageBonus;
|
||||
else if (meleeWeaponComponent.Damage.DamageDict.ContainsKey("Slash"))
|
||||
damageBonus = component.SlashDamageBonus;
|
||||
|
||||
EnsureComp<SharpenedComponent>(target).DamageBonus = damageBonus;
|
||||
|
||||
component.Usages -= 1;
|
||||
|
|
@ -96,4 +90,25 @@ public sealed class SharpeningSystem : EntitySystem
|
|||
_popupSystem.PopupEntity(Loc.GetString("sharpening-removed"), uid, args.User);
|
||||
RemCompDeferred<SharpenedComponent>(uid);
|
||||
}
|
||||
|
||||
private static bool TryGetDamageBonus(
|
||||
SharpenerComponent sharpener,
|
||||
MeleeWeaponComponent meleeWeapon,
|
||||
out DamageSpecifier damageBonus)
|
||||
{
|
||||
if (meleeWeapon.Damage.DamageDict.ContainsKey(PiercingDamageType))
|
||||
{
|
||||
damageBonus = sharpener.PiercingDamageBonus;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (meleeWeapon.Damage.DamageDict.ContainsKey(SlashDamageType))
|
||||
{
|
||||
damageBonus = sharpener.SlashDamageBonus;
|
||||
return true;
|
||||
}
|
||||
|
||||
damageBonus = default!;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue