Великий фикс апстрима (#2821)

Co-authored-by: Matthew Herber <32679887+Happyrobot33@users.noreply.github.com>
This commit is contained in:
iertis 2025-08-18 03:28:45 +05:00 committed by GitHub
parent 305718810a
commit 1a62c50d57
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
40 changed files with 450 additions and 289 deletions

View file

@ -48,6 +48,11 @@ namespace Content.Client.Chemistry.UI
(uint) _window.BottleDosage.Value, _window.LabelLine));
_window.BufferSortButton.OnPressed += _ => SendMessage(
new ChemMasterSortingTypeCycleMessage());
// Starlight-start
_window.CreatePatchButton.OnPressed += _ => SendMessage(
new ChemMasterCreatePatchesMessage(
(uint)_window.PatchDosage.Value, (uint)_window.PatchNumber.Value, _window.LabelLine));
// Starlight-end
for (uint i = 0; i < _window.PillTypeButtons.Length; i++)
{

View file

@ -58,11 +58,11 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
var humanoidAppearance = entity.Comp1;
var sprite = entity.Comp2;
// Sunrise-start
var scale = new Vector2(humanoidAppearance.Width, humanoidAppearance.Height);
_sprite.SetScale(entity.Owner, scale);
// Sunrise-end
sprite[_sprite.LayerMapReserve((entity.Owner, sprite), HumanoidVisualLayers.Eyes)].Color = humanoidAppearance.EyeColor;
}

View file

@ -168,7 +168,7 @@
</BoxContainer>
<!-- Right side -->
<BoxContainer Orientation="Vertical" VerticalExpand="True" VerticalAlignment="Center">
<SpriteView Name="SpriteView" Scale="8 8" Margin="4" SizeFlagsStretchRatio="1" />
<SpriteView Name="SpriteView" Scale="8 8" Margin="4" SizeFlagsStretchRatio="1" SetSize="256 384"/> <!-- Sunrise-edit -->
<BoxContainer Orientation="Horizontal" HorizontalAlignment="Center" Margin="0 5">
<Button Name="SpriteRotateLeft" Text="◀" StyleClasses="OpenRight" />
<cc:VSeparator Margin="2 0 3 0" />

View file

@ -12,8 +12,10 @@
<PanelContainer Name="PaperContent" VerticalExpand="True" HorizontalExpand="True" MaxWidth="600">
<BoxContainer Orientation="Vertical" VerticalAlignment="Stretch">
<TextureButton Name="HeaderImage" HorizontalAlignment="Center" VerticalAlignment="Top" MouseFilter="Ignore"/>
<!-- Sunrise-start -->
<TextureRect Name="ImageContent" HorizontalAlignment="Stretch" VerticalAlignment="Top"
HorizontalExpand="True" VerticalExpand="True" Stretch="KeepAspectCentered" MouseFilter="Ignore"/>
<!-- Sunrise-end -->
<Control Name="TextAlignmentPadding" VerticalAlignment="Top"/>
<RichTextLabel Name="BlankPaperIndicator" StyleClasses="LabelSecondaryColor" VerticalAlignment="Top" HorizontalAlignment="Center"/>
<RichTextLabel StyleClasses="PaperWrittenText" Name="WrittenTextLabel" VerticalAlignment="Top"/>

View file

@ -296,8 +296,11 @@ namespace Content.Client.Paper.UI
ImageContent.Texture = sprite.Frame0(state.ImageContent);
if (state.ImageScale != null)
ImageContent.TextureScale = state.ImageScale.Value;
ImageContent.Visible = true;
BlankPaperIndicator.Visible = false;
}
else
ImageContent.Visible = false;
// Sunrise-End
StampDisplay.RemoveAllChildren();

View file

@ -21,9 +21,9 @@ public sealed partial class SurveillanceCameraMonitorWindow : FancyWindow
{
private static readonly ProtoId<ShaderPrototype> CameraStaticShader = "CameraStatic";
private readonly IPrototypeManager _prototypeManager; // Sunrise-edit
private readonly IEntityManager _entManager; // Sunrise-edit
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IResourceCache _resourceCache = default!;
[Dependency] private readonly IEntityManager _entManager = default!; // Sunrise-edit
public event Action<string, string>? CameraSelected;
public event Action? CameraRefresh;
@ -43,11 +43,9 @@ public sealed partial class SurveillanceCameraMonitorWindow : FancyWindow
public SurveillanceCameraMonitorWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
// Sunrise-start
_prototypeManager = IoCManager.Resolve<IPrototypeManager>();
var resourceCache = IoCManager.Resolve<IResourceCache>();
_entManager = IoCManager.Resolve<IEntityManager>();
var spriteSystem = _entManager.System<SpriteSystem>();
// Sunrise-end
@ -70,7 +68,6 @@ public sealed partial class SurveillanceCameraMonitorWindow : FancyWindow
// Sunrise-start
NavMap.TrackedEntitySelectedAction += SetTrackedEntityFromNavMap;
_entManager = IoCManager.Resolve<IEntityManager>();
// Sunrise-end
}

View file

