Фикс многих тестов (#3586)

This commit is contained in:
ThereDrD 2026-01-02 14:17:03 +03:00 committed by GitHub
parent a42e78c3c9
commit 73455af753
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
106 changed files with 1126 additions and 969 deletions

View file

@ -244,10 +244,12 @@ public sealed partial class AdminLogsControl : Control
foreach (var child in LogsContainer.Children)
{
if (child is not AdminLogLabel log)
// Sunrise edit start - крутые красивые логи
if (child is not SunriseAdminLogLabel log)
{
continue;
}
// Sunrise edit end
child.Visible = ShouldShowLog(log);
if (child.Visible)
@ -271,7 +273,8 @@ public sealed partial class AdminLogsControl : Control
button.Text.Contains(PlayerSearch.Text, StringComparison.OrdinalIgnoreCase);
}
private bool LogMatchesPlayerFilter(AdminLogLabel label)
// Sunrise edit - крутые красивые логи
private bool LogMatchesPlayerFilter(SunriseAdminLogLabel label)
{
if (label.Log.Players.Length == 0)
return SelectedPlayers.Count == 0 || IncludeNonPlayerLogs;
@ -279,7 +282,8 @@ public sealed partial class AdminLogsControl : Control
return SelectedPlayers.Overlaps(label.Log.Players);
}
private bool ShouldShowLog(AdminLogLabel label)
// Sunrise edit - крутые красивые логи
private bool ShouldShowLog(SunriseAdminLogLabel label)
{
// Check log type
if (!SelectedTypes.Contains(label.Log.Type))
@ -471,7 +475,11 @@ public sealed partial class AdminLogsControl : Control
{
ref var log = ref span[i];
var separator = new HSeparator();
var label = new AdminLogLabel(ref log, separator);
// Sunrise edit start - крутые красивые логи
var label = new SunriseAdminLogLabel(ref log, separator);
// Sunrise edit end
label.Visible = ShouldShowLog(label);
TotalLogs++;

View file

@ -1,5 +1,6 @@
using System.IO;
using System.Linq;
using Content.Client._Sunrise.Administration.UI.CustomControls;
using Content.Client.Administration.UI.CustomControls;
using Content.Client.Eui;
using Content.Shared.Administration.Logs;
@ -109,8 +110,10 @@ public sealed class AdminLogsEui : BaseEui
await writer.WriteLineAsync(CsvHeader);
foreach (var child in LogsControl.LogsContainer.Children)
{
if (child is not AdminLogLabel logLabel || !child.Visible)
// Sunrise edit start - крутые красивые логи
if (child is not SunriseAdminLogLabel logLabel || !child.Visible)
continue;
// Sunrise edit end
var log = logLabel.Log;

View file

@ -8,6 +8,15 @@ using Robust.Shared.Utility;
namespace Content.Client._Sunrise.Administration.UI.CustomControls;
/// <summary>
/// Красивая обертка для логов, поддерживающая форматирование текста.
/// </summary>
/// <remarks>
/// Добавляет в начало файла цветовой индикатор важности логи и выделяет время жирным текстом. <br/>
/// Дополнительную информацию о сущности выделяет <see cref="InfoColor"/> цветом, чтобы не засорять основную информацию. <br/>
/// Цвета логов определяются в <see cref="GetTypeSpecificColor"/>
/// </remarks>
/// <seealso cref="AdminLogLabel"/>
public sealed class SunriseAdminLogLabel : RichTextLabel
{
private const string InfoColor = "gray";
@ -91,7 +100,7 @@ public sealed class SunriseAdminLogLabel : RichTextLabel
#endregion
public SharedAdminLog Log { get; }
public new SharedAdminLog Log { get; }
public HSeparator Separator { get; }
@ -100,9 +109,9 @@ public sealed class SunriseAdminLogLabel : RichTextLabel
Separator.Visible = Visible;
}
protected override void Dispose(bool disposing)
protected override void ExitedTree()
{
base.Dispose(disposing);
base.ExitedTree();
OnVisibilityChanged -= VisibilityChanged;
}

View file

@ -1,13 +0,0 @@
using Content.Shared.Sunrise.FactionGunBlockerSystem;
namespace Content.Client._Sunrise.FactionWeaponBlockerSystem;
[RegisterComponent]
public sealed partial class FactionWeaponBlockerComponent : SharedFactionWeaponBlockerComponent
{
[ViewVariables(VVAccess.ReadWrite)]
public bool CanUse;
[ViewVariables(VVAccess.ReadWrite)]
public string AlertText = "";
}

View file

@ -1,64 +0,0 @@
using Content.Shared.Interaction.Events;
using Content.Shared.Sunrise.FactionGunBlockerSystem;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Weapons.Ranged.Systems;
using Robust.Shared.GameStates;
namespace Content.Client._Sunrise.FactionWeaponBlockerSystem;
public sealed class FactionWeaponBlockerSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FactionWeaponBlockerComponent, AttemptShootEvent>(OnShootAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, AttemptMeleeEvent>(OnMeleeAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, UseAttemptEvent>(OnUseAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, InteractionAttemptEvent>(OnInteractAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, ComponentHandleState>(OnFactionWeaponBlockerHandleState);
}
private void OnUseAttempt(EntityUid uid, FactionWeaponBlockerComponent component, ref UseAttemptEvent args)
{
if (component.CanUse)
return;
args.Cancel();
}
private void OnInteractAttempt(EntityUid uid, FactionWeaponBlockerComponent component, ref InteractionAttemptEvent args)
{
if (component.CanUse)
return;
args.Cancelled = true;
}
private void OnFactionWeaponBlockerHandleState(EntityUid uid, FactionWeaponBlockerComponent component, ref ComponentHandleState args)
{
if (args.Current is not FactionWeaponBlockerComponentState state)
return;
component.CanUse = state.CanUse;
component.AlertText = state.AlertText;
}
private void OnMeleeAttempt(EntityUid uid, FactionWeaponBlockerComponent component, ref AttemptMeleeEvent args)
{
if (component.CanUse)
return;
args.Cancelled = true;
args.Message = component.AlertText;
}
private void OnShootAttempt(EntityUid uid, FactionWeaponBlockerComponent component, ref AttemptShootEvent args)
{
if (component.CanUse)
return;
args.Cancelled = true;
args.Message = component.AlertText;
}
}

View file

@ -1,4 +1,5 @@
using System.Linq;
using Content.Client._Sunrise.Administration.UI.CustomControls;
using Content.Client.Administration.UI;
using Content.Client.Administration.UI.CustomControls;
using Content.Client.Administration.UI.Logs;
@ -41,7 +42,11 @@ public sealed class LogWindowTest : InteractionTest
await Client.WaitPost(() => search.Text = guid.ToString());
await ClickControl(refresh);
await RunTicks(5);
var searchResult = cont.Children.Where(x => x.Visible && x is AdminLogLabel).Cast<AdminLogLabel>().ToArray();
// Sunrise edit start - крутые красивые логи
var searchResult = cont.Children.Where(x => x.Visible && x is SunriseAdminLogLabel).Cast<SunriseAdminLogLabel>().ToArray();
// Sunrise edit end
Assert.That(searchResult.Length, Is.EqualTo(1));
Assert.That(searchResult[0].Log.Message, Contains.Substring($" test log 1: {guid}"));
@ -53,7 +58,11 @@ public sealed class LogWindowTest : InteractionTest
await Client.WaitPost(() => search.Text = guid.ToString());
await ClickControl(refresh);
await RunTicks(5);
searchResult = cont.Children.Where(x => x.Visible && x is AdminLogLabel).Cast<AdminLogLabel>().ToArray();
// Sunrise edit start - крутые красивые логи
searchResult = cont.Children.Where(x => x.Visible && x is SunriseAdminLogLabel).Cast<SunriseAdminLogLabel>().ToArray();
// Sunrise edit end
Assert.That(searchResult.Length, Is.EqualTo(1));
Assert.That(searchResult[0].Log.Message, Contains.Substring($" test log 2: {guid}"));
}

View file

@ -61,6 +61,11 @@ public abstract class TileAtmosphereTest : AtmosTest
[Test]
public async Task FireSpreading()
{
// Sunrise added start - так как у нас включен ветер - это ломает математику теста. Ветер нужно выключить
Server.CfgMan.SetCVar(CCVars.SpaceWind, false);
Assert.That(Server.CfgMan.GetCVar(CCVars.SpaceWind), Is.False);
// Sunrise added end
var markers = SEntMan.AllEntities<TestMarkerComponent>();
EntityUid source, point1, point2;

View file

@ -47,6 +47,14 @@ public sealed class BuckleDragTest : InteractionTest
Assert.That(pullable.Puller, Is.Null);
Assert.That(pullable.BeingPulled, Is.False);
// Sunrise added start - у нас пулинг не убирает бакл
// Поэтому делаем это вручную, до того, как человека схватят, чтобы логика теста не сломалась
await Server.WaitAssertion(() =>
{
Assert.That(Server.System<SharedBuckleSystem>().TryUnbuckle(sUrist, sUrist));
});
// Sunrise added end
// Start pulling, and thus unbuckle them
await PressKey(ContentKeyFunctions.TryPullObject, cursorEntity: urist);
await RunTicks(5);

View file

@ -28,6 +28,9 @@ namespace Content.IntegrationTests.Tests.Buckle
id: {BuckleDummyId}
components:
- type: Buckle
# Sunrise edit start
unbuckleDoafterTime: 0
# Sunrise edit end
- type: Hands
- type: ComplexInteraction
- type: InputMover

View file

@ -251,6 +251,11 @@ public sealed class SuicideCommandTests
var player = playerMan.Sessions.First().AttachedEntity!.Value;
var mind = mindSystem.GetMind(player);
// Sunrise edit start - подарки от праздников ломают тест.
// Поэтому выбрасываем все говно, что может помешать
handsSystem.TryDrop(player);
// Sunrise edit end
MindComponent mindComponent = default;
MobStateComponent mobStateComp = default;
MobThresholdsComponent mobThresholdsComp = default;
@ -326,6 +331,11 @@ public sealed class SuicideCommandTests
var player = playerMan.Sessions.First().AttachedEntity!.Value;
var mind = mindSystem.GetMind(player);
// Sunrise edit start - подарки от праздников ломают тест.
// Поэтому выбрасываем все говно, что может помешать
handsSystem.TryDrop(player);
// Sunrise edit end
MindComponent mindComponent = default;
MobStateComponent mobStateComp = default;
MobThresholdsComponent mobThresholdsComp = default;

View file

@ -242,6 +242,10 @@ namespace Content.IntegrationTests.Tests
"StationEvent",
"TimedDespawn",
// Sunrise added start
"StationTransitHub",
// Sunrise added end
// makes an announcement on mapInit.
"AnnounceOnSpawn",
};

View file

@ -1,6 +1,7 @@
using System.Globalization;
using System.Linq;
using System.Numerics;
using Content.Server._Sunrise.Helpers;
using Content.Server._Sunrise.Station;
using Content.Server.Administration.Managers;
using Content.Server.Administration.Systems;
@ -13,7 +14,6 @@ using Content.Server.Spawners.Components;
using Content.Server.Speech.Components;
using Content.Server.Station.Components;
using Content.Shared.CCVar;
using Content.Shared._Sunrise.SunriseCCVars;
using Content.Shared.Database;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
@ -45,7 +45,11 @@ namespace Content.Server.GameTicking
[Dependency] private readonly AdminSystem _admin = default!;
[Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
[Dependency] private readonly ArrivalsSystem _arrivals = default!;
[Dependency] private readonly NewLifeSystem _newLifeSystem = default!; // Sunrise-Edit
// Sunrise added start
[Dependency] private readonly NewLifeSystem _newLife = default!;
[Dependency] private readonly SunriseHelpersSystem _helpers = default!;
// Sunrise added end
public static readonly EntProtoId ObserverPrototypeName = "MobObserver";
public static readonly EntProtoId AdminObserverPrototypeName = "AdminObserver";
@ -182,7 +186,10 @@ namespace Content.Server.GameTicking
if (station == EntityUid.Invalid)
{
var stations = GetSpawnableStations();
// Sunrise edit start - фикс спавна на ЦК вместо девмапы
var stations = _helpers.GetSpawnableStations();
// Sunrise edit end
_robustRandom.Shuffle(stations);
if (stations.Count == 0)
station = EntityUid.Invalid;
@ -197,8 +204,8 @@ namespace Content.Server.GameTicking
}
// Sunrise-NewLife-Start
_newLifeSystem.AddUsedCharactersForRespawn(player.UserId, _prefsManager.GetPreferences(player.UserId).SelectedCharacterIndex);
_newLifeSystem.SetNextAllowRespawn(player.UserId, _gameTiming.CurTime + TimeSpan.FromMinutes(_newLifeSystem.NewLifeTimeout));
_newLife.AddUsedCharactersForRespawn(player.UserId, _prefsManager.GetPreferences(player.UserId).SelectedCharacterIndex);
_newLife.SetNextAllowRespawn(player.UserId, _gameTiming.CurTime + TimeSpan.FromMinutes(_newLife.NewLifeTimeout));
// Sunrise-NewLife-End
string speciesId;
@ -272,11 +279,17 @@ namespace Content.Server.GameTicking
return;
}
DoSpawn(player, character, station, jobId, silent, out var mob, out var jobPrototype, out var jobName);
// Sunrise edit start - почему-то тут проебан тип спавна,
// что приводит к тому, что ивент о спавне игрока не знает, куда его спавнить.
// Учитывая, что у нас система из Delta-V с этими спавнпоинтами - я думаю, что тут наша ошибка, а не виздена.
var spawnPointType = lateJoin ? SpawnPointType.LateJoin : SpawnPointType.Job;
DoSpawn(player, character, station, jobId, silent, out var mob, out var jobPrototype, out var jobName, spawnPointType);
// Sunrise edit end
// Sunrise-Start
if (HasComp<StationAntagsTargetsComponent>(station))
EntityManager.AddComponent<AntagTargetComponent>(mob);
EnsureComp<AntagTargetComponent>(mob);
// Sunrise-End
if (lateJoin && !silent)
@ -365,7 +378,8 @@ namespace Content.Server.GameTicking
bool silent,
out EntityUid mob,
out JobPrototype jobPrototype,
out string jobName)
out string jobName,
SpawnPointType spawnPointType = SpawnPointType.Unset) // Sunrise added
{
PlayerJoinGame(player, silent);
@ -380,7 +394,7 @@ namespace Content.Server.GameTicking
_playTimeTrackings.PlayerRolesChanged(player);
var mobMaybe = _stationSpawning.SpawnPlayerCharacterOnStation(station, jobId, character);
var mobMaybe = _stationSpawning.SpawnPlayerCharacterOnStation(station, jobId, character, spawnPointType: spawnPointType);
DebugTools.AssertNotNull(mobMaybe);
mob = mobMaybe!.Value;

View file

@ -164,6 +164,14 @@ public sealed class SecretRuleSystem : GameRuleSystem<SecretRuleComponent>
if (selected == null)
return false;
// Sunrise added start - Почему раньше это НЕ учитывалось
if (players < selected.MinPlayers)
return false;
if (players > selected.MaxPlayers)
return false;
// Sunrise added end
foreach (var ruleId in selected.Rules)
{
if (!_prototypeManager.TryIndex(ruleId, out EntityPrototype? rule)

View file

@ -1,19 +0,0 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Holiday
{
[Prototype("holidayGiveawayItem")]
public sealed partial class HolidayGiveawayItemPrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
[DataField("holiday", customTypeSerializer:typeof(PrototypeIdSerializer<HolidayPrototype>))]
public string Holiday { get; private set; } = string.Empty;
[DataField("prototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
public string Prototype { get; private set; } = string.Empty;
}
}

View file

@ -39,8 +39,8 @@ namespace Content.Server.Holiday
private IHolidayGreet _greet = new DefaultHolidayGreet();
// Sunrise-Start
[DataField("greetColor")]
private Color? _color;
[DataField]
public Color? Color;
// Sunrise-End
[DataField("celebrate")]
@ -56,13 +56,6 @@ namespace Content.Server.Holiday
return _greet.Greet(this);
}
// Sunrise-Start
public Color? GreetColor()
{
return _color;
}
// Sunrise-End
/// <summary>
/// Called before the round starts to set up any festive shenanigans.
/// </summary>

View file

@ -59,7 +59,7 @@ namespace Content.Server.Holiday
{
foreach (var holiday in _currentHolidays)
{
_chatManager.DispatchServerAnnouncement(holiday.Greet(), holiday.GreetColor()); // Sunrise-Edit
_chatManager.DispatchServerAnnouncement(holiday.Greet(), holiday.Color); // Sunrise-Edit
}
}
@ -108,7 +108,7 @@ namespace Content.Server.Holiday
break;
}
}
private void OnLightMapInit(Entity<PointLightComponent> ent, ref MapInitEvent args)
{
foreach (var holiday in _currentHolidays)

View file

@ -24,9 +24,16 @@ public sealed class ToggleNinjaSuitDrawSystem : EntitySystem
private void OnMapInit(Entity<ToggleNinjaSuitDrawComponent> ent, ref MapInitEvent args)
{
var uid = ent.Owner;
var draw = Comp<NinjaSuitDrawComponent>(uid);
_suitDraw.SetEnabled((uid, draw), _toggle.IsActivated(uid));
if (!TryComp<NinjaSuitDrawComponent>(ent, out var draw))
{
// Если тут будет стоять еррор, то AllComponentsToOneDeleteTest насрет, что все плохо.
Log.Warning($"Found entity {ToPrettyString(ent)} with {nameof(ToggleNinjaSuitDrawComponent)} but without {nameof(NinjaSuitDrawComponent)}! Toggle component will be removed");
RemComp<ToggleNinjaSuitDrawComponent>(ent);
return;
}
_suitDraw.SetEnabled((ent, draw), _toggle.IsActivated(ent.Owner));
}
private void OnActivateAttempt(Entity<ToggleNinjaSuitDrawComponent> ent, ref ItemToggleActivateAttemptEvent args)

View file

@ -33,36 +33,29 @@ public sealed class SpawnPointSystem : EntitySystem
if (args.Station != null && _stationSystem.GetOwningStation(uid, xform) != args.Station)
continue;
// Sunrise added start
// Delta-V: Allow setting a desired SpawnPointType
if (args.DesiredSpawnPointType != SpawnPointType.Unset)
// То, что приходит из ивента главнее заданного в спавнпоинте.
var spawnPointType = args.DesiredSpawnPointType != SpawnPointType.Unset
? args.DesiredSpawnPointType
: spawnPoint.SpawnType;
var isMatchingJob = string.IsNullOrEmpty(args.Job)
|| string.IsNullOrEmpty(spawnPoint.Job)
|| spawnPoint.Job == args.Job;
switch (spawnPointType)
{
var isMatchingJob = spawnPoint.SpawnType == SpawnPointType.Job &&
(args.Job == null || spawnPoint.Job == args.Job);
switch (args.DesiredSpawnPointType)
{
case SpawnPointType.Job when isMatchingJob:
case SpawnPointType.LateJoin when spawnPoint.SpawnType == SpawnPointType.LateJoin:
case SpawnPointType.Observer when spawnPoint.SpawnType == SpawnPointType.Observer:
possiblePositions.Add(xform.Coordinates);
break;
default:
continue;
}
}
// Sunrise-Start
else
{
if (spawnPoint.SpawnType == SpawnPointType.Job &&
(args.Job == null || spawnPoint.Job == args.Job))
{
case SpawnPointType.Job when isMatchingJob && spawnPoint.SpawnType == SpawnPointType.Job:
case SpawnPointType.LateJoin when spawnPoint.SpawnType == SpawnPointType.LateJoin:
case SpawnPointType.Observer when spawnPoint.SpawnType == SpawnPointType.Observer:
possiblePositions.Add(xform.Coordinates);
}
break;
default:
continue;
}
// Sunrise-End
// Sunrise added end
}
if (possiblePositions.Count == 0)

View file

@ -1,5 +1,4 @@
using Content.Server.Access.Systems;
using Content.Server.Holiday;
using Content.Server.Humanoid;
using Content.Server.Mind;
using Content.Server.PDA;
@ -11,7 +10,6 @@ using Content.Shared.Access.Systems;
using Content.Shared.CCVar;
using Content.Shared.Clothing;
using Content.Shared.DetailExaminable;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.IdentityManagement;
@ -222,25 +220,6 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
{
jobSpecial.AfterEquip(entity);
}
// Sunrise-Start
foreach (var giveaway in _prototypeManager.EnumeratePrototypes<HolidayGiveawayItemPrototype>())
{
if (string.IsNullOrEmpty(giveaway.Holiday) || string.IsNullOrEmpty(giveaway.Prototype))
continue;
var sysMan = IoCManager.Resolve<IEntitySystemManager>();
if (!sysMan.GetEntitySystem<HolidaySystem>().IsCurrentlyHoliday(giveaway.Holiday))
continue;
var entMan = IoCManager.Resolve<IEntityManager>();
var ent = entMan.SpawnEntity(giveaway.Prototype, entMan.GetComponent<TransformComponent>(entity).Coordinates);
sysMan.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(entity, ent);
}
// Sunrise-End
}
/// <summary>

View file

@ -15,6 +15,7 @@ public sealed class BiocodeDefibrillatorSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BiocodeComponent, SunriseCanZapEvent>(OnCanZap);
}
@ -28,7 +29,7 @@ public sealed class BiocodeDefibrillatorSystem : EntitySystem
// User is not authorized, cancel the zap
if (!string.IsNullOrEmpty(component.AlertText))
_popup.PopupEntity(component.AlertText, uid, args.User.Value);
_popup.PopupEntity(Loc.GetString(component.AlertText), uid, args.User.Value);
args.Cancelled = true;
}

View file

@ -397,6 +397,9 @@ public sealed class BloodCultRuleSystem : GameRuleSystem<BloodCultRuleComponent>
{
foreach (var userAction in actionsComponent.Actions)
{
if (TerminatingOrDeleted(userAction))
continue;
var entityPrototypeId = MetaData(userAction).EntityPrototype?.ID;
if (entityPrototypeId != null && BloodCultistComponent.CultistActions.Contains(entityPrototypeId))
_actionsSystem.RemoveAction(uid, userAction);

View file

@ -13,11 +13,13 @@ using Content.Shared._Sunrise.Events;
using Content.Shared.Blocking;
using Content.Shared.Body.Events;
using Content.Shared.Damage;
using Content.Shared.Damage.Components;
using Content.Shared.FixedPoint;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction.Components;
using Content.Shared.Inventory;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.NPC.Systems;
using Content.Shared.Popups;
@ -164,6 +166,10 @@ public sealed partial class CultMirrorShieldSystem : EntitySystem
/// </summary>
private void OnIllusionInit(EntityUid uid, CultMirrorIllusionComponent component, ComponentInit args)
{
EnsureComp<MobStateComponent>(uid);
EnsureComp<MobThresholdsComponent>(uid);
EnsureComp<DamageableComponent>(uid);
_mobThreshold.SetMobStateThreshold(uid, 15, MobState.Critical);
_mobThreshold.SetMobStateThreshold(uid, 20, MobState.Dead);
}

View file

@ -73,6 +73,9 @@ public sealed class ExtendedAccessSystem : EntitySystem
/// </summary>
private void AfterDelay(Entity<AlertLevelComponent> station)
{
if (TerminatingOrDeleted(station))
return;
_chat.DispatchStationAnnouncement(station,
Loc.GetString("access-system-accesses-established"),
colorOverride: Color.Yellow,

View file

@ -1,20 +0,0 @@
using Content.Shared.NPC.Prototypes;
using Content.Shared.Sunrise.FactionGunBlockerSystem;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set;
namespace Content.Server._Sunrise.FactionWeaponBlockerSystem;
[RegisterComponent]
public sealed partial class FactionWeaponBlockerComponent : SharedFactionWeaponBlockerComponent
{
[ViewVariables(VVAccess.ReadWrite)]
public bool CanUse;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("alertText")]
public string AlertText = "";
[ViewVariables(VVAccess.ReadWrite),
DataField("factions", customTypeSerializer:typeof(PrototypeIdHashSetSerializer<NpcFactionPrototype>))]
public HashSet<string> Factions = new();
}

View file

@ -1,64 +0,0 @@
using Content.Shared.Hands;
using Content.Shared.NPC.Components;
using Content.Shared.Sunrise.FactionGunBlockerSystem;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Weapons.Ranged.Systems;
using Robust.Shared.GameStates;
namespace Content.Server._Sunrise.FactionWeaponBlockerSystem;
public sealed class FactionWeaponBlockerSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FactionWeaponBlockerComponent, AttemptShootEvent>(OnShootAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, AttemptMeleeEvent>(OnMeleeAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<FactionWeaponBlockerComponent, GotEquippedHandEvent>(OnGotEquippedHand);
}
private void OnGotEquippedHand(EntityUid uid, FactionWeaponBlockerComponent component, GotEquippedHandEvent args)
{
var canUse = false;
if (TryComp<NpcFactionMemberComponent>(args.User, out var npcFactionMemberComponent))
{
foreach (var faction in npcFactionMemberComponent.Factions)
{
if (component.Factions.Contains(faction))
canUse = true;
}
}
component.CanUse = canUse;
Dirty(uid, component);
}
private void OnGetState(EntityUid uid, FactionWeaponBlockerComponent component, ref ComponentGetState args)
{
args.State = new FactionWeaponBlockerComponentState()
{
CanUse = component.CanUse,
AlertText = component.AlertText
};
}
private void OnMeleeAttempt(EntityUid uid, FactionWeaponBlockerComponent component, ref AttemptMeleeEvent args)
{
if (component.CanUse)
return;
args.Cancelled = true;
args.Message = component.AlertText;
}
private void OnShootAttempt(EntityUid uid, FactionWeaponBlockerComponent component, ref AttemptShootEvent args)
{
if (component.CanUse)
return;
args.Cancelled = true;
args.Message = component.AlertText;
}
}

View file

@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server._Sunrise.Other.StationOnlyDirectSpawn;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Station.Components;
using Content.Shared._Sunrise.Helpers;
@ -125,4 +126,19 @@ public sealed partial class SunriseHelpersSystem : SharedSunriseHelpersSystem
}
#endregion
public List<EntityUid> GetSpawnableStations()
{
var spawnableStations = new List<EntityUid>();
var query = EntityQueryEnumerator<StationJobsComponent, StationSpawningComponent>();
while (query.MoveNext(out var uid, out _, out _))
{
if (HasComp<StationOnlyDirectSpawnComponent>(uid))
continue;
spawnableStations.Add(uid);
}
return spawnableStations;
}
}

View file

@ -0,0 +1,22 @@
using Content.Server.Holiday;
using Robust.Shared.Prototypes;
namespace Content.Server._Sunrise.Holiday.HolidayGiveaway;
/// <summary>
/// Прототип для подарков, которые будут выданы в определенный праздник.
/// <seealso cref="HolidayGiveawaySystem"/>
/// <seealso cref="PreventHolidayGiveawayComponent"/>
/// </summary>
[Prototype]
public sealed partial class HolidayGiveawayItemPrototype : IPrototype
{
[IdDataField, ViewVariables]
public string ID { get; private set; } = default!;
[DataField(required: true)]
public ProtoId<HolidayPrototype> Holiday;
[DataField(required: true)]
public EntProtoId Prototype;
}

View file

@ -0,0 +1,128 @@
using Content.Server.GameTicking;
using Content.Server.Hands.Systems;
using Content.Server.Holiday;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Server._Sunrise.Holiday.HolidayGiveaway;
/// <summary>
/// Система для выдачи различных подарков во время определенных праздников.
/// </summary>
public sealed class HolidayGiveawaySystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IConfigurationManager _configuration = default!;
[Dependency] private readonly HolidaySystem _holiday = default!;
[Dependency] private readonly HandsSystem _hands = default!;
/// <summary>
/// Кешированные текущие раздачи, которые будут применены после спавна игрока в <see cref="OnPlayerSpawn"/> <br/>
/// Сбрасываются и пересчитываются каждый раунд в <see cref="CacheGiveaways()"/>
/// </summary>
private readonly List<ProtoId<HolidayGiveawayItemPrototype>> _activeGiveaways = [];
[ViewVariables]
private bool _enabled = true;
public override void Initialize()
{
base.Initialize();
Subs.CVar(_configuration, CCVars.HolidaysEnabled, OnHolidaysEnableChange);
SubscribeLocalEvent<GameRunLevelChangedEvent>(CacheGiveaways);
SubscribeLocalEvent<RoundStartedEvent>(CacheGiveaways);
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnPlayerSpawn);
SubscribeLocalEvent<PreventHolidayGiveawayComponent, HolidayGiveawayAttemptEvent>(Cancel);
}
/// <summary>
/// Основной метод для кеширования подарков.
/// </summary>
private void CacheGiveaways(GameRunLevelChangedEvent ev)
{
if (!_enabled)
return;
if (ev.New != GameRunLevel.PreRoundLobby)
return;
CacheGiveaways();
}
/// <summary>
/// Дополнительный метод для кеширования подарков.
/// Специально для случая, когда лобби недоступно или выключено.
/// </summary>
private void CacheGiveaways(RoundStartedEvent ev)
{
if (!_enabled)
return;
if (_activeGiveaways.Count != 0)
return;
CacheGiveaways();
}
private void CacheGiveaways()
{
_activeGiveaways.Clear();
foreach (var giveaway in _prototype.EnumeratePrototypes<HolidayGiveawayItemPrototype>())
{
if (!_holiday.IsCurrentlyHoliday(giveaway.Holiday))
continue;
_activeGiveaways.Add(giveaway.ID);
}
}
private void OnPlayerSpawn(PlayerSpawnCompleteEvent ev)
{
if (!_enabled)
return;
if (_activeGiveaways.Count == 0)
return;
var attempt = new HolidayGiveawayAttemptEvent();
RaiseLocalEvent(ev.Mob, ref attempt);
if (attempt.Canceled)
return;
foreach (var giveawayProto in _activeGiveaways)
{
var giveAway = _prototype.Index(giveawayProto);
var present = SpawnNextToOrDrop(giveAway.Prototype, ev.Mob);
_hands.PickupOrDrop(ev.Mob, present);
}
}
private void Cancel(Entity<PreventHolidayGiveawayComponent> ent, ref HolidayGiveawayAttemptEvent args)
{
args.Canceled = true;
}
private void OnHolidaysEnableChange(bool enabled)
{
_enabled = enabled;
if (enabled)
CacheGiveaways();
else
_activeGiveaways.Clear();
}
}
[ByRefEvent]
public record struct HolidayGiveawayAttemptEvent
{
public bool Canceled;
}

