Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Jabak
2024-06-28 11:45:35 +03:00
346 changed files with 1792 additions and 213 deletions

View File

@@ -93,11 +93,14 @@ namespace Content.Client.Popups
_aliveWorldLabels.Add(label);
// START WhiteDream
// START WhiteDream
if (!_isLogging)
return;
if (!_examine.InRangeUnOccluded(_playerManager.LocalEntity!.Value, coordinates, 10))
if (_playerManager.LocalEntity == null)
return;
if (!_examine.InRangeUnOccluded(_playerManager.LocalEntity.Value, coordinates, 10))
return;
var fontSizeDict = new Dictionary<PopupType, string>
@@ -117,7 +120,7 @@ namespace Content.Client.Popups
var chatMsg = new ChatMessage(ChatChannel.Emotes, message, wrappedMEssage,
GetNetEntity(EntityUid.Invalid), null);
_uiManager.GetUIController<ChatUIController>().ProcessChatMessage(chatMsg);
// END WhiteDream
}

View File

@@ -32,6 +32,9 @@ public sealed class FlipOnHitSystem : SharedFlipOnHitSystem
if (!_timing.IsFirstTimePredicted)
return;
if (TerminatingOrDeleted(user))
return;
if (_animationSystem.HasRunningAnimation(user, EmoteAnimationSystem.AnimationKey))
{
EnsureComp<FlippingComponent>(user);

View File

@@ -9,6 +9,7 @@ using Content.Shared.Verbs;
using Robust.Shared.Player;
using Robust.Shared.Utility;
using Content.Server._White.Cult.GameRule;
using Content.Server._White.Wizard;
namespace Content.Server.Administration.Systems;
@@ -22,6 +23,7 @@ public sealed partial class AdminVerbSystem
[Dependency] private readonly PiratesRuleSystem _piratesRule = default!;
[Dependency] private readonly RevolutionaryRuleSystem _revolutionaryRule = default!;
[Dependency] private readonly CultRuleSystem _cultRule = default!;
[Dependency] private readonly WizardRuleSystem _wizardRule = default!;
// All antag verbs have names so invokeverb works.
private void AddAntagVerbs(GetVerbsEvent<Verb> args)
@@ -150,8 +152,21 @@ public sealed partial class AdminVerbSystem
Impact = LogImpact.High,
Message = Loc.GetString("admin-verb-make-changeling"),
};
args.Verbs.Add(changeling);
//WD edit end
Verb wizard = new()
{
Text = Loc.GetString("admin-verb-text-make-wizard"),
Category = VerbCategory.Antag,
Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Clothing/Head/Hats/wizardhat.rsi/icon.png")),
Act = () =>
{
_wizardRule.AdminMakeWizard(args.Target);
},
Impact = LogImpact.High,
Message = Loc.GetString("admin-verb-make-wizard"),
};
args.Verbs.Add(wizard);
}
//WD edit end
}

View File