@ -28,7 +28,6 @@ public abstract class BaseTextureTag : IMarkupTagHandler
SplitRsiPath(path, out var rsiPath, out var state);
var resourceCache = new SpriteSpecifier.Rsi(new ResPath(rsiPath), state);
texture.TexturePath = path;
_spriteSystem ??= _entitySystemManager.GetEntitySystem<SpriteSystem>();
texture.Texture = _spriteSystem.Frame0(resourceCache);
texture.TextureScale = new Vector2(scaleValue, scaleValue);

View file

@ -119,13 +119,6 @@ public sealed class EmpSystem : SharedEmpSystem
{
args.Cancelled = true;
}
// Sunrise-Start
private void OnEmpAttempt(EntityUid uid, EmpImmuneComponent comp, EmpAttemptEvent args)
{
args.Cancel();
}
// Sunrise-Edit
}
/// <summary>

View file

@ -223,16 +223,17 @@ public sealed class RadioSystem : EntitySystem
if (accessItems.Count == 0)
return null;
var idUid = accessItems.FirstOrDefault();
if (TryComp<PdaComponent>(idUid, out var pda) && pda.ContainedId.HasValue)
foreach (var item in accessItems)
{
if (TryComp<IdCardComponent>(pda.ContainedId, out var idComp))
return idComp;
}
else if (TryComp<IdCardComponent>(idUid, out var id))
{
return id;
if (TryComp<PdaComponent>(item, out var pda) && pda.ContainedId.HasValue)
{
if (TryComp<IdCardComponent>(pda.ContainedId, out var idComp))
return idComp;
}
else if (TryComp<IdCardComponent>(item, out var id))
{
return id;
}
}
return null;

View file

@ -31,13 +31,13 @@ internal static class Const
];
public static float MinPressure = 33f;
public static float MaxPressure = 303.9f;
public static float MaxPressure = 363.9f;
public static float MaxTemperature = Atmospherics.T0C + 150;
public static float MaxTemperature = Atmospherics.T0C + 200;
public static float EvaporationCompensation = 10;
public static FixedPoint2 MaxDamagePerSecond = (100f / 120f) + RegenerationPerSecond; // Ensures it takes at least 2 minutes to deplete
public static FixedPoint2 MaxDamagePerSecond = (100f / 180f) + RegenerationPerSecond; // Ensures it takes at least 3 minutes to deplete
public static FixedPoint2 RegenerationPerSecond = 0.3f;
public static string[] AudioCrack = ["/Audio/_Starlight/Effects/supermatter/crystal_crack_1.ogg", "/Audio/_Starlight/Effects/supermatter/crystal_crack_2.ogg"];

View file

@ -93,9 +93,6 @@ public sealed class SupermatterCascadeSystem : EntitySystem
}
branch.Coordinates = branch.Coordinates.SnapToGrid(gridComp);
foreach (var entity in _lookup.GetEntitiesIntersecting(branch.Coordinates))
QueueDel(entity);
SpawnAttachedTo(_random.Pick(_prototypes), branch.Coordinates);
node = nextNode;

View file

@ -2,6 +2,7 @@ using System;
using System.Linq;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Chat.Managers;
using Content.Server.Explosion.EntitySystems;
using Content.Server.Lightning;
using Content.Server.Radio.EntitySystems;
using Content.Server.Starlight.Energy.Supermatter;
@ -38,6 +39,7 @@ public sealed class SupermatterSystem : AccUpdateEntitySystem
[Dependency] private readonly IChatManager _chat = default!;
[Dependency] private readonly IPrototypeManager _prototypes = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ExplosionSystem _explosion = default!;
private readonly Dictionary<EntityUid, Entity<SupermatterComponent>> _supermatters = [];
private DamageGroupPrototype? _brute;
@ -111,7 +113,7 @@ public sealed class SupermatterSystem : AccUpdateEntitySystem
private void Cascad(Entity<SupermatterComponent> supermatter)
{
if (supermatter.Comp.Durability > 0.01) return;
_explosion.QueueExplosion(supermatter, ExplosionSystem.DefaultExplosionPrototypeId, 150, 3, 20);
_cascade.StartCascade(Transform(supermatter.Owner).Coordinates);
QueueDel(supermatter.Owner);
}
@ -182,7 +184,7 @@ public sealed class SupermatterSystem : AccUpdateEntitySystem
radiationStability += prop.RadiationStability * percent;
}
supermatter.Comp.RadiationStability = MathHelper.Clamp(radiationStability, 1, 10);
supermatter.Comp.RadiationStability = MathHelper.Clamp(radiationStability, 1.1, 10);
ProcessHeat(supermatter, gas, heatTransfer, heatModifier);
TryCompensateDamage(supermatter, gas);
@ -237,6 +239,6 @@ public sealed class SupermatterSystem : AccUpdateEntitySystem
supermatter.Comp.AccBreak = MathHelper.Clamp(supermatter.Comp.AccBreak + (trueDamage * Const.BreakPercent), 0, 9999);
supermatter.Comp.AccHeat = MathHelper.Clamp(supermatter.Comp.AccHeat + (trueDamage * Const.HeatPercent), 0, 9999);
supermatter.Comp.AccLighting = MathHelper.Clamp(supermatter.Comp.AccLighting + (trueDamage * Const.LightingPercent), 0, 25);
supermatter.Comp.AccRadiation = MathHelper.Clamp(supermatter.Comp.AccRadiation + (trueDamage * Const.RadiationPercent), 0, 100);
supermatter.Comp.AccRadiation = MathHelper.Clamp(supermatter.Comp.AccRadiation + (trueDamage * Const.RadiationPercent), 0, 50);
}
}

