Merge branch 'master' into veilnew

This commit is contained in:
MartynDew
2026-05-31 11:45:34 +03:00
committed by GitHub
48 changed files with 547 additions and 290 deletions
@@ -158,6 +158,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
return mobState switch
{
MobState.Alive => Loc.GetString("health-analyzer-window-entity-alive-text"),
MobState.PreCritical => Loc.GetString("health-analyzer-window-entity-precritical-text"), // Corvax-Wega-Add
MobState.Critical => Loc.GetString("health-analyzer-window-entity-critical-text"),
MobState.Dead => Loc.GetString("health-analyzer-window-entity-dead-text"),
_ => Loc.GetString("health-analyzer-window-entity-unknown-text"),
@@ -0,0 +1,22 @@
using Content.Shared.Overlays;
using Content.Shared.Inventory.Events;
using Robust.Client.GameObjects;
namespace Content.Client.Overlays;
public abstract class ToggleableEquipmentHudSystem<T> : EquipmentHudSystem<T>
where T : ToggleableHudComponent
{
public override void Initialize()
{
base.Initialize();
}
protected override void OnRefreshComponentHud(Entity<T> ent, ref RefreshEquipmentHudEvent<T> args)
{
if (!ent.Comp.Enabled)
return;
base.OnRefreshComponentHud(ent, ref args);
}
}
@@ -32,28 +32,18 @@ public sealed class NightVisionOverlay : Overlay
_baseShader = _prototypeManager.Index(NightVision).Instance();
}
protected override bool BeforeDraw(in OverlayDrawArgs args)
{
if (_playerManager.LocalEntity is not { } player
|| !_entityManager.TryGetComponent(player, out EyeComponent? eye)
|| args.Viewport.Eye != eye.Eye)
{
return false;
}
protected override bool BeforeDraw(in OverlayDrawArgs args)
{
if (_playerManager.LocalEntity is not { } player
|| !_entityManager.TryGetComponent(player, out EyeComponent? eye)
|| args.Viewport.Eye != eye.Eye)
{
return false;
}
if (_entityManager.TryGetComponent<NightVisionComponent>(player, out var nv))
{
Brightness = nv.Brightness;
LuminanceThreshold = nv.LuminanceThreshold;
NoiseAmount = nv.NoiseAmount;
Tint = nv.Tint;
_currentShader = _baseShader.Duplicate();
return true;
}
return false;
}
_currentShader = _baseShader.Duplicate();
return true;
}
protected override void Draw(in OverlayDrawArgs args)
{
@@ -1,13 +1,13 @@
using Content.Client.Overlays;
using Content.Shared.Inventory.Events;
using Content.Shared.Shaders;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Player;
using Robust.Shared.GameStates;
namespace Content.Client.Shaders.Systems;
public sealed class NightVisionSystem : EntitySystem
public sealed class NightVisionSystem : ToggleableEquipmentHudSystem<NightVisionComponent>
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IOverlayManager _overlayMan = default!;
[Dependency] private readonly ILightManager _lightManager = default!;
@@ -15,59 +15,38 @@ public sealed class NightVisionSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<NightVisionComponent, ComponentInit>(OnNightVisionInit);
SubscribeLocalEvent<NightVisionComponent, ComponentShutdown>(OnNightVisionShutdown);
SubscribeLocalEvent<NightVisionComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<NightVisionComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
base.Initialize();
SubscribeLocalEvent<NightVisionComponent, AfterAutoHandleStateEvent>(OnHandleState);
_overlay = new();
}
private void UpdateLighting(bool isActive)
public void OnHandleState(Entity<NightVisionComponent> ent, ref AfterAutoHandleStateEvent args)
{
_lightManager.DrawLighting = isActive;
RefreshOverlay();
}
private void OnPlayerAttached(EntityUid uid, NightVisionComponent component, LocalPlayerAttachedEvent args)
protected override void UpdateInternal(RefreshEquipmentHudEvent<NightVisionComponent> args)
{
UpdateLighting(false);
UpdateOverlay(component);
_overlayMan.AddOverlay(_overlay);
}
base.UpdateInternal(args);
private void OnPlayerDetached(EntityUid uid, NightVisionComponent component, LocalPlayerDetachedEvent args)
{
UpdateLighting(true);
_overlayMan.RemoveOverlay(_overlay);
}
if (args.Components.Count == 0)
return;
private void OnNightVisionInit(EntityUid uid, NightVisionComponent component, ComponentInit args)
{
if (_player.LocalEntity == uid)
{
UpdateLighting(false);
UpdateOverlay(component);
_overlayMan.AddOverlay(_overlay);
}
}
var component = args.Components[0];
private void OnNightVisionShutdown(EntityUid uid, NightVisionComponent component, ComponentShutdown args)
{
if (_player.LocalEntity == uid)
{
UpdateLighting(true);
_overlayMan.RemoveOverlay(_overlay);
}
}
private void UpdateOverlay(NightVisionComponent component)
{
_overlay.Brightness = component.Brightness;
_overlay.LuminanceThreshold = component.LuminanceThreshold;
_overlay.NoiseAmount = component.NoiseAmount;
_overlay.Tint = component.Tint;
_lightManager.DrawLighting = false;
_overlayMan.AddOverlay(_overlay);
}
protected override void DeactivateInternal()
{
base.DeactivateInternal();
_lightManager.DrawLighting = true;
_overlayMan.RemoveOverlay(_overlay);
}
}
@@ -18,7 +18,7 @@ public sealed partial class NukeopsRuleComponent : Component
[DataField]
public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall;
//Corvax-Wega-War-Edit-Start
public string? SetAlertlevel = "martial_law";
public string? SetAlertlevel = "gamma";
[DataField]
public uint AlertlevelDelay = 10;
[DataField]
@@ -37,6 +37,8 @@ using Content.Shared.Standing;
using Content.Shared.StatusEffectNew;
using Content.Shared.Stunnable;
using Content.Shared.Timing;
using Content.Shared.Hands.Components;
using Content.Shared.Examine;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Containers;
@@ -46,7 +48,6 @@ using Robust.Shared.Physics.Systems;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Content.Shared.Examine;
namespace Content.Server.Blood.Cult;
@@ -186,28 +187,20 @@ public sealed partial class BloodCultSystem
private void OnStun(EntityUid cultist, BloodCultistComponent component, BloodCultStunActionEvent args)
{
var spellGear = new ProtoId<StartingGearPrototype>("BloodCultSpellStunGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { spellGear };
_loadout.Equip(cultist, gear, null);
args.Handled = true;
EmpoweringCheck(args.Action, component);
if (TrySpawnSpellInHand(cultist, "BloodCultSpellStun"))
{
args.Handled = true;
EmpoweringCheck(args.Action, component);
}
}
private void OnTeleport(EntityUid cultist, BloodCultistComponent component, BloodCultTeleportActionEvent args)
{
var spellGear = new ProtoId<StartingGearPrototype>("BloodCultSpellTeleportGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { spellGear };
_loadout.Equip(cultist, gear, null);
args.Handled = true;
EmpoweringCheck(args.Action, component);
if (TrySpawnSpellInHand(cultist, "BloodCultSpellTeleport"))
{
args.Handled = true;
EmpoweringCheck(args.Action, component);
}
}
private void OnElectromagneticPulse(EntityUid cultist, BloodCultistComponent component, BloodCultElectromagneticPulseActionEvent args)
@@ -248,41 +241,29 @@ public sealed partial class BloodCultSystem
private void OnShadowShackles(EntityUid cultist, BloodCultistComponent component, BloodCultShadowShacklesActionEvent args)
{
var spellGear = new ProtoId<StartingGearPrototype>("BloodCultSpellShadowShacklesGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { spellGear };
_loadout.Equip(cultist, gear, null);
args.Handled = true;
EmpoweringCheck(args.Action, component);
if (TrySpawnSpellInHand(cultist, "BloodCultSpellShadowShackles"))
{
args.Handled = true;
EmpoweringCheck(args.Action, component);
}
}
private void OnTwistedConstruction(EntityUid cultist, BloodCultistComponent component, BloodCultTwistedConstructionActionEvent args)
{
var spellGear = new ProtoId<StartingGearPrototype>("BloodCultSpellTwistedConstructionGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { spellGear };
_loadout.Equip(cultist, gear, null);
args.Handled = true;
EmpoweringCheck(args.Action, component);
if (TrySpawnSpellInHand(cultist, "BloodCultSpellTwistedConstruction"))
{
args.Handled = true;
EmpoweringCheck(args.Action, component);
}
}
private void OnSummonEquipment(EntityUid cultist, BloodCultistComponent component, BloodCultSummonEquipmentActionEvent args)
{
var spellGear = new ProtoId<StartingGearPrototype>("BloodCultSpellSummonEquipmentGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { spellGear };
_loadout.Equip(cultist, gear, null);
args.Handled = true;
EmpoweringCheck(args.Action, component);
if (TrySpawnSpellInHand(cultist, "BloodCultSpellSummonEquipment"))
{
args.Handled = true;
EmpoweringCheck(args.Action, component);
}
}
private void OnSummonDagger(EntityUid cultist, BloodCultistComponent component, BloodCultSummonDaggerActionEvent args)
@@ -398,15 +379,11 @@ public sealed partial class BloodCultSystem
#region Blood Rites
private void OnBloodRites(EntityUid cultist, BloodCultistComponent component, BloodCultBloodRitesActionEvent args)
{
var spellGear = new ProtoId<StartingGearPrototype>("BloodCultSpellBloodRitesGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { spellGear };
_loadout.Equip(cultist, gear, null);
args.Handled = true;
EmpoweringCheck(args.Action, component);
if (TrySpawnSpellInHand(cultist, "BloodCultSpellBloodRites"))
{
args.Handled = true;
EmpoweringCheck(args.Action, component);
}
}
private void OnExamine(EntityUid uid, BloodSpellComponent spell, ExaminedEvent args)
@@ -603,16 +580,13 @@ public sealed partial class BloodCultSystem
_popup.PopupEntity(Loc.GetString("blood-cult-bolt-barrage-failed"), cultist, cultist, PopupType.SmallCaution);
return;
}
var boltBarrageGear = new ProtoId<StartingGearPrototype>("BloodCultSpellBloodBarrageGear");
var dropEvent = new DropHandItemsEvent();
RaiseLocalEvent(cultist, ref dropEvent);
List<ProtoId<StartingGearPrototype>> gear = new() { boltBarrageGear };
_loadout.Equip(cultist, gear, null);
component.BloodCount -= 200;
_action.RemoveAction(cultist, args.Action!);
args.Handled = true;
if (TrySpawnSpellInHand(cultist, "BloodCultSpellBloodBarrage"))
{
component.BloodCount -= 200;
_action.RemoveAction(cultist, args.Action!);
args.Handled = true;
}
}
#endregion Blood Rites
#endregion Abilities
@@ -1055,5 +1029,25 @@ public sealed partial class BloodCultSystem
_action.RemoveAction(spell);
}
}
private bool TrySpawnSpellInHand(EntityUid uid, EntProtoId proto)
{
if (!TryComp<HandsComponent>(uid, out var hands))
return false;
var spell = Spawn(proto, Transform(uid).Coordinates);
var activeHand = _hands.GetActiveHand((uid, hands));
if (_hands.TryPickupAnyHand(uid, spell))
return true;
else if (activeHand != null && _hands.TryForcePickup((uid, hands), spell, activeHand))
return true;
else
QueueDel(spell);
return false;
}
#endregion
}
@@ -59,7 +59,7 @@ public sealed class DamageInContainerSystem : EntitySystem
finalDamage = comp.Damage.Clone();
if (comp.DamageGroups != null && !comp.DamageGroups.Empty)
{
var groupsHeal = _damageable.CreateWeightedHealFromGroups(uid, comp.DamageGroups);
var groupsHeal = _damageable.CreateWeightedHealFromGroups(contained, comp.DamageGroups);
finalDamage += groupsHeal;
}
}
@@ -69,13 +69,16 @@ public sealed class DamageInContainerSystem : EntitySystem
}
else if (comp.DamageGroups != null && !comp.DamageGroups.Empty)
{
finalDamage = _damageable.CreateWeightedHealFromGroups(uid, comp.DamageGroups);
finalDamage = _damageable.CreateWeightedHealFromGroups(contained, comp.DamageGroups);
}
else
{
continue;
}
if (finalDamage == null)
continue;
if (TryComp<MobStateComponent>(contained, out var mobState))
{
foreach (var allowedState in comp.AllowedStates)
@@ -0,0 +1,6 @@
using Content.Shared.Shaders;
using Content.Shared.Overlay;
namespace Content.Server.Overlay;
public sealed class NightVisionSystem : SharedToggleableEquipmentHudSystem<NightVisionComponent>;
@@ -210,7 +210,8 @@ public sealed partial class VampireSystem
if (!TryComp<EntityStorageComponent>(coffin, out var storage) || storage.Contents.ContainedEntities.Count == 0)
return;
foreach (var contentsEnt in storage.Contents.ContainedEntities)
var entities = storage.Contents.ContainedEntities.ToList();
foreach (var contentsEnt in entities)
{
_container.Remove(contentsEnt, storage.Contents);
_status.TryRemoveStatusEffect(contentsEnt, ForceSleeping);
@@ -33,6 +33,7 @@ using Content.Shared.Weapons.Ranged.Events;
using Content.Shared.Wieldable;
using Content.Shared.Zombies;
using Content.Shared.Lavaland.Events; // Corvax-Wega-Lavaland
using Content.Shared.Shaders; // Corvax-Wega-NightVision
namespace Content.Shared.Inventory;
@@ -106,7 +107,8 @@ public partial class InventorySystem
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<NoirOverlayComponent>>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<ThermalSightComponent>>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<RaveOverlayComponent>>(RefRelayInventoryEvent); // Corvax-Wega-Add
SubscribeLocalEvent<InventoryComponent, RefreshEquipmentHudEvent<NightVisionComponent>>(RefRelayInventoryEvent); // Corvax-Wega-Add
SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<EquipmentVerb>>(OnGetEquipmentVerbs);
SubscribeLocalEvent<InventoryComponent, GetVerbsEvent<InnateVerb>>(OnGetInnateVerbs);
@@ -15,10 +15,10 @@ public sealed partial class DamageInContainerComponent : Component
public float Interval = 1f;
[DataField, AutoNetworkedField]
public DamageSpecifier Damage = default!;
public DamageSpecifier? Damage = default!;
[DataField, AutoNetworkedField]
public GroupHealSpecifier DamageGroups = default!;
public GroupHealSpecifier? DamageGroups = default!;
[DataField]
public EntityWhitelist? Whitelist;
@@ -0,0 +1,115 @@
using Content.Shared.Actions;
using Content.Shared.Item.ItemToggle;
using Content.Shared.Overlays;
using Content.Shared.Popups;
using Content.Shared.PowerCell;
using Content.Shared.Toggleable;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Timing;
namespace Content.Shared.Overlay;
public abstract class SharedToggleableEquipmentHudSystem<T> : EntitySystem where T : ToggleableHudComponent
{
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly PowerCellSystem _powerCell = default!;
[Dependency] private readonly ActionContainerSystem _actionContainer = default!;
[Dependency] private readonly ItemToggleSystem _toggle = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<T, ToggleActionEvent>(OnToggleAction);
SubscribeLocalEvent<T, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<T, GetItemActionsEvent>(OnGetItemActions);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<T>();
while (query.MoveNext(out var uid, out var hud))
{
if (!hud.Enabled)
continue;
if (hud.NextChargeCheck >= _gameTiming.CurTime)
continue;
if (!_powerCell.HasDrawCharge(uid))
{
TurnOff((uid, hud));
continue;
}
hud.NextChargeCheck = _gameTiming.CurTime + hud.ChargeCheckInterval;
}
}
private void OnMapInit(Entity<T> ent, ref MapInitEvent args)
{
_actionContainer.EnsureAction(ent, ref ent.Comp.ActionEntity, ent.Comp.ToggleAction);
}
private void OnGetItemActions(Entity<T> ent, ref GetItemActionsEvent args)
{
if (args.InHands)
return;
args.AddAction(ref ent.Comp.ActionEntity, ent.Comp.ToggleAction);
_actions.SetToggled(ent.Comp.ActionEntity, ent.Comp.Enabled);
}
private void OnToggleAction(Entity<T> ent, ref ToggleActionEvent args)
{
if (args.Handled)
return;
args.Handled = true;
if (!ent.Comp.Enabled)
{
if (!_powerCell.HasDrawCharge(ent.Owner, user: args.Performer))
{
_audio.PlayPvs(ent.Comp.ActivateFailSound, ent);
_popup.PopupEntity(Loc.GetString("toggleable-hud-no-power"), ent, args.Performer);
return;
}
TryActivate(ent);
}
else
{
TurnOff(ent);
}
}
private bool TryActivate(Entity<T> ent)
{
if (!_toggle.TryActivate(ent.Owner))
return false;
ent.Comp.Enabled = true;
ent.Comp.NextChargeCheck = _gameTiming.CurTime;
_actions.SetToggled(ent.Comp.ActionEntity, ent.Comp.Enabled);
Dirty(ent);
return true;
}
private void TurnOff(Entity<T> ent)
{
if (!ent.Comp.Enabled)
return;
ent.Comp.Enabled = false;
_actions.SetToggled(ent.Comp.ActionEntity, ent.Comp.Enabled);
_toggle.TryDeactivate(ent.Owner);
Dirty(ent);
}
}
@@ -0,0 +1,27 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Audio;
namespace Content.Shared.Overlays;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
public abstract partial class ToggleableHudComponent : Component
{
[DataField]
public EntProtoId ToggleAction = "ActionToggleHud";
[DataField, AutoNetworkedField]
public EntityUid? ActionEntity;
[DataField]
public TimeSpan ChargeCheckInterval = TimeSpan.FromSeconds(1);
[ViewVariables]
public TimeSpan NextChargeCheck = TimeSpan.Zero;
[DataField, AutoNetworkedField]
public bool Enabled = false;
[DataField]
public SoundSpecifier ActivateFailSound = new SoundPathSpecifier("/Audio/Machines/button.ogg");
}
@@ -1,19 +1,20 @@
using Robust.Shared.GameStates;
using Content.Shared.Overlays;
namespace Content.Shared.Shaders;
[RegisterComponent, NetworkedComponent]
public sealed partial class NightVisionComponent : Component
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
public sealed partial class NightVisionComponent : ToggleableHudComponent
{
[DataField("brightness")]
public float Brightness = 1.5f;
[DataField("brightness"), AutoNetworkedField]
public float Brightness = 1f;
[DataField("tint")]
[DataField("tint"), AutoNetworkedField]
public Color Tint = Color.FromHex("#1c89f2");
[DataField("luminanceThreshold")]
public float LuminanceThreshold = 0.5f;
[DataField("luminanceThreshold"), AutoNetworkedField]
public float LuminanceThreshold = 0f;
[DataField("noiseAmount")]
[DataField("noiseAmount"), AutoNetworkedField]
public float NoiseAmount = 0.075f;
}
Binary file not shown.
@@ -15,3 +15,13 @@
license: "CC-BY-NC-4.0"
copyright: "Taken from CassetteRewind.flac by acclivity. Converted from Flac to Ogg."
source: "https://freesound.org/people/acclivity/sounds/23393/"
- files: ["activate.ogg"]
license: "CC-BY-NC-SA-3.0"
copyright: "Taken from TGstation"
source: "https://github.com/tgstation/tgstation"
- files: ["deactivate.ogg"]
license: "CC-BY-NC-SA-3.0"
copyright: "Taken from TGstation"
source: "https://github.com/tgstation/tgstation"
Binary file not shown.
@@ -0,0 +1,2 @@
health-analyzer-window-entity-precritical-text = Подкритическое
@@ -50,3 +50,5 @@ uplink-energy-shield-module-bundle-name = набор модулей энерге
uplink-energy-shield-module-bundle-desc = Комплект из пяти модулей энергетического щита в удобной сумке. Позволяет оснастить всю команду личной защитой.
uplink-xc67-agent-name = xC-67
uplink-xc67-agent-desc = Невероятная штурмовая винтовка xC-67, которая позволит бадаться со станцией на равной.
uplink-nightvision-name = прибор ночного видения
uplink-nightvision-desc = Прибор, благодаря которому вы сможете видеть в темноте. Очень полезен, если вы собираетесь сделать LIGHTS OFF!
@@ -179,7 +179,7 @@ corvax-chatsan-replacement-89 = доказал
corvax-chatsan-word-90 = брух
corvax-chatsan-replacement-90 = мда...
corvax-chatsan-word-91 = имба
corvax-chatsan-replacement-91 = имба # corvax-wega-edit
corvax-chatsan-replacement-91 = нечестно
corvax-chatsan-word-92 = разлокать
corvax-chatsan-replacement-92 = разблокировать
corvax-chatsan-word-93 = юзать
@@ -1,2 +1,4 @@
ent-ActionToggleNaturalNightVision = Переключение зрения
.desc = Моргните чтобы увидеть мир иначе.
.desc = Моргните чтобы увидеть мир иначе.
ent-ActionToggleHud = Переключить HUD
.desc = Переключает графический интерфейс элемента одежды.
@@ -3,4 +3,6 @@ ent-ClothingEyesGlassesMedSecSunglasses = мед-охранные очки
ent-ClothingEyesGlassesMedSunglasses = медицинские очки
.desc = Пара солнцезащитных очков с мед-охранным интерфейсом.
ent-ClothingEyesJudicialVisor = очки вершителя
.desc = Надёжные очки, при взгляде на которые вспоминается странное чувство греха.
.desc = Надёжные очки, при взгляде на которые вспоминается странное чувство греха.
ent-ClothingEyesGlassesNightVision = очки ночного зрения
.desc = Очки, позволяющие вам видеть сквозь тьму.
@@ -1,3 +1,7 @@
ent-ThiefPersonalAI = { ent-PersonalAI }
.desc = { ent-PersonalAI.desc }
.suffix = Воровской
.suffix = Воровской
ent-ActionPAIPolymorphBorgi = Форма "Гав"
.desc = Станьте борги и следуйте за своим хозяином.
ent-Borgi = борги
.desc = ПИИ теперь физически следует за вами, невероятно!
@@ -6,7 +6,7 @@
announcement: alert-level-green-announcement
color: Green
emergencyLightColor: LawnGreen
shuttleTime: 600
shuttleTime: 300 # Corvax-Wega-Edit
blue:
announcement: alert-level-blue-announcement
sound: /Audio/Misc/bluealert.ogg
@@ -46,6 +46,7 @@
color: PaleVioletRed
emergencyLightColor: PaleVioletRed
forceEnableEmergencyLights: true
shuttleTime: 600 # Corvax-Wega-Add
delta:
announcement: alert-level-delta-announcement
selectable: false
@@ -57,7 +58,7 @@
color: DarkRed
emergencyLightColor: Orange
forceEnableEmergencyLights: true
shuttleTime: 1200
shuttleTime: 300 # Corvax-Wega-Edit
epsilon:
announcement: alert-level-epsilon-announcement
selectable: false
@@ -344,11 +344,19 @@
- type: DamageInContainer
allowedStates:
- Alive
- PreCritical
- Critical
damage:
types:
Heat: -3
Blunt: -3
Heat: -6
Blunt: -6
Slash: -6
Piercing: -6
Shock: -2
damageGroups:
groups:
Brute: 0
Burn: 0
slotId: entity_storage
whitelist:
components:
@@ -49,13 +49,13 @@
recipes:
- ProximitySensor
# # Corvax-Wega-Android-Start
# - AndroidBodyPart
# - ArmSyntheticPry
# - ArmSyntheticDefib
# - ArmSyntheticProtoKinetic
# - ArmSyntheticCharger
# - LegSyntheticMagboots
# - LegSyntheticJump
- AndroidBodyPart
- ArmSyntheticPry
- ArmSyntheticDefib
- ArmSyntheticProtoKinetic
- ArmSyntheticCharger
- LegSyntheticMagboots
- LegSyntheticJump
# # Corvax-Wega-Android-End
- type: latheRecipePack
+1 -1
View File
@@ -13,7 +13,7 @@
- WeaponProtoKineticAccelerator
- ShuttleGunKineticCircuitboard
- BorgModuleKinetic # Corvax-Wega-Kinetic
# - ArmSyntheticProtoKinetic # Corvax-Wega-Androids
- ArmSyntheticProtoKinetic # Corvax-Wega-Androids
# These are roundstart but not replenishable for salvage
- type: technology
@@ -11,7 +11,6 @@
cost: 5000
recipeUnlocks:
- ProximitySensor
# - AndroidBodyPart # Corvax-Wega-Android
- BorgModuleRobotics # Corvax-Wega-Add
- type: technology
@@ -69,7 +68,7 @@
recipeUnlocks:
- ClothingShoesBootsMagSci
- ClothingShoesBootsMoon
# - LegSyntheticMagboots # Corvax-Wega-Androids
- LegSyntheticMagboots # Corvax-Wega-Androids
- MagnetSuitModule # Corvax-Wega-add
- type: technology
+1 -1
View File
@@ -44,7 +44,7 @@
- PowerCellHigh
- TurboItemRechargerCircuitboard
- SMESAdvancedMachineCircuitboard
# - ArmSyntheticCharger # Corvax-Wega-Androids
- ArmSyntheticCharger # Corvax-Wega-Androids
- type: technology
id: MechanicalCompression
@@ -25,6 +25,7 @@
# shoes: ClothingShoesColorBlack # Corvax-Wega-Edit
id: ChaplainPDA
ears: ClothingHeadsetService
belt: ClothingBeltSheathChaplinFilled
storage:
back:
- RubberStampChaplain
+14 -1
View File
@@ -21,6 +21,19 @@
- type: InstantAction
event: !type:DamageOnActionEvent
- type: entity
parent: BaseAction
id: ActionToggleHud
name: Toggle HUD
description: Toggles HUD of your cloth.
components:
- type: Action
itemIconStyle: BigItem
priority: -20
useDelay: 1
- type: InstantAction
event: !type:ToggleActionEvent
- type: entity
parent: BaseSuicideAction
id: ActionActivateBluespaceLifeline
@@ -36,4 +49,4 @@
sprite: _Wega/Effects/bluespace_lifeline.rsi
state: bluespace_lifeline
- type: InstantAction
event: !type:ActivateImplantEvent
event: !type:ActivateImplantEvent
@@ -555,6 +555,16 @@
TacticalResource: 1
categories:
- ERTEquipment
- type: listing
id: ERTNightVision
name: uplink-nightvision-name
description: uplink-nightvision-desc
productEntity: ClothingEyesGlassesNightVision
cost:
TacticalResource: 10
categories:
- ERTEquipment
- type: listing
id: ERTRCDCombat
@@ -423,6 +423,19 @@
whitelist:
tags:
- NukeOpsUplink
- type: listing
id: UplinkNightVision
name: uplink-nightvision-name
description: uplink-nightvision-desc
productEntity: ClothingEyesGlassesNightVision
discountCategory: usualDiscounts
discountDownTo:
Telecrystal: 2
cost:
Telecrystal: 3
categories:
- UplinkWearables
- type: listing
id: UplinkLoyaltyImplant
@@ -37,6 +37,39 @@
- type: Construction
graph: GlassesMedSec
node: medsecGlasses
- type: entity
parent: ClothingEyesBase
id: ClothingEyesGlassesNightVision
name: night vision goggles
description: a pair of goggles that allows you to see through dark.
components:
- type: Sprite
sprite: _Wega/Clothing/Eyes/nightvision.rsi
layers:
- state: icon-off
map: [ "enum.ToggleableVisuals.Layer" ]
- type: Clothing
sprite: _Wega/Clothing/Eyes/nightvision.rsi
- type: Tag
tags:
- WhitelistChameleon
- type: IdentityBlocker
coverage: EYES
- type: NightVision
tint: "#00800000"
- type: ItemToggle
soundActivate: /Audio/_Wega/Items/activate.ogg
soundDeactivate: /Audio/_Wega/Items/deactivate.ogg
onUse: false
onActivate: false
- type: Appearance
- type: GenericVisualizer
visuals:
enum.ToggleableVisuals.Enabled:
enum.ToggleableVisuals.Layer:
True: { state: "icon" }
False: { state: "icon-off" }
# ADT
@@ -267,12 +267,12 @@
whitelist:
components:
- BorgModule
# - hand:
# emptyRepresentative: LeftArmSyntheticPry
# emptyLabel: borg-slot-bodypart-empty
# whitelist:
# tags:
# - BaseBodyPart
- hand:
emptyRepresentative: ArmSyntheticPry
emptyLabel: borg-slot-bodypart-empty
whitelist:
tags:
- BaseBodyPart
- hand:
emptyRepresentative: PowerCellSmall
emptyLabel: borg-slot-powercell-empty
@@ -17,7 +17,14 @@
damage:
types:
Heat: -3
Blunt: -3
Blunt: -3
Slash: -3
Piercing: -3
Shock: -1
damageGroups:
groups:
Brute: 0
Burn: 0
slotId: entity_storage
whitelist:
components:
@@ -175,80 +175,80 @@
Gold: 500
Plasma: 500
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: ArmSyntheticPry
# result: LeftArmSyntheticPry
# categories:
# - Android
# completetime: 5
# materials:
# Steel: 750
# Plastic: 300
# Gold: 200
# Plasma: 150
- type: latheRecipe
parent: BaseRoboticsRecipe
id: ArmSyntheticPry
result: ArmSyntheticPry
categories:
- Android
completetime: 5
materials:
Steel: 750
Plastic: 300
Gold: 200
Plasma: 150
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: ArmSyntheticDefib
# result: LeftArmSyntheticDefib
# categories:
# - Android
# completetime: 5
# materials:
# Steel: 750
# Plastic: 300
# Silver: 250
- type: latheRecipe
parent: BaseRoboticsRecipe
id: ArmSyntheticDefib
result: ArmSyntheticDefib
categories:
- Android
completetime: 5
materials:
Steel: 750
Plastic: 300
Silver: 250
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: ArmSyntheticProtoKinetic
# result: LeftArmSyntheticProtoKinetic
# categories:
# - Android
# completetime: 5
# materials:
# Steel: 750
# Plastic: 300
# Silver: 200
# Plasma: 150
- type: latheRecipe
parent: BaseRoboticsRecipe
id: ArmSyntheticProtoKinetic
result: ArmSyntheticProtoKinetic
categories:
- Android
completetime: 5
materials:
Steel: 750
Plastic: 300
Silver: 200
Plasma: 150
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: ArmSyntheticCharger
# result: LeftArmSyntheticCharger
# categories:
# - Android
# completetime: 5
# materials:
# Steel: 750
# Plastic: 300
# Gold: 200
- type: latheRecipe
parent: BaseRoboticsRecipe
id: ArmSyntheticCharger
result: ArmSyntheticCharger
categories:
- Android
completetime: 5
materials:
Steel: 750
Plastic: 300
Gold: 200
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: LegSyntheticMagboots
# result: LeftLegSyntheticMagboots
# categories:
# - Android
# completetime: 5
# materials:
# Steel: 750
# Plastic: 300
# Gold: 300
- type: latheRecipe
parent: BaseRoboticsRecipe
id: LegSyntheticMagboots
result: LegSyntheticMagboots
categories:
- Android
completetime: 5
materials:
Steel: 750
Plastic: 300
Gold: 300
# - type: latheRecipe
# parent: BaseRoboticsRecipe
# id: LegSyntheticJump
# result: LeftLegSyntheticJump
# categories:
# - Android
# completetime: 5
# materials:
# Steel: 750
# Plastic: 300
# Gold: 250
# Plasma: 150
- type: latheRecipe
parent: BaseRoboticsRecipe
id: LegSyntheticJump
result: LegSyntheticJump
categories:
- Android
completetime: 5
materials:
Steel: 750
Plastic: 300
Gold: 250
Plasma: 150
- type: latheRecipe
parent: BaseRoboticsRecipe
@@ -99,6 +99,7 @@
- AdvancedJetInjector
- Hynospray
- DefibrillatorCompact
- ArmSyntheticDefib
- type: technology
id: ChemicalDispensary
@@ -24,8 +24,8 @@
- OreBagSuitModule
- DrillSuitModule
- EngineeringPlating
# - ArmSyntheticPry
# - LegSyntheticJump
- ArmSyntheticPry
- LegSyntheticJump
- type: technology
id: Gidravlik
@@ -69,37 +69,3 @@
inhand:
- WeaponHellDagger
- type: startingGear
id: BloodCultSpellStunGear
inhand:
- BloodCultSpellStun
- type: startingGear
id: BloodCultSpellTeleportGear
inhand:
- BloodCultSpellTeleport
- type: startingGear
id: BloodCultSpellShadowShacklesGear
inhand:
- BloodCultSpellShadowShackles
- type: startingGear
id: BloodCultSpellTwistedConstructionGear
inhand:
- BloodCultSpellTwistedConstruction
- type: startingGear
id: BloodCultSpellSummonEquipmentGear
inhand:
- BloodCultSpellSummonEquipment
- type: startingGear
id: BloodCultSpellBloodRitesGear
inhand:
- BloodCultSpellBloodRites
- type: startingGear
id: BloodCultSpellBloodBarrageGear
inhand:
- BloodCultSpellBloodBarrage
Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

@@ -0,0 +1,47 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at https://github.com/tgstation/tgstation , icon-off is og icon modified by MartynDew",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "equipped-EYES",
"directions": 4,
"delays": [
[
0.1,
0.1
],
[
0.1,
0.1
],
[
0.1,
0.1
],
[
0.1,
0.1
]
]
},
{
"name": "icon"
},
{
"name": "icon-off"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}
+8 -13
View File
@@ -13,19 +13,14 @@ void fragment() {
highp float grey = dot(color.rgb, vec3(0.299, 0.587, 0.114));
highp float threshold = grey * luminance_threshold;
if (grey < threshold) {
grey += (threshold - grey) * brightness;
grey = min(grey, 1.0);
if (grey < luminance_threshold) {
grey += (luminance_threshold - grey) * brightness;
}
highp vec3 night_color = mix(color.rgb, tint * grey, 0.8);
highp float noise = (rand(UV + TIME) - 0.5) * noise_amount * (0.5 - grey * 0.5);
night_color += noise;
night_color *= 0.5;
grey = clamp(grey, 0.0, 1.0);
highp vec3 night_color = tint * grey;
highp float noise = (rand(UV + TIME) - 0.5) * noise_amount * (1.0 - grey);
night_color += vec3(noise);
COLOR = vec4(clamp(night_color, 0.0, 1.0), color.a);
}