@@ -3,6 +3,7 @@ using Content.Server.Administration;
using Content.Server.Atmos.Components;
using Content.Shared.Administration;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Components;
using Robust.Shared.Console;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
@@ -84,44 +85,72 @@ public sealed partial class AtmosphereSystem
continue;
}
var transform = Transform(euid.Value);
// Force Invalidate & update air on all tiles
Entity<GridAtmosphereComponent, GasTileOverlayComponent, MapGridComponent, TransformComponent> grid =
new(euid.Value, gridAtmosphere, Comp<GasTileOverlayComponent>(euid.Value), gridComp, Transform(euid.Value));
foreach (var (indices, tileMain) in gridAtmosphere.Tiles)
RebuildGridTiles(grid);
var query = GetEntityQuery<AtmosFixMarkerComponent>();
foreach (var (indices, tile) in gridAtmosphere.Tiles.ToArray())
{
var tile = tileMain.Air;
if (tile == null)
if (tile.Air is not {Immutable: false} air)
continue;
if (!_mapSystem.TryGetTile(gridComp, indices, out var gTile) || gTile.IsEmpty)
{
gridAtmosphere.Tiles.Remove(indices);
continue;
}
if (tile.Immutable && !IsTileSpace(euid, transform.MapUid, indices))
{
tile = new GasMixture(tile.Volume) { Temperature = tile.Temperature };
tileMain.Air = tile;
}
tile.Clear();
air.Clear();
var mixtureId = 0;
foreach (var entUid in gridComp.GetAnchoredEntities(indices))
var enumerator = _mapSystem.GetAnchoredEntitiesEnumerator(grid, grid, indices);
while (enumerator.MoveNext(out var entUid))
{
if (!TryComp(entUid, out AtmosFixMarkerComponent? afm))
continue;
mixtureId = afm.Mode;
break;
if (query.TryComp(entUid, out var marker))
mixtureId = marker.Mode;
}
var mixture = mixtures[mixtureId];
Merge(tile, mixture);
tile.Temperature = mixture.Temperature;
gridAtmosphere.InvalidatedCoords.Add(indices);
var mixture = mixtures[mixtureId];
Merge(air, mixture);
air.Temperature = mixture.Temperature;
}
}
}
/// <summary>
/// Clears & re-creates all references to <see cref="TileAtmosphere"/>s stored on a grid.
/// </summary>
private void RebuildGridTiles(
Entity<GridAtmosphereComponent, GasTileOverlayComponent, MapGridComponent, TransformComponent> ent)
{
foreach (var indices in ent.Comp1.Tiles.Keys)
{
InvalidateVisuals((ent, ent), indices);
}
var atmos = ent.Comp1;
atmos.MapTiles.Clear();
atmos.ActiveTiles.Clear();
atmos.ExcitedGroups.Clear();
atmos.HotspotTiles.Clear();
atmos.SuperconductivityTiles.Clear();
atmos.HighPressureDelta.Clear();
atmos.CurrentRunTiles.Clear();
atmos.CurrentRunExcitedGroups.Clear();
atmos.InvalidatedCoords.Clear();
atmos.CurrentRunInvalidatedTiles.Clear();
atmos.PossiblyDisconnectedTiles.Clear();
atmos.Tiles.Clear();
var volume = GetVolumeForTiles(ent);
TryComp(ent.Comp4.MapUid, out MapAtmosphereComponent? mapAtmos);
var enumerator = _map.GetAllTilesEnumerator(ent, ent);
while (enumerator.MoveNext(out var tileRef))
{
var tile = GetOrNewTile(ent, ent, tileRef.Value.GridIndices);
UpdateTileData(ent, mapAtmos, tile);
UpdateAdjacentTiles(ent, tile, activate: true);
UpdateTileAir(ent, tile, volume);
}
}
private CompletionResult FixGridAtmosCommandCompletions(IConsoleShell shell, string[] args)
{
MapId? playerMap = null;

View File

@@ -30,13 +30,15 @@ namespace Content.Server.Atmos.EntitySystems
private int _currentRunAtmosphereIndex;
private bool _simulationPaused;
private TileAtmosphere GetOrNewTile(EntityUid owner, GridAtmosphereComponent atmosphere, Vector2i index)
private TileAtmosphere GetOrNewTile(EntityUid owner, GridAtmosphereComponent atmosphere, Vector2i index, bool invalidateNew = true)
{
var tile = atmosphere.Tiles.GetOrNew(index, out var existing);
if (existing)
return tile;
atmosphere.InvalidatedCoords.Add(index);
if (invalidateNew)
atmosphere.InvalidatedCoords.Add(index);
tile.GridIndex = owner;
tile.GridIndices = index;
return tile;
@@ -68,7 +70,7 @@ namespace Content.Server.Atmos.EntitySystems
atmosphere.CurrentRunInvalidatedTiles.EnsureCapacity(atmosphere.InvalidatedCoords.Count);
foreach (var indices in atmosphere.InvalidatedCoords)
{
var tile = GetOrNewTile(uid, atmosphere, indices);
var tile = GetOrNewTile(uid, atmosphere, indices, invalidateNew: false);
atmosphere.CurrentRunInvalidatedTiles.Enqueue(tile);
// Update tile.IsSpace and tile.MapAtmosphere, and tile.AirtightData.

View File

@@ -14,7 +14,7 @@ namespace Content.Server.Audio;
public sealed class ContentAudioSystem : SharedContentAudioSystem
{
[ValidatePrototypeId<SoundCollectionPrototype>]
private const string LobbyMusicCollection = "LobbyMusic";
private const string LobbyMusicCollection = "LobbyMusicWhite";
[Dependency] private readonly AudioSystem _serverAudio = default!;
[Dependency] private readonly IRobustRandom _robustRandom = default!;

View File

@@ -1,3 +1,4 @@
using Content.Server._White.Accent.Bloodloss;
using Content.Server.Body.Components;
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Chemistry.ReactionEffects;
@@ -43,6 +44,7 @@ public sealed class BloodstreamSystem : EntitySystem
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
[Dependency] private readonly ForensicsSystem _forensicsSystem = default!;
[Dependency] private readonly MovementSpeedModifierSystem _speed = default!; // WD
[Dependency] private readonly BloodLossAccent _bloodLossAccent = default!;
public override void Initialize()
{
@@ -158,7 +160,7 @@ public sealed class BloodstreamSystem : EntitySystem
uid,
(float) bloodstream.UpdateInterval.TotalSeconds * 2,
applySlur: false);
_stutteringSystem.DoStutter(uid, bloodstream.UpdateInterval * 2, refresh: false);
_bloodLossAccent.StartBloodLossAccent(uid, bloodstream.UpdateInterval * 2, refresh: false);
// storing the drunk and stutter time so we can remove it independently from other effects additions
bloodstream.StatusTime += bloodstream.UpdateInterval * 2;
@@ -173,7 +175,7 @@ public sealed class BloodstreamSystem : EntitySystem
// Remove the drunk effect when healthy. Should only remove the amount of drunk and stutter added by low blood level
_drunkSystem.TryRemoveDrunkenessTime(uid, bloodstream.StatusTime.TotalSeconds);
_stutteringSystem.DoRemoveStutterTime(uid, bloodstream.StatusTime.TotalSeconds);
_bloodLossAccent.StopBloodLossAccent(uid, bloodstream.StatusTime.TotalSeconds);
// Reset the drunk and stutter time to zero
bloodstream.StatusTime = TimeSpan.Zero;
}

View File

@@ -1,7 +1,10 @@
using System.Linq;
using Content.Server.Administration;
using Content.Server.Administration.Logs;
using Content.Server.Chat.Managers;
using Content.Server.GameTicking.Presets;
using Content.Shared.Administration;
using Content.Shared.Database;
using Robust.Shared.Console;
using Robust.Shared.Prototypes;
@@ -10,6 +13,9 @@ namespace Content.Server.GameTicking.Commands
[AdminCommand(AdminFlags.Round)]
sealed class ForcePresetCommand : IConsoleCommand
{
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly IChatManager _chatManager = default!;
public string Command => "forcepreset";
public string Description => "Forces a specific game preset to start for the current lobby.";
public string Help => $"Usage: {Command} <preset>";
@@ -36,8 +42,19 @@ namespace Content.Server.GameTicking.Commands
return;
}
ticker.SetGamePreset(type, true);
shell.WriteLine($"Forced the game to start with preset {name}.");
ticker.SetGamePreset(type);
_adminLogger.Add(LogType.EventStarted, $"Forced {type.ID} for secret.");
var player = "Someone";
if (shell.Player != null)
player = shell.Player.Name;
_chatManager.SendAdminAnnouncement($"{player} forced {type.ID} for secret.");
shell.WriteLine($"forced the game to start with preset {name}.");
ticker.UpdateInfoText();
}

View File

@@ -38,6 +38,7 @@ using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Systems;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager.Exceptions;
using Robust.Shared.Timing;
using InvisibilityComponent = Content.Shared._White.Administration.InvisibilityComponent;
@@ -455,8 +456,10 @@ namespace Content.Server.Ghost
{
var entity = mindContainer.Owner;
if (!(HasComp<HumanoidAppearanceComponent>(entity) || HasComp<GhostComponent>(entity)) ||
HasComp<GlobalAntagonistComponent>(entity))
if (!(HasComp<HumanoidAppearanceComponent>(entity) || HasComp<GhostComponent>(entity)))
continue;
if (HasComp<GlobalAntagonistComponent>(entity))
continue;
var playerDepartmentId = _prototypeManager.Index<DepartmentPrototype>("Specific").ID;
@@ -503,9 +506,12 @@ namespace Content.Server.Ghost
foreach (var antagonist in EntityQuery<GlobalAntagonistComponent>())
{
var entity = antagonist.Owner;
if (!_mobState.IsAlive(entity))
continue;
var prototype =
_prototypeManager.Index<AntagonistPrototype>(antagonist.AntagonistPrototype ??
"globalAntagonistUnknown");
_prototypeManager.Index<AntagonistPrototype>(antagonist.AntagonistPrototype ?? "globalAntagonistUnknown");
var warp = new GhostWarpGlobalAntagonist(
GetNetEntity(entity),

View File

@@ -1,10 +1,13 @@
using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Body.Systems;
using Content.Server.Kitchen.Components;
using Content.Server.Popups;
using Content.Shared.Body.Components;
using Content.Shared.Database;
using Content.Shared.DoAfter;
using Content.Shared.DragDrop;
using Content.Shared.Examine;
using Content.Shared.IdentityManagement;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
@@ -50,9 +53,21 @@ namespace Content.Server.Kitchen.EntitySystems
SubscribeLocalEvent<KitchenSpikeComponent, SuicideEvent>(OnSuicide);
SubscribeLocalEvent<KitchenSpikeComponent, ExaminedEvent>(OnExamine);
SubscribeLocalEvent<ButcherableComponent, CanDropDraggedEvent>(OnButcherableCanDrop);
}
private void OnExamine(Entity<KitchenSpikeComponent> ent, ref ExaminedEvent args)
{
var (uid, comp) = ent;
if (comp.Victim is not "?" or "")
{
args.PushMarkup(Loc.GetString("comp-kitchen-spike-examine", ("this", uid), ("victim", comp.Victim)));
}
}
private void OnButcherableCanDrop(EntityUid uid, ButcherableComponent component, ref CanDropDraggedEvent args)
{
args.Handled = true;
@@ -152,7 +167,8 @@ namespace Content.Server.Kitchen.EntitySystems
// THE WHAT?
// TODO: Need to be able to leave them on the spike to do DoT, see ss13.
var gibs = _bodySystem.GibBody(victimUid);
foreach (var gib in gibs) {
foreach (var gib in gibs.Where(HasComp<BodyComponent>)) // WD EDIT
{
QueueDel(gib);
}
@@ -236,21 +252,23 @@ namespace Content.Server.Kitchen.EntitySystems
// THE WHAT? (again)
// Prevent dead from being spiked TODO: Maybe remove when rounds can be played and DOT is implemented
if (Resolve(victimUid, ref mobState, false) &&
/*if (Resolve(victimUid, ref mobState, false) &&
_mobStateSystem.IsAlive(victimUid, mobState))
{
_popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-deny-not-dead", ("victim", Identity.Entity(victimUid, EntityManager))),
victimUid, userUid);
return true;
}
}*/
// WD EDIT
if (userUid != victimUid)
{
_popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-begin-hook-victim", ("user", Identity.Entity(userUid, EntityManager)), ("this", uid)), victimUid, victimUid, PopupType.LargeCaution);
}
// TODO: make it work when SuicideEvent is implemented
// else
// _popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-begin-hook-self", ("this", uid)), victimUid, Filter.Pvs(uid)); // This is actually unreachable and should be in SuicideEvent
else
{
_popupSystem.PopupEntity(Loc.GetString("comp-kitchen-spike-begin-hook-self", ("this", uid)), victimUid,
victimUid); // This is actually unreachable and should be in SuicideEvent
}
butcherable.BeingButchered = true;
component.InUse = true;

View File

@@ -63,9 +63,6 @@ namespace Content.Server.Light.Components
[DataField("togglePort", customTypeSerializer: typeof(PrototypeIdSerializer<SinkPortPrototype>))]
public string TogglePort = "Toggle";
[DataField("statusPort", customTypeSerializer: typeof(PrototypeIdSerializer<SourcePortPrototype>))]
public string StatusPort = "LightStatus";
/// <summary>
/// How long it takes to eject a bulb from this
/// </summary>

View File

@@ -76,7 +76,6 @@ namespace Content.Server.Light.EntitySystems
{
light.LightBulbContainer = _containerSystem.EnsureContainer<ContainerSlot>(uid, LightBulbContainer);
_signalSystem.EnsureSinkPorts(uid, light.OnPort, light.OffPort, light.TogglePort);
_signalSystem.EnsureSourcePorts(uid, light.StatusPort); // WD
}
private void OnMapInit(EntityUid uid, PoweredLightComponent light, MapInitEvent args)
@@ -447,14 +446,6 @@ namespace Content.Server.Light.EntitySystems
light.On = !light.On;
// WD START
var data = new NetworkPayload
{
{DeviceNetworkConstants.LogicState, light.On ? SignalState.High : SignalState.Low}
};
_signalSystem.InvokePort(uid, light.StatusPort, data);
// WD END
UpdateLight(uid, light);
}

View File

@@ -0,0 +1,66 @@
using System.Text;
using Content.Server.Speech;
using Content.Shared.StatusEffect;
using Robust.Shared.Random;
namespace Content.Server._White.Accent.Bloodloss;
public sealed class BloodLossAccent : EntitySystem
{
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BloodLossAccentComponent, AccentGetEvent>(OnAccent);
}
public void StartBloodLossAccent(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null)
{
if (!Resolve(uid, ref status, false))
return;
_statusEffectsSystem.TryAddStatusEffect<BloodLossAccentComponent>(uid, "BloodLoss", time, refresh, status);
}
public void StopBloodLossAccent(EntityUid uid, double timeRemoved)
{
_statusEffectsSystem.TryRemoveTime(uid, "BloodLoss", TimeSpan.FromSeconds(timeRemoved));
}
private void OnAccent(EntityUid uid, BloodLossAccentComponent component, AccentGetEvent args)
{
args.Message = Accentuate(args.Message, component);
}
public string Accentuate(string message, BloodLossAccentComponent component)
{
if (string.IsNullOrEmpty(message))
{
return message;
}
var result = new StringBuilder();
string[] words = message.Split(' ');
foreach (var word in words)
{
if (word.Length >= 3 && _random.NextDouble() < component.ReplaceProb)
{
int start = Random.Shared.Next(1, word.Length - 1);
int end = start + Random.Shared.Next(1, word.Length - start);
result.Append(word.Substring(0, start) + component.ToReplace + word.Substring(end));
}
else
{
result.Append(word);
}
result.Append(' ');
}
return result.ToString().TrimEnd();
}
}

View File

@@ -0,0 +1,13 @@
namespace Content.Server._White.Accent.Bloodloss;
[RegisterComponent]
public sealed partial class BloodLossAccentComponent : Component
{
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public float ReplaceProb = 0.6f;
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public string ToReplace = "...";
}

View File

@@ -12,6 +12,7 @@ using Content.Shared.Physics;
using Content.Shared.StatusEffect;
using Content.Shared._White.Cult;
using Content.Shared._White.Cult.Components;
using Content.Shared.Throwing;
namespace Content.Server._White.Cult.Runes.Systems;
@@ -34,6 +35,7 @@ public partial class CultSystem
SubscribeLocalEvent<WraithPhaseActionEvent>(OnWraithPhase);
SubscribeLocalEvent<IncorporealComponent, AttackAttemptEvent>(OnAttackAttempt);
SubscribeLocalEvent<IncorporealComponent, ThrowAttemptEvent>(OnThrowAttempt);
SubscribeLocalEvent<JuggernautCreateWallActionEvent>(OnJuggernautCreateWall);
@@ -163,6 +165,14 @@ public partial class CultSystem
}
}
private void OnThrowAttempt(Entity<IncorporealComponent> ent, ref ThrowAttemptEvent args)
{
if (_statusEffectsSystem.HasStatusEffect(args.Uid, "Incorporeal"))
{
_statusEffectsSystem.TryRemoveStatusEffect(args.Uid, "Incorporeal");
}
}
private void OnJuggernautCreateWall(JuggernautCreateWallActionEvent ev)
{
if (!TrySpawnWall(ev.Performer, ev.WallPrototypeId))

View File

@@ -1,20 +1,25 @@
using System.Linq;
using Content.Server.Actions;
using Content.Shared._White.Wizard.Magic;
using Content.Shared.Actions;
using Content.Shared.Eye;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
using Content.Shared.Movement.Systems;
using Content.Shared.Physics;
using Content.Shared.Stealth;
using Content.Shared.Stealth.Components;
using Robust.Server.GameObjects;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Systems;
using Robust.Shared.Timing;
namespace Content.Server._White.IncorporealSystem;
public sealed class IncorporealSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly MovementSpeedModifierSystem _movement = default!;
[Dependency] private readonly ActionsSystem _actions = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly VisibilitySystem _visibilitySystem = default!;
[Dependency] private readonly SharedStealthSystem _stealth = default!;
@@ -78,6 +83,21 @@ public sealed class IncorporealSystem : EntitySystem
_stealth.SetVisibility(uid, 1);
RemComp<StealthComponent>(uid);
_movement.RefreshMovementSpeedModifiers(uid);
if (!TryComp(uid, out ActionsContainerComponent? container))
return;
var cooldown = TimeSpan.FromSeconds(3);
foreach (var action in container.Container.ContainedEntities.Where(HasComp<MagicComponent>))
{
if (!_actions.TryGetActionData(action, out var comp, false))
continue;
if (comp.Cooldown.HasValue && comp.Cooldown.Value.End >= _timing.CurTime + cooldown)
continue;
_actions.SetCooldown(action, cooldown);
}
}
private void OnRefresh(EntityUid uid, IncorporealComponent component, RefreshMovementSpeedModifiersEvent args)

View File

@@ -24,7 +24,7 @@ public sealed class AmaterasuSystem : EntitySystem
if (flammable.OnFire)
{
_bodySystem.GibBody(uid);
_bodySystem.GibBody(uid, true);
return;
}

View File

@@ -300,10 +300,10 @@ public sealed class WizardRuleSystem : GameRuleSystem<WizardRuleComponent>
_npcFaction.AddFaction(mob, "Wizard");
}
private void SpawnWizard(ICommonSession? session, WizardRuleComponent component, bool spawnGhostRoles = true)
private EntityCoordinates WizardSpawnPoint(WizardRuleComponent component)
{
if (component.ShuttleMap is not {Valid: true} mapUid)
return;
return EntityCoordinates.Invalid;
var spawn = new EntityCoordinates();
foreach (var (_, meta, xform) in EntityQuery<SpawnPointComponent, MetaDataComponent, TransformComponent>(true))
@@ -318,13 +318,25 @@ public sealed class WizardRuleSystem : GameRuleSystem<WizardRuleComponent>
break;
}
//Fallback, spawn at the centre of the map
// Fallback, spawn at the centre of the map
if (spawn == new EntityCoordinates())
{
spawn = Transform(mapUid).Coordinates;
_sawmill.Warning("Fell back to default spawn for wizard!");
}
return spawn;
}
private void SpawnWizard(ICommonSession? session, WizardRuleComponent component, bool spawnGhostRoles = true)
{
var spawn = WizardSpawnPoint(component);
if (spawn == EntityCoordinates.Invalid)
{
_sawmill.Error("Failed to calculate wizard spawn point");
return;
}
var wizardAntag = _prototypeManager.Index(component.WizardRoleProto);
//If a session is available, spawn mob and transfer mind into it
@@ -395,4 +407,62 @@ public sealed class WizardRuleSystem : GameRuleSystem<WizardRuleComponent>
ICommonSession? session = null;
SpawnWizard(session, component, true);
}
/// <summary>
/// Makes mob a wizard through admin verb button
/// </summary>
public void AdminMakeWizard(EntityUid uid)
{
var rule = EntityQuery<WizardRuleComponent>().FirstOrDefault();
if (rule == null)
{
GameTicker.StartGameRule("Wizard", out var ruleEntity);
rule = Comp<WizardRuleComponent>(ruleEntity);
}
if (HasComp<WizardComponent>(uid))
return;
MakeWizard(uid, rule, true);
}
private bool MakeWizard(EntityUid wizard, WizardRuleComponent rule,
bool giveObjectives = true)
{
if (!_mind.TryGetMind(wizard, out var mindId, out var mind))
{
Log.Info("Failed getting mind for picked wizard.");
return false;
}
if (HasComp<WizardRoleComponent>(mindId))
{
Log.Error($"Player {mind.CharacterName} is already a wizard.");
return false;
}
HumanoidCharacterProfile? profile = null;
if (TryComp(wizard, out ActorComponent? actor))
profile = _prefs.GetPreferences(actor.PlayerSession.UserId).SelectedCharacter as HumanoidCharacterProfile;
if (giveObjectives)
{
AddRole(mindId, mind, rule);
}
if (!_prototypeManager.TryIndex(rule.StartingGear, out var gear))
{
_sawmill.Error("Failed to load wizard gear prototype");
return false;
}
SetupWizardEntity(wizard, gear, profile, false);
var spawnpoint = WizardSpawnPoint(rule);
var transform = EnsureComp<TransformComponent>(wizard);
transform.Coordinates = spawnpoint;
return true;
}
}