View file

@ -38,9 +38,6 @@ public sealed partial class AbductorSystem : SharedAbductorSystem
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedVirtualItemSystem _virtualItem = default!;
private readonly EntProtoId _nanoStation = "StandardNanotrasenStation";
private EntityUid? _opener;
public override void Initialize()
{
SubscribeLocalEvent<AbductorHumanObservationConsoleComponent, BeforeActivatableUIOpenEvent>(OnBeforeActivatableUIOpen);
@ -70,7 +67,22 @@ public sealed partial class AbductorSystem : SharedAbductorSystem
EntityUid eye;
_opener = args.Actor;
ent.Comp.Opener = args.Actor;
if (!TryComp<UserInterfaceComponent>(ent, out var bound))
return;
foreach (var uids in bound.Actors.Values)
{
foreach (var uid in uids)
{
if (uid == args.Actor)
continue;
_uiSystem.CloseUserUis<AbductorCameraConsoleUIKey>(uid);
}
}
var beacon = _entityManager.GetEntity(args.Beacon.NetEnt);
var beaconCoords = Transform(beacon).Coordinates;
@ -115,10 +127,13 @@ public sealed partial class AbductorSystem : SharedAbductorSystem
if (console == null)
return;
if (!TryComp<AbductorHumanObservationConsoleComponent>(console, out var comp))
return;
comp.Opener = null;
RemoveEye(actor);
_virtualItem.DeleteInHandsMatching(actor, console.Value);
_opener = null;
}
private void OnActivatableUIOpenAttemptEvent(Entity<AbductorHumanObservationConsoleComponent> ent, ref ActivatableUIOpenAttemptEvent args)
@ -126,7 +141,7 @@ public sealed partial class AbductorSystem : SharedAbductorSystem
if (!HasComp<AbductorScientistComponent>(args.User) && !HasComp<AbductorAgentComponent>(args.User))
args.Cancel();
if (_opener != null && _opener != args.User)
if (ent.Comp.Opener != null && ent.Comp.Opener != args.User)
{
_popup.PopupEntity(Loc.GetString("console-occupied"), args.User, args.User);
args.Cancel();

View file

@ -1,10 +1,12 @@
using Content.Server._Sunrise.Emp;
namespace Content.Server.Emp;
/// <summary>
/// Upon being triggered will EMP area around it.
/// </summary>
[RegisterComponent]
[Access(typeof(EmpSystem))]
[Access(typeof(EmpImmuneSystem))]
public sealed partial class EmpImmuneComponent : Component
{

View file

@ -0,0 +1,19 @@
using Content.Server.Emp;
namespace Content.Server._Sunrise.Emp;
public sealed class EmpImmuneSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<EmpImmuneComponent, EmpAttemptEvent>(OnEmpAttempt);
}
private void OnEmpAttempt(EntityUid uid, EmpImmuneComponent comp, EmpAttemptEvent args)
{
args.Cancel();
}
}

View file

@ -1,19 +0,0 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
namespace Content.Server._Sunrise.InnateItem
{
[RegisterComponent]
public sealed partial class InnateItemComponent : Component
{
[ViewVariables(VVAccess.ReadOnly),
DataField("instantActions", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))]
public List<string?> InstantActions = new();
[ViewVariables(VVAccess.ReadOnly),
DataField("worldTargetActions", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))]
public List<string?> WorldTargetActions = new();
public List<EntityUid> Actions = new();
}
}

View file