View file

@ -0,0 +1,10 @@
namespace Content.Server._Sunrise.Holiday.HolidayGiveaway;
/// <summary>
/// Компонент, блокирующий выдаче сущности подарков в честь праздника.
/// </summary>
[RegisterComponent]
public sealed partial class PreventHolidayGiveawayComponent : Component
{
}

View file

@ -0,0 +1,11 @@
namespace Content.Server._Sunrise.Other.StationOnlyDirectSpawn;
/// <summary>
/// Компонент маркер, который обозначает, что на станции нельзя будет заспавниться путем случайного выбора из пула доступных станций.
/// Это нужно, чтобы помечать станции, на которые появляться должно быть можно ТОЛЬКО путем прямого спавна на ней
/// </summary>
[RegisterComponent]
public sealed partial class StationOnlyDirectSpawnComponent : Component
{
}

View file

@ -48,7 +48,8 @@ public sealed class SyndicateTeleporterSystem : EntitySystem
if (TryComp<BiocodeComponent>(uid, out var biocode) && !_biocode.CanUse(args.User, biocode.Factions))
{
if (!string.IsNullOrEmpty(biocode.AlertText))
_popup.PopupEntity(biocode.AlertText, args.User, args.User);
_popup.PopupEntity(Loc.GetString(biocode.AlertText), args.User, args.User);
args.Handled = true;
return;
}