View File

@@ -9,7 +9,7 @@ namespace Content.Shared.Kitchen.Components;
public sealed partial class KitchenSpikeComponent : Component
{
[DataField("delay")]
public float SpikeDelay = 7.0f;
public float SpikeDelay = 2.0f;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("sound")]

View File

@@ -285,6 +285,7 @@ public abstract partial class SharedProjectileSystem : EntitySystem
new RemoveEmbeddedProjectileEvent(), eventTarget: uid, target: uid)
{
DistanceThreshold = SharedInteractionSystem.InteractionRange,
CancelDuplicate = false
}, doAfter);
return true;

View File

@@ -4,13 +4,13 @@ namespace Content.Shared._White.Cult.Components;
public sealed partial class CultBuffComponent : Component
{
[ViewVariables(VVAccess.ReadOnly), DataField]
public TimeSpan BuffTime = TimeSpan.FromSeconds(60);
public TimeSpan BuffTime = TimeSpan.FromSeconds(20);
[ViewVariables(VVAccess.ReadOnly), DataField]
public TimeSpan StartingBuffTime = TimeSpan.FromSeconds(60);
public TimeSpan StartingBuffTime = TimeSpan.FromSeconds(20);
[ViewVariables(VVAccess.ReadOnly), DataField]
public TimeSpan BuffLimit = TimeSpan.FromSeconds(55);
public TimeSpan BuffLimit = TimeSpan.FromSeconds(10);
public static float NearbyTilesBuffRadius = 1f;

View File

@@ -4933,3 +4933,98 @@
id: 326
time: '2024-06-26T02:13:42.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/378
- author: Aviu
changes:
- message: "\u041D\u0430 \u043C\u044F\u0441\u043D\u043E\u0439 \u043A\u0440\u044E\
\u043A \u043C\u043E\u0436\u043D\u043E \u043F\u043E\u0432\u0435\u0441\u0438\u0442\
\u044C \u0436\u0438\u0432\u044B\u0445 \u0446\u0435\u043B\u0435\u0439, \u0432\
\ \u0442\u043E\u043C \u0447\u0438\u0441\u043B\u0435 \u0438 \u0441\u0435\u0431\
\u044F, \u0434\u0443\u0430\u0444\u0442\u0435\u0440 \u0443\u043C\u0435\u043D\u044C\
\u0448\u0435\u043D."
type: Add
- message: "\u0422\u0435\u043F\u0435\u0440\u044C \u043C\u043E\u0436\u043D\u043E\
\ \u0443\u0437\u043D\u0430\u0442\u044C, \u0447\u044C\u044F \u0442\u0443\u0448\
\u0430 \u0432\u0438\u0441\u0438\u0442 \u043D\u0430 \u043C\u044F\u0441\u043D\u043E\
\u043C \u043A\u0440\u044E\u043A\u0435, \u0435\u0441\u043B\u0438 \u043E\u0441\
\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0435\u0433\u043E."
type: Add
- message: "\u041F\u0440\u0438 \u0432\u044B\u0445\u043E\u0434\u0435 \u0438\u0437\
\ \u043F\u043E\u0442\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0433\
\u043E \u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044F \u0432\
\u0441\u044F \u043C\u0430\u0433\u0438\u044F \u0443\u0445\u043E\u0434\u0438\u0442\
\ \u0432 \u043A\u0434 \u043D\u0430 3 \u0441\u0435\u043A\u0443\u043D\u0434\u044B\
."
type: Add
- message: "\u0423 \u0430\u0440\u0430\u0445\u043D\u0438\u0434\u043E\u0432 \u0442\
\u0435\u043F\u0435\u0440\u044C \u0435\u0441\u0442\u044C \u043F\u043E\u043B."
type: Add
- message: "\u0423\u0431\u0440\u0430\u043D\u0430 \u0432\u043E\u0437\u043C\u043E\u0436\
\u043D\u043E\u0441\u0442\u044C \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\
\u0442\u044C \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0432\u0435\u0442\u0430\
."
type: Remove
- message: "\u041F\u0440\u0438 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u0431\
\u0440\u043E\u0441\u0438\u0442\u044C \u0447\u0442\u043E-\u043B\u0438\u0431\u043E\
\ \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436 \u0432\u044B\u0445\u043E\u0434\
\u0438\u0442 \u0438\u0437 \u043F\u043E\u0442\u0443\u0441\u0442\u043E\u0440\u043E\
\u043D\u043D\u0435\u0433\u043E \u043F\u0443\u0442\u0435\u0448\u0435\u0441\u0442\
\u0432\u0438\u044F."
type: Tweak
- message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u043E \u0432\u0440\u0435\
\u043C\u044F \u0431\u0430\u0444\u0444\u0430 \u0441 \u0440\u0443\u043D\u044B\
\ \u0434\u043E 20 \u0441\u0435\u043A\u043D\u0443\u0434."
type: Tweak
- message: "\u0424\u0438\u043A\u0441 \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\
\u043D\u0438\u044F \u043D\u043E\u0441\u043A\u043E\u0432."
type: Fix
id: 327
time: '2024-06-26T11:56:29.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/385
- author: RinKeeper
changes:
- message: "\u041A\u043D\u043E\u043F\u043A\u0430 \u0441\u0434\u0435\u043B\u0430\u0442\
\u044C \u043C\u0430\u0433\u043E\u043C \u0434\u043B\u044F \u043F\u0435\u0434\u0430\
\u043B\u0435\u0439"
type: Add
id: 328
time: '2024-06-27T05:59:13.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/374
- author: ThereDrD
changes:
- message: "\u0412 \u043F\u0430\u043D\u0435\u043B\u0438 \u0433\u043E\u0441\u0442\
\u043E\u0432 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043E\u0442\u043E\
\u0431\u0440\u0430\u0436\u0430\u044E\u0442\u0441\u044F \u043C\u0435\u0440\u0442\
\u0432\u044B\u0435 \u0430\u043D\u0442\u0430\u0433\u043E\u043D\u0438\u0441\u0442\
\u044B"
type: Fix
- message: "\u0424\u0438\u043A\u0441 \u0440\u0430\u0437\u043C\u0435\u0440\u0430\
\ \u0444\u043B\u0435\u0435\u0440\u0433\u0430\u043D\u0430"
type: Fix
- message: "\u0421\u043A\u0430\u0444\u0430\u043D\u0434\u0440 \u0420\u0414 \u0431\
\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043F\u043E\u043C\u0435\u0449\u0430\
\u0435\u0442\u0441\u044F \u0432 \u043F\u043E\u044F\u0441"
type: Fix
- message: "\u0413\u043E\u0432\u043D\u043E\u0432\u043E\u0437 \u043F\u0440\u043E\u043F\
\u0430\u043B \u0438\u0437 \u043B\u043E\u0431\u0431\u0438, \u0432\u0440\u0435\
\u043C\u0435\u043D\u043D\u043E."
type: Remove
id: 329
time: '2024-06-27T18:29:16.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/388
- author: ThereDrD
changes:
- message: "\u0411\u043E\u043B\u044C\u0448\u0438\u043D\u0441\u0442\u0432\u043E \u0441\
\u043F\u0440\u0430\u0439\u0442\u043E\u0432 \u043E\u0440\u0443\u0436\u0438\u044F\
\ \u0431\u044B\u043B\u043E \u043F\u0435\u0440\u0435\u0440\u0438\u0441\u043E\u0432\
\u0430\u043D\u043E"
type: Add
- message: "\u041E\u0440\u0443\u0436\u0438\u0435, \u043D\u0435 \u0438\u043C\u0435\
\u0432\u0448\u0435\u0435 \u0440\u0430\u043D\u044C\u0448\u0435 \u0441\u0432\u043E\
\u0438\u0445 \u0441\u043E\u0431\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0445\
\ \u0441\u043F\u0440\u0430\u0439\u0442\u043E\u0432 \u0432 \u0440\u0443\u043A\
\u0430\u0445 \u0438 \u043D\u0430 \u0442\u0435\u043B\u0435 \u043F\u043E\u043B\
\u0443\u0447\u0438\u043B\u043E \u0438\u0445"
type: Add
id: 330
time: '2024-06-27T20:54:09.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/387

View File

@@ -6,6 +6,7 @@ admin-verb-make-nuclear-operative = Make target into a lone Nuclear Operative.
admin-verb-make-pirate = Make the target into a pirate. Note this doesn't configure the game rule.
admin-verb-make-head-rev = Make the target into a Head Revolutionary.
admin-verb-make-thief = Make the target into a thief.
admin-verb-make-wizard = Make the target into a wizard.
admin-verb-text-make-traitor = Make Traitor
admin-verb-text-make-changeling = Make Changeling
@@ -14,3 +15,4 @@ admin-verb-text-make-nuclear-operative = Make Nuclear Operative
admin-verb-text-make-pirate = Make Pirate
admin-verb-text-make-head-rev = Make Head Rev
admin-verb-text-make-thief = Make Thief
admin-verb-text-make-wizard = Make wizard

View File

@@ -6,6 +6,7 @@ admin-verb-make-nuclear-operative = Сделать цель одиноким Я
admin-verb-make-pirate = Сделать цель пиратом\капером. Учтите, что это не меняет игровой режим.
admin-verb-make-head-rev = Сделать цель главой революции.
admin-verb-make-thief = Сделать цель вором.
admin-verb-make-wizard = Сделать цель магом.
admin-verb-text-make-traitor = Сделать предателем
admin-verb-text-make-changeling = Сделать генокрадом
@@ -14,3 +15,4 @@ admin-verb-text-make-nuclear-operative = Сделать одиноким яде
admin-verb-text-make-pirate = Сделать пиратом
admin-verb-text-make-head-rev = Сделать главой революции
admin-verb-text-make-thief = Сделать вором
admin-verb-text-make-wizard = Сделать магом

View File

@@ -3,8 +3,8 @@
hands-system-missing-equipment-slot = У вас нет { $slotName }, из которого можно что-то взять!
hands-system-empty-equipment-slot = В вашем { $slotName } нет ничего, что можно было бы вынуть!
# Examine text after when they're holding something (in-hand)
comp-hands-examine-empty = { CAPITALIZE(SUBJECT($user)) } ничего не удерживает.
comp-hands-examine-empty = { CAPITALIZE(SUBJECT($user)) } ничего не держит.
comp-hands-examine-wrapper = [color=paleturquoise]{$item}[/color]
comp-hands-examine = { CAPITALIZE(SUBJECT($user)) } удерживает { $items }.
comp-hands-examine = { CAPITALIZE(SUBJECT($user)) } держит { $items }.
hands-system-blocked-by = Руки заблокированы этим:

View File

@@ -11,3 +11,4 @@ comp-kitchen-spike-knife-needed = Вам нужен нож для этого.
comp-kitchen-spike-remove-meat = Вы срезаете немного мяса с { $victim }.
comp-kitchen-spike-remove-meat-last = Вы срезаете последний кусок мяса с { $victim }!
comp-kitchen-spike-meat-name = мясо { $victim }
comp-kitchen-spike-examine = На { CAPITALIZE($this) } висит туша { CAPITALIZE($victim) }.

View File

@@ -5,9 +5,9 @@
description: A cardboard box for storing things.
components:
- type: Item
size: Large
shape:
- 0,0,2,2
size: Normal
shape:
- 0,0,1,1
- type: Storage
maxItemSize: Small
grid:

View File

@@ -7,7 +7,7 @@
- type: StorageFill
contents:
- id: Syringe
amount: 6
amount: 4
- type: Sprite
layers:
- state: box

View File

@@ -39,6 +39,7 @@
id: UplinkRifleMosin
name: uplink-rifle-mosin-name
description: uplink-rifle-mosin-desc
icon: { sprite: /Textures/White/Objects/Weapons/Guns/Snipers/bolt_gun_wood-icons.rsi, state: icon }
productEntity: WeaponSniperMosin
cost:
Telecrystal: 1
@@ -135,7 +136,7 @@
id: UplinkSniperBundle
name: uplink-sniper-bundle-name
description: uplink-sniper-bundle-desc
icon: { sprite: /Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi, state: base }
icon: { sprite: /Textures/White/Objects/Weapons/Guns/Snipers/hristov-icons.rsi, state: icon }
productEntity: BriefcaseSyndieSniperBundleFilled
cost:
Telecrystal: 20 # WD EDIT
@@ -147,7 +148,7 @@
id: UplinkC20RBundle
name: uplink-c20r-bundle-name
description: uplink-c20r-bundle-desc
icon: { sprite: /Textures/Objects/Weapons/Guns/SMGs/c20r.rsi, state: icon }
icon: { sprite: /Textures/White/Objects/Weapons/Guns/SMG/c20r-icons.rsi, state: icon }
productEntity: ClothingBackpackDuffelSyndicateFilledSMG
cost:
Telecrystal: 15 # WD EDIT
@@ -159,7 +160,7 @@
id: UplinkBulldogBundle
name: uplink-buldog-bundle-name
description: uplink-buldog-bundle-desc
icon: { sprite: /Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi, state: icon }
icon: { sprite: /Textures/White/Objects/Weapons/Guns/Shotguns/bulldog-icons.rsi, state: icon }
productEntity: ClothingBackpackDuffelSyndicateFilledShotgun
cost:
Telecrystal: 17
@@ -171,7 +172,7 @@
id: UplinkGrenadeLauncherBundle
name: uplink-grenade-launcher-bundle-name
description: uplink-grenade-launcher-bundle-desc
icon: { sprite: /Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi, state: icon }
icon: { sprite: /Textures/White/Objects/Weapons/Guns/Launchers/china_lake-icons.rsi, state: icon }
productEntity: ClothingBackpackDuffelSyndicateFilledGrenadeLauncher
cost:
Telecrystal: 25
@@ -183,7 +184,7 @@
id: UplinkL6SawBundle
name: uplink-l6-saw-bundle-name
description: uplink-l6-saw-bundle-desc
icon: { sprite: /Textures/Objects/Weapons/Guns/LMGs/l6.rsi, state: icon }
icon: { sprite: /Textures/White/Objects/Weapons/Guns/LMGs/l6-icons.rsi, state: icon }
productEntity: ClothingBackpackDuffelSyndicateFilledLMG
cost:
Telecrystal: 25

View File

@@ -156,12 +156,6 @@
description: Передатчик сигнала ХимМастера
# WD
- type: sourcePort
id: LightStatus
name: Статус светильника
description: Этот порт вызывается всякий раз, когда меняется статус светильника
defaultLinks: [ Toggle ]
- type: sourcePort
id: BodyScannerSender
name: Сканер тела

View File

@@ -27,7 +27,9 @@
grid:
- 0,0,7,1
- type: Item
size: Ginormous
size: Large
shape:
- 0, 0, 4, 1
- type: ContainerContainer
containers:
storagebase: !type:Container

View File

@@ -548,7 +548,9 @@
- type: Clothing
sprite: Clothing/Belt/sheath.rsi
- type: Item
size: Ginormous
size: Huge
shape:
- 0, 0, 4, 0
- type: ItemSlots
slots:
item:

View File

@@ -1,5 +1,15 @@
- type: entity
parent: ClothingNeckBase
id: ClothingNeckMantleBase
abstract: true
name: base mantle
description: based
components:
- type: Item
storedRotation: -90
- type: entity
parent: ClothingNeckMantleBase
id: ClothingNeckMantleCap
name: captain's mantle
description: A comfortable and chique mantle befitting of only the most experienced captain.
@@ -10,7 +20,7 @@
sprite: Clothing/Neck/mantles/capmantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleCE
name: chief engineer's mantle
description: High visibility, check. RIG system, check. High capacity cell, check. Everything a chief engineer could need in a stylish mantle.
@@ -21,7 +31,7 @@
sprite: Clothing/Neck/mantles/cemantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleCMO
name: chief medical officer's mantle
description: For a CMO that has been in enough medbays to know that more PPE means less central command dry cleaning visits when the shift is over.
@@ -32,7 +42,7 @@
sprite: Clothing/Neck/mantles/cmomantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleHOP
name: head of personnel's mantle
description: A good HOP knows that paper pushing is only half the job... petting your dog and looking fashionable is the other half.
@@ -43,7 +53,7 @@
sprite: Clothing/Neck/mantles/hopmantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleHOS
name: head of security's mantle
description: Shootouts with nukies are just another Tuesday for this HoS. This mantle is a symbol of commitment to the station.
@@ -54,7 +64,7 @@
sprite: Clothing/Neck/mantles/hosmantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleRD
name: research director's mantle
description: For when long days in the office consist of explosives, poisonous gas, murder robots, and a fresh pizza from cargo; this mantle will keep you comfy.
@@ -65,7 +75,7 @@
sprite: Clothing/Neck/mantles/rdmantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleQM
name: quartermaster's mantle
description: For the master of goods and materials to rule over the department, a befitting mantle to show off superiority!
@@ -76,7 +86,7 @@
sprite: Clothing/Neck/mantles/qmmantle.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckMantleBase
id: ClothingNeckMantleInspector
name: inspector's mantle
description: Dark mantle that highlights your intimidating figure. These are the shoulders!

View File

@@ -1,5 +1,15 @@
- type: entity
parent: ClothingNeckBase
id: ClothingNeckTieBase
abstract: true
name: red-tie
description: A neosilk clip-on red tie.
components:
- type: Item
storedRotation: 135
- type: entity
parent: ClothingNeckTieBase
id: ClothingNeckTieRed
name: red-tie
description: A neosilk clip-on red tie.
@@ -15,7 +25,7 @@
- ClothMade
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckTieBase
id: ClothingNeckTieDet
name: detective's tie
description: A loosely tied necktie, a perfect accessory for the over-worked detective.
@@ -24,9 +34,9 @@
sprite: Clothing/Neck/Ties/dettie.rsi
- type: Clothing
sprite: Clothing/Neck/Ties/dettie.rsi
- type: entity
parent: ClothingNeckBase
parent: ClothingNeckTieBase
id: ClothingNeckTieSci
name: scientist's tie
description: Why do we all have to wear these ridiculous ties?

View File

@@ -3,7 +3,7 @@
#Basic armor vest
- type: entity
parent: ClothingOuterBaseMedium
parent: ClothingOuterBase
id: ClothingOuterArmorBasic
name: armor vest
description: A standard Type I armored vest that provides decent protection against most types of damage.

View File

@@ -421,7 +421,7 @@
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: Item
size: Normal
size: Huge
- type: Tag
tags:
- WhitelistChameleon

View File

@@ -74,6 +74,8 @@
sprite: Clothing/OuterClothing/Suits/atmos_firesuit.rsi
- type: Clothing
sprite: Clothing/OuterClothing/Suits/atmos_firesuit.rsi
- type: Item
storedRotation: -90
- type: PressureProtection
highPressureMultiplier: 0.02
lowPressureMultiplier: 1000

View File

@@ -10,6 +10,7 @@
state: icon
- type: Item
size: Small
storedRotation: 90
- type: Food
requiresSpecialDigestion: true
- type: SolutionContainerManager

View File

@@ -40,3 +40,5 @@
- behavior: Anchoring
useSound: /Audio/Items/drill_use.ogg
changeSound: /Audio/Items/change_drill.ogg
- type: Item
storedRotation: -90

View File

@@ -39,6 +39,7 @@
- KnockedDown
- SlowedDown
- Stutter
- BloodLoss
- Electrocution
- type: Pullable
- type: Tag

View File

@@ -1,7 +1,7 @@
- type: entity
name: laser raptor
id: MobLaserRaptor
parent: SimpleMobBase
parent: SimpleSpaceMobBase
description: From the Viking age.
components:
- type: NpcFactionMember
@@ -36,7 +36,7 @@
- type: MobThresholds
thresholds:
0: Alive
100: Dead
50: Dead
- type: MovementSpeedModifier
baseWalkSpeed: 2
baseSprintSpeed: 5

View File

@@ -56,6 +56,7 @@
- KnockedDown
- SlowedDown
- Stutter
- BloodLoss
- Electrocution
- type: NameIdentifier
group: GenericNumber

View File

@@ -21,6 +21,7 @@
allowed:
- SlowedDown
- Stutter
- BloodLoss
- Electrocution
- ForcedSleep
- TemporaryBlindness
@@ -97,6 +98,7 @@
- KnockedDown
- SlowedDown
- Stutter
- BloodLoss
- Electrocution
- ForcedSleep
- TemporaryBlindness

View File

@@ -32,6 +32,7 @@
- KnockedDown
- SlowedDown
- Stutter
- BloodLoss
- Electrocution
- Drunk
- SlurredSpeech

View File

@@ -43,10 +43,10 @@
visible: false
- map: [ "underwearb" ] #White
- map: [ "underweart" ] #White
- map: ["jumpsuit"]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
- map: [ "socks" ] #White
- map: ["jumpsuit"]
- map: ["enum.HumanoidVisualLayers.LHand"]
- map: ["enum.HumanoidVisualLayers.RHand"]
- map: [ "gloves" ]
@@ -146,6 +146,7 @@
- KnockedDown
- SlowedDown
- Stutter
- BloodLoss
- SeeingRainbows
- Electrocution
- Drunk
@@ -309,6 +310,7 @@
- KnockedDown
- SlowedDown
- Stutter
- BloodLoss
- SeeingRainbows
- Electrocution
- ForcedSleep

View File

@@ -100,17 +100,14 @@
sprite: Mobs/Customization/masking_helpers.rsi
state: unisex_full
visible: false
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "underwearb" ] #White
- map: [ "underweart" ] #White
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
- map: [ "socks" ] #White
- map: [ "enum.HumanoidVisualLayers.Handcuffs" ]
color: "#ffffff"
sprite: Objects/Misc/handcuffs.rsi
state: body-overlay-2
visible: false
- map: [ "jumpsuit" ]
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "gloves" ]
- map: [ "shoes" ]
- map: [ "ears" ]
@@ -129,6 +126,11 @@
- map: [ "head" ]
- map: [ "pocket1" ]
- map: [ "pocket2" ]
- map: [ "enum.HumanoidVisualLayers.Handcuffs" ]
color: "#ffffff"
sprite: Objects/Misc/handcuffs.rsi
state: body-overlay-2
visible: false
- map: [ "clownedon" ] # Dynamically generated
sprite: "Effects/creampie.rsi"
state: "creampie_moth"

