QoL говно и типа того, улучшены потоки в Razor, Paintе и Sharpening. И еще разбор причины в ghostkicke на сдачу. By rechka

This commit is contained in:
= 2026-02-25 20:45:49 +05:00
parent a04bd9a754
commit 560d78176c
4 changed files with 142 additions and 156 deletions

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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;
}
}
}

View file

@ -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;
}
}