View file

@ -73,7 +73,7 @@ public sealed partial class BuckleComponent : Component
// Sunrise-Start
[DataField]
public float UnbuckleDoafterTime = 2f;
public TimeSpan UnbuckleDoafterTime = TimeSpan.FromSeconds(2f);
// Sunrise-End
}

View file

@ -116,14 +116,10 @@ public abstract partial class SharedBuckleSystem
{
BreakOnMove = true,
BreakOnDamage = true,
AttemptFrequency = AttemptFrequency.EveryTick
AttemptFrequency = AttemptFrequency.EveryTick,
};
if (_doAfter.TryStartDoAfter(doAfterArgs))
{
args.Handled = true;
return;
}
args.Handled = _doAfter.TryStartDoAfter(doAfterArgs);
}
}
// Sunrise-End

View file

@ -1,17 +1,15 @@
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Shared._Sunrise.Abilities.Felinid;
[RegisterComponent]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class FelinidLickingComponent : Component
{
[DataField(customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string ActionLickingWoundsId = "ActionLickingWounds";
[DataField]
public EntProtoId ActionLickingWoundsId = "ActionLickingWounds";
[DataField(required: true)]
public DamageSpecifier Damage = default!;
@ -26,8 +24,11 @@ public sealed partial class FelinidLickingComponent : Component
public TimeSpan Delay = TimeSpan.FromSeconds(3f);
[DataField]
public SoundSpecifier? HealingBeginSound = null;
public SoundSpecifier? HealingBeginSound;
[DataField]
public SoundSpecifier? HealingEndSound = null;
public SoundSpecifier? HealingEndSound;
[ViewVariables, AutoNetworkedField]
public EntityUid? Action;
}

View file

@ -1,5 +1,4 @@
using Content.Shared.Actions;
using Content.Shared.Damage;
using Content.Shared.DoAfter;
using Content.Shared.Popups;
using Content.Shared.Standing;
@ -12,7 +11,6 @@ using Content.Shared.Mobs.Systems;
using Content.Shared.Nutrition.Components;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Serialization;
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Systems;
@ -25,56 +23,63 @@ public sealed class FelinidLickingSystem : EntitySystem
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedBloodstreamSystem _bloodstreamSystem = default!;
[Dependency] private readonly SharedBloodstreamSystem _bloodstream = default!;
[Dependency] private readonly StandingStateSystem _standing = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FelinidLickingComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<FelinidLickingComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<FelinidLickingComponent, LickingWoundsTargetActionEvent>(OnLickingAction);
SubscribeLocalEvent<FelinidLickingComponent, FelinidLickingDoAfterEvent>(OnDoAfter);
}
private void OnStartup(EntityUid uid, FelinidLickingComponent component, ComponentStartup args)
private void OnStartup(Entity<FelinidLickingComponent> ent, ref ComponentStartup args)
{
_actions.AddAction(uid, component.ActionLickingWoundsId);
_actions.AddAction(ent, ref ent.Comp.Action, ent.Comp.ActionLickingWoundsId);
Dirty(ent);
}
private void OnLickingAction(EntityUid uid, FelinidLickingComponent component, LickingWoundsTargetActionEvent args)
private void OnShutdown(Entity<FelinidLickingComponent> ent, ref ComponentShutdown args)
{
if (args.Handled || args.Target == null) // мда
_actions.RemoveAction(ent.Owner, ent.Comp.Action);
}
private void OnLickingAction(Entity<FelinidLickingComponent> ent, ref LickingWoundsTargetActionEvent args)
{
if (args.Handled) // мда
return;
var target = args.Target;
if (!CanLick(uid, target, component, out var damageable, out var errorMessage))
if (!CanLick(ent, args.Target, out var errorMessage))
{
if (errorMessage != null)
_popup.PopupClient(errorMessage, uid, uid);
_popup.PopupClient(errorMessage, ent, ent);
return;
}
StartLicking(uid, target, component, damageable!);
args.Handled = TryStartLicking(ent, args.Target);
}
private void StartLicking(EntityUid uid, EntityUid target, FelinidLickingComponent licking, DamageableComponent damageable)
private bool TryStartLicking(Entity<FelinidLickingComponent> ent, EntityUid target)
{
_audio.PlayPredicted(licking.HealingBeginSound, uid, uid);
_audio.PlayPredicted(ent.Comp.HealingBeginSound, ent, ent);
var doAfterArgs = new DoAfterArgs(EntityManager, uid, licking.Delay, new FelinidLickingDoAfterEvent(), uid, target: target)
var doAfterArgs = new DoAfterArgs(EntityManager, ent, ent.Comp.Delay, new FelinidLickingDoAfterEvent(), ent, target: target)
{
BreakOnMove = true,
NeedHand = false
NeedHand = false,
};
_doAfter.TryStartDoAfter(doAfterArgs);
return _doAfter.TryStartDoAfter(doAfterArgs);
}
private void OnDoAfter(EntityUid uid, FelinidLickingComponent component, FelinidLickingDoAfterEvent args)
private void OnDoAfter(Entity<FelinidLickingComponent> ent, ref FelinidLickingDoAfterEvent args)
{
if (args.Cancelled || args.Handled || args.Target is not { } target)
return;
@ -82,28 +87,26 @@ public sealed class FelinidLickingSystem : EntitySystem
if (!TryComp<DamageableComponent>(target, out var damageable))
return;
_damageable.TryChangeDamage(target, component.Damage, true, origin: uid);
_damageable.TryChangeDamage(target, ent.Comp.Damage, true, origin: ent);
if (component.StopBleeding && TryComp<BloodstreamComponent>(target, out var bloodstream))
if (ent.Comp.StopBleeding && TryComp<BloodstreamComponent>(target, out var bloodstream))
{
var wasBleeding = bloodstream.BleedAmount > 0;
_bloodstreamSystem.TryModifyBleedAmount((target, bloodstream), component.BloodlossModifier);
_bloodstream.TryModifyBleedAmount((target, bloodstream), ent.Comp.BloodlossModifier);
if (wasBleeding && bloodstream.BleedAmount <= 0)
{
var popup = (uid == target)
var popup = ent.Owner == target
? Loc.GetString("medical-item-stop-bleeding-self")
: Loc.GetString("medical-item-stop-bleeding", ("target", Identity.Entity(target, EntityManager)));
_popup.PopupClient(popup, target, uid);
_popup.PopupClient(popup, target, ent);
}
}
_audio.PlayPredicted(component.HealingEndSound, uid, uid);
_audio.PlayPredicted(ent.Comp.HealingEndSound, ent, ent);
if (_mobStateSystem.IsAlive(target) && HasDamageToHeal(target, damageable, component))
{
StartLicking(uid, target, component, damageable);
}
if (_mobState.IsAlive(target) && HasDamageToHeal(target, damageable, ent.Comp))
TryStartLicking(ent, target);
args.Handled = true;
}
@ -111,28 +114,24 @@ public sealed class FelinidLickingSystem : EntitySystem
/// <summary>
/// Проверяет, можно ли облизывать раны цели
/// </summary>
/// <param name="licker">Тот, кто облизывает</param>
/// <param name="ent">Тот, кто облизывает</param>
/// <param name="target">Цель</param>
/// <param name="component">Компонент облизывания</param>
/// <param name="damageable">Компонент урона цели (если доступен)</param>
/// <param name="errorMessage">Сообщение об ошибке (если есть)</param>
/// <returns>True, если можно облизывать</returns>
private bool CanLick(EntityUid licker, EntityUid target, FelinidLickingComponent component,
[NotNullWhen(true)] out DamageableComponent? damageable, out string? errorMessage)
private bool CanLick(Entity<FelinidLickingComponent> ent, EntityUid target, out string? errorMessage)
{
damageable = null;
errorMessage = null;
if (_standing.IsDown(licker))
if (_standing.IsDown(ent.Owner))
return false;
if (!TryComp<DamageableComponent>(target, out damageable))
if (!TryComp<DamageableComponent>(target, out var damageable))
return false;
if (!_mobStateSystem.IsAlive(target))
if (!_mobState.IsAlive(target))
return false;
if (HasIngestionBlocker(licker))
if (HasIngestionBlocker(ent))
{
errorMessage = Loc.GetString("felinid-licking-blocked-by-blocker");
return false;
@ -144,7 +143,7 @@ public sealed class FelinidLickingSystem : EntitySystem
return false;
}
if (!HasDamageToHeal(target, damageable, component))
if (!HasDamageToHeal(target, damageable, ent.Comp))
return false;
return true;
@ -155,7 +154,7 @@ public sealed class FelinidLickingSystem : EntitySystem
/// </summary>
private bool HasDamageToHeal(EntityUid target, DamageableComponent damageable, FelinidLickingComponent licking)
{
foreach (var (type, amount) in licking.Damage.DamageDict)
foreach (var (type, _) in licking.Damage.DamageDict)
{
if (damageable.Damage.DamageDict.TryGetValue(type, out var currentDamage) &&
currentDamage > FixedPoint2.Zero)
@ -181,7 +180,7 @@ public sealed class FelinidLickingSystem : EntitySystem
if (!TryComp<InventoryComponent>(uid, out var inventory))
return false;
var enumerator = _inventorySystem.GetSlotEnumerator((uid, inventory), SlotFlags.MASK | SlotFlags.HEAD);
var enumerator = _inventory.GetSlotEnumerator((uid, inventory), SlotFlags.MASK | SlotFlags.HEAD);
while (enumerator.NextItem(out var item))
{
if (TryComp<IngestionBlockerComponent>(item, out var blocker) && blocker.Enabled)
@ -199,7 +198,7 @@ public sealed class FelinidLickingSystem : EntitySystem
if (!TryComp<InventoryComponent>(uid, out var inventory))
return false;
var enumerator = _inventorySystem.GetSlotEnumerator((uid, inventory), SlotFlags.INNERCLOTHING | SlotFlags.OUTERCLOTHING);
var enumerator = _inventory.GetSlotEnumerator((uid, inventory), SlotFlags.INNERCLOTHING | SlotFlags.OUTERCLOTHING);
return enumerator.NextItem(out _);
}
}

View file

@ -1,16 +1,15 @@
using Content.Shared.NPC.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.Biocode;
[RegisterComponent]
[RegisterComponent, NetworkedComponent]
public sealed partial class BiocodeComponent : Component
{
[ViewVariables(VVAccess.ReadWrite)]
[DataField("alertText")]
public string AlertText = "";
[DataField]
public string AlertText = "item-biocode-refused";
[ViewVariables(VVAccess.ReadWrite),
DataField("factions", customTypeSerializer:typeof(PrototypeIdHashSetSerializer<NpcFactionPrototype>))]
public HashSet<string> Factions = new();
[DataField(required: true)]
public HashSet<ProtoId<NpcFactionPrototype>> Factions = [];
}

View file

@ -1,5 +1,7 @@
using Content.Shared.NPC.Components;
using Content.Shared.NPC.Prototypes;
using Content.Shared.Popups;
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.Biocode;
@ -13,7 +15,7 @@ public sealed class BiocodeSystem : EntitySystem
SubscribeLocalEvent<BiocodeComponent, AttemptThrowBiocodeEvent>(OnAttemptThrowBiocode);
}
public bool CanUse(EntityUid user, HashSet<string> factions)
public bool CanUse(EntityUid user, HashSet<ProtoId<NpcFactionPrototype>> factions)
{
var canUse = false;
if (!TryComp<NpcFactionMemberComponent>(user, out var npcFactionMemberComponent))
@ -34,7 +36,7 @@ public sealed class BiocodeSystem : EntitySystem
return;
if (!string.IsNullOrEmpty(component.AlertText))
_popup.PopupEntity(component.AlertText, args.User.Value, args.User.Value);
_popup.PopupEntity(Loc.GetString(component.AlertText), args.User.Value, args.User.Value);
args.Cancelled = true;
}

View file

@ -11,19 +11,19 @@ public sealed partial class BiocodeDeactivationComponent : Component
/// <summary>
/// Whether the item should be deactivated when removed from authorized user's possession.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
[DataField]
public bool DeactivateOnRemoval = true;
/// <summary>
/// Whether the item should be deactivated when placed in unauthorized user's possession.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
[DataField]
public bool DeactivateOnUnauthorized = true;
/// <summary>
/// Alert text to show when unauthorized user tries to use the item.
/// If null, uses the BiocodeComponent's alert text.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
[DataField]
public string? AlertText;
}

View file

@ -1,37 +0,0 @@
using Content.Shared._Sunrise.BloodCult.Components;
namespace Content.Shared._Sunrise.BloodCult.Systems;
/// <summary>
/// Thats need for chat perms update
/// </summary>
public sealed class CultistSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BloodCultistComponent, ComponentStartup>(OnInit);
SubscribeLocalEvent<BloodCultistComponent, ComponentShutdown>(OnRemove);
}
private void OnInit(EntityUid uid, BloodCultistComponent component, ComponentStartup args)
{
RaiseLocalEvent(new EventCultistComponentState(true));
}
private void OnRemove(EntityUid uid, BloodCultistComponent component, ComponentShutdown args)
{
RaiseLocalEvent(new EventCultistComponentState(false));
}
}
public sealed class EventCultistComponentState
{
public EventCultistComponentState(bool state)
{
Created = state;
}
public bool Created { get; }
}

