Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Jabak
2024-05-31 23:12:21 +03:00
55 changed files with 1241 additions and 33 deletions

View File

@@ -0,0 +1,36 @@
using Content.Shared._White.PolymorphableCanister;
using Robust.Client.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Client._White.PolymorphableCanister;
public sealed class PolymorphableCanisterSystem : SharedPolymorphableCanisterSystem
{
[Dependency] private readonly IComponentFactory _componentFactory = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PolymorphableCanisterComponent, AfterAutoHandleStateEvent>(HandleState);
}
private void HandleState(EntityUid uid,
PolymorphableCanisterComponent component,
ref AfterAutoHandleStateEvent args)
{
UpdateAppearance(uid, component.CurrentPrototype);
}
protected override void UpdateSprite(EntityUid uid, EntityPrototype proto)
{
base.UpdateSprite(uid, proto);
if (!TryComp(uid, out SpriteComponent? sprite) ||
!proto.TryGetComponent(out SpriteComponent? otherSprite, _componentFactory))
{
return;
}
sprite.CopyFrom(otherSprite);
}
}

View File

@@ -0,0 +1,37 @@
using Content.Shared._White.PolymorphableCanister;
using JetBrains.Annotations;
namespace Content.Client._White.PolymorphableCanister.UI;
[UsedImplicitly]
// ReSharper disable once InconsistentNaming
public sealed class PolymorphableCanisterBUI : BoundUserInterface
{
private PolymorphableCanisterMenu? _menu;
public PolymorphableCanisterBUI(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
IoCManager.InjectDependencies(this);
}
protected override void Open()
{
_menu = new PolymorphableCanisterMenu(Owner, this);
_menu.OnClose += Close;
_menu.OpenCentered();
}
public void SendMessage(string protoId)
{
SendMessage(new PolymorphableCanisterMessage(protoId));
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!disposing)
return;
_menu?.Dispose();
}
}

View File

@@ -0,0 +1,12 @@
<ui:RadialMenu xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
BackButtonStyleClass="RadialMenuBackButton"
CloseButtonStyleClass="RadialMenuCloseButton"
VerticalExpand="True"
HorizontalExpand="True"
MinSize="450 450">
<!-- Main container to hold all canister states-->
<ui:RadialContainer Name="Main" VerticalExpand="True" HorizontalExpand="True" Radius="140"
ReserveSpaceForHiddenChildren="False" />
</ui:RadialMenu>

View File

@@ -0,0 +1,57 @@
using System.Numerics;
using Content.Client.UserInterface.Controls;
using Content.Shared._White.PolymorphableCanister;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._White.PolymorphableCanister.UI;
[GenerateTypedNameReferences]
public sealed partial class PolymorphableCanisterMenu : RadialMenu
{
[Dependency] private readonly EntityManager _entManager = default!;
[Dependency] private readonly IPrototypeManager _protoManager = default!;
public PolymorphableCanisterMenu(EntityUid owner, PolymorphableCanisterBUI bui)
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
if (!_entManager.TryGetComponent<PolymorphableCanisterComponent>(owner, out var canister))
return;
var spriteSystem = _entManager.System<SpriteSystem>();
var main = FindControl<RadialContainer>("Main");
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (main is null)
return;
foreach (var protoId in canister.Prototypes)
{
if (canister.CurrentPrototype == protoId)
continue;
if (!_protoManager.TryIndex(protoId, out var proto))
continue;
var button = new RadialMenuTextureButton
{
ToolTip = Loc.GetString(proto.Name),
TextureNormal = spriteSystem.GetPrototypeIcon(protoId).Default,
StyleClasses = { "RadialMenuButton" },
SetSize = new Vector2(64f, 64f)
};
button.OnButtonUp += _ =>
{
bui.SendMessage(protoId);
Close();
};
main.AddChild(button);
}
}
}

View File