@ -1,140 +0,0 @@
using Content.Shared.Actions;
using Content.Shared.Actions.Components;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.UserInterface;
using Robust.Shared.Utility;
namespace Content.Server._Sunrise.InnateItem
{
public sealed class InnateItemSystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
[Dependency] private readonly ActionContainerSystem _actionContainer = default!;
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<InnateItemComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<InnateItemComponent, InnateEntityTargetActionEvent>(WorldTargetActionActivate);
SubscribeLocalEvent<InnateItemComponent, InnateInstantActionEvent>(InstantActionActivate);
SubscribeLocalEvent<InnateItemComponent, ComponentShutdown>(OnShutdown);
}
private void OnShutdown(EntityUid uid, InnateItemComponent component, ComponentShutdown args)
{
foreach (var action in component.Actions)
{
_actionContainer.RemoveAction(action);
}
}
private void OnMapInit(EntityUid uid, InnateItemComponent component, MapInitEvent args)
{
AddItems(uid, component);
}
private void AddItems(EntityUid uid, InnateItemComponent component)
{
foreach (var itemProto in component.WorldTargetActions)
{
var item = Spawn(itemProto);
var action = CreateWorldTargetAction(item);
_actionContainer.AddAction(uid, action);
_actionsSystem.AddAction(uid, action, uid);
component.Actions.Add(action);
}
foreach (var itemProto in component.InstantActions)
{
var item = Spawn(itemProto);
var action = CreateInstantAction(item);
_actionContainer.AddAction(uid, action);
_actionsSystem.AddAction(uid, action, uid);
component.Actions.Add(action);
}
}
private EntityUid CreateWorldTargetAction(EntityUid uid)
{
var action = EnsureComp<ActionComponent>(uid);
EnsureComp<WorldTargetActionComponent>(uid);
EnsureComp<EntityTargetActionComponent>(uid);
var targetAction = EnsureComp<TargetActionComponent>(uid);
_actionsSystem.SetIcon(uid, new SpriteSpecifier.EntityPrototype(MetaData(uid).EntityPrototype!.ID));
_actionsSystem.SetEvent(uid, new InnateEntityTargetActionEvent(uid));
_actionsSystem.SetPriority((uid, action), 0);
_actionsSystem.SetItemIconStyle((uid, action), ItemActionIconStyle.NoItem);
_actionsSystem.SetCheckCanInteract((uid, action), false);
_actionsSystem.SetIgnoreContainer((uid, targetAction), true);
if (TryComp<ActivatableUIComponent>(uid, out var activatableUIComponent))
{
activatableUIComponent.RequiresComplex = false;
activatableUIComponent.InHandsOnly = false;
activatableUIComponent.RequireActiveHand = false;
Dirty(uid, activatableUIComponent);
}
return uid;
}
private EntityUid CreateInstantAction(EntityUid uid)
{
var action = EnsureComp<ActionComponent>(uid);
EnsureComp<InstantActionComponent>(uid);
_actionsSystem.SetEvent(uid, new InnateInstantActionEvent(uid));
_actionsSystem.SetPriority((uid, action), 0);
_actionsSystem.SetIcon(uid, new SpriteSpecifier.EntityPrototype(MetaData(uid).EntityPrototype!.ID));
_actionsSystem.SetCheckCanInteract((uid, action), false);
if (TryComp<ActivatableUIComponent>(uid, out var activatableUIComponent))
{
activatableUIComponent.RequiresComplex = false;
activatableUIComponent.InHandsOnly = false;
activatableUIComponent.RequireActiveHand = false;
Dirty(uid, activatableUIComponent);
}
return uid;
}
private void WorldTargetActionActivate(EntityUid uid, InnateItemComponent component, InnateEntityTargetActionEvent args)
{
if (args.Entity == null)
return;
_interactionSystem.InteractUsing(
args.Performer,
args.Item,
args.Entity.Value,
args.Target,
false,
false,
false);
}
private void InstantActionActivate(EntityUid uid, InnateItemComponent component, InnateInstantActionEvent args)
{
var ev = new UseInHandEvent(args.Performer);
RaiseLocalEvent(args.Item, ev);
}
}
public sealed partial class InnateEntityTargetActionEvent : WorldTargetActionEvent
{
public EntityUid Item;
public InnateEntityTargetActionEvent(EntityUid item)
{
Item = item;
}
}
public sealed partial class InnateInstantActionEvent : InstantActionEvent
{
public EntityUid Item;
public InnateInstantActionEvent(EntityUid item)
{
Item = item;
}
}
}

View file

@ -0,0 +1,46 @@
using Content.Shared._Sunrise.ThermalVision;
using Content.Shared.Actions;
using Content.Shared.Toggleable;
namespace Content.Server._Sunrise.ThermalVision;
public sealed class ToggleableThermalVisionSystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ToggleableThermalVisionComponent, ComponentInit>(OnVisionInit);
SubscribeLocalEvent<ToggleableThermalVisionComponent, ComponentShutdown>(OnVisionShutdown);
SubscribeLocalEvent<ToggleableThermalVisionComponent, ToggleActionEvent>(OnToggleThermalVision);
}
private void OnVisionInit(Entity<ToggleableThermalVisionComponent> ent, ref ComponentInit args)
{
_actionsSystem.AddAction(ent.Owner, ref ent.Comp.ActionEntity, ent.Comp.Action);
}
private void OnVisionShutdown(Entity<ToggleableThermalVisionComponent> ent, ref ComponentShutdown args)
{
_actionsSystem.RemoveAction(ent.Comp.ActionEntity);
RemComp<ThermalVisionComponent>(ent);
}
private void OnToggleThermalVision(Entity<ToggleableThermalVisionComponent> ent, ref ToggleActionEvent args)
{
if (args.Handled)
return;
ent.Comp.Active = !ent.Comp.Active;
if (ent.Comp.Active)
EnsureComp<ThermalVisionComponent>(ent);
else
RemComp<ThermalVisionComponent>(ent);
args.Handled = true;
Dirty(ent, ent.Comp);
}
}

View file

