Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions Content.Server/Stack/StackSystem.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Content.Shared.Popups;
using Content.Shared.Stacks;
using JetBrains.Annotations;
using Robust.Server.Player;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
// ADT-Tweak start
Expand All @@ -18,6 +19,7 @@ namespace Content.Server.Stack
public sealed class StackSystem : SharedStackSystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!; // ADT-Tweak
[Dependency] private readonly QuickDialogSystem _quickDialog = default!; // ADT-Tweak for system own split

#region Spawning
Expand Down Expand Up @@ -304,6 +306,45 @@ protected override void UserSplit(Entity<StackComponent> stack, Entity<Transform

Popup.PopupCursor(Loc.GetString("comp-stack-split"), user.Owner);
}

// ADT-Tweak start
protected override void RequestCustomSplit(Entity<StackComponent> stack, Entity<TransformComponent?> user)
{
if (!Resolve(user.Owner, ref user.Comp, false))
return;

if (!_playerManager.TryGetSessionByEntity(user.Owner, out var session))
return;

var maxCount = stack.Comp.Count;

_quickDialog.OpenDialog<int>(
session,
Loc.GetString("comp-stack-split-custom-title"),
Loc.GetString("comp-stack-split-custom-description", ("count", maxCount)),
(int amount) =>
{
if (amount <= 0)
{
Popup.PopupCursor(Loc.GetString("comp-stack-split-too-small"), user.Owner, PopupType.Medium);
return;
}

if (amount > maxCount)
{
Popup.PopupCursor(Loc.GetString("comp-stack-split-too-large"), user.Owner, PopupType.Medium);
return;
}

if (Split(stack.AsNullable(), amount, user.Comp.Coordinates) is not { } split)
return;

Hands.PickupOrDrop(user.Owner, split);

Popup.PopupCursor(Loc.GetString("comp-stack-split"), user.Owner);
});
}
// ADT-Tweak end
#endregion
}
}
95 changes: 91 additions & 4 deletions Content.Shared/ADT/Combat/ComboEffects.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
using Robust.Shared.Network;
using Content.Shared.Mobs.Components;
using Content.Shared.StatusEffectNew;
using Content.Shared.Administration.Logs;
using Content.Shared.Database;
using Robust.Shared.IoC;
using Robust.Shared.GameObjects;

namespace Content.Shared.ADT.Combat;

Expand All @@ -42,7 +46,14 @@ public sealed partial class ComboDamageEffect : IComboEffect
public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
var damageable = entMan.System<DamageableSystem>();
damageable.TryChangeDamage(target, Damage);
var damageResult = damageable.ChangeDamage(target, Damage);

if (damageResult.GetTotal() > 0)
{
var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo damage on {entMan.ToPrettyString(target):subject} and dealt {damageResult.GetTotal():damage} damage");
}
}
}

Expand All @@ -59,6 +70,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
var stun = entMan.System<SharedStaminaSystem>();
stun.TakeStaminaDamage(target, StaminaDamage);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo stamina damage on {entMan.ToPrettyString(target):subject} and dealt {StaminaDamage:stamina} stamina damage");
}
}

Expand Down Expand Up @@ -99,6 +114,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
var stun = entMan.System<SharedStunSystem>();
stun.TryKnockdown(target, time: null, drop: DropItems, force: false);
}

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Low,
$"{entMan.ToPrettyString(user):actor} performed combo fall effect on {entMan.ToPrettyString(target):subject} (dropItems: {DropItems})");
}
}

Expand All @@ -118,7 +137,13 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
var damageable = entMan.System<DamageableSystem>();
if (down.IsDown(target))
{
damageable.TryChangeDamage(target, Damage, IgnoreResistances);
var damageResult = damageable.ChangeDamage(target, Damage, ignoreResistances: IgnoreResistances);
if (damageResult.GetTotal() > 0)
{
var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo damage (downed target) on {entMan.ToPrettyString(target):subject} and dealt {damageResult.GetTotal():damage} damage");
}
}
}
}
Expand Down Expand Up @@ -147,6 +172,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
down.TryKnockdown(target, time: null, drop: DropItems, force: false);
}

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo stun effect on {entMan.ToPrettyString(target):subject} (stunTime: {StunTime}s, fall: {Fall}, dropItems: {DropItems})");
}
}

Expand Down Expand Up @@ -178,6 +207,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
if (!entMan.TryGetComponent<HandsComponent>(target, out var hand) || hand.ActiveHandId == null)
return;
hands.DoDrop(target, hand.ActiveHandId);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Low,
$"{entMan.ToPrettyString(user):actor} performed combo drop from hands effect on {entMan.ToPrettyString(target):subject}");
}
}

Expand All @@ -200,6 +233,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
if(!hands.TryPickup(user, activeItem.Value, emptyHand))
return;
hands.SetActiveHand(user, emptyHand);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo hands retake effect on {entMan.ToPrettyString(target):subject}");
}
}

Expand Down Expand Up @@ -227,8 +264,12 @@ public sealed partial class ComboMuteEffect : IComboEffect

public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
var status = entMan.System<Content.Shared.StatusEffect.StatusEffectsSystem>(); // я меняю системы эффектов ибо я две сразу использую. новая система эффектов для сна тупо лучше. смотрите ниже
var status = entMan.System<Content.Shared.StatusEffect.StatusEffectsSystem>();
status.TryAddStatusEffect<MutedComponent>(target, "Muted", TimeSpan.FromSeconds(Time), false);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo mute effect on {entMan.ToPrettyString(target):subject} (time: {Time}s)");
}
}