View file

@ -59,7 +59,7 @@ public abstract class SharedHellSpawnInvincibilitySystem : EntitySystem
private void RemoveGodmode(EntityUid uid, HellSpawnInvincibilityComponent? comp = null)
{
if (!Resolve(uid, ref comp))
if (!Resolve(uid, ref comp, false))
return;
if (HasComp<GodmodeComponent>(uid))
{

View file

@ -0,0 +1,18 @@
using Content.Shared.NPC.Prototypes;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._Sunrise.FactionWeaponBlockerSystem;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class FactionWeaponBlockerComponent : Component
{
[ViewVariables, AutoNetworkedField]
public bool CanUse;
[DataField]
public string AlertText = "weapon-biocode-refused";
[DataField(required: true)]
public HashSet<ProtoId<NpcFactionPrototype>> Factions = [];
}

View file

@ -0,0 +1,53 @@
using System.Linq;
using Content.Shared.Hands;
using Content.Shared.NPC.Components;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Weapons.Ranged.Systems;
namespace Content.Shared._Sunrise.FactionWeaponBlockerSystem;
public sealed class SharedFactionWeaponBlockerSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FactionWeaponBlockerComponent, AttemptShootEvent>(OnShootAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, AttemptMeleeEvent>(OnMeleeAttempt);
SubscribeLocalEvent<FactionWeaponBlockerComponent, GotEquippedHandEvent>(OnGotEquippedHand);
}
private void OnGotEquippedHand(Entity<FactionWeaponBlockerComponent> ent, ref GotEquippedHandEvent args)
{
if (!TryComp<NpcFactionMemberComponent>(args.User, out var npcFactionMemberComponent))
return;
var canUse = npcFactionMemberComponent.Factions
.Any(x => ent.Comp.Factions.Contains(x));
if (ent.Comp.CanUse == canUse)
return;
ent.Comp.CanUse = canUse;
Dirty(ent);
}
private void OnMeleeAttempt(Entity<FactionWeaponBlockerComponent> ent, ref AttemptMeleeEvent args)
{
if (ent.Comp.CanUse)
return;
args.Cancelled = true;
args.Message = Loc.GetString(ent.Comp.AlertText);
}
private void OnShootAttempt(Entity<FactionWeaponBlockerComponent> ent, ref AttemptShootEvent args)
{
if (ent.Comp.CanUse)
return;
args.Cancelled = true;
args.Message = Loc.GetString(ent.Comp.AlertText);
}
}

View file

@ -1,17 +0,0 @@
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Sunrise.FactionGunBlockerSystem;
[NetworkedComponent]
public abstract partial class SharedFactionWeaponBlockerComponent : Component
{
}
[Serializable, NetSerializable]
public sealed class FactionWeaponBlockerComponentState : ComponentState
{
public bool CanUse;
public string AlertText = "";
}

View file

@ -1,6 +0,0 @@
namespace Content.Shared._Sunrise.FactionWeaponBlockerSystem;
public sealed class SharedFactionWeaponBlockerSystem : EntitySystem
{
}

View file

@ -0,0 +1,10 @@
using Content.Shared.Trigger.Components.Triggers;
using Robust.Shared.GameStates;
namespace Content.Shared._Sunrise.Trigger.TriggerOnBeingGibbed;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class TriggerOnBeingGibbedComponent : BaseTriggerOnXComponent
{
}

View file

@ -0,0 +1,21 @@
using Content.Shared.Body.Events;
using Content.Shared.Trigger.Systems;
namespace Content.Shared._Sunrise.Trigger.TriggerOnBeingGibbed;
public sealed class TriggerOnBeingGibbedSystem : EntitySystem
{
[Dependency] private readonly TriggerSystem _trigger = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TriggerOnBeingGibbedComponent, BeingGibbedEvent>(Trigger);
}
private void Trigger(Entity<TriggerOnBeingGibbedComponent> ent, ref BeingGibbedEvent args)
{
_trigger.Trigger(ent, key: ent.Comp.KeyOut);
}
}

View file

@ -2,7 +2,5 @@ ent-ImplantExtractor = microwave implant extractor
.desc = A high-tech device specifically designed for implant extraction in conditions with low-skilled medical personnel.
ent-Interrogator = interrogator
.desc = apchy
ent-ImplantExtractorMachineCircuitboard = implant scan machine board
.desc = A machine printed circuit board for a implant extractor.
ent-InterrogatorMachineCircuitboard = interrogator machine board
.desc = A machine printed circuit board for a interrogator.

View file

@ -2,7 +2,5 @@ ent-ImplantExtractor = Микроволновой экстрактор импл
.desc = Устройство предназначеное для извлечения имплантов из гуманоидов, разработанное для извлечени имплантов в условиях низкоквалифицированных врачей.
ent-Interrogator = Экстрактор имплантов
.desc = Устройство предназначеное для извлечения имплантов из гуманоидов.
ent-ImplantExtractorMachineCircuitboard = плата машины для сканирования имплантатов
.desc = Машинная печатная плата для экстрактора имплантатов.
ent-InterrogatorMachineCircuitboard = машинная плата интеррогатора
.desc = Машинная печатная плата для интеррогатора.

View file

@ -0,0 +1,2 @@
weapon-biocode-refused = Данное оружие биокодировано. Вы не можете его использовать.
item-biocode-refused = Данный предмет биокодирован. Вы не можете его использовать.

View file

@ -10,4 +10,4 @@ contraband-examine-text-in-the-clear = [color=green][italic]Вы, скорее
contraband-examinable-verb-text = Легальность
contraband-examinable-verb-message = Проверить легальность этого предмета.
contraband-department-plural = { $department }
contraband-job-plural = { MAKEPLURAL($job) }
contraband-job-plural = { $job }

View file

@ -32,7 +32,7 @@
sprite: Objects/Specific/Service/vending_machine_restock.rsi
state: base
product: CrateVendingMachineRestockClothesFilled
cost: 3270 # Sunrise-edit
cost: 3600 # Sunrise-edit
category: cargoproduct-category-name-service
group: market
@ -102,7 +102,7 @@
sprite: Objects/Specific/Service/vending_machine_restock.rsi
state: base
product: CrateVendingMachineRestockMedicalFilled
cost: 2045 # Sunrise-edit
cost: 2200 # Sunrise-edit
category: cargoproduct-category-name-medical
group: market

View file

@ -80,7 +80,9 @@
- id: ClothingUniformJumpsuitHosFormal
- id: ClothingOuterWinterHoS
- id: ClothingNeckCloakHos
# Sunrise edit start
- id: ClothingHoSMantleCoat
# Sunrise edit end
- type: entity
id: DresserQuarterMasterFilled

View file

@ -39,9 +39,9 @@
# Sunrise-start
- type: PhysicalComposition
materialComposition:
Steel: 25
Plastic: 25
Cloth: 500
Steel: 5
Plastic: 20
Cloth: 100
# Sunrise-end
- type: entity
@ -332,6 +332,8 @@
grid:
- 0,0,19,9
# Sunrise-start
- type: StaticPrice
price: 700
- type: PhysicalComposition
materialComposition:
Steel: 1000