@@ -60,7 +60,7 @@ namespace Content.Server.Chemistry.EntitySystems
{
// Create a pop-up for the target
var userName = Identity.Entity(user, EntityManager);
_popup.PopupEntity(Loc.GetString("injector-component-injecting-target",
_popup.PopupEntity(Loc.GetString("patch-component-injecting-target",
("user", userName)), user, target);
}

View File

@@ -37,8 +37,10 @@ using Content.Shared._White.Cult.Components;
using Content.Shared._White.Cult.Runes;
using Content.Shared._White.Cult.UI;
using Content.Shared.Cuffs;
using Content.Shared.FixedPoint;
using Content.Shared.GameTicking;
using Content.Shared.Mindshield.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
using Content.Shared.UserInterface;
@@ -74,6 +76,8 @@ public sealed partial class CultSystem : EntitySystem
[Dependency] private readonly PullingSystem _pulling = default!;
[Dependency] private readonly SharedCuffableSystem _cuffable = default!;
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly MobThresholdSystem _thresholdSystem = default!;
public override void Initialize()
{
@@ -821,8 +825,7 @@ public sealed partial class CultSystem : EntitySystem
var targets =
_lookup.GetEntitiesInRange(uid, component.RangeTarget, LookupFlags.Dynamic | LookupFlags.Sundries);
targets.RemoveWhere(x =>
!_entityManager.HasComponent<HumanoidAppearanceComponent>(x) || !HasComp<CultistComponent>(x));
targets.RemoveWhere(x => !_entityManager.HasComponent<HumanoidAppearanceComponent>(x));
if (targets.Count == 0)
return;
@@ -832,12 +835,7 @@ public sealed partial class CultSystem : EntitySystem
if (victim == null)
return;
_entityManager.TryGetComponent<MobStateComponent>(victim.Value, out var state);
if (state == null)
return;
if (state.CurrentState != MobState.Dead && state.CurrentState != MobState.Critical)
if (_mobState.IsAlive(victim.Value))
{
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-already-alive"), args.User, args.User);
return;
@@ -850,15 +848,56 @@ public sealed partial class CultSystem : EntitySystem
private bool Revive(EntityUid target, EntityUid user)
{
if (CultRuneReviveComponent.ChargesLeft == 0)
if (HasComp<CultistComponent>(target))
{
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-no-charges"), user, user);
return false;
if (CultRuneReviveComponent.ChargesLeft == 0)
{
_popupSystem.PopupEntity(Loc.GetString("cult-revive-rune-no-charges"), user, user);
return false;
}
CultRuneReviveComponent.ChargesLeft--;
_entityManager.EventBus.RaiseLocalEvent(target, new RejuvenateEvent());
}
else
{
if (!TryComp(target, out DamageableComponent? damageable) ||
!TryComp(target, out MobThresholdsComponent? threshold) ||
!TryComp(target, out MobStateComponent? mobState))
return false;
CultRuneReviveComponent.ChargesLeft--;
if (!_mobState.IsDead(target, mobState))
return false;
_entityManager.EventBus.RaiseLocalEvent(target, new RejuvenateEvent());
var airlossGroup = _prototypeManager.Index<DamageGroupPrototype>("Airloss");
var deadThreshold = _thresholdSystem.GetThresholdForState(target, MobState.Dead, threshold);
if (damageable.Damage.TryGetDamageInGroup(airlossGroup, out var toHeal))
{
var afterHeal = damageable.TotalDamage - toHeal;
if (deadThreshold <= afterHeal)
return false;
var asphyxType = _prototypeManager.Index<DamageTypePrototype>("Asphyxiation");
var bloodlossType = _prototypeManager.Index<DamageTypePrototype>("Bloodloss");
var heal = new Action<DamageTypePrototype>(type =>
{
if (!damageable.Damage.DamageDict.TryGetValue(type.ID, out var damage))
return;
_damageableSystem.TryChangeDamage(target, new DamageSpecifier(type, -damage));
});
heal(asphyxType);
heal(bloodlossType);
}
if (damageable.TotalDamage < deadThreshold)
_mobState.ChangeMobState(target, MobState.Critical, mobState, user);
}
EntityUid? transferTo = null;
@@ -1383,4 +1422,4 @@ public sealed partial class CultSystem : EntitySystem
/*
* Helpers End ----
*/
}
}

View File

@@ -121,8 +121,12 @@ public sealed class ERTRecruitmentRule : StationEventSystem<ERTRecruitmentRuleCo
var ev = new ERTRecruitedReasonEvent();
RaiseLocalEvent(uid,ev);
_chat.DispatchServerMessage(args.PlayerSession,Loc.GetString("ert-description"));
_chat.DispatchServerMessage(args.PlayerSession, Loc.GetString("ert-reason", ("reason", ev.Reason)));
if (args.PlayerSession != null)
{
_chat.DispatchServerMessage(args.PlayerSession, Loc.GetString("ert-description"));
_chat.DispatchServerMessage(args.PlayerSession, Loc.GetString("ert-reason", ("reason", ev.Reason)));
}
}
private void OnStartAttempt(RoundStartAttemptEvent ev)
@@ -186,6 +190,7 @@ public sealed class ERTRecruitmentRule : StationEventSystem<ERTRecruitmentRuleCo
return false;
}
*/
var ertMap = EnsureComp<ERTMapComponent>(outpost);
ertMap.MapId = mapId;

View File

@@ -0,0 +1,53 @@
using Content.Server.Atmos.Piping.Unary.Components;
using Content.Shared._White.PolymorphableCanister;
using Content.Shared.Lock;
using Content.Shared.Verbs;
using Robust.Server.GameObjects;
using Robust.Shared.Player;
using Robust.Shared.Utility;
namespace Content.Server._White.PolymorphableCanister;
public sealed class PolymorphableCanisterSystem : SharedPolymorphableCanisterSystem
{
[Dependency] private readonly UserInterfaceSystem _ui = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PolymorphableCanisterComponent, GetVerbsEvent<Verb>>(GetVerb);
}
private void GetVerb(EntityUid uid, PolymorphableCanisterComponent component, GetVerbsEvent<Verb> args)
{
if (TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked)
{
return;
}
if (TryComp(uid, out GasCanisterComponent? gasCanister) && gasCanister.Air.Pressure > 100)
{
return;
}
var changeAppearanceVerb = new Verb
{
Text = Loc.GetString("polymorphable-canister-change-appearance-verb"),
Icon = new SpriteSpecifier.Rsi(new ResPath("Structures/Storage/canister.rsi"), "yellow"),
Act = () => TryOpenUi(uid, args.User, component)
};
args.Verbs.Add(changeAppearanceVerb);
}
private void TryOpenUi(EntityUid uid, EntityUid user, PolymorphableCanisterComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
if (!TryComp(user, out ActorComponent? actor))
return;
_ui.TryToggleUi(uid, PolymorphableCanisterUiKey.Key, actor.PlayerSession);
}
}