Expand All @@ -242,6 +283,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
var status = entMan.System<Content.Shared.StatusEffect.StatusEffectsSystem>();
status.TryAddStatusEffect<StunnedStatusEffectComponent>(target, "SlowedDown", TimeSpan.FromSeconds(Time), false);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo slowdown effect on {entMan.ToPrettyString(target):subject} (time: {Time}s)");
}
}

Expand All @@ -261,6 +306,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
if (down.IsDown(target))
{
stun.TakeStaminaDamage(target, Damage);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo stamina damage (downed target) on {entMan.ToPrettyString(target):subject} and dealt {Damage:stamina} stamina damage");
}
}
}
Expand All @@ -280,6 +329,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
status.TryAddStatusEffect<FlashedComponent>(target, "Flashed", TimeSpan.FromSeconds(Duration), true);

blind.AdjustEyeDamage(target, 1);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo flash effect on {entMan.ToPrettyString(target):subject} (duration: {Duration}s)");
}
}

Expand All @@ -296,6 +349,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
pull.TryLowerGrabStageOrStopPulling((user, puller), (target, pulled));
}
pull.TryStopPull(target, pulled, user);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Low,
$"{entMan.ToPrettyString(user):actor} performed combo stop grab effect on {entMan.ToPrettyString(target):subject}");
}
}

Expand All @@ -312,6 +369,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
pull.TryLowerGrabStageOrStopPulling((target, puller), (user, pulled));
}
pull.TryStopPull(user, pulled, target);

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Low,
$"{entMan.ToPrettyString(user):actor} performed combo stop target grab effect on {entMan.ToPrettyString(target):subject}");
}
}

Expand Down Expand Up @@ -362,6 +423,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
comboEvent.DoEffect(user, target, entMan);
}
}

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Low,
$"{entMan.ToPrettyString(user):actor} performed combo effect to downed on {entMan.ToPrettyString(target):subject} ({ComboEvents.Count} events)");
}
}
[Serializable]
Expand Down Expand Up @@ -424,6 +489,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
comboEvent.DoEffect(user, target, entMan);
}

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Low,
$"{entMan.ToPrettyString(user):actor} performed combo effect to stunned on {entMan.ToPrettyString(target):subject} ({ComboEvents.Count} events)");
}
}

Expand All @@ -440,6 +509,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
transform.SetCoordinates(user, transform.GetMoverCoordinates(target));
}

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo teleport on victim effect to {entMan.ToPrettyString(target):subject}");
}
}

Expand All @@ -456,6 +529,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
transform.SwapPositions(user, target);
}

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.Action, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo swap position effect with {entMan.ToPrettyString(target):subject}");
}
}

Expand All @@ -473,6 +550,10 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
var status = entMan.System<Content.Shared.StatusEffectNew.StatusEffectsSystem>();

status.TryAddStatusEffectDuration(target, "StatusEffectForcedSleeping", out _, TimeSpan.FromSeconds(Time));

var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo sleep effect on {entMan.ToPrettyString(target):subject} (time: {Time}s)");
}
}

Expand Down Expand Up @@ -507,7 +588,13 @@ public void DoEffect(EntityUid user, EntityUid target, IEntityManager entMan)
{
var damageable = entMan.System<DamageableSystem>();
var newDamage = Damage * comp.ComboCounter;
damageable.TryChangeDamage(target, newDamage);
var damageResult = damageable.ChangeDamage(target, newDamage);
if (damageResult.GetTotal() > 0)
{
var adminLogger = IoCManager.Resolve<ISharedAdminLogManager>();
adminLogger.Add(LogType.MeleeHit, LogImpact.Medium,
$"{entMan.ToPrettyString(user):actor} performed combo counter damage on {entMan.ToPrettyString(target):subject} and dealt {damageResult.GetTotal():damage} damage (counter: {comp.ComboCounter})");
}
}

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using Content.Shared.EntityEffects;
using Robust.Shared.GameObjects;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Serialization;

namespace Content.Shared.ADT.EntityEffects.Effects.EntitySpawning;

/// <summary>
/// Spawns a random entity from a list of prototypes at the coordinates of this entity.
/// Amount is modified by scale.
/// </summary>
public sealed partial class SpawnRandomEntityEntityEffectSystem : EntityEffectSystem<TransformComponent, SpawnRandomEntity>
{
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!;

protected override void Effect(Entity<TransformComponent> entity, ref EntityEffectEvent<SpawnRandomEntity> args)
{
var quantity = args.Effect.Number * (int)Math.Floor(args.Scale);

if (!args.Effect.Predicted && !_net.IsServer)
return;

for (var i = 0; i < quantity; i++)
{
var protoId = _random.Pick(args.Effect.Prototypes);
if (args.Effect.Predicted)
{
PredictedSpawnNextToOrDrop(protoId, entity, entity.Comp);
}
else
{
SpawnNextToOrDrop(protoId, entity, entity.Comp);
}
}
}
}

/// <summary>
/// Effect that spawns a random entity from a list of prototypes.
/// </summary>
[Serializable, NetSerializable]
public sealed partial class SpawnRandomEntity : EntityEffectBase<SpawnRandomEntity>
{
/// <summary>
/// Amount of entities we're spawning
/// </summary>
[DataField]
public int Number = 1;

/// <summary>
/// List of prototypes to randomly choose from when spawning.
/// </summary>
[DataField(required: true)]
public List<EntProtoId> Prototypes = new();

/// <summary>
/// Whether this spawning is predicted. Set false to not predict the spawn.
/// Entities with animations or that have random elements when spawned should set this to false.
/// </summary>
[DataField]
public bool Predicted = true;

public override string EntityEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("entity-effect-guidebook-spawn-entity",
("chance", Probability),
("entname", "random crystal"),
("amount", Number));
}
Loading
Loading