View file

@ -255,6 +255,8 @@
sprintModifier: 1 # makes its stats identical to other variants of bag of holding
- type: HeldSpeedModifier
# Sunrise-start
- type: StaticPrice
price: 700
- type: PhysicalComposition
materialComposition:
Steel: 1000

View file

@ -188,6 +188,8 @@
grid:
- 0,0,19,9
# Sunrise-start
- type: StaticPrice
price: 700
- type: PhysicalComposition
materialComposition:
Steel: 1000

View file

@ -213,11 +213,14 @@
- type: ShowSyndicateIcons
- type: entity
parent: [ClothingEyesBase, ShowSecurityIcons, BaseSyndicateContraband, WeldingMaskBase]
parent: [ClothingEyesBase, ShowSecurityIcons, BaseSyndicateContraband]
id: ClothingEyesHudSyndicate
name: syndicate visor
description: The syndicate's professional head-up display, designed for better detection of humanoids and their subsequent elimination.
components:
# Sunrise added start
- type: FlashImmunity
# Sunrise added end
- type: Sprite
sprite: Clothing/Eyes/Hud/synd.rsi
- type: Clothing

View file

@ -7,7 +7,7 @@
id: FoodBreadBase
components:
- type: Item
size: Normal
size: Small # Sunrise edit - для багета внутри запаски мима
- type: FlavorProfile
flavors:
- bread
@ -670,7 +670,7 @@
quickEquip: false
- type: Item
shape:
- 0,0,0,3
- 0,0,0,2 # Sunrise edit - для багета внутри запаски мима
storedRotation: -45
inhandVisuals:
left:

View file

@ -425,6 +425,10 @@
- state: paper_stamp-generic
map: ["enum.PaperVisualLayers.Stamp"]
visible: false
# Sunrise edit start - пендосы ебанные. PaperVisuals требуется этот слой. Я сделал его фиктивным
- map: [ "enum.PaperVisualLayers.Writing" ]
visible: false
# Sunrise edit end
- type: Paper
content: envelope-default-message
- type: PaperVisuals
@ -460,7 +464,7 @@
tags:
- Trash
- Document
#- type: Appearance, hide stamp marks until we have some kind of displacement
- type: Appearance # Sunrise edit - ебанный рот это нужно для работы FireVisuals
- type: Flammable
fireSpread: true
canResistFire: false

View file

@ -602,7 +602,7 @@
# Gygax
- type: entity
id: MechGygax
parent: [ BaseMech, CombatMech, BaseRestrictedContraband ]
parent: [ BaseMech, CombatMech, BaseSecurityScienceContraband ]
name: Gygax
description: While lightly armored, the Gygax has incredible mobility thanks to its ability that lets it smash through walls at high speeds.
components:
@ -665,7 +665,7 @@
# Durand
- type: entity
id: MechDurand
parent: [ BaseMech, CombatMech, BaseRestrictedContraband ]
parent: [ BaseMech, CombatMech, BaseSecurityScienceContraband ]
name: Durand
description: A slow but beefy combat exosuit that is extra scary in confined spaces due to its punches. Xenos hate it!
components:
@ -734,7 +734,7 @@
# NT Gygax
- type: entity
id: MechNTGygax
parent: [ BaseMech, CombatMech, BaseRestrictedContraband ]
parent: [ BaseMech, CombatMech, BaseSecurityScienceContraband ]
name: Nanotrasen Special Gygax
description: "Nanotrasen's trump card when solving problems. High durability, increased protection against shock, explosions, temperature, shots: conventional, laser and energy, as well as expanded equipment slots allow to turn the situation on the station upside down. Gas pedals consume a colossal amount of energy."
components:

View file

@ -1,3 +1,5 @@
# TODO: Перенеси в папки санрайза
- type: entity
name: blood red personal shield generator
description: A personal shield generator that protects the wearer from lasers and bullets but prevents from using ranged weapons himself. Uses a power cell.
@ -137,6 +139,7 @@
maxChargeRate: 1000 #<- passive charging frow power net
supplyRampTolerance: 500
supplyRampRate: 50
netsync: false # Sunrise edit
- type: BatteryCharger
voltage: Medium
- type: NodeContainer

View file

@ -60,6 +60,7 @@
- type: Transform
- type: ProtectedGrid
- type: UnbuildableGrid
- type: StationOnlyDirectSpawn # Sunrise added
- type: entity
id: StandardStationArena

View file

@ -31,7 +31,7 @@
acts: [ "Destruction" ]
- type: Storage
grid:
- 0,0,6,3
- 0,0,6,4 # Sunrise edit - миллион одежды не лезет в таком маленький комод
maxItemSize: Normal
- type: ContainerContainer
containers:

View file

@ -573,8 +573,8 @@
- type: latheRecipe #sunrise-start
parent: BaseGoldCircuitboardRecipe
id: ImplantExtractorMachineCircuitboard
result: ImplantExtractorMachineCircuitboard
id: InterrogatorMachineCircuitboard
result: InterrogatorMachineCircuitboard
materials:
Steel: 100
Glass: 500

View file

@ -236,7 +236,7 @@
- Metal
- type: Construction
graph: SwordForgedGraph
node: tool
node: sword
- type: entity
parent: BaseItem
@ -257,7 +257,7 @@
- Metal
- type: Construction
graph: ClaymoreForgedGraph
node: tool
node: sword
- type: entity
parent: BaseItem

View file

@ -311,5 +311,5 @@
min: 2
max: 10
- type: Construction
graph: MakeshiftShield
node: makeshiftShield
graph: ImprovisedShieldGraph
node: start

View file

@ -6,7 +6,6 @@
categories: [ HideSpawnMenu ]
components:
- type: Action
temporary: true
useDelay: 6
icon:
sprite: /Textures/_Sunrise/Actions/felionoid.rsi

View file

@ -16,4 +16,3 @@
- type: Biocode
factions:
- BloodCult
alertText: Данное оружие биокодировано. Вы не можете его использовать.

View file