@ -84,19 +84,6 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem
var fireMode = component.FireModes[i];
var index = i;
if (fireMode.Conditions != null)
{
var conditionArgs = new FireModeConditionConditionArgs(args.User, args.Target, fireMode, EntityManager);
var conditionsMet = fireMode.Conditions.All(condition => condition.Condition(conditionArgs));
if (!conditionsMet)
{
if (component.CurrentFireMode == index)
SetFireMode(uid, component, 0, args.User);
continue;
}
}
if (ammoProvider is ProjectileBatteryAmmoProviderComponent projectileAmmo)
{
var entProto = _prototypeManager.Index<EntityPrototype>(fireMode.Prototype);
@ -142,12 +129,12 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem
private void OnUseInHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, UseInHandEvent args)
{
//starlight
if(args.Handled)
//starlight
if (args.Handled)
return;
args.Handled = true;
//starlight end
//starlight end
TryCycleFireMode(uid, component, args.User);
}
@ -179,6 +166,20 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem
component.CurrentFireMode = index;
Dirty(uid, component);
if (fireMode.Conditions != null && user != null)
{
var conditionArgs = new FireModeConditionConditionArgs(user.Value, uid, fireMode, EntityManager);
var conditionsMet = fireMode.Conditions.All(condition => condition.Condition(conditionArgs));
if (!conditionsMet)
{
if (TryComp<ActorComponent>(user, out var actor))
_popupSystem.PopupEntity(Loc.GetString("gun-alert-level-condition"),
uid, actor.PlayerSession);
return;
}
}
if (TryGetAmmoProvider(uid, out var ammoProvider) && ammoProvider != null)
{
if (ammoProvider is ProjectileBatteryAmmoProviderComponent projectileAmmo)
@ -195,8 +196,7 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem
projectileAmmo.Capacity = (int)Math.Round(projectileAmmo.Capacity / fireCostDiff);
Dirty(uid, projectileAmmo);
if (user != null && TryComp<ActorComponent>(user, out var actor))
_popupSystem.PopupEntity(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, actor.PlayerSession);
_popupSystem.PopupPredicted(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user);
}
else if (ammoProvider is HitscanBatteryAmmoProviderComponent hitscanAmmo)
{
@ -212,8 +212,7 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem
hitscanAmmo.Capacity = (int)Math.Round(hitscanAmmo.Capacity / fireCostDiff);
Dirty(uid, hitscanAmmo);
if (user != null && TryComp<ActorComponent>(user, out var actor))
_popupSystem.PopupEntity(Loc.GetString("gun-set-fire-mode", ("mode", hitscan.Name)), uid, actor.PlayerSession);
_popupSystem.PopupPredicted(Loc.GetString("gun-set-fire-mode", ("mode", hitscan.Name)), uid, user);
}
var updateClientAmmoEvent = new UpdateClientAmmoEvent();
@ -282,19 +281,6 @@ public sealed class BatteryWeaponFireModesSystem : EntitySystem
var index = (component.CurrentFireMode + 1) % component.FireModes.Count;
var fireMode = component.FireModes[index];
if (fireMode.Conditions != null)
{
var conditionArgs = new FireModeConditionConditionArgs(user, uid, fireMode, EntityManager);
var conditionsMet = fireMode.Conditions.All(condition => condition.Condition(conditionArgs));
if (!conditionsMet)
{
return;
}
}
SetFireMode(uid, component, index, user);
}
}

View file

@ -14,6 +14,9 @@ public sealed partial class AbductorHumanObservationConsoleComponent : Component
[DataField, AutoNetworkedField]
public NetEntity? RemoteEntity;
[DataField, AutoNetworkedField]
public EntityUid? Opener;
}
[RegisterComponent, NetworkedComponent, Access(typeof(SharedAbductorSystem)), AutoGenerateComponentState]
public sealed partial class AbductorConsoleComponent : Component

View file

@ -0,0 +1,18 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.InnateItem;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class InnateItemComponent : Component
{
[DataField, AutoNetworkedField]
public List<EntProtoId?> InstantActions = new();
[DataField, AutoNetworkedField]
public List<EntProtoId?> WorldTargetActions = new();
[DataField, AutoNetworkedField]
public List<EntityUid> Actions = new();
}

View file