View File

@@ -2,6 +2,7 @@ using Content.Shared.DoAfter;
using Content.Shared.Gravity;
using Content.Shared.Hands.Components;
using Content.Shared.Input;
using Content.Shared.Mobs.Systems;
using Content.Shared.Movement.Systems;
using Content.Shared.Physics;
using Content.Shared.Rotation;
@@ -24,6 +25,7 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!; // WD EDIT
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!; // WD EDIT
[Dependency] private readonly SharedStunSystem _stun = default!; // WD EDIT
[Dependency] private readonly MobStateSystem _mobState = default!; // WD EDIT
// If StandingCollisionLayer value is ever changed to more than one layer, the logic needs to be edited.
private const int StandingCollisionLayer = (int)CollisionGroup.MidImpassable;
@@ -64,6 +66,11 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
return;
}
if (!_mobState.IsAlive(uid))
{
return;
}
if (IsDown(uid))
{
TryStandUp(uid);
@@ -123,13 +130,13 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
if (standingState.CurrentState is not StandingState.Lying)
return false;
standingState.CurrentState = StandingState.GettingUp;
var doargs = new DoAfterArgs(EntityManager, uid, standingState.StandingUpTime,
new StandingUpDoAfterEvent(), uid)
{
BreakOnMove = false,
BreakOnDamage = false,
BreakOnHandChange = false
BreakOnHandChange = false,
RequireCanInteract = false
};
if (!_doAfter.TryStartDoAfter(doargs))
@@ -141,7 +148,7 @@ public abstract partial class SharedStandingStateSystem : EntitySystem
public bool TryLieDown(EntityUid uid, StandingStateComponent? standingState = null, bool dropHeldItems = false)
{
if (!Resolve(uid, ref standingState, false))
if (!Resolve(uid, ref standingState, false) || !standingState.CanLieDown)
return false;
if (standingState.CurrentState is not StandingState.Standing)

View File

@@ -11,7 +11,6 @@ namespace Content.Shared.Standing.Systems;
public abstract partial class SharedStandingStateSystem
{
[Dependency] protected readonly IRobustRandom Random = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
private void InitializeColliding()
{

View File

@@ -0,0 +1,46 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._White.PolymorphableCanister;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
public sealed partial class PolymorphableCanisterComponent : Component
{
[DataField]
public ResPath ResPath = new("Structures/Storage/canister.rsi");
[DataField, AutoNetworkedField]
public ProtoId<EntityPrototype>? CurrentPrototype;
[DataField, ViewVariables(VVAccess.ReadWrite)]
public int DoAfterTime = 3;
[DataField]
public List<ProtoId<EntityPrototype>> Prototypes = new()
{
"GasCanister",
"StorageCanister",
"AirCanister",
"OxygenCanister",
"NitrogenCanister",
"CarbonDioxideCanister",
"PlasmaCanister",
"TritiumCanister",
"WaterVaporCanister",
"AmmoniaCanister",
"NitrousOxideCanister",
"FrezonCanister",
"BZCanister",
"PluoxiumCanister",
"HydrogenCanister",
"NitriumCanister",
"HealiumCanister",
"HyperNobliumCanister",
"ProtoNitrateCanister",
"ZaukerCanister",
"HalonCanister",
"HeliumCanister",
"AntiNobliumCanister",
};
}

View File

@@ -0,0 +1,106 @@
using Content.Shared.DoAfter;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._White.PolymorphableCanister;
public abstract class SharedPolymorphableCanisterSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PolymorphableCanisterComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<PolymorphableCanisterComponent, PolymorphableCanisterMessage>(OnMessage);
SubscribeLocalEvent<PolymorphableCanisterComponent, PolymorphableCanisterDoAfterEvent>(OnDoAfter);
}
private void OnInit(Entity<PolymorphableCanisterComponent> ent, ref ComponentInit args)
{
var proto = MetaData(ent.Owner).EntityPrototype;
if (proto is null)
{
return;
}
ent.Comp.CurrentPrototype = proto.ID;
Dirty(ent);
}
private void OnMessage(Entity<PolymorphableCanisterComponent> ent, ref PolymorphableCanisterMessage args)
{
if (!args.Session.AttachedEntity.HasValue)
{
return;
}
var doAfterArgs = new DoAfterArgs(EntityManager,
args.Session.AttachedEntity.Value,
ent.Comp.DoAfterTime,
new PolymorphableCanisterDoAfterEvent(args.ProtoId),
ent.Owner
)
{
BreakOnMove = true,
NeedHand = true
};
_doAfter.TryStartDoAfter(doAfterArgs);
}
private void OnDoAfter(Entity<PolymorphableCanisterComponent> ent, ref PolymorphableCanisterDoAfterEvent args)
{
if (args.Cancelled)
{
return;
}
ent.Comp.CurrentPrototype = args.ProtoId;
UpdateAppearance(ent, args.ProtoId);
Dirty(ent);
}
public void UpdateAppearance(EntityUid uid, ProtoId<EntityPrototype>? protoId)
{
if (string.IsNullOrEmpty(protoId) || !_proto.TryIndex(protoId, out var proto))
{
return;
}
var metadata = MetaData(uid);
_metaData.SetEntityName(uid, proto.Name, metadata);
_metaData.SetEntityDescription(uid, proto.Description, metadata);
UpdateSprite(uid, proto);
}
protected virtual void UpdateSprite(EntityUid uid, EntityPrototype proto)
{
}
}
[NetSerializable, Serializable]
public enum PolymorphableCanisterUiKey : byte
{
Key
}
[Serializable, NetSerializable]
public sealed class PolymorphableCanisterMessage(string protoId) : BoundUserInterfaceMessage
{
public readonly ProtoId<EntityPrototype> ProtoId = protoId;
}
[Serializable, NetSerializable]
public sealed partial class PolymorphableCanisterDoAfterEvent : SimpleDoAfterEvent
{
public readonly ProtoId<EntityPrototype> ProtoId;
public PolymorphableCanisterDoAfterEvent(string protoId)
{
ProtoId = protoId;
}
}

View File

@@ -3804,3 +3804,93 @@
id: 267
time: '2024-05-22T23:54:27.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/312
- author: Aviu
changes:
- message: "\u0414\u043B\u044F \u0437\u0430\u043F\u0443\u0441\u043A\u0430 \u0440\
\u0435\u0436\u0438\u043C\u0430 \u044F\u0434\u0435\u0440\u043D\u044B\u0445 \u043E\
\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0438\u043A\u043E\u0432 \u0432\
\u043D\u043E\u0432\u044C \u043D\u0443\u0436\u043D\u043E 20 \u0433\u043E\u0442\
\u043E\u0432\u044B\u0445."
type: Tweak
id: 268
time: '2024-05-28T14:13:17.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/313
- author: ThereDrD
changes:
- message: "\u041D\u0430 \u0412\u0430\u043D\u0434\u0435\u0440\u0431\u043E\u043A\u0441\
\ \u0438 \u0412\u0430\u0439\u0442\u0431\u043E\u043A\u0441 \u0434\u043E\u0431\
\u0430\u0432\u043B\u0435\u043D\u044B \u0431\u043E\u0440\u0433\u0438"
type: Add
id: 269
time: '2024-05-29T20:40:05.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/315
- author: Aviu
changes:
- message: "\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E\
\ \u0432\u0441\u0442\u0430\u0442\u044C \u0431\u0443\u0434\u0443\u0447\u0438\
\ \u0432 \u043D\u0430\u0440\u0443\u0447\u043D\u0438\u043A\u0430\u0445."
type: Fix
- message: "\u041A\u043B\u043E\u0443\u043D\u044B \u043C\u043E\u0433\u0443\u0442\
\ \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u0437\
\u0430\u043B\u043F\u043E\u043C \u043A\u0440\u043E\u0432\u0430\u0432\u044B\u0445\
\ \u0441\u043D\u0430\u0440\u044F\u0434\u043E\u0432."
type: Fix
- message: "\u041E\u0431\u0435\u0437\u044C\u044F\u043D\u044B \u043C\u043E\u0433\u0443\
\u0442 \u0442\u0435\u043F\u0435\u0440\u044C \u043B\u043E\u0436\u0438\u0442\u044C\
\u0441\u044F."
type: Add
- message: "\u0423\u0431\u0440\u0430\u043D \u0440\u0435\u0444\u043B\u0435\u043A\u0442\
\ \u0443 \u0441\u0442\u0435\u043D \u0448\u0430\u0442\u0442\u043B\u0430."
type: Remove
id: 270
time: '2024-05-30T12:12:24.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/314
- author: Aviu
changes:
- message: "\u0420\u0443\u043D\u0430 \u0432\u043E\u0441\u043A\u0440\u0435\u0448\u0435\
\u043D\u0438\u044F \u043C\u043E\u0436\u0435\u0442 \u0432\u043E\u0441\u043A\u0440\
\u0435\u0448\u0430\u0442\u044C \u043D\u0435 \u043A\u0443\u043B\u044C\u0442\u0438\
\u0441\u0442\u043E\u0432, \u043D\u0435 \u0442\u0440\u0430\u0442\u044F \u043F\
\u0440\u0438 \u044D\u0442\u043E\u043C \u0437\u0430\u0440\u044F\u0434\u044B,\
\ \u043D\u043E \u043E\u043D\u0430 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\
\u0430 \u0438\u0437\u043B\u0435\u0447\u0438\u0442\u044C \u0438\u0445 \u0442\u043E\
\u043B\u044C\u043A\u043E \u043E\u0442 \u0443\u0434\u0443\u0448\u0435\u043D\u0438\
\u044F \u0438 \u043A\u0440\u043E\u0432\u043E\u043F\u043E\u0442\u0435\u0440\u0438\
."
type: Add
id: 271
time: '2024-05-30T12:27:13.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/318
- author: Remuchi
changes:
- message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0432\u043D\u0435\u0448\u043D\u0438\
\u0439 \u0432\u0438\u0434 \u0433\u0430\u0437\u043E\u0432\u044B\u0445 \u043A\u0430\
\u043D\u0438\u0441\u0442\u0440 \u043C\u043E\u0436\u043D\u043E \u043C\u0435\u043D\
\u044F\u0442\u044C."
type: Add
id: 272
time: '2024-05-30T14:28:53.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/317
- author: RinKeeper
changes:
- message: "\u041E\u0411\u0420 \u0442\u0435\u043F\u0435\u0440\u044C \u0434\u043E\
\u043B\u0436\u043D\u043E \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C \u043A\
\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E(\u0432\u043E\u0437\u043C\u043E\
\u0436\u043D\u043E)"
type: Fix
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D popup \u043F\u043B\
\u0430\u0441\u0442\u044B\u0440\u044F"
type: Fix
id: 273
time: '2024-05-30T14:48:15.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/282
- author: S_k_R_i_M_e_X
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043D\u043E\u0432\
\u044B\u0435 \u0441\u043F\u0430\u0432\u043D\u0435\u0440\u044B \u0441\u0442\u0440\
\u0443\u043A\u0442\u0443\u0440, \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u043E\
\u0432."
type: Add
id: 274
time: '2024-05-30T18:56:18.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/319

View File

@@ -0,0 +1 @@
polymorphable-canister-change-appearance-verb = Change appearance

View File

@@ -1,6 +1,5 @@
## Entity
patch-component-target-getting-injected = Someone trying to put a patch on you
patch-component-injecting-user = You are trying to put a patch on {$target}.
patch-component-inject-other-message = You put a patch on {$other}.
patch-component-inject-self-message = You put a patch on yourself.
@@ -8,3 +7,6 @@ patch-component-empty-message = It's empty!
patch-component-feel-prick-message = You feel a little sting
patch-cant-inject = Can't put a patch on {$target}!
patch-cant-inject-now = Can't put a patch now
## mob-inject doafter messages
patch-component-injecting-target = {CAPITALIZE($user)} is trying to put a patch on you!

View File

@@ -1,4 +1,4 @@
ent-SoulShard = камень душ
ent-SoulShard = камень душ
.desc = Мистический светящийся осколок.
ent-SoulShardGhost = камень душ
@@ -57,7 +57,7 @@ ent-SummoningRune = руна призыва
.desc = Эта руна позволяет мгновенно призвать к руне любого несвязанного культиста. Для использования требуются 2 культиста, стоящих вокруг руны.
ent-ReviveRune = руна воскрешения
.desc = Каждый раз, когда кого-то приносят в жертву на Руне Преподнесения, этой руне добавляется один глобальный заряд. Размещение трупа культиста на руне и её активация вернет его к жизни, расходуя при этом заряд.
.desc = Каждый раз, когда кого-то приносят в жертву на Руне Преподнесения, этой руне добавляется один глобальный заряд. Размещение трупа культиста на руне и её активация вернет его к жизни, расходуя при этом заряд. Руна воскрешения может воскрешать не культистов, не тратя при этом заряды, но она способна излечить их только от удушения и кровопотери.
ent-BarrierRune = руна барьера
.desc = При активации на создаёт барьер, блокирующую проход. Может быть повторно активирована, чтобы отменить заклинание.

View File

@@ -0,0 +1 @@
polymorphable-canister-change-appearance-verb = Перекрасить

View File

@@ -10,4 +10,4 @@ patch-cant-inject-now = Вы не можете наложить пластырь
## mob-inject doafter messages
injector-component-injecting-target = {CAPITALIZE(THE($user))} пытается приклеить пластырь на вас!
patch-component-injecting-target = {CAPITALIZE($user)} пытается приклеить пластырь на вас!

View File

@@ -0,0 +1,620 @@
# random book spawner
- type: entity
id: RandomBook
name: random book spawner
parent: MarkerBase
suffix: 85%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: book
- type: RandomSpawner
prototypes:
- BookBase
- BookSpaceEncyclopedia
- BookTheBookOfControl
- BookBartendersManual
- BookChefGaming
- BookLeafLoversSecret
- BookEngineersHandbook
- BookScientistsGuidebook
- BookSecurity
- BookHowToKeepStationClean
- BookHowToRockAndStone
- BookMedicalReferenceBook
- BookHowToSurvive
- BookChemicalCompendium
- BookEscalation
- BookEscalationSecurity
- BookAtmosDistro
- BookAtmosWaste
- BookAtmosAirAlarms
- BookAtmosVentsMore
chance: 0.85
# random barricade spawner
- type: entity
id: Random...
name: random barricade spawner
parent: MarkerBase
suffix: 55%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: barricade
- type: RandomSpawner
prototypes:
- Barricade
chance: 0.55
# random box spawner
- type: entity
id: RandomBox
name: random box spawner
parent: MarkerBase
suffix: 65%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: box
- type: RandomSpawner
prototypes:
- BigBox
chance: 0.65
# random cash spawner
- type: entity
id: RandomCash
name: random cash spawner
parent: MarkerBase
suffix: 95%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: cash
- type: RandomSpawner
prototypes:
- SpaceCash10
- SpaceCash100
- SpaceCash500
chance: 0.95
rarePrototypes:
- SpaceCash1000
rareChance: 0.05
# random circuit spawner
- type: entity
id: RandomCircuit
name: random circuit spawner
parent: MarkerBase
suffix: 85%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: circuit
- type: RandomSpawner
prototypes:
- StationMapCircuitboard
- AlertsComputerCircuitboard
- PowerComputerCircuitboard
- MedicalRecordsComputerCircuitboard
- StationRecordsComputerCircuitboard
- SurveillanceCameraMonitorCircuitboard
- SurveillanceWirelessCameraMonitorCircuitboard
- ComputerTelevisionCircuitboard
- ResearchComputerCircuitboard
- CrewMonitoringComputerCircuitboard
- AnalysisComputerCircuitboard
- BodyScannerComputerCircuitboard
- RadarConsoleCircuitboard
- SolarControlComputerCircuitboard
- SpaceVillainArcadeComputerCircuitboard
- BlockGameArcadeComputerCircuitboard
- ComputerMassMediaCircuitboard
- SensorConsoleCircuitboard
- AutolatheMachineCircuitboard
- VaccinatorMachineCircuitboard
- DiagnoserMachineCircuitboard
- ArtifactAnalyzerMachineCircuitboard
- ThermomachineFreezerMachineCircuitBoard
- ThermomachineHeaterMachineCircuitBoard
- PortableScrubberMachineCircuitBoard
- HydroponicsTrayMachineCircuitboard
- SMESMachineCircuitboard
- SubstationMachineCircuitboard
- StasisBedMachineCircuitboard
chance: 0.85
rarePrototypes:
- ShuttleConsoleCircuitboard
- ProtolatheMachineCircuitboard
- CloningPodMachineCircuitboard
- MedicalScannerMachineCircuitboard
- CrewMonitoringServerMachineCircuitboard
- BiomassReclaimerMachineCircuitboard
- GyroscopeMachineCircuitboard
- MicrowaveMachineCircuitboard
rareChance: 0.15
# random disabler spawner
- type: entity
id: RandomDisabler
name: random disabler spawner
parent: MarkerBase
suffix: 40%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: disabler
- type: RandomSpawner
prototypes:
- WeaponDisablerPractice
chance: 0.40
rarePrototypes:
- WeaponDisabler
rareChance: 0.20
# random egun spawner
- type: entity
id: RandomEGun
name: random egun spawner
parent: MarkerBase
suffix: 10%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: e_gun
- type: RandomSpawner
prototypes:
- WeaponEgun
chance: 0.10
# random flashlight spawner
- type: entity
id: RandomFlashlight
name: random flashlight spawner
parent: MarkerBase
suffix: 90%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: flashlight
- type: RandomSpawner
prototypes:
- FlashlightLantern
- EmptyFlashlightLantern
- FlashlightSeclite
- Lamp
- LampGold
- Lantern
chance: 0.90
rarePrototypes:
- LanternFlash
rareChance: 0.01
# random girder spawner
- type: entity
id: RandomGirder
name: random girder spawner
parent: MarkerBase
suffix: 70%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: girder
- type: RandomSpawner
prototypes:
- Girder
- ReinforcedGirder
chance: 0.70
# random handcuffs spawner
- type: entity
id: RandomHandcuffs
name: random handcuffs spawner
parent: MarkerBase
suffix: 50%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: handcuffs
- type: RandomSpawner
prototypes:
- Handcuffs
- Zipties
chance: 0.50
# random closed spawner
- type: entity
id: RandomCloset
name: random closet spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: locker
- type: RandomSpawner
prototypes:
- ClosetEmergencyFilledRandom
- ClosetFireFilled
- ClosetMaintenanceFilledRandom
- ClosetToolFilled
- LockerWeldingSuppliesFilled
- LockerElectricalSuppliesFilled
chance: 0.80
rarePrototypes:
- ClosetEmergency
- ClosetFire
- ClosetMaintenance
- ClosetTool
- LockerWeldingSupplies
- LockerElectricalSupplies
rareChance: 0.20
# random medkit spawner
- type: entity
id: RandomMedkit
name: random medkit spawner
parent: MarkerBase
suffix: 70%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: medkit
- type: RandomSpawner
prototypes:
- MedkitFilled
- MedkitCombat
- MedkitRadiationFilled
- MedkilOxygenFilled
- MedkitBruteFilled
- MedkitToxinFilled
- MedkitBurnFilled
- MedkitAdvanced
chance: 0.70
rarePrototypes:
- Medkit
- MedkitCombatFilled
- MedkitRadiation
- MedkilOxygen
- MedkitBrute
- MedkitToxin
- MedkitBurn
- MedkitAdvancedFilled
rareChance: 0.20
# random material spawner
- type: entity
id: RandomMaterial
name: random material spawner
parent: MarkerBase
suffix: 70%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: metal
- type: RandomSpawner
prototypes:
- SheetPlastic
- SheetGlass
- SheetRGlass
- SheetSteel
- SheetPaper
- SheetPlasteel
chance: 0.70
rarePrototypes:
- SheetPlasma
- SheetUranium
- SheetPGlass
- SheetUGlass
- SheetRPGlass
- SheetRUGlass
rareChance: 0.15
# random peel spawner
- type: entity
id: RandomPeel
name: random peel spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: peel
- type: RandomSpawner
prototypes:
- TrashBananaPeel
- TrashBananiumPeel
- TrashMimanaPeel
- TrashBakedBananaPeel
chance: 0.80
rarePrototypes:
- TrashBananaPeelExplosive
rareChance: 0.01
# random P.A.C.M.A.N spawner
- type: entity
id: RandomPower
name: random P.A.C.M.A.N spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: power
- type: RandomSpawner
prototypes:
- PortableGeneratorJrPacman
- PortableGeneratorPacman
- PortableGeneratorSuperPacman
chance: 0.80
# random rod spawner
- type: entity
id: RandomRods
name: random rod spawner
parent: MarkerBase
suffix: 90%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: rods
- type: RandomSpawner
prototypes:
- PartRodMetal1
- PartRodMetal10
- PartRodMetal
chance: 0.90
# random rollerbed spawner
- type: entity
id: RandomRollerBed
name: random rollerbed spawner
parent: MarkerBase
suffix: 60%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: rollerbed
- type: RandomSpawner
prototypes:
- RollerBed
- EmergencyRollerBed
- CheapRollerBed
chance: 0.60
rarePrototypes:
- RollerBedSpawnFolded
- EmergencyRollerBedSpawnFolded
- CheapRollerBedSpawnFolded
rareChance: 0.20
# random shard spawner
- type: entity
id: RandomShard
name: random shard spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: shard
- type: RandomSpawner
prototypes:
- ShardGlass
- ShardGlassReinforced
chance: 0.80
rarePrototypes:
- ShardGlassPlasma
- ShardGlassUranium
rareChance: 0.5
# random shiv spawner
- type: entity
id: RandomShiv
name: random shiv spawner
parent: MarkerBase
suffix: 50%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: shiv
- type: RandomSpawner
prototypes:
- Shiv
- ScalpelShiv
- ReinforcedShiv
chance: 0.50
rarePrototypes:
- PlasmaShiv
- UraniumShiv
rareChance: 0.10
# random tank spawner
- type: entity
id: RandomTank
name: random tank spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: tank
- type: RandomSpawner
prototypes:
- WaterTank
- WaterTankFull
- WeldingFuelTank
- WeldingFuelTankFull
chance: 0.80
rarePrototypes:
- WaterTankHighCapacity
- WeldingFuelTankHighCapacity
rareChance: 0.10
# random toolbox spawner
- type: entity
id: RandomToolbox
name: random toolbox spawner
parent: MarkerBase
suffix: 70%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: toolbox
- type: RandomSpawner
prototypes:
- ToolboxArtisticFilled
- ToolboxArtistic
- ToolboxEmergencyFilled
- ToolboxEmergency
- ToolboxMechanicalFilled
- ToolboxMechanical
- ToolboxElectricalFilled
- ToolboxElectrical
chance: 0.70
rarePrototypes:
- CowToolboxFilled
- CowToolbox
- ToolboxGoldFilled
- ToolboxGold
rareChance: 0.5
# random vomit spawner
- type: entity
id: RandomVomit
name: random vomit spawner
parent: MarkerBase
suffix: 60%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: vomit
- type: RandomSpawner
prototypes:
- PuddleVomit
chance: 0.60
# random wood spawner
- type: entity
id: RandomWood
name: random wood spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: wood
- type: RandomSpawner
prototypes:
- MaterialWoodPlank
- MaterialWoodPlank1
- MaterialWoodPlank10
chance: 0.80
# random utility spawner
- type: entity
id: RandomUtility
name: random utility spawner
parent: MarkerBase
suffix: 80%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: wrench
- type: RandomSpawner
prototypes:
- Crowbar
- Wrench
- Wirecutter
- Screwdriver
- Welder
- NetworkConfigurator
chance: 0.80
rarePrototypes:
- Multitool
rareChance: 0.10
# random syndie loot spawner
- type: entity
id: RandomSyndie
name: random syndie spawner
parent: MarkerBase
suffix: 1%
components:
- type: Sprite
layers:
- state: red
- sprite: /Textures/White/Specific/spawner.rsi
state: pistol
- type: RandomSpawner
prototypes:
- WeaponSniperMosin
- WeaponPistolViper
- WeaponPistolCobra
- C4
- ExGrenade
- SyndieMiniBomb
- ClothingEyesNightVisionGogglesSyndie
- ClothingOuterVestWeb
- ClothingBackpackChameleonFill
- CigPackSyndicate
- ToolboxSyndicateFilled
chance: 0.01
rarePrototypes:
- WeaponRevolverPythonAP
- EnergyCrossbowMini
- BetrayalKnife
- HypopenBox
- AgentIDCard
- Emag
- ExperimentalSyndicateTeleporter
- ClothingHandsGlovesNorthStar
rareChance: 0.001

View File

@@ -1253,6 +1253,8 @@
tags:
- VimPilot
- DoorBumpOpener
- type: StandingState
canLieDown: true
- type: entity
name: monkey

View File

@@ -34,10 +34,12 @@
1: { state: can-o1, shader: "unshaded" }
2: { state: can-o2, shader: "unshaded" }
3: { state: can-o3, shader: "unshaded" }
- type: UserInterface
- type: UserInterface # WhiteDream - Added PolymorphableCanisterUiKey
interfaces:
- key: enum.GasCanisterUiKey.Key
type: GasCanisterBoundUserInterface
- key: enum.PolymorphableCanisterUiKey.Key
type: PolymorphableCanisterBUI
- type: Destructible
thresholds:
- trigger:
@@ -104,6 +106,7 @@
access: [["Atmospherics"], ["Engineering"], ["Research"]]
- type: Lock
locked: false
- type: PolymorphableCanister # WhiteDream
- type: entity
parent: GasCanister

View File

@@ -782,8 +782,6 @@
damageModifierSet: StructuralMetallic
- type: Physics
bodyType: Static
- type: Reflect
reflectProb: 1
- type: Pullable
- type: Airtight
noAirWhenFullyAirBlocked: false
@@ -858,8 +856,6 @@
3: { state: shuttle_construct-3, visible: true}
4: { state: shuttle_construct-4, visible: true}
5: { state: shuttle_construct-5, visible: true}
- type: Reflect
reflectProb: 1
- type: entity
parent: WallSolid
@@ -877,8 +873,6 @@
- type: IconSmooth
key: walls
base: state
- type: Reflect
reflectProb: 1
- type: entity
parent: BaseWall

View File

@@ -69,7 +69,7 @@
noSpawn: true
components:
- type: GameRule
minPlayers: 35
minPlayers: 20
- type: NukeopsRule
faction: Syndicate

View File

@@ -57,3 +57,4 @@
SeniorPhysician: [ 1, 1 ]
SeniorEngineer: [ 1, 1 ]
SeniorSalvageSpecialist: [ 1, 1 ]
Borg: [ 2, 2 ]

View File

@@ -59,4 +59,5 @@
SeniorOfficer: [ 1, 1 ]
SeniorPhysician: [ 1, 1 ]
SeniorEngineer: [ 1, 1 ]
Borg: [ 2, 2 ]

View File

@@ -19,6 +19,7 @@
soundEmpty: null
soundGunshot:
path: /Audio/White/Cult/wand_teleport.ogg
clumsyProof: true
- type: BasicEntityAmmoProvider
proto: BloodBolt
capacity: 25

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

View File

@@ -0,0 +1,95 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from https://github.com/tgstation/tgstation/blob/master/icons/effects/random_spawners.dmi",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "barricade"
},
{
"name": "book"
},
{
"name": "power"
},
{
"name": "box"
},
{
"name": "briefcase"
},
{
"name": "cash"
},
{
"name": "caution"
},
{
"name": "circuit"
},
{
"name": "disabler"
},
{
"name": "e_gun"
},
{
"name": "flashlight"
},
{
"name": "girder"
},
{
"name": "grille"
},
{
"name": "handcuffs"
},
{
"name": "locker"
},
{
"name": "medkit"
},
{
"name": "metal"
},
{
"name": "peel"
},
{
"name": "pistol"
},
{
"name": "rods"
},
{
"name": "rollerbed"
},
{
"name": "shard"
},
{
"name": "shiv"
},
{
"name": "tank"
},
{
"name": "toolbox"
},
{
"name": "vomit"
},
{
"name": "wood"
},
{
"name": "wrench"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 B