@ -2,46 +2,43 @@
parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDuffelSyndicateFilledBauer127
name: Sniper bundle
description: "Iconic heavy anti-materiel sniper rifle with three spare magazines, a large-calibre ammo boxes and thermal goggles."
description: Iconic heavy anti-materiel sniper rifle with three spare magazines, a large-calibre ammo boxes and thermal goggles.
components:
- type: StorageFill
contents:
- id: WeaponRifleBauer127Biocode
- id: MagazineBauer127
amount: 3
- id: MagazineBoxAntiMateriel
- id: MagazineBauer127Penetrator
amount: 2
- id: MagazineBauer127Frag
amount: 2
- id: MagazineBauer127Blast
amount: 2
- id: MagazineBauer127Emp
amount: 2
- id: ClothingEyesGlassesSniperThermalSyndie
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleBauer127Biocode
- id: MagazineBauer127
amount: 3
- id: MagazineBoxAntiMateriel
- id: MagazineBauer127Penetrator
amount: 2
- id: MagazineBauer127Frag
amount: 2
- id: MagazineBauer127Blast
amount: 2
- id: MagazineBauer127Emp
amount: 2
- id: ClothingEyesGlassesSniperThermalSyndie
- type: entity
parent: ClothingBackpackDuffelSyndicateAmmo
id: ClothingBackpackDuffelSyndicateSuperAmmoFilled
name: ammo bundle
description: "Reloading! Contains 4 magazines for the C-20r, 5 drums for the Bulldog, 3 magazines for the Estoc DMR, and 2 ammo boxes for the L6 SAW."
description: Reloading! Contains 4 magazines for the C-20r, 5 drums for the Bulldog, 3 magazines for the Estoc DMR, and 2 ammo boxes for the L6 SAW.
components:
- type: StorageFill
contents:
- id: SMGAmmoKit # Sunrise-edit
amount: 1
- id: ShotGunKit # Sunrise-edit
amount: 1
- id: LMGKit # Sunrise-edit
amount: 1
- id: MMGKit # Sunrise-edit
amount: 1
- id: CaselessAmmoKit # Sunrise-edit
amount: 1
- id: RifleAmmoKit # Sunrise-edit
amount: 1
- id: DragunovAmmoKit # Sunrise-edit
amount: 1
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: SMGAmmoKit
- id: ShotGunKit
- id: LMGKit
- id: MMGKit
- id: CaselessAmmoKit
- id: RifleAmmoKit
- id: DragunovAmmoKit
#ERT_Uplink
- type: entity
@ -50,13 +47,15 @@
name: Bundle MP5
description: MP5 with 4 raspy magazines.
components:
- type: StorageFill
contents:
- id: WeaponSubMachineGunMP5
- id: MagazineMP5
amount: 1
- id: MagazineMP5Extended
amount: 4
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponSubMachineGunMP5
- id: MagazineMP5
amount: 1
- id: MagazineMP5Extended
amount: 4
- type: entity
id: ClothingBackpackDuffelWeaponSubMachineGunMP7Filled
@ -64,11 +63,13 @@
name: Bundle MP7
description: MP7 with 3 raspy magazines.
components:
- type: StorageFill
contents:
- id: WeaponSubMachineGunMP7
- id: MagazinePistolHighCapacityFMJ
amount: 3
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponSubMachineGunMP7
- id: MagazinePistolHighCapacityFMJ
amount: 3
- type: entity
id: ClothingBackpackDuffelWeaponSubMachineGunWt550
@ -76,13 +77,15 @@
name: Bundle WT550
description: WT550 with 3 raspy magazines FMJ and 2 HP.
components:
- type: StorageFill
contents:
- id: WeaponSubMachineGunWt550
- id: MagazinePistolSubMachineGunTopMounted
amount: 3
- id: MagazinePistolSubMachineGunTopMountedHP
amount: 2
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponSubMachineGunWt550
- id: MagazinePistolSubMachineGunTopMounted
amount: 3
- id: MagazinePistolSubMachineGunTopMountedHP
amount: 2
- type: entity
id: ClothingBackpackDuffelWeaponSubMachineGunDrozdMk2
@ -90,13 +93,15 @@
name: Bundle Drozd Mk2
description: Drozd Mk2 with 3 raspy magazines FMJ and 2 HP.
components:
- type: StorageFill
contents:
- id: WeaponSubMachineGunDrozdMk2
- id: MagazinePistolSubMachineGunFMJ
amount: 3
- id: MagazinePistolSubMachineGunHP
amount: 2
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponSubMachineGunDrozdMk2
- id: MagazinePistolSubMachineGunFMJ
amount: 3
- id: MagazinePistolSubMachineGunHP
amount: 2
- type: entity
id: ClothingBackpackDuffelWeaponRifleLecterFilled
@ -104,15 +109,16 @@
name: Bundle lecter Mk2
description: Lecter Mk2 with 3 raspy FMJ magazines and 2 HP.
components:
- type: StorageFill
contents:
- id: WeaponRifleLecterMk2
- id: MagazineRifleFMJ
amount: 3
- id: MagazineRifleHP
amount: 2
- id: MagazineRifleSP
amount: 1
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleLecterMk2
- id: MagazineRifleFMJ
amount: 3
- id: MagazineRifleHP
amount: 2
- id: MagazineRifleSP
- type: entity
id: ClothingBackpackDuffelWeaponRifleM52Filled
@ -120,15 +126,16 @@
name: Bundle M-52
description: Premium assault rifle with 3 raspy FMJ magazines, 2 SP and 1 HP.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleM52
- id: MagazineRifleM52FMJ
amount: 3
- id: MagazineRifleM52SP
amount: 2
- id: MagazineRifleM52HP
amount: 1
- type: entity
id: ClothingBackpackDuffelWeaponSubMachineGunP90Filled
@ -136,8 +143,10 @@
name: Bundle p90
description: P-90 with 4 raspy magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponSubMachineGunP90
- id: MagazineP90
amount: 2
@ -150,8 +159,10 @@
name: Bundle ams42
description: AMS-42 with 4 raspy magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponAMS-42
- id: MagazineRifleSP
amount: 4
@ -162,8 +173,10 @@
name: Bundle G36
description: G36 with 4 raspy magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleG36
- id: MagazineRifleSP
amount: 4
@ -174,11 +187,13 @@
name: Bundle Assault Shotgun
description: Assault Shotgun with 6 raspy speedloaders.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponShotgunCycler
- id: SpeedLoaderShellShotgun
amount: 4
amount: 2
- id: SpeedLoaderShotgunSlug
amount: 2
@ -188,8 +203,10 @@
name: Bundle Trenchgun 4034
description: Trenchgun 4034 with 1 Box ammo.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponShotgunTrenchgun4034
- id: BoxLethalshot
- id: BoxShotgunFlare
@ -201,8 +218,10 @@
name: Bundle law12
description: Law-12 with 1 Box ammo.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponShotgunSPAS12
- id: BoxLethalshot
- id: BoxShotgunFlare
@ -214,13 +233,14 @@
name: Bundle SKM-24
description: SKM-24 with 6 raspy various magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleSKM24Nano
- id: MagazineLightRifleSP
amount: 3
- id: MagazineLightRifleFMJ
amount: 1
- id: MagazineLightRifleHP
amount: 2
@ -230,8 +250,10 @@
name: Bundle SKM-24
description: AR18 with 6 raspy Incendiary magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleSKM24
- id: MagazineLightRifleIncendiary
amount: 6
@ -243,11 +265,12 @@
name: Bundle SKM-28
description: SKM-28 with 6 raspy various magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleSKM28Nano
- id: MagazineRifleHeavyFMJ
amount: 1
- id: MagazineRifleHeavySP
amount: 3
- id: MagazineRifleHeavyHP
@ -259,8 +282,10 @@
name: Bundle SKM-28
description: SKM-28 with 6 raspy Incendiary magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleSKM28
- id: MagazineRifleHeavyIncendiary
amount: 6
@ -272,8 +297,10 @@
name: Bundle br64
description: BR64 with 2 raspy magazines.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleBR64
- id: MagazineRifleHeavyFMJ
amount: 2
@ -284,8 +311,10 @@
name: Bundle smart gun M492
description: M492 with 2 raspy SP and FMJ belt-box.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponLightMachineGunM492
- id: MagazineLightRifleBeltBox
- id: MagazineLightRifleBeltBoxFMJ
@ -293,11 +322,13 @@
- type: entity
id: ClothingBackpackDuffelWeaponLightMachineGunM492CBURN
parent: ClothingBackpackDuffelCBURN
name: Bundle M492 "Incinerator"
name: Bundle M492 Incinerator
description: M492 with 3 raspy Incendiary belt-box.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponLightMachineGunM492Cburn
- id: MagazineLightRifleBeltBoxIncendiary
amount: 3
@ -309,11 +340,13 @@
name: Bundle Hristov
description: Hristov with 4 raspy .60 10-rounds Box.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponSniperHristov
- id: MagazineBoxAntiMateriel
amount: 4
amount: 3
- type: entity
id: ClothingBackpackDuffelWeaponRifleAsh12
@ -321,12 +354,14 @@
name: Bundle ASH-12
description: ASH-12 with 5 magazines and a blueprint.
components:
- type: StorageFill
contents:
- id: WeaponRifleAsh12
- id: MagazineAsh12
amount: 5
- id: BlueprintMagAsh12Slug
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleAsh12
- id: MagazineAsh12
amount: 5
- id: BlueprintMagAsh12Slug
- type: entity
id: ClothingBackpackDuffelNanotrasenMedicalBundleFilled
@ -334,42 +369,46 @@
name: nanotrasen medical bundle
description: A large duffel bag for holding any medical army goods.
components:
- type: StorageFill
contents:
- id: DefibrillatorCompact
- id: MedkitCombatFilled
amount: 3
- id: Tourniquet
amount: 2
- id: MedipenCombatInjector
amount: 2
- id: CombatMedipen
amount: 4
- id: PunctAutoInjector
amount: 4
- id: PyraAutoInjector
amount: 4
- id: AirlossAutoInjector
amount: 4
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: DefibrillatorCompact
- id: MedkitCombatFilled
amount: 3
- id: Tourniquet
amount: 2
- id: MedipenCombatInjector
amount: 2
- id: CombatMedipen
amount: 4
- id: PunctAutoInjector
amount: 4
- id: PyraAutoInjector
amount: 4
- id: AirlossAutoInjector
amount: 4
- type: entity
parent: ClothingBackpackDuffelAbductorBundle
id: ClothingBackpackDuffelAbductorFilled
suffix: Filled
components:
- type: StorageFill
contents:
- id: HemostatAbductor
- id: SawAbductor
- id: DrillAbductor
- id: CauteryAbductor
- id: RetractorAbductor
- id: ScalpelAbductor
- id: BoneGelAbductor
- id: BoneSetterAbductor
- id: NitrousOxideTankFilled
- id: NitrousOxideTankFilled
- id: ClothingMaskBreath
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: HemostatAbductor
- id: SawAbductor
- id: DrillAbductor
- id: CauteryAbductor
- id: RetractorAbductor
- id: ScalpelAbductor
- id: BoneGelAbductor
- id: BoneSetterAbductor
- id: NitrousOxideTankFilled
- id: NitrousOxideTankFilled
- id: ClothingMaskBreath
- type: entity
@ -378,82 +417,94 @@
name: Minotaur bundle
description: "Lean and mean: Contains smooth, powerful, highly illegal Shotgun, a 5 12g buckshot drums."
components:
- type: StorageFill
contents:
- id: WeaponShotgunMinotaurBiocode
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponShotgunMinotaurBiocode
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDuffelSyndicateFilledDeagle
name: Desert Eagle bundle
description: "Contains high damage Desert Eagle, a 3 magnum magazines."
description: Contains high damage Desert Eagle, a 3 magnum magazines.
components:
- type: StorageFill
contents:
- id: WeaponPistolDeagle
- id: MagazineShotgun
- id: MagazineShotgun
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponPistolDeagle
- id: MagazineDeagle
amount: 3
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDufelSyndicateFilledMantisBladeArms
name: Mantis Blade bundle
description: "Contains a pair of cybernetic arms, watch out. You got a psycho on the loose."
description: Contains a pair of cybernetic arms, watch out. You got a psycho on the loose.
components:
- type: StorageFill
contents:
- id: RightArmCyberMantisBlade
- id: LeftArmCyberMantisBlade
- id: RightHandCyber
- id: LeftHandCyber
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: RightArmCyberMantisBlade
- id: LeftArmCyberMantisBlade
- id: RightHandCyber
- id: LeftHandCyber
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDuffelSyndicateFilledInfiltration
name: infiltration hardsuit bundle
description: "Contains the latest in Syndicate chameleon technology, the infiltration hardsuit."
description: Contains the latest in Syndicate chameleon technology, the infiltration hardsuit.
components:
- type: StorageFill
contents:
- id: ClothingOuterHardsuitInfiltrationBiocode
- id: ClothingMaskGasSyndicate
- id: ClothingHandsGlovesCombatCQC
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingOuterHardsuitInfiltrationBiocode
- id: ClothingMaskGasSyndicate
- id: ClothingHandsGlovesCombatCQC
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
- type: entity
parent: ClothingBackpackMessengerPirate
id: ClothingBackpackMessengerPirateDecoyKitFilled
name: decoy bundle
description: "Contains visual distractions. Smell and audio coming soon."
description: Contains visual distractions. Smell and audio coming soon.
components:
- type: StorageFill
contents:
- id: BalloonPirate1
- id: BalloonPirate2
- id: BalloonPirate3
- id: BalloonPirate4
- id: BalloonPirate5
- id: BalloonPirate6
- id: BalloonPirate7
- id: BalloonPirate8
- id: GrenadeDummy
amount: 4
- id: SnapPop
amount: 2
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: BalloonPirate1
- id: BalloonPirate2
- id: BalloonPirate3
- id: BalloonPirate4
- id: BalloonPirate5
- id: BalloonPirate6
- id: BalloonPirate7
- id: BalloonPirate8
- id: GrenadeDummy
amount: 4
- id: SnapPop
amount: 2
- type: entity
id: ClothingBackpackDuffelMilitaryBundleScaf
parent: ClothingBackpackDuffelMilitary
name: Scaf bundle
description: "Contains the old combat EVA suit."
description: Contains the old combat EVA suit.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingOuterHardsuitScaf
- id: ClothingHeadHelmetHardsuitScaf
- id: DoubleEmergencyOxygenTankFilled
@ -463,10 +514,12 @@
id: ClothingBackpackDuffelMilitaryBundlePirateEva
parent: ClothingBackpackDuffelMilitary
name: Pirate EVA bundle
description: "Contains the old pirate EVA suit."
description: Contains the old pirate EVA suit.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingHeadHelmetPirateOld
- id: ClothingOuterEVASuitPirateOld
- id: DoubleEmergencyOxygenTankFilled
@ -476,20 +529,19 @@
id: ClothingBackpackMessengerMercenaryBundleSKM24
parent: ClothingBackpackMessengerMercenary
name: SKM-24 bundle
description: "Contains the cheap assault rifle."
description: Contains the cheap assault rifle.
components:
- type: StorageFill
contents:
- id: WeaponRifleSKM24
orGroup: SKM24
- id: WeaponRifleSKM24Syndi
orGroup: SKM24
- id: WeaponRifleSKM24White
orGroup: SKM24
- id: WeaponRifleSKM24Nano
orGroup: SKM24
- id: WeaponRifleSKM24Green
orGroup: SKM24
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- !type:GroupSelector
children:
- id: WeaponRifleSKM24
- id: WeaponRifleSKM24Syndi
- id: WeaponRifleSKM24White
- id: WeaponRifleSKM24Nano
- id: WeaponRifleSKM24Green
- id: MagazineLightRifleFMJ
- id: MagazineLightRifleSP
- id: MagazineLightRifleSP
@ -501,26 +553,25 @@
id: ClothingBackpackMessengerPirateBundleSKM24Scrap
parent: ClothingBackpackMessengerPirate
name: SKM-24 bundle
description: "Contains the cheapest assault rifle."
description: Contains the cheapest assault rifle.
components:
- type: StorageFill
contents:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: WeaponRifleSKM24Scrap
- id: MagazineLightRifleImprovised
- id: MagazineLightRifleImprovised
- id: MagazineLightRifleImprovised
- id: MagazineBoxImprovisedRifle
prob: 0.5
orGroup: MagRifle
- id: MagazineLightRifleFMJ
prob: 0.25
orGroup: MagRifle
- id: MagazineLightRifleAP
prob: 0.01
orGroup: MagRifle
- id: MagazineLightRifleHP
prob: 0.4
orGroup: MagRifle
- id: MagazineLightRifleSP
prob: 0.4
orGroup: MagRifle
- !type:GroupSelector
children:
- id: MagazineBoxImprovisedRifle
prob: 0.5
- id: MagazineLightRifleFMJ
prob: 0.25
- id: MagazineLightRifleAP
prob: 0.01
- id: MagazineLightRifleHP
prob: 0.4
- id: MagazineLightRifleSP
prob: 0.4

View file

@ -1,19 +1,21 @@
- type: entity
name: blue shield encryption key box
parent: BoxEncryptionKeyPassenger
id: BoxEncryptionKeyLaw
name: law encryption key box
components:
- type: StorageFill
contents:
- id: EncryptionKeyLaw
amount: 4
- type: EntityTableContainerFill
containers:
storagebase:
id: EncryptionKeyLaw
amount: 4
- type: entity
name: blue shield encryption key box
parent: BoxEncryptionKeyPassenger
id: BoxEncryptionKeyBlueShield
name: blue shield encryption key box
components:
- type: StorageFill
contents:
- id: EncryptionKeyBlueShield
amount: 4
- type: EntityTableContainerFill
containers:
storagebase:
id: EncryptionKeyBlueShield
amount: 4

View file