@ -0,0 +1,144 @@
using Content.Shared.Actions;
using Content.Shared.Actions.Components;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.UserInterface;
using Robust.Shared.Utility;
namespace Content.Shared._Sunrise.InnateItem;
public sealed class InnateItemSystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
[Dependency] private readonly ActionContainerSystem _actionContainer = default!;
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<InnateItemComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<InnateItemComponent, InnateEntityTargetActionEvent>(WorldTargetActionActivate);
SubscribeLocalEvent<InnateItemComponent, InnateInstantActionEvent>(InstantActionActivate);
SubscribeLocalEvent<InnateItemComponent, ComponentShutdown>(OnShutdown);
}
private void OnShutdown(EntityUid uid, InnateItemComponent component, ComponentShutdown args)
{
foreach (var action in component.Actions)
{
_actionsSystem.RemoveAction(action);
}
}
private void OnMapInit(EntityUid uid, InnateItemComponent component, MapInitEvent args)
{
AddItems(uid, component);
}
private void AddItems(EntityUid uid, InnateItemComponent component)
{
foreach (var itemProto in component.WorldTargetActions)
{
var item = Spawn(itemProto);
var action = CreateWorldTargetAction(item);
_actionContainer.AddAction(uid, action);
_actionsSystem.AddAction(uid, action, uid);
component.Actions.Add(action);
}
foreach (var itemProto in component.InstantActions)
{
var item = Spawn(itemProto);
var action = CreateInstantAction(item);
_actionContainer.AddAction(uid, action);
_actionsSystem.AddAction(uid, action, uid);
component.Actions.Add(action);
}
}
private EntityUid CreateWorldTargetAction(EntityUid uid)
{
if (!TryComp<ActionComponent>(uid, out var action))
return EntityUid.Invalid;
EnsureComp<WorldTargetActionComponent>(uid);
EnsureComp<EntityTargetActionComponent>(uid);
var targetAction = EnsureComp<TargetActionComponent>(uid);
_actionsSystem.SetIcon(uid, new SpriteSpecifier.EntityPrototype(MetaData(uid).EntityPrototype!.ID));
_actionsSystem.SetEvent(uid, new InnateEntityTargetActionEvent(uid));
_actionsSystem.SetPriority((uid, action), 0);
_actionsSystem.SetItemIconStyle((uid, action), ItemActionIconStyle.NoItem);
_actionsSystem.SetCheckCanInteract((uid, action), false);
_actionsSystem.SetIgnoreContainer((uid, targetAction), true);
if (TryComp<ActivatableUIComponent>(uid, out var activatableUIComponent))
{
activatableUIComponent.RequiresComplex = false;
activatableUIComponent.InHandsOnly = false;
activatableUIComponent.RequireActiveHand = false;
Dirty(uid, activatableUIComponent);
}
return uid;
}
private EntityUid CreateInstantAction(EntityUid uid)
{
if (!TryComp<ActionComponent>(uid, out var action))
return EntityUid.Invalid;
EnsureComp<InstantActionComponent>(uid);
_actionsSystem.SetEvent(uid, new InnateInstantActionEvent(uid));
_actionsSystem.SetPriority((uid, action), 0);
_actionsSystem.SetIcon(uid, new SpriteSpecifier.EntityPrototype(MetaData(uid).EntityPrototype!.ID));
_actionsSystem.SetCheckCanInteract((uid, action), false);
if (TryComp<ActivatableUIComponent>(uid, out var activatableUIComponent))
{
activatableUIComponent.RequiresComplex = false;
activatableUIComponent.InHandsOnly = false;
activatableUIComponent.RequireActiveHand = false;
Dirty(uid, activatableUIComponent);
}
return uid;
}
private void WorldTargetActionActivate(EntityUid uid, InnateItemComponent component, InnateEntityTargetActionEvent args)
{
if (args.Entity == null)
return;
_interactionSystem.InteractUsing(
args.Performer,
args.Item,
args.Entity.Value,
args.Target,
false,
false,
false);
}
private void InstantActionActivate(EntityUid uid, InnateItemComponent component, InnateInstantActionEvent args)
{
var ev = new UseInHandEvent(args.Performer);
RaiseLocalEvent(args.Item, ev);
}
}
public sealed partial class InnateEntityTargetActionEvent : WorldTargetActionEvent
{
public EntityUid Item;
public InnateEntityTargetActionEvent(EntityUid item)
{
Item = item;
}
}
public sealed partial class InnateInstantActionEvent : InstantActionEvent
{
public EntityUid Item;
public InnateInstantActionEvent(EntityUid item)
{
Item = item;
}
}

View file

@ -0,0 +1,18 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.ThermalVision;
[RegisterComponent, NetworkedComponent]
public sealed partial class ToggleableThermalVisionComponent : Component
{
[DataField]
public EntProtoId Action = "ActionToggleThermalVision";
[ViewVariables]
public EntityUid? ActionEntity;
[ViewVariables]
public bool Active;
}

View file