View File

@@ -440,6 +440,8 @@
Quantity: 10
- ReagentId: Oculine
Quantity: 2
- type: Item
storedRotation: -45
- type: entity
name: cabbage
@@ -872,6 +874,8 @@
- type: Tag
tags:
- Fruit
- type: Item
size: Tiny
- type: entity
name: cocoa pod

View File

@@ -17,7 +17,7 @@
sprite: Objects/Devices/timer.rsi
state: timer
- type: Item
size: Small
size: Tiny
- type: PayloadTrigger
components:
- type: OnUseTimerTrigger

View File

@@ -9,6 +9,7 @@
state: forensicnew
- type: Item
size: Small
storedRotation: 90
- type: Clothing
sprite: Objects/Devices/forensic_scanner.rsi
quickEquip: false

View File

@@ -18,6 +18,8 @@
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: Item
size: Tiny
- type: entity
name: explosive payload

View File

@@ -22,6 +22,7 @@
state: pinpointer
- type: Item
sprite: Objects/Devices/pinpointer.rsi
size: Tiny
- type: Pinpointer
- type: Appearance
- type: GenericVisualizer

View File

@@ -9,7 +9,7 @@
sprite: Objects/Materials/Sheets/glass.rsi
- type: Item
sprite: Objects/Materials/Sheets/glass.rsi
size: Small
size: Normal
- type: StaticPrice
price: 0
- type: Tag
@@ -197,7 +197,7 @@
- ReagentId: Carbon
Quantity: 0.5
canReact: false
- type: entity
parent: SheetGlassBase
id: SheetPGlass