@ -6,11 +6,13 @@
- type: Storage
grid:
- 0,0,3,1
- type: StorageFill
contents:
- id: ExplosiveCollarRed
- id: ExplosiveCollarWhite
- id: Bouquet
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ExplosiveCollarRed
- id: ExplosiveCollarWhite
- id: Bouquet
- type: Sprite
layers:
- state: box_of_doom_big
@ -26,11 +28,13 @@
maxItemSize: Normal
grid:
- 0,0,2,2
- type: StorageFill
contents:
- id: CaneShotgun
- id: ShellShotgunBooze
amount: 4
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: CaneShotgun
- id: ShellShotgunBooze
amount: 4
- type: entity
parent: [BoxCardboard, BaseSyndicateContraband]
@ -69,14 +73,15 @@
id: SMGAmmoKit
name: C20r ammo kit
components:
- type: StorageFill
contents:
- id: MagazinePistolSubMachineGunSP
- id: MagazinePistolSubMachineGunSP
- id: MagazinePistolSubMachineGunSP
- id: MagazinePistolSubMachineGunFMJ
- id: MagazinePistolSubMachineGunFMJ
- id: MagazinePistolSubMachineGunHP
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazinePistolSubMachineGunSP
amount: 3
- id: MagazinePistolSubMachineGunFMJ
amount: 2
- id: MagazinePistolSubMachineGunHP
- type: Sprite
layers:
- state: box_of_doom_big
@ -87,14 +92,15 @@
id: RifleAmmoKit
name: Estoc ammo kit
components:
- type: StorageFill
contents:
- id: MagazineRifleSP
- id: MagazineRifleSP
- id: MagazineRifleSP
- id: MagazineRifleFMJ
- id: MagazineRifleFMJ
- id: MagazineRifleAP
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineRifleSP
amount: 3
- id: MagazineRifleFMJ
amount: 2
- id: MagazineRifleAP
- type: Sprite
layers:
- state: box_of_doom_big
@ -108,12 +114,12 @@
- type: Storage
grid:
- 0,0,1,3
- type: StorageFill
contents:
- id: MagazinePistolSubMachineGunCaselessExtended
- id: MagazinePistolSubMachineGunCaselessExtended
- id: MagazinePistolSubMachineGunCaselessExtended
- id: MagazinePistolSubMachineGunCaselessExtended
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazinePistolSubMachineGunCaselessExtended
amount: 4
- type: Sprite
layers:
- state: box_of_doom
@ -127,12 +133,14 @@
- type: Storage
grid:
- 0,0,1,3
- type: StorageFill
contents:
- id: MagazineDragunov
- id: MagazineDragunov
- id: MagazineDragunovExtended
- id: MagazineDragunovExtended
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineDragunov
amount: 2
- id: MagazineDragunovExtended
amount: 2
- type: Sprite
layers:
- state: box_of_doom
@ -143,14 +151,16 @@
id: AntimaterialAmmoKit
name: Antimaterial magazine kit
components:
- type: StorageFill
contents:
- id: MagazineBauer127
- id: MagazineBauer127
- id: MagazineBauer127Penetrator
- id: MagazineBauer127Frag
- id: MagazineBauer127Blast
- id: MagazineBauer127Emp
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineBauer127
amount: 2
- id: MagazineBauer127Penetrator
- id: MagazineBauer127Frag
- id: MagazineBauer127Blast
- id: MagazineBauer127Emp
- type: Sprite
layers:
- state: box_of_doom
@ -161,91 +171,35 @@
id: SMGIncendiaryAmmoKit
name: C20r Incendiary ammo kit
components:
- type: StorageFill
contents:
- id: MagazinePistolSubMachineGunIncendiary
amount: 8
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazinePistolSubMachineGunIncendiary
amount: 8
- type: Sprite
layers:
- state: box_of_doom_big
- state: smg_red
# - type: entity
# parent: BaseSyndicateAmmoKit
# id: SMGUraniumAmmoKit
# name: C20r Uranium ammo kit
# components:
# - type: StorageFill
# contents:
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - id: MagazinePistolSubMachineGunUranium
# - type: Sprite
# layers:
# - state: box_of_doom_big
# - state: smg_uranium
- type: entity
parent: BaseSyndicateAmmoKit
id: ShotGunKit
name: Bulldog ammo kit
components:
- type: StorageFill
contents:
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgun
- id: MagazineShotgunSlug
- id: MagazineShotgunSlug
- id: MagazineShotgunSlug
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineShotgun
amount: 5
- id: MagazineShotgunSlug
amount: 3
- type: Sprite
layers:
- state: box_of_doom_big
- state: shotgun_base
# - type: entity
# parent: BaseSyndicateAmmoKit
# id: ShotGunIncendiaryKit
# name: Bulldog Incendiary ammo kit
# components:
# - type: StorageFill
# contents:
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - id: MagazineShotgunIncendiary
# - type: Sprite
# layers:
# - state: box_of_doom_big
# - state: shotgun_red
# - type: entity
# parent: BaseSyndicateAmmoKit
# id: ShotGunUraniumKit
# name: Bulldog Uranium ammo kit
# components:
# - type: StorageFill
# contents:
# - id: MagazineShotgunUranium
# - id: MagazineShotgunUranium
# - id: MagazineShotgunUranium
# - id: MagazineShotgunUranium
# - type: Sprite
# layers:
# - state: box_of_doom_big
# - state: shotgun_uranium
- type: entity
parent: BaseSyndicateAmmoKit
id: MMGKit
@ -258,11 +212,12 @@
- type: Storage
grid:
- 0,0,2,1
- type: StorageFill
contents:
- id: MagazineDl6902
- id: MagazineDl6902
- id: MagazineDl6902
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineDl6902
amount: 3
- type: Sprite
layers:
- state: box_of_doom_big
@ -276,11 +231,13 @@
- type: Storage
grid:
- 0,0,3,1
- type: StorageFill
contents:
- id: MagazineRifleBoxSP
amount: 3
- id: MagazineRifleBoxFMJ
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineRifleBoxSP
amount: 3
- id: MagazineRifleBoxFMJ
- type: Sprite
layers:
- state: box_of_doom_big
@ -291,10 +248,12 @@
id: LMGIncendiaryKit
name: L6 Saw Incendiary ammo kit
components:
- type: StorageFill
contents:
- id: MagazineRifleBoxIncendiary
amount: 4
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineRifleBoxIncendiary
amount: 4
- type: Sprite
layers:
- state: box_of_doom_big
@ -305,10 +264,12 @@
id: LMGUraniumKit
name: L6 Saw Uranium ammo kit
components:
- type: StorageFill
contents:
- id: MagazineRifleBoxUranium
amount: 4
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: MagazineRifleBoxUranium
amount: 4
- type: Sprite
layers:
- state: box_of_doom_big
@ -335,7 +296,6 @@
- id: CyberEyeThermal
sound:
path: /Audio/Effects/unwrap.ogg
# Sunrise edit start
- type: EmitSoundOnPickup
sound:
path: /Audio/_Sunrise/Items/Handling/cardboardbox_pickup.ogg
@ -348,7 +308,6 @@
- type: EmitSoundOnCollide
sound:
path: /Audio/_Sunrise/Items/Handling/cardboardbox_drop.ogg
# Sunrise edit end
- type: entity
parent: CyberEyeThermalBox
@ -422,10 +381,12 @@
- type: Storage
grid:
- 0,0,1,1
- type: StorageFill
contents:
- id: RightArmCyberMantisBlade
- id: LeftArmCyberMantisBlade
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: RightArmCyberMantisBlade
- id: LeftArmCyberMantisBlade
- type: Sprite
layers:
- state: box_of_doom_big

View file

@ -4,14 +4,16 @@
name: Trenchgun4034 crate
description: Contains two Trenchgun4034 with two Bandolier and four buckshot box. Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: WeaponShotgunTrenchgun4034
amount: 2
- id: ClothingBeltBandolier
amount: 2
- id: BoxLethalshot
amount: 4
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: WeaponShotgunTrenchgun4034
amount: 2
- id: ClothingBeltBandolier
amount: 2
- id: BoxLethalshot
amount: 4
- type: entity
id: CrateArmoryCombatShotgun
@ -19,29 +21,33 @@
name: Combat Shotgun crate
description: Contains two Combat Shotgun with two Bandolier and four buckshot box. Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: WeaponShotgunCombat
amount: 2
- id: ClothingBeltBandolier
amount: 2
- id: BoxLethalshot
amount: 4
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: WeaponShotgunCombat
amount: 2
- id: ClothingBeltBandolier
amount: 2
- id: BoxLethalshot
amount: 4
- type: entity
id: CrateArmoryShotgunAmmo
parent: [ CrateWeaponSecure, BaseSecurityContraband ]
name: Shotgun Ammo crate
description: Contains varios Box Shotgun ammo. Requires Armory access to open.
description: Contains various Box Shotgun ammo. Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: BoxLethalshot
amount: 4
- id: BoxBeanbag
amount: 2
- id: BoxShotgunSlug
amount: 2
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: BoxLethalshot
amount: 4
- id: BoxBeanbag
amount: 2
- id: BoxShotgunSlug
amount: 2
- type: entity
id: CrateArmoryAKMS
@ -49,18 +55,20 @@
name: AKMS crate
description: Contains two AKMS assault rifle with four mags. Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: WeaponRifleAKM
amount: 2
- id: MagazineLightRifleSP
amount: 1
- id: MagazineLightRifleHP
amount: 1
- id: MagazineLightRifleFMJ
amount: 1
- id: MagazineLightRifleAP
amount: 1
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: WeaponRifleAKM
amount: 2
- id: MagazineLightRifleSP
amount: 1
- id: MagazineLightRifleHP
amount: 1
- id: MagazineLightRifleFMJ
amount: 1
- id: MagazineLightRifleAP
amount: 1
- type: entity
id: CrateArmoryMP5
@ -68,12 +76,14 @@
name: MP5 crate
description: Contains two MP5 submachine gun with two mags. Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: WeaponSubMachineGunMP5
amount: 2
- id: MagazineMP5
amount: 2
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: WeaponSubMachineGunMP5
amount: 2
- id: MagazineMP5
amount: 2
- type: entity
id: CrateArmoryIK30
@ -81,12 +91,14 @@
name: IK-30 crate
description: Contains three IK-30 laser carbine with additional ammunition. Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: WeaponGunLaserCarbineSemi
amount: 3
- id: MagazineBatteryLr30
amount: 3
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: WeaponGunLaserCarbineSemi
amount: 3
- id: MagazineBatteryLr30
amount: 3
- type: entity
id: CrateArmoryIK30Magazines
@ -94,7 +106,9 @@
name: IK-30 magazine's crate
description: Contains six magazines for "IK-30". Requires Armory access to open.
components:
- type: StorageFill
contents:
- id: MagazineBatteryLr30
amount: 6
- type: EntityTableContainerFill
containers:
entity_storage: !type:AllSelector
children:
- id: MagazineBatteryLr30
amount: 6

View file

@ -21,7 +21,7 @@
sprite: _Sunrise/Clothing/Eyes/Glasses/kim.rsi
- type: entity
parent: [ClothingEyesBase, ShowSecurityIcons, BaseRestrictedContraband]
parent: [ClothingEyesBase, ShowSecurityIcons, BaseSecurityContraband]
id: ClothingEyesGlassesBlueShield
name: blueshield's glasses
description: The innovative blue lenses hide your eyes from light flashes and have a built-in visor.
@ -74,7 +74,7 @@
- WhitelistChameleon
- type: entity
parent: [BaseNightVisionDevice, ClothingEyesGlassesSunglasses,ShowSecurityIcons, PowerCellSlotSmallItem]
parent: [BaseNightVisionDevice, ClothingEyesGlassesSunglasses, ShowSecurityIcons, PowerCellSlotSmallItem]
id: ClothingEyesGlassesNVG
name: sun glasses
description: A pair of black sunglasses.

View file