@ -28,9 +28,9 @@ flesh-cult-round-end-leader = [bold]Лидером культа плоти бы
preset-flesh-cult-objective-issuer-flesh-cult = [color=#e0106a]Культ плоти[/color]
objective-issuer-flesh-cult = [color=#e0106a]Культ плоти[/color]
# Shown at the end of a round of Traitor
flesh-cult-objective-condition-success = { $condition } | [color={ $markupColor }]Успех![/color]
flesh-cult-objective-condition-success = { $condition } | [color=green]Успех![/color]
# Shown at the end of a round of Traitor
flesh-cult-objective-condition-fail = { $condition } | [color={ $markupColor }]Провал![/color] ({ $progress }%)
flesh-cult-objective-condition-fail = { $condition } | [color=red]Провал![/color] ({ $progress }%)
flesh-cult-title = Культ плоти
flesh-cult-description = На станции появился культ, который желает захватить станцию.
flesh-cult-not-enough-ready-players = Недостаточно игроков готовы к игре! Из { $minimumPlayers } необходимых игроков готовы { $readyPlayersCount }.

View file

@ -1,5 +1,5 @@
shared-solution-container-component-on-examine-empty-container = Не содержит вещества.
shared-solution-container-component-on-examine-main-text = Содержит [color={ $color }]{ $desc }[/color] { $wordedAmount }
shared-solution-container-component-on-examine-main-text = Содержит [color={ $color }]{ $desc }[/color] { $chemCount }
shared-solution-container-component-on-examine-worded-amount-one-reagent = вещество.
shared-solution-container-component-on-examine-worded-amount-multiple-reagents = смесь веществ.
examinable-solution-has-recognizable-chemicals = В этом растворе вы можете распознать { $recognizedString }.

View file

@ -9,7 +9,12 @@ objectives-player-user-named = [color=White]{ $name }[/color] ([color=gray]{ $us
objectives-player-user = [color=gray]{ $user }[/color]
objectives-player-named = [color=White]{ $name }[/color]
objectives-no-objectives = { $custody }{ $title } { $agent }.
objectives-with-objectives = { $custody }{ $title } { $agent } со следующими целями:
objectives-objective-success = { $objective } | [color={ $markupColor }]Успех![/color]
objectives-objective-fail = { $objective } | [color={ $markupColor }]Провал![/color] ({ $progress }%)
objectives-objective-success = {$objective} | [color=green]Успех![/color] ({TOSTRING($progress, "P0")})
objectives-objective-partial-success = {$objective} | [color=yellow]Частичный успех![/color] ({TOSTRING($progress, "P0")})
objectives-objective-partial-failure = {$objective} | [color=orange]Частичный провал![/color] ({TOSTRING($progress, "P0")})
objectives-objective-fail = {$objective} | [color=red]Провал![/color] ({TOSTRING($progress, "P0")})
objectives-in-custody = [bold][color=red]| АРЕСТОВАН | [/color][/bold]

View file

@ -5,6 +5,7 @@ gun-selected-mode = Выбран { $mode }
gun-disabled = Вы не можете использовать оружие!
gun-clumsy = Оружие взрывается вам в лицо!
gun-set-fire-mode = Выбран режим { $mode }
gun-alert-level-condition = Слишком низкий станционный код для этого режима стрельбы!
gun-magazine-whitelist-fail = Это не помещается в оружие!
gun-magazine-fired-empty = Патронов не осталось!
gun-Insulated-gloves = У вас слишком толстые пальцы чтобы нажать курок!

View file

@ -234,7 +234,7 @@
#Make a scanner category when these actually function and we get the trayson
- type: entity
parent: [ClothingEyesBase, BaseToggleClothing]
parent: [ClothingEyesBase, BaseToggleClothing, PowerCellSlotSmallItem] # Sunrise-edit
id: ClothingEyesGlassesThermal
name: optical thermal scanner
description: Thermals in the shape of glasses.
@ -259,6 +259,20 @@
parent: true
components:
- type: ThermalVision
- type: PowerCellDraw
drawRate: 3.5
useRate: 20
- type: ItemToggle
predictable: false # issues between ToggleCellDraw and ItemToggleActiveSound
onUse: false
canActivateInhand: false
soundActivate:
path: /Audio/_Sunrise/Items/Goggles/activate.ogg
soundDeactivate:
path: /Audio/_Sunrise/Items/Goggles/deactivate.ogg
soundFailToActivate:
path: /Audio/Machines/button.ogg
- type: ToggleCellDraw
# Sunrise-End
- type: entity

View file

@ -385,7 +385,7 @@
range: 3
- type: InnateItem
instantActions:
- HandheldStationMapUnpowered
- HandheldStationMapUnpoweredInnateItem
- type: BorgCrewManifestViewer
- type: StationRecordKeyStorage
# Sunrise-End

View file

@ -144,7 +144,7 @@
baseSprintSpeed : 4.5
- type: InnateItem
worldTargetActions:
- AccessBreaker
- AccessBreakerInnateItem
# Sunrise-End
- type: entity
@ -194,8 +194,8 @@
baseSprintSpeed: 5
- type: InnateItem
worldTargetActions:
- Emag
- HandheldHealthAnalyzerUnpowered
- EmagInnateItem
- HandheldHealthAnalyzerUnpoweredInnateItem
# Sunrise-End
- type: entity

View file

@ -186,7 +186,7 @@
voice: HearthstoneLordOfThunder
- type: InnateItem
instantActions:
- HandHeldMassScannerBorg
- HandHeldMassScannerBorgInnateItem
# Sunrise-End
- type: entity

View file

@ -99,11 +99,11 @@
voice: Portal2FactCore
- type: InnateItem
instantActions:
- PortableSurveillanceCameraMonitorUnpowered
- HandheldStationMapUnpowered
- HandheldCrewMonitorBorg
- PortableSurveillanceCameraMonitorUnpoweredInnateItem
- HandheldStationMapUnpoweredInnateItem
- HandheldCrewMonitorBorgInnateItem
worldTargetActions:
- HandheldHealthAnalyzerUnpowered
- HandheldHealthAnalyzerUnpoweredInnateItem
- type: BorgBrain
# Sunrise-End
- type: ChangeVoiceInContainer
@ -161,8 +161,8 @@
enabled: false
- type: InnateItem
worldTargetActions:
- AccessBreaker
- HandheldHealthAnalyzerUnpowered
- AccessBreakerInnateItem
- HandheldHealthAnalyzerUnpoweredInnateItem
- type: Biocode
factions:
- Syndicate

View file

@ -65,4 +65,4 @@
- type: entity
id: HandHeldMassScannerUnpowered
parent: HandHeldMassScanner
suffix: Handheld, Always Powered
suffix: Handheld, Always Powered

View file

@ -91,6 +91,7 @@
tags:
- Bottle
- PillCanister
- PatchPack # Sunrise-edit
- type: SolutionContainerManager
solutions:
buffer: {}

View file

@ -24,8 +24,8 @@
sprite: _Starlight/Objects/Specific/Medical/implants.rsi
state: eyes_night
- type: FunctionalOrgan
comps:
- type: NightVision
comps:
- type: ToggleableNightVision
- type: OrganVisualization
layer: Eyes
prototype: CyberEyesNightVision
@ -40,8 +40,8 @@
sprite: _Starlight/Objects/Specific/Medical/implants.rsi
state: eyes_thermal
- type: FunctionalOrgan
comps:
- type: ThermalVision
comps:
- type: ToggleableThermalVision
- type: OrganVisualization
layer: Eyes
prototype: CyberEyesThermalVision
prototype: CyberEyesThermalVision

View file

@ -58,16 +58,6 @@
eyes:
- state: on-equipped-EYES
shader: unshaded
- type: PowerCellSlot
cellSlotId: cell_slot
- type: ContainerContainer
containers:
cell_slot: !type:ContainerSlot
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellSmall
- type: ToggleCellDraw
- type: HideLayerClothing
layers:

View file

@ -106,7 +106,7 @@
nameSegments: [NamesBorg]
- type: InnateItem
worldTargetActions:
- Emag
- EmagInnateItem
- type: startingGear
id: SyndiReaperHardsuitGear
@ -209,10 +209,10 @@
- EmagImmune
- type: InnateItem
instantActions:
- PortableSurveillanceCameraMonitor
- HandheldStationMapUnpowered
- HandheldCrewMonitorBorg
- HandHeldMassScannerUnpowered
- PortableSurveillanceCameraMonitorUnpoweredInnateItem
- HandheldStationMapUnpoweredInnateItem
- HandheldCrewMonitorBorgInnateItem
- HandHeldMassScannerBorgInnateItem
- type: MobThresholds
thresholds:
0: Alive
@ -330,7 +330,7 @@
baseSprintSpeed : 3
- type: InnateItem
worldTargetActions:
- Emag
- EmagInnateItem
- type: entity
id: BorgChassisSyndicateSpider
@ -411,4 +411,4 @@
baseSprintSpeed : 5
- type: InnateItem
worldTargetActions:
- Emag
- EmagInnateItem

View file

@ -0,0 +1,59 @@
- type: entity
id: HandHeldMassScannerBorgInnateItem
parent: HandHeldMassScannerBorg
components:
- type: Action
- type: entity
id: HandheldStationMapUnpoweredInnateItem
parent: BaseHandheldStationMap
components:
- type: Action
- type: entity
id: EngiAlertsMonitorInnateItem
parent: EngiAlertsMonitor
components:
- type: Action
- type: entity
parent: HandheldCrewMonitorBorg
id: HandheldCrewMonitorBorgInnateItem
components:
- type: Action
- type: entity
id: PortableSurveillanceCameraMonitorUnpoweredInnateItem
parent: PortableSurveillanceCameraMonitorUnpowered
components:
- type: Action
- type: entity
id: HandheldCriminalRecordsMonitorUnpoweredInnateItem
parent: HandheldCriminalRecordsMonitorUnpowered
components:
- type: Action
- type: entity
id: HandheldHealthAnalyzerUnpoweredInnateItem
parent: HandheldHealthAnalyzerUnpowered
components:
- type: Action
- type: entity
parent: Emag
id: EmagInnateItem
components:
- type: Action
- type: entity
parent: AccessBreaker
id: AccessBreakerInnateItem
components:
- type: Action
- type: entity
parent: ForensicScanner
id: ForensicScannerInnateItem
components:
- type: Action

View file

@ -39,8 +39,8 @@
- type: BorgCuffed
- type: InnateItem
instantActions:
- PortableSurveillanceCameraMonitor
- HandheldStationMapUnpowered
- PortableSurveillanceCameraMonitorUnpoweredInnateItem
- HandheldStationMapUnpoweredInnateItem
- type: Access
tags:
- EmergencyShuttleRepealAll
@ -159,7 +159,7 @@
- BorgModuleGeneric
- BorgModuleSecurity
- BorgModuleSyndicate
- BorgModuleSyndicateAssault
- BorgModuleSyndicateAssault
defaultModules:
- BorgModuleStandart
@ -192,11 +192,11 @@
voice: Sentrybot
- type: InnateItem
instantActions:
- PortableSurveillanceCameraMonitorUnpowered
- HandheldCriminalRecordsMonitorUnpowered
- HandheldStationMapUnpowered
- PortableSurveillanceCameraMonitorUnpoweredInnateItem
- HandheldCriminalRecordsMonitorUnpoweredInnateItem
- HandheldStationMapUnpoweredInnateItem
worldTargetActions:
- ForensicScanner
- ForensicScannerInnateItem
- type: ShowCriminalRecordIcons
- type: ShowMindShieldIcons
- type: BorgCuffed

View file

@ -85,8 +85,8 @@
- Mech
- type: InnateItem
instantActions:
- HandheldStationMapUnpowered
- EngiAlertsMonitor
- HandheldStationMapUnpoweredInnateItem
- EngiAlertsMonitorInnateItem
# Sunrise-End
# Visual
@ -135,7 +135,7 @@
collection: FootstepCyborgSpider
params:
volume: -15
addComponents:
- type: BorgJetpack
acceleration: 1
@ -167,7 +167,7 @@
False: {state: icon}
- type: InnateItem
instantActions:
- HandheldStationMapUnpowered
- HandheldStationMapUnpoweredInnateItem
# Sunrise-End
# Visual
@ -285,10 +285,10 @@
- type: FabricateCandy
- type: InnateItem
instantActions:
- HandheldStationMapUnpowered
- HandheldCrewMonitorBorg
- HandheldStationMapUnpoweredInnateItem
- HandheldCrewMonitorBorgInnateItem
worldTargetActions:
- HandheldHealthAnalyzerUnpowered
- HandheldHealthAnalyzerUnpoweredInnateItem
# Sunrise-End
# Visual