View File

@@ -8,7 +8,7 @@
sprite: Objects/Materials/Sheets/metal.rsi
- type: Item
sprite: Objects/Materials/Sheets/metal.rsi
size: Small
size: Normal
- type: StaticPrice
price: 0
- type: Tag

View File

@@ -8,7 +8,7 @@
sprite: Objects/Materials/Sheets/other.rsi
- type: Item
sprite: Objects/Materials/Sheets/other.rsi
size: Small
size: Normal
- type: Tag
tags:
- Sheet

View File

@@ -21,6 +21,8 @@
- type: Sprite
sprite: Objects/Misc/nukedisk.rsi
state: icon
- type: Item
size: Tiny
- type: StaticPrice
price: 2000
- type: CargoSellBlacklist

View File

@@ -4,7 +4,7 @@
parent: BaseItem
components:
- type: Item
storedRotation: -90
size: Tiny
- type: Battery
pricePerJoule: 0.15
- type: PowerCell
@@ -291,7 +291,7 @@
parent: BasePowerCell
components:
- type: Item
size: Ginormous
size: Huge
- type: MultiHandedItem
- type: SolutionContainerManager
solutions:

View File

@@ -13,7 +13,9 @@
slots:
- belt
- type: Item
size: Ginormous
size: Large
shape:
- 0, 0, 2, 1
- type: Storage
maxItemSize: Normal # allow up to 5 large beakers / 10 beakers / 10 pill canisters
grid:

View File

@@ -19,6 +19,7 @@
Slash: 10
- type: Item
sprite: Objects/Tools/Hydroponics/hoe.rsi
storedRotation: 45
- type: entity
name: plant clippers
@@ -108,6 +109,7 @@
Piercing: 5 # I guess you can stab it into them?
- type: Item
sprite: Objects/Tools/Hydroponics/spade.rsi
storedRotation: 135
- type: Shovel
speedModifier: 0.75 # slower at digging than a full-sized shovel
@@ -121,7 +123,7 @@
sprite: Objects/Specific/Hydroponics/Equipment/plant_bag.rsi
state: icon
- type: Item
storedRotation: -90
size: Normal
- type: Clothing
quickEquip: false
slots:

View File

@@ -23,6 +23,9 @@
- type: Item
size: Large
sprite: Objects/Specific/Janitorial/mop.rsi
storedRotation: -135
shape:
- 0, 0, 3, 0
- type: Absorbent
- type: SolutionContainerManager
solutions:

View File

@@ -27,6 +27,7 @@
state: ointment
- type: Item
heldPrefix: ointment
storedRotation: 45
- type: Healing
damageContainers:
- Biological
@@ -229,7 +230,7 @@
components:
- type: Stack
lingering: true
- type: entity
parent: BaseHealingItem
id: Tourniquet
@@ -268,6 +269,8 @@
- Gauze
- type: Sprite
state: gauze
- type: Item
storedRotation: 90
- type: Construction
graph: Gauze
node: gauze

View File

@@ -328,6 +328,9 @@
layers:
- state: stimpen
map: ["enum.SolutionContainerLayers.Fill"]
- type: Item
size: Small
storedRotation: 90
- type: SolutionContainerManager
solutions:
pen:

View File

@@ -10,9 +10,9 @@
- type: Storage
maxItemSize: Small
grid:
- 0,0,3,1
- 0,0,4,1
- type: Item
size: Large
size: Normal
sprite: Objects/Specific/Medical/firstaidkits.rsi
heldPrefix: firstaid
- type: Tag

View File

@@ -4,6 +4,10 @@
name: research point disk (1000)
description: A disk for the R&D server containing 1000 points.
components:
- type: Item
size: Small
shape:
- 0, 0, 1, 1
- type: Sprite
sprite: Objects/Specific/Research/researchdisk.rsi
state: icon

View File

@@ -154,6 +154,8 @@
description: Used to contain a moderate amount of chemicals and solutions.
id: Beaker
components:
- type: Item
size: Tiny
- type: Spillable
solution: beaker
- type: StaticPrice
@@ -281,6 +283,7 @@
- type: Item
size: Tiny
sprite: Objects/Specific/Chemistry/dropper.rsi
storedRotation: -45
- type: Appearance
- type: SolutionContainerVisuals
maxFillLevels: 1
@@ -329,8 +332,9 @@
sprite: Objects/Specific/Chemistry/syringe.rsi
state: "syringe_base0"
- type: Item
size: Tiny
size: Small
sprite: Objects/Specific/Chemistry/syringe.rsi
storedRotation: -45
- type: SolutionContainerManager
solutions:
injector:

View File

@@ -64,6 +64,7 @@
- type: Item
sprite: Objects/Devices/communication.rsi
heldPrefix: old-radio
storedRotation: 90
- type: UserInterface
interfaces:
- key: enum.StoreUiKey.Key

View File

@@ -9,6 +9,7 @@
- type: Item
size: Normal
sprite: Objects/Tanks/generic.rsi
storedRotation: 45
- type: Clothing
quickEquip: false
sprite: Objects/Tanks/generic.rsi
@@ -57,6 +58,8 @@
sprite: Objects/Tanks/oxygen.rsi
- type: Item
sprite: Objects/Tanks/oxygen.rsi
shape:
- 0, 0, 3, 0
- type: GasTank
outputPressure: 21.3
air:
@@ -87,6 +90,8 @@
sprite: Objects/Tanks/emergency.rsi
- type: Item
size: Small
shape:
- 0, 0, 1, 0
sprite: Objects/Tanks/emergency.rsi
- type: GasTank
air:
@@ -208,6 +213,9 @@
air:
volume: 15
temperature: 293.15
- type: Item
shape:
- 0, 0, 3, 0
- type: entity
parent: GasTankRoundBase
@@ -219,6 +227,8 @@
sprite: Objects/Tanks/anesthetic.rsi
- type: Item
sprite: Objects/Tanks/anesthetic.rsi
shape:
- 0, 0, 3, 0
- type: GasTank
outputPressure: 30.4
air:

View File

@@ -38,6 +38,8 @@
- type: Item
sprite: Objects/Tanks/Jetpacks/blue.rsi
size: Huge
shape:
- 0, 0, 2, 3
- type: UserInterface
interfaces:
- key: enum.SharedGasTankUiKey.Key

View File

@@ -9,6 +9,7 @@
state: spray_painter
- type: Item
sprite: Objects/Tools/spray_painter.rsi
storedRotation: -90
- type: ActivatableUI
key: enum.SprayPainterUiKey.Key
- type: UserInterface

View File

@@ -23,7 +23,9 @@
grid:
- 0,0,6,3
- type: Item
size: Ginormous
size: Large
shape:
- 0,0,6,2
- type: MeleeWeapon
damage:
types:

View File

@@ -502,6 +502,7 @@
sprite: Objects/Tools/rcd.rsi
state: ammo
- type: Item
size: Tiny
sprite: Objects/Tools/rcd.rsi
heldPrefix: ammo
- type: PhysicalComposition

View File

@@ -21,7 +21,7 @@
containers:
ballistic-ammo: !type:Container
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
@@ -47,10 +47,10 @@
capacity: 100
- type: Item
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_box.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/LightRifle/light_rifle_box.rsi
- type: MagazineVisuals
magState: mag
steps: 8
steps: 6
zeroVisible: false
- type: Appearance

View File

@@ -85,7 +85,7 @@
containers:
ballistic-ammo: !type:Container
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/Pistol/smg_mag.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
@@ -112,7 +112,7 @@
tags:
- CartridgePistol
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag_top_mounted.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/Pistol/smg_mag_top_mounted.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
@@ -121,7 +121,7 @@
shader: unshaded
- type: MagazineVisuals
magState: mag
steps: 6
steps: 5
zeroVisible: false
- type: Appearance
- type: ContainerContainer

View File

@@ -20,7 +20,7 @@
containers:
ballistic-ammo: !type:Container
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Rifle/rifle_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/Rifle/rifle_mag.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]

View File

@@ -12,6 +12,8 @@
- type: Sprite
- type: Item
size: Huge
shape:
- 0,0,4,1
- type: Clothing
sprite: Objects/Weapons/Guns/Battery/laser_retro.rsi
quickEquip: false
@@ -838,3 +840,5 @@
price: 800
- type: Item
size: Large
shape:
- 0, 0, 3, 1

View File

@@ -9,7 +9,7 @@
- type: Item
size: Huge
- type: Clothing
sprite: Objects/Weapons/Guns/LMGs/l6.rsi
sprite: White/Objects/Weapons/Guns/LMGs/l6.rsi
quickEquip: false
slots:
- Back
@@ -77,15 +77,20 @@
description: A rather traditionally made LMG with a pleasantly lacquered wooden pistol grip. Uses .30 rifle ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/LMGs/l6.rsi
sprite: White/Objects/Weapons/Guns/LMGs/l6-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-3
map: ["enum.GunVisualLayers.Mag"]
map: [ "enum.GunVisualLayers.Base" ]
- state: mag-4
map: [ "enum.GunVisualLayers.Mag" ]
- type: Item
sprite: White/Objects/Weapons/Guns/LMGs/l6-inhands.rsi
size: Huge
- type: Clothing
sprite: White/Objects/Weapons/Guns/LMGs/l6-inhands.rsi
- type: MagazineVisuals
magState: mag
steps: 4
steps: 5
zeroVisible: true
- type: Appearance
@@ -109,14 +114,19 @@
soundEmpty:
path: /Audio/Weapons/Guns/Empty/lmg_empty.ogg
- type: Sprite
sprite: Objects/Weapons/Guns/LMGs/l6.rsi
sprite: White/Objects/Weapons/Guns/LMGs/l6-icons.rsi
layers:
- state: base
map: [ "enum.GunVisualLayers.Base" ]
- state: mag-3
- state: mag-4
map: [ "enum.GunVisualLayers.Mag" ]
- type: Item
sprite: White/Objects/Weapons/Guns/LMGs/l6-inhands.rsi
size: Huge
- type: Clothing
sprite: White/Objects/Weapons/Guns/LMGs/l6-inhands.rsi
slots:
- Back
- type: ContainerContainer
containers:
ballistic-ammo: !type:Container
@@ -130,3 +140,8 @@
autoRecharge: true
autoRechargeRate: 25
- type: AmmoCounter
- type: MagazineVisuals
magState: mag
steps: 5
zeroVisible: true
- type: Appearance