@ -14,7 +14,7 @@
- HudMedical
- type: entity
parent: [ClothingEyesBase, ShowSecurityIcons, BaseSyndicateContraband, WeldingMaskBase]
parent: [ClothingEyesBase, ShowSecurityIcons, BaseSyndicateContraband]
id: ClothingEyesHudSyndicateMech
name: syndicate Mech pilot visor
description: The syndicate Mech pilote`s professional head-up display, designed for quick diagnosis of their Mech's status.
@ -28,7 +28,8 @@
damageContainers:
- Inorganic
- Silicon
- Mech # Sunrise-edit
- Mech
- type: FlashImmunity
- type: entity
parent: [ ClothingEyesBase, ShowSecurityIcons ]
@ -44,4 +45,4 @@
damageContainers:
- Inorganic
- Silicon
- Mech # Sunrise-edit
- Mech

View file

@ -31,16 +31,14 @@
Blunt: 0.9
Slash: 0.9
Piercing: 0.95
# SUNRISE EDIT
- type: Tag
tags:
- ClothMade
- FullCovered # INTERACTIONS
- WhitelistChameleon
# SUNRISE EDIT
- type: entity
parent: [ClothingHeadBase, BaseRestrictedContraband, BaseFoldable]
parent: [ClothingHeadBase, BaseSecurityContraband, BaseFoldable]
id: ClothingHeadHelmetPubg
name: Altyn
description: A fortified helmet used to suppress and incite riots.
@ -69,13 +67,11 @@
Piercing: 0.85
- type: ExplosionResistance
damageCoefficient: 0.95
# SUNRISE EDIT
- type: Tag
tags:
- ClothMade
- FullCovered # INTERACTIONS
- WhitelistChameleon
# SUNRISE EDIT
# region ERT Amber EVA
- type: entity

View file

@ -205,7 +205,7 @@
- WhitelistChameleon
- type: entity
parent: [ClothingOuterHardsuitBase, BaseRestrictedContraband]
parent: ClothingOuterHardsuitBase
id: ClothingOuterLightHardsuitUSSP
name: Thunder-P
description: A lightweight combat suit designed for rapid response and mobile operations. The light armor provides protection against firearms and allows for high maneuverability. The Grom-P is used by assault troops for fast and effective combat operations.
@ -235,12 +235,11 @@
clothingPrototype: ClothingHeadHelmetLightHardsuitUSSP
- type: entity
parent: [ClothingOuterHardsuitEngineering, BaseEngineeringContraband]
parent: [ ClothingOuterHardsuitEngineering, BaseEngineeringContraband ]
id: ClothingOuterHardsuitEngineeringCompact
name: senior's engineer hardsuit
description: A special suit that protects against hazardous, low pressure environments. Has radiation shielding. Very compact.
components:
# Sunrise-Start
- type: FireProtection
reduction: 0.8
- type: ExplosionResistance
@ -256,7 +255,6 @@
Shock: 0.5
Heat: 0.7
Radiation: 0.4
# Sunrise-End
- type: ClothingSpeedModifier
walkModifier: 0.85
sprintModifier: 0.85

View file

@ -397,7 +397,7 @@
- type: Sprite
sprite: _Sunrise/Clothing/Uniforms/Jumpsuit/alcoholichka.rsi
- type: Clothing
sprite: _Sunrise/Clothing/Uniforms/Jumpsuit/alcoholichka.rs
sprite: _Sunrise/Clothing/Uniforms/Jumpsuit/alcoholichka.rsi
- type: entity
parent: ClothingUniformBase

View file

@ -128,7 +128,7 @@
- type: Sprite
state: cpu_supply
- type: ComputerBoard
prototype: ComputerFineRecords
prototype: ComputerContrabandSale
- type: StaticPrice
price: 3000

View file

@ -7,7 +7,6 @@
factions:
- Syndicate
- Thief
alertText: Данный предмет биокодирован. Вы не можете его использовать.
- type: entity
parent: DefibrillatorSyndicate
@ -17,8 +16,6 @@
- type: Biocode
factions:
- Syndicate
alertText: Данный предмет биокодирован. Вы не можете его использовать.
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.

View file

@ -128,7 +128,7 @@
# region Mech Pod
- type: entity
id: MechSecPod
parent: [ BaseMechPod, BaseRestrictedContraband ]
parent: [ BaseMechPod, BaseSecurityContraband ]
name: Security Pod
description: Despite its size, the Security Pod has incredible mobility in space thanks to its engines.
suffix: Filled
@ -169,6 +169,7 @@
equipmentWhitelist:
tags:
- CombatMech
- PaddyMech
startingEquipment:
- WeaponMechCombatSolarisLaser
- type: Reflect
@ -193,7 +194,7 @@
- type: entity
id: MechMiningPod
parent: [ BaseMechPod, BaseRestrictedContraband ]
parent: [ BaseMechPod, BaseSalvageSpecialistContraband ]
name: Mining Pod
description: Despite its size, the Mining Pod has incredible survability in space.
suffix: Filled
@ -553,7 +554,7 @@
- type: entity
id: MechPhazon
parent: [ BaseMech, CombatMech, BaseRestrictedContraband ]
parent: [ BaseMech, CombatMech, BaseSecurityScienceContraband ]
name: Phazon
description: The most advanced mech on the market, the pinnacle of technological development, extremely mobile and deadly.
components:

View file

@ -1,12 +1,9 @@
- type: entity
name: CommandFriend™ X-02
parent: [ BaseHandheldComputer, BaseRestrictedContraband ]
parent: [ BaseHandheldComputer, BaseMedicalContraband ]
id: HandheldBSOCrewMonitor
description: Does not monitor the competence levels of command members.
components:
# - type: Tag
# tags:
# - BSOBeltEquip
- type: Sprite
sprite: _Sunrise/Objects/Specific/Medical/handheld_bso_crewmonitor.rsi
state: scanner
@ -28,9 +25,6 @@
parent: HandheldBSOCrewMonitor
suffix: Empty
components:
# - type: Tag
# tags:
# - BSOBeltEquip
- type: ItemSlots
slots:
cell_slot:

View file

@ -15,6 +15,8 @@
map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance
- type: SpentAmmoVisuals
- type: StaticPrice
price: 3
- type: PhysicalComposition
materialComposition:
Steel: 10
@ -36,6 +38,8 @@
map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance
- type: SpentAmmoVisuals
- type: StaticPrice
price: 3
- type: PhysicalComposition
materialComposition:
Steel: 10

View file

@ -54,9 +54,9 @@
- type: entity
name: LNT620 "Spark"
parent: [ BaseWeaponAutoPowerCell, BaseRestrictedContraband ]
parent: [ BaseWeaponAutoPowerCell, BaseSecurityContraband ]
id: WeaponLaserLNT620
description: "Automatic Laser NanoTrasen LNT620."
description: Automatic Laser NanoTrasen LNT620.
components:
- type: Sprite
sprite: _Sunrise/Objects/Weapons/Guns/Battery/smg_laser.rsi

View file

@ -6,7 +6,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponShotgunBulldog
@ -16,7 +15,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponLightMachineGunL6
@ -26,7 +24,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSubMachineGunC20r
@ -36,7 +33,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponRifleEstoc
@ -46,7 +42,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponLauncherChinaLake
@ -56,7 +51,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponLauncherM79
@ -66,7 +60,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSniperHristov
@ -76,7 +69,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponPistolDeagle
@ -86,7 +78,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponRifleM90GrenadeLauncher
@ -96,7 +87,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponRifleBauer127
@ -106,7 +96,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSniperDragunov
@ -116,7 +105,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSIAR52
@ -126,7 +114,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponDL6902
@ -136,7 +123,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponAJ100
@ -146,7 +132,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSyndieLaserPistol
@ -156,7 +141,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponLaserMinigun
@ -166,7 +150,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSyndieLaserGun
@ -176,7 +159,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponGrenadeLauncherGL70
@ -186,7 +168,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponShotgunMinotaur
@ -196,7 +177,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponEnergyCrossbow
@ -206,7 +186,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponSubMachineGunC40r
@ -216,7 +195,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: entity
parent: WeaponPistolDeagleGolden
@ -226,4 +204,3 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.

View file

@ -1,7 +1,7 @@
- type: entity
name: SyndyFlash Grenade
description: It definitely smells fake.
parent: [ GrenadeBase, BaseRestrictedContraband, GrenadeFlashBang ]
parent: [ GrenadeBase, BaseSyndicateContraband, GrenadeFlashBang ]
id: SyndyFlashGrenade
components:
- type: Sprite

View file

@ -6,10 +6,9 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: Construction
graph: EnergySwordDoubleGraph
node: DoubleEnergySwordNode
node: double
- type: Biocode
factions:
- Syndicate
@ -22,7 +21,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: Tag
tags:
- EnergySword
@ -41,7 +39,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: Biocode
factions:
- Syndicate
@ -54,7 +51,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: Biocode
factions:
- Syndicate
@ -67,7 +63,6 @@
- type: FactionWeaponBlocker
factions:
- Syndicate
alertText: Данное оружие биокодировано. Вы не можете его использовать.
- type: Biocode
factions:
- Syndicate

View file

@ -7,4 +7,3 @@
factions:
- Syndicate
- Thief
alertText: Данное оружие биокодировано. Вы не можете его использовать.

View file

@ -0,0 +1,15 @@
- type: entity
id: BaseSecurityScienceContraband
parent: BaseRestrictedContraband
abstract: true
components:
- type: Contraband
allowedDepartments: [ Security, Science ]
- type: entity
id: BaseSalvageSpecialistContraband
parent: BaseRestrictedContraband
abstract: true
components:
- type: Contraband
allowedJobs: [ SalvageSpecialist ]

View file

@ -11,6 +11,8 @@
layers:
- state: icon
map: ["enum.LatheVisualLayers.IsRunning"]
- type: Machine
board: SewingPrinterMetusMachineCircuitboard
- type: Lathe
staticPacks:
- ClothingMetusPlanetPrison
@ -107,6 +109,8 @@
- PowerCellsStatic
- ElectronicsStaticPrison
- HydroponicsStatic
- type: Machine
board: AutolathePrisonMetusMachineCircuitboard
- type: entity
id: PirateTechFab

View file

@ -1,3 +1,6 @@
# Какого хуя это не наследуется от BaseStructure
# TODO: Исправьте это говно кто-нибудь
- type: entity
id: Reflector
name: reflector
@ -16,6 +19,7 @@
- type: Pullable
- type: Rotatable
- type: Machine
board: ReflectorMachineCircuitboard
- type: Physics
bodyType: Static
- type: Fixtures

View file

@ -28,15 +28,9 @@
collection: MetalBreak
- !type:SpawnEntitiesBehavior
spawn:
SheetSteel1:
min: 4
max: 12
MaterialWoodPlank1:
min: 1
max: 4
PartRodMetal1:
min: 2
max: 8
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Fixtures
@ -101,14 +95,14 @@
- !type:SpawnEntitiesBehavior
spawn:
SheetSteel1:
min: 4
max: 12
min: 0
max: 1
MaterialWoodPlank1:
min: 1
max: 4
PartRodMetal1:
min: 2
max: 8
min: 1
max: 2
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Fixtures

View file

@ -64,8 +64,8 @@
- !type:SpawnEntitiesBehavior
spawn:
MaterialWoodPlank:
min: 1
max: 2
min: 0
max: 1
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Construction
@ -165,8 +165,8 @@
- !type:SpawnEntitiesBehavior
spawn:
MaterialWoodPlank:
min: 1
max: 2
min: 0
max: 1
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Construction

View file

@ -3,6 +3,7 @@
parent: BaseStructure
name: Flesh Heart
description: Flesh Heart
categories: [ Spawner ]
placement:
mode: AlignTileAny
components:

View file

@ -17,7 +17,7 @@
- DurandTargetingElectronics
- ClarkeCentralElectronics
- ClarkePeripheralsElectronics
- ImplantExtractorMachineCircuitboard
- InterrogatorMachineCircuitboard
- ExosuitFabricatorHyperConvectionMachineCircuitboard
- MedicalAssemblerMachineCircuitboard

View file

@ -18,14 +18,9 @@
Plastic: 600
- type: latheRecipe
parent: BaseLightRecipe
id: UvLightTube
result: UvLightTube
categories:
- Lights
completetime: 2
materials:
Steel: 50
Glass: 50
- type: latheRecipe
id: ClothingShoesBootsMagSec

View file

@ -256,7 +256,7 @@
tier: 3
cost: 12500
recipeUnlocks:
- ImplantExtractorMachineCircuitboard
- InterrogatorMachineCircuitboard
- type: technology
id: AutoMenders

View file

@ -55,3 +55,15 @@
storage:
back:
- HandheldBSOCrewMonitor
- type: chameleonOutfit
id: BlueShieldEnsignChameleonOutfit
job: BlueShieldEnsign
icon: JobIconBlueShield
equipment:
shoes: ClothingShoesBootsBlueShieldFilled
eyes: ClothingEyesGlassesBlueShield
head: ClothingHeadHatBeretBlueShield
outerClothing: ClothingOuterArmorBlueShield
belt: ClothingBeltBlueShieldWebbingFilled
gloves: ClothingHandsGlovesCombat

View file

@ -52,3 +52,13 @@
storage:
back:
# - HandheldBSOCrewMonitor
- type: chameleonOutfit
id: BlueShieldOfficerChameleonOutfit
job: BlueShieldOfficer
icon: JobIconBlueShield
equipment:
shoes: ClothingShoesBootsBlueShieldFilled
eyes: ClothingEyesGlassesBlueShield
outerClothing: ClothingOuterArmorBlueShield
gloves: ClothingHandsGlovesCombat

View file

@ -40,3 +40,14 @@
sprite: /Textures/_Sunrise/Interface/Misc/job_icons.rsi
state: CommandMaid
- type: chameleonOutfit
id: ComMaidChameleonOutfit
job: ComMaid
icon: JobIconComMaid
equipment:
jumpsuit: ClothingUniformJumpskirtElegantMaid
head: ClothingHeadNurseHat
eyes: ClothingEyesGlassesSunglasses
neck: BunnyButterfly
shoes: ClothingShoesColorWhite

View file

@ -347,10 +347,8 @@
description:
components:
- type: CargoPalletConsole
#tag: #Service sale
#whitelist:
# components:
# - Food
- type: Computer
board: ComputerServiceSaleConsoleCircuitboard
- type: entity
id: ComputerSecuritySaleConsole
@ -360,10 +358,8 @@
description:
components:
- type: CargoPalletConsole
# tag: #Security sale
# whitelist:
# components:
# - Gun
- type: Computer
board: ComputerSecuritySaleConsoleCircuitboard
- type: entity
id: ComputerMedicalSaleConsole
@ -373,10 +369,8 @@
description:
components:
- type: CargoPalletConsole
# tag: #Medical sale
# whitelist:
# components:
# - Healing
- type: Computer
board: ComputerMedicalSaleConsoleCircuitboard
- type: entity
id: ComputerMiningSaleConsole
@ -386,10 +380,8 @@
description:
components:
- type: CargoPalletConsole
# tag: #Mining sale
# whitelist:
# components:
# - Material
- type: Computer
board: ComputerMiningSaleConsoleCircuitboard
- type: entity
id: ComputerScienceSaleConsole
@ -399,13 +391,8 @@
description:
components:
- type: CargoPalletConsole
# tag: #Science sale
# whitelist:
# components:
# - TechnologyDisk
# - MachineBoard
# - MachinePart
# - PowerCell
- type: Computer
board: ComputerScienceSaleConsoleboard
- type: entity
parent: ComputerComms

View file

@ -48,7 +48,7 @@
- !type:DoActsBehavior
acts: ["Destruction"]
- type: Machine
board: ImplantExtractorMachineCircuitboard
board: InterrogatorMachineCircuitboard
- type: WiresPanel
- type: ApcPowerReceiver
powerLoad: 200
@ -70,10 +70,10 @@
board: InterrogatorMachineCircuitboard
- type: entity
id: ImplantExtractorMachineCircuitboard
id: InterrogatorMachineCircuitboard
parent: BaseMachineCircuitboard
name: implant scan machine board
description: A machine printed circuit board for a implant extractor.
name: interrogator machine board
description: A machine printed circuit board for a interrogator.
components:
- type: Sprite
state: medical
@ -83,12 +83,3 @@
Manipulator: 4
Glass: 1
Cable: 1
- type: entity
id: InterrogatorMachineCircuitboard
parent: ImplantExtractorMachineCircuitboard
name: interrogator machine board
description: A machine printed circuit board for a interrogator.
components:
- type: Sprite
state: medical

Some files were not shown because too many files have changed in this diff Show more