View File

@@ -13,6 +13,8 @@
- Back
- type: Item
size: Huge
shape:
- 0,0,5,1
- type: StaticPrice
price: 500
- type: ContainerContainer
@@ -36,12 +38,14 @@
description: PLOOP
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Launchers/china_lake.rsi
sprite: White/Objects/Weapons/Guns/Launchers/china_lake-icons.rsi
layers:
- state: icon
map: ["enum.GunVisualLayers.Base"]
- type: Item
sprite: White/Objects/Weapons/Guns/Launchers/china_lake-inhands.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Launchers/china_lake.rsi
sprite: White/Objects/Weapons/Guns/Launchers/china_lake-inhands.rsi
slots:
- Back
- suitStorage
@@ -70,14 +74,16 @@
description: A modified ancient rocket-propelled grenade launcher.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Launchers/rocket.rsi
sprite: White/Objects/Weapons/Guns/Launchers/rocket-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- type: Item
sprite: White/Objects/Weapons/Guns/Launchers/rocket-inhands.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Launchers/rocket.rsi
sprite: White/Objects/Weapons/Guns/Launchers/rocket-inhands.rsi
- type: Gun
fireRate: 0.5
soundGunshot:
@@ -103,14 +109,16 @@
description: A modified ancient rocket-propelled grenade launcher.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Launchers/rocket.rsi
sprite: White/Objects/Weapons/Guns/Launchers/rocket-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- type: Item
sprite: White/Objects/Weapons/Guns/Launchers/rocket-inhands.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Launchers/rocket.rsi
sprite: White/Objects/Weapons/Guns/Launchers/rocket-inhands.rsi
- type: Gun
fireRate: 6
selectedMode: FullAuto
@@ -127,7 +135,7 @@
path: /Audio/Weapons/Guns/MagIn/batrifle_magin.ogg
- type: MagazineVisuals
magState: mag
steps: 1
steps: 2
zeroVisible: true
- type: Appearance

View File

@@ -8,6 +8,8 @@
- type: Sprite
- type: Item
size: Huge
shape:
- 0,0,4,1
- type: Clothing
sprite: Objects/Weapons/Guns/Rifles/ak.rsi
quickEquip: false
@@ -66,7 +68,7 @@
description: An iconic weapon of war. Uses .30 rifle ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/ak.rsi
sprite: White/Objects/Weapons/Guns/Rifles/ak-icons.rsi
layers:
- state: base
map: [ "enum.GunVisualLayers.Base" ]
@@ -84,6 +86,10 @@
visible: false
sprite: White/Objects/Weapons/modulesOnWeapon.rsi
map: [ "enum.ModuleVisualState.AimModule" ]
- type: Item
sprite: White/Objects/Weapons/Guns/Rifles/ak-inhands.rsi
- type: Clothing
sprite: White/Objects/Weapons/Guns/Rifles/ak-inhands.rsi
- type: Gun
fireRate: 5
soundGunshot:
@@ -200,7 +206,7 @@
description: A high end military grade assault rifle. Uses .20 rifle ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Rifles/lecter.rsi
sprite: White/Objects/Weapons/Guns/Rifles/lecter-icons.rsi
layers:
- state: base
map: [ "enum.GunVisualLayers.Base" ]
@@ -218,8 +224,10 @@
visible: false
sprite: White/Objects/Weapons/modulesOnWeapon.rsi
map: [ "enum.ModuleVisualState.AimModule" ]
- type: Item
sprite: White/Objects/Weapons/Guns/Rifles/lecter-inhands.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Rifles/lecter.rsi
sprite: White/Objects/Weapons/Guns/Rifles/lecter-inhands.rsi
- type: Gun
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/ltrifle.ogg

View File

@@ -71,12 +71,16 @@
description: Pla-ket-ket-ket-ket! Uses .35 auto ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/SMGs/atreides.rsi
sprite: White/Objects/Weapons/Guns/SMG/atreides-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- type: Item
sprite: White/Objects/Weapons/Guns/SMG/atreides-inhands.rsi
- type: Clothing
sprite: White/Objects/Weapons/Guns/SMG/atreides-inhands.rsi
- type: Gun
fireRate: 10
soundGunshot:
@@ -94,7 +98,7 @@
description: A firearm that is often used by the infamous nuclear operatives. Uses .35 auto ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/SMGs/c20r.rsi
sprite: White/Objects/Weapons/Guns/SMG/c20r-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
@@ -113,7 +117,9 @@
sprite: White/Objects/Weapons/modulesOnSMGs.rsi
map: [ "enum.ModuleVisualState.AimModule" ]
- type: Clothing
sprite: Objects/Weapons/Guns/SMGs/c20r.rsi
sprite: White/Objects/Weapons/Guns/SMG/c20r-inhands.rsi
- type: Item
sprite: White/Objects/Weapons/Guns/SMG/c20r-inhands.rsi
- type: Gun
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg
@@ -171,7 +177,7 @@
aim_module: !type:ContainerSlot
- type: MagazineVisuals
magState: mag
steps: 6
steps: 4
zeroVisible: true
- type: Appearance
- type: PointLight
@@ -185,7 +191,7 @@
description: An excellent fully automatic Heavy SMG.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/SMGs/drozd.rsi
sprite: White/Objects/Weapons/Guns/SMG/drozd-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
@@ -204,7 +210,9 @@
sprite: White/Objects/Weapons/modulesOnWeapon.rsi
map: [ "enum.ModuleVisualState.AimModule" ]
- type: Clothing
sprite: Objects/Weapons/Guns/SMGs/drozd.rsi
sprite: White/Objects/Weapons/Guns/SMG/drozd-inhands.rsi
- type: Item
sprite: White/Objects/Weapons/Guns/SMG/drozd-inhands.rsi
- type: Gun
fireRate: 6
selectedMode: FullAuto
@@ -325,7 +333,7 @@
description: An excellent SMG, produced by NanoTrasen's Small Arms Division. Uses .35 auto ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/SMGs/wt550.rsi
sprite: White/Objects/Weapons/Guns/SMG/wt550-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
@@ -350,7 +358,9 @@
sprite: White/Objects/Weapons/modulesOnWeapon.rsi
map: [ "enum.ModuleVisualState.AimModule" ]
- type: Clothing
sprite: Objects/Weapons/Guns/SMGs/wt550.rsi
sprite: White/Objects/Weapons/Guns/SMG/wt550-inhands.rsi
- type: Item
sprite: White/Objects/Weapons/Guns/SMG/wt550-inhands.rsi
- type: ChamberMagazineAmmoProvider
boltClosed: null
- type: Gun
@@ -410,7 +420,7 @@
aim_module: !type:ContainerSlot
- type: MagazineVisuals
magState: mag
steps: 6
steps: 5
zeroVisible: true
- type: PointLight
enabled: false

View File

@@ -62,16 +62,17 @@
description: It's a magazine-fed shotgun designed for close quarters combat. Uses .50 shotgun shells.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/bulldog.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/bulldog-icons.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-0
map: ["enum.GunVisualLayers.Mag"]
- type: Item
sprite: White/Objects/Weapons/Guns/Shotguns/bulldog-inhands.rsi
size: Large
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/bulldog.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/bulldog-inhands.rsi
quickEquip: false
slots:
- Back
@@ -104,7 +105,7 @@
- type: MagazineAmmoProvider
- type: MagazineVisuals
magState: mag
steps: 1
steps: 4
zeroVisible: true
- type: Appearance
- type: StaticPrice
@@ -117,12 +118,14 @@
description: An immortal classic. Uses .50 shotgun shells.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/db_shotgun.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/db_shotgun-icons.rsi
- type: Clothing
sprite: White/Objects/Weapons/Guns/Shotguns/db_shotgun-inhands.rsi
- type: Item
size: Normal
shape:
- 0,0,4,0
sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/db_shotgun-inhands.rsi
heldPrefix: db
- type: Gun
fireRate: 2
@@ -151,11 +154,11 @@
description: A premium combat shotgun based on the Kammerer design, featuring an upgraded clip capacity. .50 shotgun shells.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/enforcer.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-icons.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/enforcer.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-inhands.rsi
- type: Item
sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/enforcer-inhands.rsi
heldPrefix: enforcer
- type: BallisticAmmoProvider
@@ -177,12 +180,12 @@
size: Normal
shape:
- 0,0,4,0
sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/pump-inhands.rsi
heldPrefix: pump
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/pump.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/pump-icons.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/pump.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/pump-inhands.rsi
- type: BallisticAmmoProvider
capacity: 4
- type: Tag
@@ -278,14 +281,14 @@
description: A shitty, hand-made shotgun that uses .50 shotgun shells. It can only hold one round in the chamber.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/improvised_shotgun-icons.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/improvised_shotgun-icons.rsi
- type: Item
size: Normal
shape:
- 0,0,4,0
sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi
sprite: White/Objects/Weapons/Guns/Shotguns/improvised_shotgun-inhands.rsi
heldPrefix: improvised
- type: Gun
fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways.

View File

@@ -11,6 +11,8 @@
map: ["enum.GunVisualLayers.Base"]
- type: Item
size: Huge
shape:
- 0,0,4,0
- type: Clothing
sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi
quickEquip: false
@@ -55,7 +57,14 @@
description: A weapon for hunting, or endless trench warfare. Uses .30 rifle ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi
layers:
- state: icon
map: [ "enum.GunVisualLayers.Base" ]
sprite: White/Objects/Weapons/Guns/Snipers/bolt_gun_wood-icons.rsi
- type: Clothing
sprite: White/Objects/Weapons/Guns/Snipers/bolt_gun_wood-inhands.rsi
- type: Item
sprite: White/Objects/Weapons/Guns/Snipers/bolt_gun_wood-inhands.rsi
- type: entity
name: Hristov
@@ -64,9 +73,16 @@
description: A portable anti-materiel rifle. Fires armor piercing 14.5mm shells. Uses .60 anti-materiel ammo.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Snipers/hristov.rsi
sprite: White/Objects/Weapons/Guns/Snipers/hristov-icons.rsi
layers:
- state: base
map: [ "enum.GunVisualLayers.Base" ]
- state: mag-0
map: [ "enum.GunVisualLayers.Mag" ]
- type: Clothing
sprite: Objects/Weapons/Guns/Snipers/hristov.rsi
sprite: White/Objects/Weapons/Guns/Snipers/hristov-inhands.rsi
- type: Item
sprite: White/Objects/Weapons/Guns/Snipers/hristov-inhands.rsi
- type: BallisticAmmoProvider
soundInsert: /Audio/White/Gun/insert.ogg
whitelist:
@@ -79,6 +95,11 @@
- type: Wieldable
forceTwoHanded: True
- type: Telescope
- type: MagazineVisuals
magState: mag
steps: 1
zeroVisible: true
- type: Appearance
- type: entity
name: musket

View File

@@ -12,6 +12,9 @@
- type: Item
size: Small
sprite: Objects/Weapons/Guns/Shotguns/flaregun.rsi
shape:
- 0,0,1,0
- 0,1,0,1
- type: Gun
fireRate: 8
selectedMode: SemiAuto
@@ -37,3 +40,12 @@
slots:
- Belt
- suitStorage
- type: EmitSoundOnPickup
sound:
collection: PistolsPickUp
- type: EmitSoundOnDrop
sound:
collection: PistolsDrop
- type: EmitSoundOnLand
sound:
collection: PistolsDrop

View File

@@ -41,6 +41,7 @@
state: icon
- type: Item
sprite: Objects/Weapons/Melee/kitchen_knife.rsi
storedRotation: -45
- type: GuideHelp
guides:
- Chef
@@ -102,6 +103,7 @@
Slash: 10
- type: Item
sprite: Objects/Weapons/Melee/combat_knife.rsi
storedRotation: -45
- type: DisarmMalus
malus: 0.225
- type: Construction
@@ -291,3 +293,4 @@
Piercing: 15
- type: Item
sprite: Objects/Weapons/Melee/throwing_knife.rsi
storedRotation: -45

View File

@@ -48,7 +48,10 @@
types:
Piercing: 15
- type: Item
size: Ginormous
storedRotation: 44 # It just works
size: Huge
shape:
- 0,0,5,0
- type: Clothing
quickEquip: false
slots:

View File

@@ -24,6 +24,9 @@
- type: Item
size: Large
sprite: Objects/Weapons/Melee/captain_sabre.rsi
storedRotation: 44 # It just works
shape:
- 0, 0, 4, 0
- type: Tag
tags:
- CaptainSabre

View File

@@ -52,6 +52,9 @@
- type: Item
heldPrefix: off
size: Normal
shape:
- 0,0,2,0
storedRotation: 44
- type: Clothing
sprite: Objects/Weapons/Melee/stunbaton.rsi
quickEquip: false

View File

@@ -40,7 +40,7 @@
- type: RCDDeconstructable
cost: 4
delay: 2
fx: EffectRCDDeconstruct2
fx: EffectRCDDeconstruct2
- type: Destructible
thresholds:
- trigger:
@@ -72,7 +72,7 @@
mode: SnapgridCenter
snap:
- Wallmount
- type: entity
name: light
description: "A light fixture. Draws power and produces light when equipped with a light tube."
@@ -100,9 +100,6 @@
receiveFrequencyId: SmartLight
- type: WirelessNetworkConnection
range: 200
- type: DeviceLinkSource
ports:
- LightStatus
- type: DeviceLinkSink
ports:
- On
@@ -294,9 +291,6 @@
receiveFrequencyId: SmartLight
- type: WirelessNetworkConnection
range: 200
- type: DeviceLinkSource
ports:
- LightStatus
- type: Appearance
- type: PoweredLightVisuals
- type: DeviceLinkSink

View File

@@ -87,9 +87,6 @@
receiveFrequencyId: SmartLight
- type: WirelessNetworkConnection
range: 200
- type: DeviceLinkSource
ports:
- LightStatus
- type: DeviceLinkSink
ports:
- On

View File

@@ -5,4 +5,5 @@
noSpawn: true
components:
- type: Item
size: Ginormous
- type: VirtualItem

View File

@@ -17,6 +17,7 @@
- type: Item
heldPrefix: off
sprite: White/VoiceRecorder/voicerecorder.rsi
storedRotation: 90
- type: Appearance
- type: VoiceRecorder
blacklist:

View File

@@ -12,8 +12,8 @@
southRotation: true
steps:
- material: Steel
amount: 15
doAfter: 2
amount: 5
doAfter: 5
- node: MeatSpike
entity: KitchenSpike
edges:
@@ -21,7 +21,7 @@
completed:
- !type:SpawnPrototype
prototype: SheetSteel1
amount: 15
amount: 5
steps:
- tool: Screwing
doAfter: 1
doAfter: 5

View File

@@ -1,10 +1,26 @@
# Хз куда это
#- /Audio/Lobby/itachi.ogg
#- /Audio/Lobby/bobby.ogg
- type: soundCollection
id: LobbyMusic
id: LobbyMusicMeme
files:
- /Audio/Lobby/govnovoz.ogg
- /Audio/Lobby/govnovoz2.ogg
- /Audio/Lobby/govnovoz3.ogg
- /Audio/Lobby/govnovoz4.ogg
- type: soundCollection
id: LobbyMusicSongs
files:
- /Audio/Lobby/spaceoddity.ogg
- /Audio/Lobby/space_asshole.ogg
- type: soundCollection
id: LobbyMusicWhite
files:
- /Audio/Lobby/thunderdome.ogg
- /Audio/Lobby/singuloose.ogg
- /Audio/Lobby/title2.ogg
- /Audio/Lobby/title3.ogg
- /Audio/Lobby/lasers_rip_apart_the_bulkhead.ogg
- /Audio/Lobby/every_light_is_blinking_at_once.ogg
- /Audio/Lobby/atomicamnesiammx.ogg
@@ -21,8 +37,15 @@
# - /Audio/Lobby/mod.flip-flap.ogg
# - /Audio/Lobby/Spac_Stac.ogg
# - /Audio/Lobby/pwmur.ogg
- /Audio/Lobby/Spac_Stac.ogg
- /Audio/Lobby/comet_haley.ogg
- type: soundCollection
id: LobbyMusicOld
id: LobbyMusicSS13
files:
- /Audio/Lobby/bobby.ogg
- /Audio/Lobby/title2.ogg
- /Audio/Lobby/title3.ogg
- /Audio/Lobby/absconditus.ogg
- /Audio/Lobby/endless_space.ogg
- /Audio/Lobby/mod.flip-flap.ogg
- /Audio/Lobby/pwmur.ogg

View File

@@ -13,8 +13,6 @@
femaleFirstNames: names_arachnid_first
maleLastNames: names_arachnid_last
femaleLastNames: names_arachnid_last
sexes:
- Unsexed
- type: markingPoints
id: MobArachnidMarkingLimits

View File

@@ -37,7 +37,7 @@
description: ящик с магазинами для Лектора, заполненными патронами.
id: cargoLecterMagazines
icon:
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Rifle/rifle_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/Rifle/rifle_mag.rsi
state: base
product: CrateLecterMagazines
cost: 2500
@@ -61,7 +61,7 @@
description: ящик с магазинами для CV-47, заполненными патронами.
id: cargoAKmagazines
icon:
sprite: Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/LightRifle/light_rifle_mag.rsi
state: base
product: CrateAKmagazines
cost: 2500
@@ -184,7 +184,7 @@
description: проверенная временем автоматическая винтовка.
id: cargoCV47
icon:
sprite: Objects/Weapons/Guns/Rifles/ak.rsi
sprite: White/Objects/Weapons/Guns/Rifles/ak.rsi
state: icon
product: CrateCV47
cost: 10000
@@ -234,7 +234,7 @@
description: Ящик с тремя обоймами нелетальных магазинов для лектора.
id: CargoLecterRubberMagazines
icon:
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Rifle/rifle_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/Rifle/rifle_mag.rsi
state: rubber
product: CrateLecterRubberMagazines
cost: 500
@@ -258,7 +258,7 @@
description: Ящик с с тремя нелетальными магазинами для CV-47.
id: cargoRifleRubberMagazines
icon:
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Rifle/rifle_mag.rsi
sprite: White/Objects/Weapons/Ammunition/Magazine/Rifle/rifle_mag.rsi
state: rubber
product: CrateRifleRubberMagazines
cost: 600

View File

@@ -46,6 +46,7 @@
id: UplinkRifleAk
name: uplink-rifle-ak-name
description: uplink-rifle-ak-description
icon: { sprite: /Textures/White/Objects/Weapons/Guns/Rifles/ak-icons.rsi, state: icon }
productEntity: WeaponRifleAk
cost:
Telecrystal: 16
@@ -189,7 +190,7 @@
id: UplinkMagazineLightRifleBox
name: uplink-magazine-l6-name
description: uplink-magazine-l6-desc
icon: { sprite: /Textures/Objects/Weapons/Guns/Ammunition/Magazine/LightRifle/light_rifle_box.rsi, state: base }
icon: { sprite: /Textures/White/Objects/Weapons/Ammunition/Magazine/LightRifle/light_rifle_box.rsi, state: base }
productEntity: MagazineLightRifleBox
cost:
Telecrystal: 3

View File

@@ -9,6 +9,8 @@
sprite: White/Misc/cards.rsi
scale: 0.8, 0.8
state: budgetcard
- type: Item
storedRotation: 90
- type: entity
parent: BaseDepartmentBudgetCard

View File

@@ -45,3 +45,5 @@
name: item-component-size-Ginormous
defaultShape:
- 0,0,5,5

View File

@@ -68,9 +68,9 @@
id: NarcoticEffect
alwaysAllowed: true
#WD EDIT
# WD EDIT
- type: statusEffect
id: Incorporeal
- type: statusEffect
id: Hallucinations
id: BloodLoss

Binary file not shown.

Before

Width:  |  Height:  |  Size: 761 B

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

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