Merge remote-tracking branch 'upstream/master' into ups

This commit is contained in:
Jabak
2024-09-19 17:13:05 +03:00
70 changed files with 737 additions and 626 deletions

View File

@@ -25,7 +25,7 @@
Для записей в списке изменений есть 4 значка: add, remove, tweak, fix. Думаю, вы сможете разобраться с остальным.
Вы можете поставить свое имя после символа :cl:, чтобы изменить имя, которое будет отображаться в журнале изменений (в противном случае будет использоваться ваше имя пользователя GitHub)
Например: ":cl: DVOniksWyvern".
Например: ":cl: Amongus".
Как правило, в журналы изменений следует помещать только то, что действительно важно игрокам. Вещи вроде "Рефактор системы X, но изменений вы не увидите" - не должны быть в журнале изменений, эти изменения обычные игроки не смогут заметить.

View File

@@ -12,14 +12,9 @@ namespace Content.Server.Atmos.EntitySystems
public float SpaceWindPressureForceDivisorPush { get; private set; }
public float SpaceWindMaxVelocity { get; private set; }
public float SpaceWindMaxPushForce { get; private set; }
public float SpaceWindMinimumCalculatedMass { get; private set; }
public float SpaceWindMaximumCalculatedInverseMass { get; private set; }
public bool MonstermosUseExpensiveAirflow { get; private set; }
public bool MonstermosEqualization { get; private set; }
public bool MonstermosDepressurization { get; private set; }
public bool MonstermosRipTiles { get; private set; }
public float MonstermosRipTilesMinimumPressure { get; private set; }
public float MonstermosRipTilesPressureOffset { get; private set; }
public bool GridImpulse { get; private set; }
public float SpacingEscapeRatio { get; private set; }
public float SpacingMinGas { get; private set; }
@@ -31,7 +26,6 @@ namespace Content.Server.Atmos.EntitySystems
public float AtmosTickRate { get; private set; }
public float Speedup { get; private set; }
public float HeatScale { get; private set; }
public float HumanoidThrowMultiplier { get; private set; }
/// <summary>
/// Time between each atmos sub-update. If you are writing an atmos device, use AtmosDeviceUpdateEvent.dt
@@ -47,14 +41,9 @@ namespace Content.Server.Atmos.EntitySystems
Subs.CVar(_cfg, CCVars.SpaceWindPressureForceDivisorPush, value => SpaceWindPressureForceDivisorPush = value, true);
Subs.CVar(_cfg, CCVars.SpaceWindMaxVelocity, value => SpaceWindMaxVelocity = value, true);
Subs.CVar(_cfg, CCVars.SpaceWindMaxPushForce, value => SpaceWindMaxPushForce = value, true);
Subs.CVar(_cfg, CCVars.SpaceWindMinimumCalculatedMass, value => SpaceWindMinimumCalculatedMass = value, true);
Subs.CVar(_cfg, CCVars.SpaceWindMaximumCalculatedInverseMass, value => SpaceWindMaximumCalculatedInverseMass = value, true);
Subs.CVar(_cfg, CCVars.MonstermosUseExpensiveAirflow, value => MonstermosUseExpensiveAirflow = value, true);
Subs.CVar(_cfg, CCVars.MonstermosEqualization, value => MonstermosEqualization = value, true);
Subs.CVar(_cfg, CCVars.MonstermosDepressurization, value => MonstermosDepressurization = value, true);
Subs.CVar(_cfg, CCVars.MonstermosRipTiles, value => MonstermosRipTiles = value, true);
Subs.CVar(_cfg, CCVars.MonstermosRipTilesMinimumPressure, value => MonstermosRipTilesMinimumPressure = value, true);
Subs.CVar(_cfg, CCVars.MonstermosRipTilesPressureOffset, value => MonstermosRipTilesPressureOffset = value, true);
Subs.CVar(_cfg, CCVars.AtmosGridImpulse, value => GridImpulse = value, true);
Subs.CVar(_cfg, CCVars.AtmosSpacingEscapeRatio, value => SpacingEscapeRatio = value, true);
Subs.CVar(_cfg, CCVars.AtmosSpacingMinGas, value => SpacingMinGas = value, true);
@@ -66,7 +55,6 @@ namespace Content.Server.Atmos.EntitySystems
Subs.CVar(_cfg, CCVars.AtmosHeatScale, value => { HeatScale = value; InitializeGases(); }, true);
Subs.CVar(_cfg, CCVars.ExcitedGroups, value => ExcitedGroups = value, true);
Subs.CVar(_cfg, CCVars.ExcitedGroupsSpaceIsAllConsuming, value => ExcitedGroupsSpaceIsAllConsuming = value, true);
Subs.CVar(_cfg, CCVars.AtmosHumanoidThrowMultiplier, value => HumanoidThrowMultiplier = value, true);
}
}
}

View File

@@ -1,6 +1,5 @@
using Content.Server.Atmos.Components;
using Content.Shared.Atmos;
using Content.Shared.Humanoid;
using Content.Shared.Mobs.Components;
using Content.Shared.Physics;
using Robust.Shared.Audio;
@@ -50,7 +49,8 @@ namespace Content.Server.Atmos.EntitySystems
comp.Accumulator = 0f;
toRemove.Add(ent);
if (TryComp<PhysicsComponent>(uid, out var body))
if (HasComp<MobStateComponent>(uid) &&
TryComp<PhysicsComponent>(uid, out var body))
{
_physics.SetBodyStatus(uid, body, BodyStatus.OnGround);
}
@@ -70,10 +70,27 @@ namespace Content.Server.Atmos.EntitySystems
}
}
private void AddMobMovedByPressure(EntityUid uid, MovedByPressureComponent component, PhysicsComponent body)
{
if (!TryComp<FixturesComponent>(uid, out var fixtures))
return;
_physics.SetBodyStatus(uid, body, BodyStatus.InAir);
foreach (var (id, fixture) in fixtures.Fixtures)
{
_physics.RemoveCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures);
}
// TODO: Make them dynamic type? Ehh but they still want movement so uhh make it non-predicted like weightless?
// idk it's hard.
component.Accumulator = 0f;
_activePressures.Add((uid, component));
}
private void HighPressureMovements(Entity<GridAtmosphereComponent> gridAtmosphere, TileAtmosphere tile, EntityQuery<PhysicsComponent> bodies, EntityQuery<TransformComponent> xforms, EntityQuery<MovedByPressureComponent> pressureQuery, EntityQuery<MetaDataComponent> metas)
{
if (tile.PressureDifference < SpaceWindMinimumCalculatedMass * SpaceWindMinimumCalculatedMass)
return;
// TODO ATMOS finish this
// Don't play the space wind sound on tiles that are on fire...
@@ -104,7 +121,7 @@ namespace Content.Server.Atmos.EntitySystems
// If we're using monstermos, smooth out the yeet direction to follow the flow
//TODO This is bad, don't run this. It just makes the throws worse by somehow rounding them to orthogonal
if (!MonstermosEqualization)
if (MonstermosEqualization)
{
// We step through tiles according to the pressure direction on the current tile.
// The goal is to get a general direction of the airflow in the area.
@@ -144,7 +161,7 @@ namespace Content.Server.Atmos.EntitySystems
(entity, pressureMovements),
gridAtmosphere.Comp.UpdateCounter,
tile.PressureDifference,
tile.PressureDirection,
tile.PressureDirection, 0,
tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid,
gridWorldRotation,
xforms.GetComponent(entity),
@@ -165,29 +182,12 @@ namespace Content.Server.Atmos.EntitySystems
tile.PressureDirection = differenceDirection;
}
//INFO The EE version of this function drops pressureResistanceProbDelta, since it's not needed. If you are for whatever reason calling this function
//INFO And if it isn't working, you've probably still got the pressureResistanceProbDelta line included.
/// <notes>
/// EXPLANATION:
/// pressureDifference = Force of Air Flow on a given tile
/// physics.Mass = Mass of the object potentially being thrown
/// physics.InvMass = 1 divided by said Mass. More CPU efficient way to do division.
///
/// Objects can only be thrown if the force of air flow is greater than the SQUARE of their mass or {SpaceWindMinimumCalculatedMass}, whichever is heavier
/// This means that the heavier an object is, the exponentially more force is required to move it
/// The force of a throw is equal to the force of air pressure, divided by an object's mass. So not only are heavier objects
/// less likely to be thrown, they are also harder to throw,
/// while lighter objects are yeeted easily, and from great distance.
///
/// For a human sized entity with a standard weight of 80kg and a spacing between a hard vacuum and a room pressurized at 101kpa,
/// The human shall only be moved if he is either very close to the hole, or is standing in a region of high airflow
/// </notes>
public void ExperiencePressureDifference(
Entity<MovedByPressureComponent> ent,
int cycle,
float pressureDifference,
AtmosDirection direction,
float pressureResistanceProbDelta,
EntityCoordinates throwTarget,
Angle gridWorldRotation,
TransformComponent? xform = null,
@@ -200,28 +200,50 @@ namespace Content.Server.Atmos.EntitySystems
if (!Resolve(uid, ref xform))
return;
// TODO ATMOS stuns?
if (physics.BodyType != BodyType.Static
&& !float.IsPositiveInfinity(component.MoveResist))
var maxForce = MathF.Sqrt(pressureDifference) * 2.25f;
var moveProb = 100f;
if (component.PressureResistance > 0)
moveProb = MathF.Abs((pressureDifference / component.PressureResistance * MovedByPressureComponent.ProbabilityBasePercent) -
MovedByPressureComponent.ProbabilityOffset);
// Can we yeet the thing (due to probability, strength, etc.)
if (moveProb > MovedByPressureComponent.ProbabilityOffset && _robustRandom.Prob(MathF.Min(moveProb / 100f, 1f))
&& !float.IsPositiveInfinity(component.MoveResist)
&& (physics.BodyType != BodyType.Static
&& (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForcePushRatio)))
|| (physics.BodyType == BodyType.Static && (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForceForcePushRatio))))
{
var moveForce = pressureDifference * MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass);
if (HasComp<HumanoidAppearanceComponent>(ent))
moveForce *= HumanoidThrowMultiplier;
if (moveForce > physics.Mass)
if (HasComp<MobStateComponent>(uid))
{
AddMobMovedByPressure(uid, component, physics);
}
if (maxForce > MovedByPressureComponent.ThrowForce)
{
var moveForce = maxForce;
moveForce /= (throwTarget != EntityCoordinates.Invalid) ? SpaceWindPressureForceDivisorThrow : SpaceWindPressureForceDivisorPush;
moveForce *= MathHelper.Clamp(moveProb, 0, 100);
// Apply a sanity clamp to prevent being thrown through objects.
var maxSafeForceForObject = SpaceWindMaxVelocity * physics.Mass;
moveForce = MathF.Min(moveForce, maxSafeForceForObject);
// Grid-rotation adjusted direction
var dirVec = (direction.ToAngle() + gridWorldRotation).ToWorldVec();
moveForce *= MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass);
//TODO Consider replacing throw target with proper trigonometry angles.
// TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs.
if (throwTarget != EntityCoordinates.Invalid)
{
var pos = throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition + dirVec;
_throwing.TryThrow(uid, pos.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce);
var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized();
_physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics);
}
else
{
_throwing.TryThrow(uid, dirVec.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce);
moveForce = MathF.Min(moveForce, SpaceWindMaxPushForce);
_physics.ApplyLinearImpulse(uid, dirVec * moveForce, body: physics);
}
component.LastHighPressureMovementAirCycle = cycle;

View File

@@ -5,11 +5,8 @@ using Content.Server.Doors.Systems;
using Content.Shared.Atmos;
using Content.Shared.Atmos.Components;
using Content.Shared.Database;
using Content.Shared.Maps;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics.Components;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
namespace Content.Server.Atmos.EntitySystems
@@ -139,7 +136,7 @@ namespace Content.Server.Atmos.EntitySystems
var logN = MathF.Log2(tileCount);
// Optimization - try to spread gases using an O(n log n) algorithm that has a chance of not working first to avoid O(n^2)
if (!MonstermosUseExpensiveAirflow && giverTilesLength > logN && takerTilesLength > logN)
if (giverTilesLength > logN && takerTilesLength > logN)
{
// Even if it fails, it will speed up the next part.
Array.Sort(_equalizeTiles, 0, tileCount, _monstermosComparer);
@@ -552,8 +549,7 @@ namespace Content.Server.Atmos.EntitySystems
}
InvalidateVisuals(ent, otherTile);
if (MonstermosRipTiles && otherTile.PressureDifference > MonstermosRipTilesMinimumPressure)
HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.PressureDifference);
HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.MonstermosInfo.CurrentTransferAmount);
}
if (GridImpulse && tileCount > 0)
@@ -685,14 +681,14 @@ namespace Content.Server.Atmos.EntitySystems
adj.MonstermosInfo[idx.ToOppositeDir()] -= amount;
}
private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float delta)
private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float sum)
{
if (!mapGrid.TryGetTileRef(tile.GridIndices, out var tileRef))
if (!MonstermosRipTiles)
return;
var tileref = tileRef.Tile;
var tileDef = (ContentTileDefinition) _tileDefinitionManager[tileref.TypeId];
if (!tileDef.Reinforced && tileDef.TileRipResistance < delta * MonstermosRipTilesPressureOffset)
var chance = MathHelper.Clamp(0.01f + (sum / SpacingMaxWind) * 0.3f, 0.003f, 0.3f);
if (sum > 20 && _robustRandom.Prob(chance))
PryTile(mapGrid, tile.GridIndices);
}

View File

@@ -6,7 +6,6 @@ using Content.Server.NodeContainer.EntitySystems;
using Content.Shared.Atmos.EntitySystems;
using Content.Shared.Doors.Components;
using Content.Shared.Maps;
using Content.Shared.Throwing;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems;
@@ -38,7 +37,6 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem
[Dependency] private readonly TileSystem _tile = default!;
[Dependency] private readonly MapSystem _map = default!;
[Dependency] public readonly PuddleSystem Puddle = default!;
[Dependency] private readonly ThrowingSystem _throwing = default!;
private const float ExposedUpdateDelay = 1f;
private float _exposedTimer = 0f;

View File

@@ -1,6 +1,5 @@
using Content.Server._White.Accent.Bloodloss;
using Content.Server.Body.Components;
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Chemistry.ReactionEffects;
using Content.Server.Fluids.EntitySystems;
using Content.Server.Forensics;
@@ -13,7 +12,6 @@ using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.Damage;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Drunk;
using Content.Shared.FixedPoint;
using Content.Shared.Mobs;
@@ -23,7 +21,6 @@ using Content.Shared.Mobs.Systems;
using Content.Shared.Movement.Systems;
using Content.Shared.Popups;
using Content.Shared.Rejuvenate;
using Content.Shared.Speech.EntitySystems;
using Robust.Server.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
@@ -42,8 +39,7 @@ public sealed class BloodstreamSystem : EntitySystem
[Dependency] private readonly PuddleSystem _puddleSystem = default!;
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly SharedDrunkSystem _drunkSystem = default!;
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
[Dependency] private readonly ForensicsSystem _forensicsSystem = default!;
[Dependency] private readonly MovementSpeedModifierSystem _speed = default!; // WD
@@ -188,12 +184,23 @@ public sealed class BloodstreamSystem : EntitySystem
private void OnComponentInit(Entity<BloodstreamComponent> entity, ref ComponentInit args)
{
var chemicalSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName);
var bloodSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName);
var tempSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName);
_solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName, out var chemicalSolution);
_solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName, out var bloodSolution);
_solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName, out var tempSolution);
if (chemicalSolution == null)
return;
chemicalSolution.MaxVolume = entity.Comp.ChemicalMaxVolume;
if (bloodSolution == null)
return;
bloodSolution.MaxVolume = entity.Comp.BloodMaxVolume;
if (tempSolution == null)
return;
tempSolution.MaxVolume = entity.Comp.BleedPuddleThreshold * 4; // give some leeway, for chemstream as well
// Fill blood solution with BLOOD
@@ -203,12 +210,10 @@ public sealed class BloodstreamSystem : EntitySystem
private void OnDamageChanged(Entity<BloodstreamComponent> ent, ref DamageChangedEvent args)
{
if (args.DamageDelta is null || !args.DamageIncreased)
{
return;
}
// TODO probably cache this or something. humans get hurt a lot
if (!_prototypeManager.TryIndex<DamageModifierSetPrototype>(ent.Comp.DamageBleedModifiers, out var modifiers))
if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers))
return;
var bloodloss = DamageSpecifier.ApplyModifierSet(args.DamageDelta, modifiers);
@@ -222,11 +227,12 @@ public sealed class BloodstreamSystem : EntitySystem
var totalFloat = total.Float();
TryModifyBleedAmount(ent, totalFloat, ent);
/// <summary>
/// Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5
/// The crit chance is currently the bleed rate modifier divided by 25.
/// Higher damage weapons have a higher chance to crit!
/// </summary>
/*
Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5
The crit chance is currently the bleed rate modifier divided by 25.
Higher damage weapons have a higher chance to crit!
*/
var prob = Math.Clamp(totalFloat / 25, 0, 1);
if (totalFloat > 0 && _robustRandom.Prob(prob))
{
@@ -413,7 +419,7 @@ public sealed class BloodstreamSystem : EntitySystem
if (HasComp<BloodLustComponent>(uid)) // WD
{
if (component.BleedAmount == 0f)
if (component.BleedAmount == 0)
RemComp<BloodLustComponent>(uid);
_speed.RefreshMovementSpeedModifiers(uid);

View File

@@ -4,6 +4,7 @@ using Content.Server.Chat.Systems;
using Content.Server.Explosion.EntitySystems;
using Content.Server.Pinpointer;
using Content.Server.Popups;
using Content.Server.RoundEnd;
using Content.Server.Station.Systems;
using Content.Shared.Audio;
using Content.Shared.Containers.ItemSlots;
@@ -43,6 +44,7 @@ public sealed class NukeSystem : EntitySystem
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly RoundEndSystem _roundEndSystem = default!;
/// <summary>
/// Used to calculate when the nuke song should start playing for maximum kino with the nuke sfx
@@ -568,6 +570,8 @@ public sealed class NukeSystem : EntitySystem
_sound.StopStationEventMusic(uid, StationEventMusicType.Nuke);
Del(uid);
_roundEndSystem.EndRound(TimeSpan.FromSeconds(30)); //Giedi EDIT
}
/// <summary>

View File

@@ -10,6 +10,12 @@ public sealed class FrontalLispSystem : EntitySystem
private static readonly Regex RegexLowerTh = new(@"[t]+[s]+|[s]+[c]+(?=[iey]+)|[c]+(?=[iey]+)|[p][s]+|([s]+[t]+|[t]+)(?=[i]+[o]+[u]*[n]*)|[c]+[h]+(?=[i]*[e]*)|[z]+|[s]+|[x]+(?=[e]+)");
private static readonly Regex RegexUpperEcks = new(@"[E]+[Xx]+[Cc]*|[X]+");
private static readonly Regex RegexLowerEcks = new(@"[e]+[x]+[c]*|[x]+");
// WD start
private static readonly Regex RegexUpperS = new(@"С");
private static readonly Regex RegexLowerS = new(@"с");
private static readonly Regex RegexUpperZ = new(@"З");
private static readonly Regex RegexLowerZ = new(@"з");
// WD end
// @formatter:on
public override void Initialize()
@@ -29,6 +35,13 @@ public sealed class FrontalLispSystem : EntitySystem
message = RegexUpperEcks.Replace(message, "EKTH");
message = RegexLowerEcks.Replace(message, "ekth");
// WD start
message = RegexUpperS.Replace(message, "Ш");
message = RegexLowerS.Replace(message, "ш");
message = RegexUpperZ.Replace(message, "Ж");
message = RegexLowerZ.Replace(message, "ж");
// WD end
args.Message = message;
}
}

View File

@@ -234,6 +234,8 @@ public sealed class IonStormRule : StationEventSystem<IonStormRuleComponent>
if (plural) feeling = feelingPlural;
var subjects = RobustRandom.Prob(0.5f) ? objectsThreats : Loc.GetString("ion-storm-people"); // WD ahead of wizden upstream
// message logic!!!
return RobustRandom.Next(0, 36) switch
{
@@ -265,7 +267,7 @@ public sealed class IonStormRule : StationEventSystem<IonStormRuleComponent>
26 => Loc.GetString("ion-storm-law-crew-must-go", ("who", crewAll), ("area", area)),
27 => Loc.GetString("ion-storm-law-crew-only-1", ("who", crew1), ("part", part)),
28 => Loc.GetString("ion-storm-law-crew-only-2", ("who", crew1), ("other", crew2), ("part", part)),
29 => Loc.GetString("ion-storm-law-crew-only-subjects", ("adjective", adjective), ("subjects", RobustRandom.Prob(0.5f) ? objectsThreats : "PEOPLE"), ("part", part)),
29 => Loc.GetString("ion-storm-law-crew-only-subjects", ("adjective", adjective), ("subjects", subjects), ("part", part)), // WD ahead of wizden upstream
30 => Loc.GetString("ion-storm-law-crew-must-do", ("must", must), ("part", part)),
31 => Loc.GetString("ion-storm-law-crew-must-have", ("adjective", adjective), ("objects", objects), ("part", part)),
32 => Loc.GetString("ion-storm-law-crew-must-eat", ("who", who), ("adjective", adjective), ("food", food), ("part", part)),

View File

@@ -171,9 +171,7 @@ public sealed class TemperatureSystem : EntitySystem
{
return Atmospherics.MinimumHeatCapacity;
}
if (physics.Mass < 1)
return comp.SpecificHeat;
else return comp.SpecificHeat * physics.FixturesMass;
return comp.SpecificHeat * physics.FixturesMass;
}
private void OnInit(EntityUid uid, InternalTemperatureComponent comp, MapInitEvent args)

View File

@@ -7,7 +7,7 @@ namespace Content.Server.VoiceMask;
public sealed partial class VoiceMaskerComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField]
public string LastSetName = "Unknown";
public string LastSetName = "Неизвестный"; // WD translate
[ViewVariables(VVAccess.ReadWrite)]
public string? LastSetVoice; // tts

View File

@@ -1122,7 +1122,7 @@ namespace Content.Shared.CCVar
/// Useful to prevent clipping through objects.
/// </summary>
public static readonly CVarDef<float> SpaceWindMaxVelocity =
CVarDef.Create("atmos.space_wind_max_velocity", 7f, CVar.SERVERONLY);
CVarDef.Create("atmos.space_wind_max_velocity", 30f, CVar.SERVERONLY);
/// <summary>
/// The maximum force that may be applied to an object by pushing (i.e. not throwing) atmospheric pressure differences.
@@ -1131,24 +1131,6 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<float> SpaceWindMaxPushForce =
CVarDef.Create("atmos.space_wind_max_push_force", 17f, CVar.SERVERONLY);
/// <summary>
/// If an object's mass is below this number, then this number is used in place of mass to determine whether air pressure can throw an object.
/// This has nothing to do with throwing force, only acting as a way of reducing the odds of tiny 5 gram objects from being yeeted by people's breath
/// </summary>
/// <remarks>
/// If you are reading this because you want to change it, consider looking into why almost every item in the game weighs only 5 grams
/// And maybe do your part to fix that? :)
/// </remarks>
public static readonly CVarDef<float> SpaceWindMinimumCalculatedMass =
CVarDef.Create("atmos.space_wind_minimum_calculated_mass", 10f, CVar.SERVERONLY);
/// <summary>
/// Calculated as 1/Mass, where Mass is the physics.Mass of the desired threshold.
/// If an object's inverse mass is lower than this, it is capped at this. Basically, an upper limit to how heavy an object can be before it stops resisting space wind more.
/// </summary>
public static readonly CVarDef<float> SpaceWindMaximumCalculatedInverseMass =
CVarDef.Create("atmos.space_wind_maximum_calculated_inverse_mass", 0.08f, CVar.SERVERONLY);
/// <summary>
/// Whether monstermos tile equalization is enabled.
/// </summary>
@@ -1170,21 +1152,7 @@ namespace Content.Shared.CCVar
/// Also looks weird on slow spacing for unrelated reasons. If you do want to enable this, you should probably turn on instaspacing.
/// </summary>
public static readonly CVarDef<bool> MonstermosRipTiles =
CVarDef.Create("atmos.monstermos_rip_tiles", true, CVar.SERVERONLY);
/// <summary>
/// Taken as the cube of a tile's mass, this acts as a minimum threshold of mass for which air pressure calculates whether or not to rip a tile from the floor
/// This should be set by default to the cube of the game's lowest mass tile as defined in their prototypes, but can be increased for server performance reasons
/// </summary>
public static readonly CVarDef<float> MonstermosRipTilesMinimumPressure =
CVarDef.Create("atmos.monstermos_rip_tiles_min_pressure", 7500f, CVar.SERVERONLY);
/// <summary>
/// Taken after the minimum pressure is checked, the effective pressure is multiplied by this amount.
/// This allows server hosts to finely tune how likely floor tiles are to be ripped apart by air pressure
/// </summary>
public static readonly CVarDef<float> MonstermosRipTilesPressureOffset =
CVarDef.Create("atmos.monstermos_rip_tiles_pressure_offset", 0.44f, CVar.SERVERONLY);
CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY);
/// <summary>
/// Whether explosive depressurization will cause the grid to gain an impulse.
@@ -1215,13 +1183,6 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<float> AtmosSpacingMaxWind =
CVarDef.Create("atmos.mmos_max_wind", 500f, CVar.SERVERONLY);
/// <summary>
/// Increases default airflow calculations to O(n^2) complexity, for use with heavy space wind optimizations. Potato servers BEWARE
/// This solves the problem of objects being trapped in an infinite loop of slamming into a wall repeatedly.
/// </summary>
public static readonly CVarDef<bool> MonstermosUseExpensiveAirflow =
CVarDef.Create("atmos.mmos_expensive_airflow", true, CVar.SERVERONLY);
/// <summary>
/// Whether atmos superconduction is enabled.
/// </summary>
@@ -1278,13 +1239,6 @@ namespace Content.Shared.CCVar
public static readonly CVarDef<float> AtmosHeatScale =
CVarDef.Create("atmos.heat_scale", 8f, CVar.SERVERONLY);
/// <summary>
/// A multiplier on the amount of force applied to Humanoid entities, as tracked by HumanoidAppearanceComponent
/// This multiplier is added after all other checks are made, and applies to both throwing force, and how easy it is for an entity to be thrown.
/// </summary>
public static readonly CVarDef<float> AtmosHumanoidThrowMultiplier =
CVarDef.Create("atmos.humanoid_throw_multiplier", 2f, CVar.SERVERONLY);
/*
* MIDI instruments
*/

View File

@@ -51,6 +51,14 @@ public sealed partial class ItemToggleComponent : Component
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
public bool ToggleLight = true;
// WD added start
[DataField]
public string ActivatedDescription = "comp-item-toggle-on"; // fallback/standard text
[DataField]
public string DeactivatedDescription = "comp-item-toggle-off"; // fallback/standard text
// WD added end
}
/// <summary>

View File

@@ -1,3 +1,4 @@
using Content.Shared.Examine;
using Content.Shared.Interaction.Events;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Popups;
@@ -23,6 +24,8 @@ public abstract class SharedItemToggleSystem : EntitySystem
[Dependency] private readonly INetManager _netManager = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedItemSystem _item = default!; // WD
public override void Initialize()
{
base.Initialize();
@@ -35,6 +38,9 @@ public abstract class SharedItemToggleSystem : EntitySystem
SubscribeLocalEvent<ItemToggleHotComponent, IsHotEvent>(OnIsHotEvent);
SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggledEvent>(UpdateActiveSound);
SubscribeLocalEvent<ItemToggleComponent, ExaminedEvent>(OnExamined); // WD
SubscribeLocalEvent<ItemToggleComponent, ItemToggledEvent>(UpdatePrefix); // WD
}
private void OnStartup(Entity<ItemToggleComponent> ent, ref ComponentStartup args)
@@ -255,4 +261,21 @@ public abstract class SharedItemToggleSystem : EntitySystem
activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream);
}
}
// WD added start
private void OnExamined(Entity<ItemToggleComponent> ent, ref ExaminedEvent args)
{
var onMsg = IsActivated(ent.Owner)
? Loc.GetString(ent.Comp.ActivatedDescription)
: Loc.GetString(ent.Comp.DeactivatedDescription);
args.PushMarkup(onMsg);
}
private void UpdatePrefix(Entity<ItemToggleComponent> ent, ref ItemToggledEvent args)
{
_item.SetHeldPrefix(ent.Owner, args.Activated ? "on" : "off");
}
// WD added end
}

View File

@@ -117,11 +117,5 @@ namespace Content.Shared.Maps
{
TileId = id;
}
[DataField]
public bool Reinforced = false;
[DataField]
public float TileRipResistance = 125f;
}
}

View File

@@ -63,6 +63,21 @@ public sealed class RCDAmmoSystem : EntitySystem
var user = args.User;
args.Handled = true;
// WD edit start
TryComp<StackComponent>(uid, out var stackComponent);
if (stackComponent != null)
{
var realValue = (int) (stackComponent.Count * comp.ChargeCountModifier);
comp.Charges = realValue;
if (realValue == 0)
{
_popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-not-enough"), target, user);
return;
}
}
// WD edit end
var count = Math.Min(charges.MaxCharges - charges.Charges, comp.Charges);
if (count <= 0)
{
@@ -73,7 +88,7 @@ public sealed class RCDAmmoSystem : EntitySystem
_popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-refilled"), target, user);
// WD edit start
if (TryComp<StackComponent>(uid, out var stackComponent))
if (stackComponent != null)
{
var spent = (int) (count / comp.ChargeCountModifier) == 0 ? 1 : (int) (count / comp.ChargeCountModifier);
_stack.SetCount(uid, stackComponent.Count - spent);

View File

@@ -26,25 +26,25 @@ public sealed partial class IonStormTargetComponent : Component
/// Chance to replace the lawset with a random one
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float RandomLawsetChance = 0.40f; // WD was 0.25f
public float RandomLawsetChance = 0.25f;
/// <summary>
/// Chance to remove a random law.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float RemoveChance = 0.15f; // WD was 0.20f
public float RemoveChance = 0.20f;
/// <summary>
/// Chance to replace a random law with the new one, rather than have it be a glitched-order law.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float ReplaceChance = 0.15f; // WD was 0.20f
public float ReplaceChance = 0.20f;
/// <summary>
/// Chance to shuffle laws after everything is done.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public float ShuffleChance = 0.15f; // WD was 0.20f
public float ShuffleChance = 0.20f;
}
/// <summary>

View File

@@ -123,6 +123,30 @@ namespace Content.Shared.StatusEffect
return false;
}
// WD added start
// May god forgive us
public bool TryAddStatusEffect<T>(EntityUid uid, string key, TimeSpan time, bool refresh, Component component,
StatusEffectsComponent? status = null)
where T : IComponent, new()
{
if (!Resolve(uid, ref status, false))
return false;
if (TryAddStatusEffect(uid, key, time, refresh, status))
{
// If they already have the comp, we just won't bother updating anything.
if (!EntityManager.HasComponent<T>(uid))
{
EntityManager.AddComponent(uid, component);
status.ActiveEffects[key].RelevantComponent = _componentFactory.GetComponentName(component.GetType());
}
return true;
}
return false;
}
// WD added end
public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, string component,
StatusEffectsComponent? status = null)
{

View File

@@ -1,18 +1,24 @@
using Content.Shared.Standing.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Stunnable;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedStunSystem))]
public sealed partial class KnockedDownComponent : Component
{
[DataField("helpInterval"), AutoNetworkedField]
[DataField, AutoNetworkedField]
public float HelpInterval = 1f;
[DataField("helpAttemptSound")]
[DataField]
public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg");
[ViewVariables, AutoNetworkedField]
public float HelpTimer = 0f;
// WD added start
// Holy shit why is this so long
[DataField, AutoNetworkedField]
public SharedStandingStateSystem.DropHeldItemsBehavior KnockDownBehavior = SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding;
// WD added end
}

View File

@@ -106,25 +106,25 @@ public abstract class SharedStunSystem : EntitySystem
private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args)
{
RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD EDIT
_standingState.TryLieDown(uid, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding);
RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD edit
_standingState.TryLieDown(uid, null, component.KnockDownBehavior); // WD edit
}
private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args)
{
// WD EDIT START
// WD edit start
// Don't stand up if we can lie down via keybind
if (!TryComp(uid, out StandingStateComponent? standing) || !(!standing.CanLieDown || standing.AutoGetUp)) // WD EDIT
if (!TryComp(uid, out StandingStateComponent? standing) || !(!standing.CanLieDown || standing.AutoGetUp)) // WD edit
return;
if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD EDIT
if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD edit
{
_standingState.TryStandUp(uid, standing);
return;
}
_standingState.Stand(uid, standing);
// WD EDIT END
// WD edit end
}
private void OnStandAttempt(EntityUid uid, KnockedDownComponent component, StandAttemptEvent args)
@@ -178,7 +178,7 @@ public abstract class SharedStunSystem : EntitySystem
/// Knocks down the entity, making it fall to the ground.
/// </summary>
public bool TryKnockdown(EntityUid uid, TimeSpan time, bool refresh,
StatusEffectsComponent? status = null)
StatusEffectsComponent? status = null, SharedStandingStateSystem.DropHeldItemsBehavior? behavior = null)
{
if (time <= TimeSpan.Zero)
return false;
@@ -186,8 +186,24 @@ public abstract class SharedStunSystem : EntitySystem
if (!Resolve(uid, ref status, false))
return false;
// WD added start
// May god forgive us
if (behavior.HasValue && !HasComp<KnockedDownComponent>(uid))
{
var knockedDownComponent = new KnockedDownComponent
{
KnockDownBehavior = behavior.Value
};
if (!_statusEffect.TryAddStatusEffect<KnockedDownComponent>(uid, "KnockedDown", time, refresh, knockedDownComponent))
return false;
}
else
{
if (!_statusEffect.TryAddStatusEffect<KnockedDownComponent>(uid, "KnockedDown", time, refresh))
return false;
}
// WD added end
var ev = new KnockedDownEvent();
RaiseLocalEvent(uid, ref ev);

View File

@@ -48,7 +48,7 @@ public sealed partial class MeleeThrowOnHitComponent : Component
[AutoNetworkedField]
public bool Enabled = true;
// WD START
// WD added
[DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public float StunTime;
@@ -56,7 +56,15 @@ public sealed partial class MeleeThrowOnHitComponent : Component
[DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public bool ThrowOnThrowHit;
// WD END
[DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public bool FallAfterHit;
[DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public bool RequireWield = true;
// WD added
}
/// <summary>

View File

@@ -1,9 +1,11 @@
using System.Numerics;
using Content.Shared.Construction.Components;
using Content.Shared.Standing.Systems;
using Content.Shared.Stunnable;
using Content.Shared.Throwing;
using Content.Shared.Weapons.Melee.Components;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Wieldable.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Events;
@@ -20,8 +22,9 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly SharedStunSystem _stun = default!; // WD
[Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD
[Dependency] private readonly SharedStunSystem _stun = default!; // WD added
[Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD added
[Dependency] private readonly SharedStandingStateSystem _standingState = default!; // WD added
/// <inheritdoc/>
public override void Initialize()
@@ -36,8 +39,10 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
private void OnDoHit(Entity<MeleeThrowOnHitComponent> ent, ref ThrowDoHitEvent args) // WD
{
// WD edit start
if (!ent.Comp.ThrowOnThrowHit)
return;
// WD edit end
if (!CanThrowOnHit(ent, args.Target))
return;
@@ -55,9 +60,15 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
MinLifetime = ent.Comp.MinLifetime
};
AddComp(args.Target, thrownComp);
// WD added start
if (ent.Comp.StunTime != 0f)
_stun.TryParalyze(args.Target, TimeSpan.FromSeconds(ent.Comp.StunTime), true);
else if (ent.Comp.FallAfterHit)
_standingState.TryLieDown(ent, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding);
// WD added end
_thrownItem.LandComponent(ent, args.Component, physics, false);
_physics.SetLinearVelocity(ent, Vector2.Zero);
}
@@ -67,14 +78,24 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
if (args.Handled) // WD
return;
var (_, comp) = ent;
if (!args.IsHit)
return;
// WD START
var stunTime = comp.StunTime;
var speed = comp.Speed;
var lifetime = comp.Lifetime;
// WD added start
if (ent.Comp.RequireWield)
{
if (!TryComp<WieldableComponent>(args.Weapon, out var weapon))
return;
if (!weapon.Wielded)
return;
}
// WD added end
// WD edit start
var stunTime = ent.Comp.StunTime;
var speed = ent.Comp.Speed;
var lifetime = ent.Comp.Lifetime;
if (args.Direction != null) // Heavy attack
{
@@ -82,7 +103,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
speed *= 0.5f;
lifetime *= 0.5f;
}
// WD END
// WD edit end
var mapPos = _transform.GetMapCoordinates(args.User).Position;
foreach (var hit in args.HitEntities)
@@ -95,7 +116,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
if (!CanThrowOnHit(ent, hit))
continue;
if (comp.UnanchorOnHit && HasComp<AnchorableComponent>(hit))
if (ent.Comp.UnanchorOnHit && HasComp<AnchorableComponent>(hit))
{
_transform.Unanchor(hit, Transform(hit));
}
@@ -105,13 +126,19 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
RaiseLocalEvent(hit, ref ev);
var thrownComp = new MeleeThrownComponent
{
Velocity = angle.Normalized() * speed, // WD EDIT
Lifetime = lifetime, // WD EDIT
MinLifetime = comp.MinLifetime
Velocity = angle.Normalized() * speed, // WD edit
Lifetime = lifetime, // WD edit
MinLifetime = ent.Comp.MinLifetime
};
AddComp(hit, thrownComp);
// WD added end
if (stunTime != 0f)
_stun.TryParalyze(hit, TimeSpan.FromSeconds(stunTime), true);
else if (ent.Comp.FallAfterHit)
_standingState.TryLieDown(hit);
// WD added start
}
}
@@ -126,9 +153,11 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
comp.PreviousStatus = body.BodyStatus;
comp.ThrownEndTime = _timing.CurTime + TimeSpan.FromSeconds(comp.Lifetime);
comp.MinLifetimeTime = _timing.CurTime + TimeSpan.FromSeconds(comp.MinLifetime);
_physics.SetBodyStatus(ent, body, BodyStatus.InAir);
_physics.SetLinearVelocity(ent, Vector2.Zero, body: body);
_physics.ApplyLinearImpulse(ent, comp.Velocity * body.Mass, body: body);
Dirty(ent, ent.Comp);
}

View File

@@ -0,0 +1,17 @@
using Content.Shared.Standing.Systems;
using Robust.Shared.GameStates;
namespace Content.Shared._White.Item.KnockDownOnHit;
[RegisterComponent, NetworkedComponent]
public sealed partial class KnockDownOnHitComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadWrite)]
public TimeSpan KnockdownTime = TimeSpan.FromSeconds(1.5f);
[DataField]
public SharedStandingStateSystem.DropHeldItemsBehavior? KnockDownBehavior;
[DataField]
public bool RequireWield;
}

View File

@@ -0,0 +1,49 @@
using Content.Shared.Damage.Events;
using Content.Shared.Item.ItemToggle;
using Content.Shared.Stunnable;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Wieldable.Components;
namespace Content.Shared._White.Item.KnockDownOnHit;
public sealed class KnockDownOnHitSystem : EntitySystem
{
[Dependency] private readonly SharedStunSystem _stun = default!;
[Dependency] private readonly SharedItemToggleSystem _itemToggle = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<KnockDownOnHitComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<KnockDownOnHitComponent, MeleeHitEvent>(OnHit);
}
private void OnHit(Entity<KnockDownOnHitComponent> ent, ref MeleeHitEvent args)
{
var time = ent.Comp.KnockdownTime;
if (time <= TimeSpan.Zero)
return;
foreach (var uid in args.HitEntities)
{
if (ent.Comp.RequireWield)
{
if (!TryComp<WieldableComponent>(args.Weapon, out var weapon))
continue;
if (!weapon.Wielded)
continue;
}
_stun.TryKnockdown(uid, time, true, behavior: ent.Comp.KnockDownBehavior);
}
}
private void OnStaminaHitAttempt(Entity<KnockDownOnHitComponent> entity, ref StaminaDamageOnHitAttemptEvent args)
{
if (!_itemToggle.IsActivated(entity.Owner))
args.Cancelled = true;
}
}

View File

@@ -1,8 +0,0 @@
namespace Content.Shared._White.Item.TelescopicBaton;
[RegisterComponent]
public sealed partial class TelescopicBatonComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadWrite)]
public TimeSpan KnockdownTime = TimeSpan.FromSeconds(1.5f);
}

View File

@@ -1,56 +0,0 @@
using Content.Shared.Damage.Events;
using Content.Shared.Examine;
using Content.Shared.Item;
using Content.Shared.Item.ItemToggle;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Stunnable;
namespace Content.Shared._White.Item.TelescopicBaton;
public sealed class TelescopicBatonSystem : EntitySystem
{
[Dependency] private readonly SharedItemSystem _item = default!;
[Dependency] private readonly SharedStunSystem _stun = default!;
[Dependency] private readonly SharedItemToggleSystem _itemToggle = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TelescopicBatonComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<TelescopicBatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<TelescopicBatonComponent, ItemToggledEvent>(ToggleDone);
SubscribeLocalEvent<TelescopicBatonComponent, StaminaMeleeHitEvent>(OnHit);
}
private void OnHit(Entity<TelescopicBatonComponent> ent, ref StaminaMeleeHitEvent args)
{
var time = ent.Comp.KnockdownTime;
if (time <= TimeSpan.Zero)
return;
foreach (var (uid, _) in args.HitList)
{
_stun.TryKnockdown(uid, time, true);
}
}
private void OnStaminaHitAttempt(Entity<TelescopicBatonComponent> entity, ref StaminaDamageOnHitAttemptEvent args)
{
if (!_itemToggle.IsActivated(entity.Owner))
args.Cancelled = true;
}
private void OnExamined(Entity<TelescopicBatonComponent> entity, ref ExaminedEvent args)
{
var onMsg = _itemToggle.IsActivated(entity.Owner)
? Loc.GetString("comp-telebaton-examined-on")
: Loc.GetString("comp-telebaton-examined-off");
args.PushMarkup(onMsg);
}
private void ToggleDone(Entity<TelescopicBatonComponent> entity, ref ItemToggledEvent args)
{
_item.SetHeldPrefix(entity.Owner, args.Activated ? "on" : "off");
}
}

View File

@@ -1,84 +1,4 @@
Entries:
- author: RavMorgan
changes:
- message: "\u0423\u0434\u0430\u043B\u0435\u043D\u043E \u0432\u0441\u044F\u043A\u043E\
\u0435!"
type: Add
id: 41
time: '2023-01-22T11:26:16.0000000+00:00'
- author: RavMorgan
changes:
- message: "\u041A\u043E\u043D\u0441\u043E\u043B\u044C \u0445\u043E\u043F\u0430\
\ \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u043E\u0440\u043C\u0430\u043B\u044C\
\u043D\u043E \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\
\u043D\u0430!"
type: Add
id: 42
time: '2023-01-22T11:28:17.0000000+00:00'
- author: RavMorgan
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0440\u0435\u0437\
\u043D\u044F \u0432 \u043A\u043E\u043D\u0446\u0435 \u0440\u0430\u0443\u043D\u0434\
\u0430!"
type: Add
id: 43
time: '2023-01-22T12:11:03.0000000+00:00'
- author: RavMorgan
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0431\u043B\u043E\
\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0444\u0435\u0441\
\u0441\u0438\u0439 \u0434\u043B\u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\
\u0435\u043D\u043D\u044B\u0445 \u0432\u0438\u0434\u043E\u0432. \u0415\u0441\u043B\
\u0438 \u0432\u0430\u0448\u0435\u0433\u043E \u0432\u0438\u0434\u0430 \u043D\u0435\
\u0442 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0430\u0437\u0440\u0435\
\u0448\u0435\u043D\u043D\u044B\u0445 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\
\u043D\u043E\u0439 \u0432\u0430\u043C\u0438 \u043F\u0440\u043E\u0444\u0435\u0441\
\u0441\u0438\u0438, \u0442\u043E \u0432\u0430\u0448\u0430 \u0432\u043D\u0435\
\u0448\u043D\u043E\u0441\u0442\u044C \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\
\u043C\u0435\u043D\u0435\u043D\u0430 \u043D\u0430 \u0440\u0430\u043D\u0434\u043E\
\u043C\u043D\u0443\u044E \u0432\u043D\u0435\u0448\u043D\u043E\u0441\u0442\u044C\
\ \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430 \u043F\u043E\u0434\u0445\
\u043E\u0434\u044F\u0449\u0438\u0445 \u0432\u0438\u0434\u043E\u0432, \u043B\u0438\
\u0431\u043E \u0436\u0435 \u043D\u0430 \u043E\u0434\u043D\u043E\u0433\u043E\
\ \u0438\u0437 \u0432\u0430\u0448\u0438\u0445 \u043F\u0435\u0440\u0441\u043E\
\u043D\u0430\u0436\u0435\u0439, \u0435\u0441\u043B\u0438 \u0435\u0433\u043E\
\ \u0432\u0438\u0434 \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442!"
type: Add
id: 44
time: '2023-01-23T11:45:06.0000000+00:00'
- author: BronyUraj
changes:
- message: "\u0421\u043A\u0440\u0443\u0431\u0431\u0435\u0440 \u0440\u0430\u0431\u043E\
\u0442\u0430\u0435\u0442 \u0431\u044B\u0441\u0442\u0440\u0435\u0435"
type: Add
id: 45
time: '2023-01-23T18:17:29.0000000+00:00'
- author: BronyUraj
changes:
- message: "\u041C\u0435\u0434\u0432\u0435\u0434\u0438 \u0442\u0435\u043F\u0435\u0440\
\u044C \u043F\u0440\u043E\u0445\u043E\u0434\u044F\u0442 \u0432 \u0434\u0432\u0435\
\u0440\u0438."
type: Add
- message: "\u0413\u043E\u0440\u0438\u043B\u043B\u044B \u0441\u0442\u0430\u043B\u0438\
\ \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043D\u044B\u043C\u0438."
type: Add
- message: "\u0420\u0435\u0430\u0433\u0435\u043D\u0442 \u043F\u0447\u0435\u043B\
\ \u0441\u0442\u0430\u043B \u0441\u043F\u0430\u0432\u043D\u0438\u0442\u044C\
\ \u0437\u043B\u044B\u0445 \u043F\u0447\u0435\u043B."
type: Add
- message: "\u041F\u0447\u0435\u043B\u044B \u0438\u0437\u0434\u0430\u044E\u0442\
\ \u0437\u0432\u0443\u043A (\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E\
\u0435 \u0440\u0435\u0448\u0435\u043D\u0438\u0435)"
type: Add
id: 46
time: '2023-01-24T07:41:12.0000000+00:00'
- author: RavMorgan
changes:
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0432\u0441\
\u044F\u043A\u043E\u0435!"
type: Add
id: 47
time: '2023-01-24T09:28:49.0000000+00:00'
- author: RavMorgan
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043D\u043E\u0432\
@@ -8710,3 +8630,94 @@
id: 540
time: '2024-09-08T04:00:32.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/689
- author: BIG_Zi_348
changes:
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u043C\u0435\
\u043B\u043E\u0447\u0438"
type: Fix
id: 541
time: '2024-09-10T17:20:56.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/690
- author: Jabak
changes:
- message: "\u042F\u0434\u0435\u0440\u043A\u0430 \u0434\u0435\u043B\u0430\u0435\u0442\
\ \u0411\u0423\u041C!!! \u0420\u0430\u0443\u043D\u0434 \u0437\u0430\u043A\u0430\
\u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F."
type: Fix
id: 542
time: '2024-09-12T18:30:03.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/692
- author: BIG_Zi
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0435\u0440\u0435\
\u0432\u043E\u0434 \u0430\u043A\u0446\u0435\u043D\u0442\u0430 \u0448\u0435\u043F\
\u0435\u043B\u044F\u0432\u043E\u0441\u0442\u0438."
type: Add
id: 543
time: '2024-09-12T18:29:30.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/691
- author: ThereDrD0
changes:
- message: "\u041C\u0438\u043B\u0438 \u043E\u0440\u0443\u0436\u0438\u0435 \u043F\
\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043E. \u0422\u0435\
\u043F\u0435\u0440\u044C \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043F\
\u043E-\u0434\u0440\u0443\u0433\u043E\u043C\u0443."
type: Add
id: 544
time: '2024-09-12T18:52:04.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/681
- author: BIG_Zi
changes:
- message: "\u0423\u0431\u0440\u0430\u043D\u044B \u043F\u0430\u0441\u0441\u0430\u0436\
\u0438\u0440\u044B."
type: Remove
id: 545
time: '2024-09-14T07:16:24.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/695
- author: BIG_Zi_348
changes:
- message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434\u044B \u043C\u0435\u043B\u043E\
\u0447\u0435\u0439."
type: Add
id: 546
time: '2024-09-15T12:23:31.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/697
- author: BIG_Zi_348
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0435\u0440\u0435\
\u0432\u043E\u0434 \u0441\u0443\u043F\u0435\u0440\u043C\u0430\u0442\u0435\u0440\
\u0438\u0438 \u0438 \u0432\u0441\u0435\u0445 \u0435\u0451 \u0441\u0438\u0441\
\u0442\u0435\u043C."
type: Add
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0435\u0440\u0435\
\u0432\u043E\u0434 \u043F\u0440\u043E\u0436\u0435\u043A\u0442\u043E\u0440\u0430\
\ \u0445\u0430\u043C\u0435\u043B\u0435\u043E\u043D\u0430 \u0438 \u0432\u0441\
\u0435\u0445 \u0435\u0433\u043E \u0441\u0438\u0441\u0442\u0435\u043C."
type: Add
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043E\u0448\
\u0438\u0431\u043A\u0430 \u043B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\
\u0438\u0438 \u0437\u0430\u043A\u043E\u043D\u0430 \u0431\u043E\u0440\u0433\u043E\
\u0432 \u043E\u0442 \u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0448\u0442\u043E\
\u0440\u043C\u0430."
type: Fix
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u043E\u043F\
\u0438\u0441\u0430\u043D\u0438\u0435 \u0438\u043C\u043F\u043B\u0430\u043D\u0442\
\u0435\u0440\u043E\u0432 \u0432 \u0440\u0443\u043A\u0435."
type: Fix
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u043E\u043F\
\u0435\u0447\u0430\u0442\u043A\u0438 \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\
\u0440\u044B\u0445 \u043C\u0435\u0441\u0442\u0430\u0445."
type: Fix
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0431\u0430\u0433\
\ \u0441 \u0431\u043B\u0438\u043D\u0447\u0438\u043A\u0430\u043C\u0438."
type: Fix
- message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043B\u043E\
\u0433\u0438\u043A\u0430 \u043F\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\
\u044F \u0437\u0430\u0440\u044F\u0434\u043E\u0432 \u0420\u0426\u0414."
type: Fix
- message: "\u041F\u043E\u0434\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u043C\
\u0435\u043B\u043E\u0447\u0438."
type: Tweak
id: 547
time: '2024-09-17T18:00:13.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/700

View File

@@ -2,3 +2,9 @@ chameleon-projector-inside-container = There's no room to scan that!
chameleon-projector-invalid = You can't disguise as that!
chameleon-projector-success = Projected new disguise.
chameleon-projector-set-disguise = Set Disguise
# Actions
ent-ActionDisguiseNoRot = Toggle Rotation
.desc = Use this to prevent your disguise from rotating, making it easier to hide in some scenarios.
ent-ActionDisguiseAnchor = Toggle Anchored
.desc = For many objects you will want to be anchored to not be completely obvious.

View File

@@ -1,3 +1,4 @@
rcd-ammo-component-on-examine = It holds {$charges} charges.
rcd-ammo-component-after-interact-full = The RCD is full!
rcd-ammo-component-after-interact-refilled = You refill the RCD.
rcd-ammo-component-after-interact-not-enough = Not enough material for charge.

View File

@@ -27,8 +27,8 @@ ent-SpawnMobSyndicateFootSoldier = генератор пехотинца син
.desc = "генератор пехотинца синдиката"
ent-SpawnMobSyndicateFootsoldierPilot = генератор пилота челнока синдиката
.desc = "генератор пилота челнока синдиката"
ent-SpawnPointPassenger = пассажир
.desc = "пассажир"
ent-SpawnPointPassenger = ассистент
.desc = "ассистент"
ent-SpawnPointInspector = инспектор
.desc = "инспектор"
ent-SpawnPointBomzh = бомж

View File

@@ -20,8 +20,8 @@ ent-ERTMedicIDCard = удостоверение личности медика ER
.desc = "удостоверение личности медика ERT"
ent-ERTSecurityIDCard = удостоверение личности службы безопасности ERT
.desc = "удостоверение личности службы безопасности ERT"
ent-NukieAgentIDCard = пропуск пассажира
.desc = "пропуск пассажира"
ent-NukieAgentIDCard = ID карта ассистента
.desc = "Карта, необходимая для доступа в различные области станции."
.suffix = Нюки
ent-PirateIDCard = пиратское удостоверение личности
.desc = "пиратское удостоверение личности"

View File

@@ -3,3 +3,6 @@ ent-TelescopicBaton = телескопическая дубинка
comp-telebaton-examined-on = Дубинка в боевом положении.
comp-telebaton-examined-off = Дубинка сложена.
comp-item-toggle-on = Активировано
comp-item-toggle-off = Деактивировано

View File

@@ -0,0 +1 @@
bodyburn-text-others = {$name} сгорел до тла!

View File

@@ -0,0 +1,10 @@
chameleon-projector-inside-container = Здесь нет места для сканирования!
chameleon-projector-invalid = Неверный объект для маскировки!
chameleon-projector-success = Маскировка выполнена успешно.
chameleon-projector-set-disguise = Выбрать для маскировки
# Actions
ent-ActionDisguiseNoRot = Переключить вращение
.desc = Используйте это, чтобы предотвратить вращение вашей маскировки, что упрощает маскировку в некоторых ситуациях.
ent-ActionDisguiseAnchor = Переключить закрепление
.desc = Для многих объектов вам надо быть закреплённым, чтобы быть менее заметным.

View File

@@ -12,7 +12,8 @@ implanter-inject-text = Установка
implanter-empty-text = Пусто
implanter-label = [color=white]Имплант: { $implantName }{ $lineBreak }Режим: { $modeString }[/color]
implanter-label = [color=white]{$implantName}
Режим: {$modeString}[/color]
implanter-contained-implant-text = [color=green]{ $desc }[/color]

View File

@@ -2,7 +2,7 @@ ent-ToyFigurineBoxer = фигурка боксёра
.desc = Статуэтка, изображающая боксера в красных перчатках.
ent-ToyFigurineCaptain = фигурка капитана
.desc = Статуэтка, изображающая стандартную экипировку капитана, принадлежащего гражданскому судну Nanotrasen.
ent-ToyFigurineHeadOfSecurity = фигурка главый службы безопасности
ent-ToyFigurineHeadOfSecurity = фигурка главы службы безопасности
.desc = Статуэтка, изображающая славного начальника отдела безопасности.
ent-ToyFigurineWarden = фигурка надзирателя
.desc = Статуэтка, изображающая надзирателя, готового в любой момент посадить кого-нибудь в тюрьму.

View File

@@ -25,9 +25,9 @@ ent-ParticleAcceleratorUnfinishedBase = ""
.desc = ""
ent-ParticleAcceleratorEmitterPort = правый эмиттер УЧ
.desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом.
ent-ParticleAcceleratorEmitterFore = центральный эммитер УЧ
ent-ParticleAcceleratorEmitterFore = центральный эмиттер УЧ
.desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом.
ent-ParticleAcceleratorEmitterStarboard = левый эммитер УЧ
ent-ParticleAcceleratorEmitterStarboard = левый эмиттер УЧ
.desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом.
ent-ParticleAcceleratorEmitterPortUnfinished = { ent-ParticleAcceleratorEmitterPort }
.desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом. Он выглядит незаконченным.

View File

@@ -23,7 +23,7 @@ ent-ClothingUniformJumpsuitSeniorSalvageSpecialist = комбинезон охо
ent-ClothingUniformJumpsuitRecruitNT = комбинезон новобранца
.desc = Стильный серый комбинезон с синей отделкой. Идеально подходит для достойного помощника.
ent-ClothingUniformJumpsuitRecruitSyndie = комбинезон новобранца синдиката
.desc = Сомнительный темно-серый комбинезон. Как будто пассажиры и без того недостаточно сомневались.
.desc = Сомнительный темно-серый комбинезон. Как будто ассистенты и без того недостаточно сомневались.
ent-ClothingUniformJumpsuitRepairmanNT = комбинезон ремонтника
.desc = Комбинезон, который напоминает вам об определенной рабочей должности в секторе экипажа. Надеюсь, тебе не придется выполнять ту же работу, что и ЭТИМ уродам.
ent-ClothingUniformJumpsuitRepairmanSyndie = комбинезон ремонтника синдиката

View File

@@ -6,11 +6,11 @@ comp-mind-ghosting-prevented = Вы не можете стать призрак
comp-mind-examined-catatonic = { CAPITALIZE(SUBJECT($ent)) } в кататоническом ступоре. Стрессы жизни в глубоком космосе, должно быть, оказались слишком тяжелы для { OBJECT($ent) }. Восстановление маловероятно.
comp-mind-examined-dead = { CAPITALIZE(POSS-PRONOUN($ent)) } душа покинула тело.
comp-mind-examined-ssd = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро придти в себя.
comp-mind-examined-ssd = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро прийти в себя.
comp-mind-examined-dead-and-ssd = { CAPITALIZE(POSS-ADJ($ent)) } душа дремлет и может скоро вернуться.
comp-mind-examined-dead-and-irrecoverable = { CAPITALIZE(POSS-ADJ($ent)) } душа покинула тело и пропала. Восстановление маловероятно.
mind-component-no-mind-and-alive-text = { CAPITALIZE(SUBJECT($ent)) } в кататоническом ступоре. Стрессы жизни в глубоком космосе, должно быть, оказались слишком тяжелы для него. Восстановление маловероятно.
mind-component-no-mind-and-dead-text = { CAPITALIZE(POSS-PRONOUN($ent)) } душа покинула тело и пропала. Восстановление маловероятно.
mind-component-mind-and-no-session-text = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро придти в себя.
mind-component-mind-and-no-session-text = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро прийти в себя.

View File

@@ -1,6 +1,7 @@
rcd-ammo-component-on-examine = Оно содержит { $charges } зарядов.
rcd-ammo-component-after-interact-full = РЦд полностью заряжена!
rcd-ammo-component-after-interact-full = РЦД полностью заряжен!
rcd-ammo-component-after-interact-refilled = Вы перезаряжаете РЦД.
rcd-ammo-component-on-examine-text = Содержит { $ammo } зарядов.
rcd-ammo-component-after-interact-full-text = РЦД полностью заряжен!
rcd-ammo-component-after-interact-refilled-text = Вы перезаряжаете РЦД.
rcd-ammo-component-after-interact-not-enough = Недостаточно материала для заряда.

View File

@@ -43,7 +43,7 @@ ent-ClothingHeadsetSecurity = охранная гарнитура
ent-ClothingHeadsetService = сервисная гарнитура
.desc = Гарнитура, используемая обслуживающим персоналом, задачей которого является поддержание станции в полноценном, счастливом и чистом состоянии.
.suffix = { "" }
ent-ClothingHeadsetGrey = гарнитура пассажира
ent-ClothingHeadsetGrey = гарнитура ассистента
.desc = Модифицированный модульный интерком, надеваемый на голову. Принимает ключи шифрования.
.suffix = { "" }
ent-ClothingHeadsetFreelance = гарнитура наемника

View File

@@ -1,3 +1,3 @@
ent-ClothingHeadsetChameleon = гарнитура пассажира
ent-ClothingHeadsetChameleon = гарнитура ассистента
.desc = Модифицированный модульный интерком, надеваемый на голову. Принимает ключи шифрования.
.suffix = Хамелеон

View File

@@ -2,5 +2,5 @@ ent-Holoprojector = проектор голографических знаков
.desc = Удобный голографический проектор, отображающий табличку уборщика.
.suffix = { "" }
ent-HolofanProjector = атмос голопроектор
.desc = Останавливает суицидально настроеных пассажиров от убийства остальных во время разгерметизации.
.desc = Останавливает суицидально настроеных ассистентов от убийства остальных во время разгерметизации.
.suffix = { "" }

View File

@@ -2,7 +2,7 @@ ent-BaseVendingMachineRestock = набор пополнения Торгомат
.desc = Набор для пополнения торговых автоматов фирменными товарами.
.suffix = { "" }
ent-VendingMachineRestockBooze = набор пополнения АлкоМат
.desc = Поместите в АлкоМат чтобы начать вечеринку! Не для продажи пассажирам, не достигшим совершеннолетия.
.desc = Поместите в АлкоМат чтобы начать вечеринку! Не для продажи ассистентам, не достигшим совершеннолетия.
.suffix = { "" }
ent-VendingMachineRestockChang = набор пополнения Мистер Чанг
.desc = Коробка, покрытая белыми наклейками с крупными красными китайскими иероглифами, готовая к загрузке в ближайший торгомат Мистер Чанг.

View File

@@ -9,6 +9,7 @@ ion-storm-the-job = { CAPITALIZE($job) }
ion-storm-clowns = КЛОУНЫ
ion-storm-heads = ГЛАВЫ
ion-storm-crew = ЭКИПАЖ
ion-storm-people = ЛЮДИ
ion-storm-adjective-things = {$adjective} ОБЪЕКТЫ
ion-storm-x-and-y = {$x} И {$y}

View File

@@ -349,7 +349,7 @@ uplink-cigarettes-name = Пачка сигарет Синдиката
uplink-cigarettes-desc = Элитные сигареты для элитных агентов. Насыщенные лекарствами, когда вам нужно больше, чем просто успокоить нервы.
uplink-clothing-conducting-gloves-name = Токопроводящие перчатки
uplink-clothing-conducting-gloves-desc = Выглядят как изолированные перчатки, но удар током нанесёт вам гораздо больше повреждений, чем если бы у вас вообще ничего не было на руках! Лучше всего подойдут в качестве подарка пассажирам, которых вы искренне недолюбливаете.
uplink-clothing-conducting-gloves-desc = Выглядят как изолированные перчатки, но удар током нанесёт вам гораздо больше повреждений, чем если бы у вас вообще ничего не было на руках! Лучше всего подойдут в качестве подарка ассистентам, которых вы искренне недолюбливаете.
uplink-snack-box-name = Коробка закусок Синдиката
uplink-snack-box-desc = Коробка с вкусными закусками и напитками, которые можно съесть в одиночку или разделить с командой. Включает одну нежеланную игрушку.

View File

@@ -88,13 +88,13 @@ character-information-ui-flavor-text-disabled = На этом сервере о
# sm
supermatter-self = Supermatter
supermatter-danger-message = Danger! Crystal hyperstructure integrity faltering! Integrity: { $integrity }%
supermatter-warning-message = WARNING! Crystal hyperstructure integrity reaching critical levels! Integrity: { $integrity }%
supermatter-safe-alert = Crystalline hyperstructure returning to safe operating parameters. Failsafe has been Disengaged. Integrity: { $integrity }%
supermatter-delamination-overmass = The Supermatter has Reached Critical Mass Falure. Singularity formation Imminent
supermatter-delamination-default = The Supermatter has Reached Critical Integrity Falure. Emergency Causality Destabilization Field has been Activated.
supermatter-seconds-before-delam = { $Seconds } Seconds Remain Before Delamination.
supermatter-self = Суперматерия
supermatter-danger-message = Опасность! Нарушение целостности кристаллической гиперструктуры! Целостность: { $integrity }%
supermatter-warning-message = ВНИМАНИЕ! Целостность кристаллической гиперструктуры достигает критических уровней! Целостность: { $integrity }%
supermatter-safe-alert = Кристаллическая гиперструктура возвращается к безопасным рабочим параметрам. Предохранитель отключён. Целостность: { $integrity }%
supermatter-delamination-overmass = Суперматерия достигла уровня критической массы. Обнаружена угроза формирования сингулярности.
supermatter-delamination-default = Суперматерия достигла уровня критической целостности. Активироанно экстренное поле дестабилизации причинности.
supermatter-seconds-before-delam = { $Seconds } секунд осталось до деламинации.
# MobStateShit

View File

@@ -256120,8 +256120,8 @@ entities:
- uid: 38080
components:
- type: MetaData
desc: Переключает работу эмитеров.
name: переключатель эммитеров
desc: Переключает работу эмиттеров.
name: переключатель эмиттеров
- type: Transform
rot: 3.141592653589793 rad
pos: -157.5,71.5

View File

@@ -241,10 +241,10 @@
# in relation to how they cause bleed rate.
- type: damageModifierSet
id: BloodlossHuman
coefficients:
Blunt: 0.05
Slash: 0.25
Piercing: 0.2
coefficients: # WD edit alert!! Weapons rebalanced - only slash and piercing damage should cast bleeding
Blunt: 0.0
Slash: 0.45 # WD
Piercing: 0.3 # WD
Shock: 0.0
Cold: 0.0
Heat: -0.5 # heat damage cauterizes wounds, but will still hurt obviously.

View File

@@ -315,7 +315,7 @@
- ВРАЧИ
- МИМЫ
- ПАРАМЕДИКИ
- ПАССАЖИРЫ
- АССИСТЕНТЫ
- КВАРТИРМЕЙСТЕРЫ
- НАУЧНЫЕ РУКОВОДИТЕЛИ
- РОБОТОТЕХНИКИ

View File

@@ -22,7 +22,7 @@
shape:
!type:PhysShapeCircle
radius: 0.25
density: 0.8
density: 10
mask:
- FlyingMobMask
layer:
@@ -89,7 +89,7 @@
shape:
!type:PhysShapeCircle
radius: 0.1
density: 0.1
density: 30
mask:
- FlyingMobMask
layer:
@@ -325,7 +325,7 @@
shape:
!type:PhysShapeCircle
radius: 0.2
density: 0.0007
density: 100
mask:
- SmallMobMask
layer:
@@ -429,7 +429,7 @@
shape:
!type:PhysShapeCircle
radius: 0.2
density: 0.007
density: 100
mask:
- SmallMobMask
layer:
@@ -1565,7 +1565,7 @@
shape:
!type:PhysShapeCircle
radius: 0.2
density: 0.76
density: 100
mask:
- SmallMobMask
layer:
@@ -2532,7 +2532,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 16.66
density: 50 #They actually are pretty light, I looked it up
mask:
- MobMask
layer:
@@ -2609,7 +2609,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 25.5
density: 50
mask:
- MobMask
layer:
@@ -2758,7 +2758,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 9
density: 15
mask:
- MobMask
layer:
@@ -2927,17 +2927,6 @@
Base: caracal_flop
Dead:
Base: caracal_dead
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.35
density: 30
mask:
- MobMask
layer:
- MobLayer
- type: entity
name: kitten
@@ -2971,17 +2960,6 @@
thresholds:
0: Alive
25: Dead
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.35
density: 2
mask:
- MobMask
layer:
- MobLayer
- type: entity
name: sloth
@@ -3062,7 +3040,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 4
density: 5
mask:
- MobMask
layer:
@@ -3141,7 +3119,7 @@
shape:
!type:PhysShapeCircle
radius: 0.2
density: 0.8
density: 120
mask:
- SmallMobMask
layer:
@@ -3263,7 +3241,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 750
density: 250
mask:
- MobMask
layer:
@@ -3348,7 +3326,7 @@
shape:
!type:PhysShapeCircle
radius: 0.35
density: 15
density: 100 # High, because wood is heavy.
mask:
- MobMask
layer:

View File

@@ -228,13 +228,13 @@
layers:
- state: pancakes1
map: ["pancakes1"]
visible: false
visible: true # WD changed to fix chameleon projector bug
- state: pancakes2
map: ["pancakes2"]
visible: false
visible: true # WD changed to fix chameleon projector bug
- state: pancakes3
map: ["pancakes3"]
visible: false
visible: true # WD changed to fix chameleon projector bug
- state: pancakes4
map: ["pancakes4"]
visible: false
@@ -277,7 +277,7 @@
layers:
- state: pancakesbb1
map: ["pancakesbb1"]
visible: false
visible: true # WD changed to fix chameleon projector bug
- state: pancakesbb2
map: ["pancakesbb2"]
visible: false
@@ -309,7 +309,7 @@
layers:
- state: pancakescc1
map: ["pancakescc1"]
visible: false
visible: true # WD changed to fix chameleon projector bug
- state: pancakescc2
map: ["pancakescc2"]
visible: false

View File

@@ -9,7 +9,7 @@
- type: Item
size: Normal
sprite: Objects/Tanks/generic.rsi
storedRotation: 45
storedRotation: 44 # WD fixing some rare texture bug
- type: Clothing
quickEquip: false
sprite: Objects/Tanks/generic.rsi

View File

@@ -11,15 +11,16 @@
wideAnimationRotation: -135
damage:
types:
Blunt: 10
Blunt: 8 # WD
Structural: 5
soundHit:
path: "/Audio/Weapons/smash.ogg"
canHeavyAttack: false
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Blunt: 5
Blunt: 4 # WD
Structural: 10
- type: Item
size: Normal
@@ -42,6 +43,14 @@
- type: Tag
tags:
- BaseballBat
- type: MeleeThrowOnHit # WD
lifetime: 0.2
speed: 5
requireWield: true
- type: KnockDownOnHit
knockDownBehavior: NoDrop
knockdownTime: 0.5
requireWield: true
- type: entity
name: incomplete baseball bat

View File

@@ -41,7 +41,7 @@
attackRate: 1.5
damage:
types:
Slash: 14
Slash: 12 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item

View File

@@ -13,7 +13,7 @@
attackRate: 1.5
damage:
types:
Slash: 12
Slash: 9 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
@@ -66,7 +66,7 @@
attackRate: 0.75
damage:
types:
Slash: 33
Slash: 27 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
@@ -104,7 +104,7 @@
damage:
types:
Blunt: 10
Slash: 20
Slash: 18 # WD
Structural: 5
soundHit:
path: "/Audio/Weapons/smash.ogg"
@@ -113,7 +113,7 @@
damage:
types:
Blunt: 4
Slash: 12
Slash: 10 # WD
Structural: 10
- type: Item
size: Ginormous

View File

@@ -13,7 +13,7 @@
attackRate: 1.3
damage:
types:
Slash: 10.5
Slash: 10.5 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
@@ -45,7 +45,7 @@
attackRate: 1.5
damage:
types:
Slash: 17.5
Slash: 15 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: EmbeddableProjectile
@@ -55,7 +55,7 @@
- type: DamageOtherOnHit
damage:
types:
Slash: 20
Slash: 44 # WD
- type: Item
size: Small
- type: DisarmMalus

View File

@@ -36,8 +36,7 @@
variation: 0.125
activatedDamage:
types:
Slash: 15
Heat: 15
Slash: 41 # WD
Structural: 20
- type: Sprite
sprite: Objects/Weapons/Melee/e_sword.rsi
@@ -131,8 +130,7 @@
variation: 0.250
activatedDamage:
types:
Slash: 10
Heat: 10
Slash: 23 # WD
deactivatedSecret: true
- type: ItemToggleActiveSound
activeSound:
@@ -263,8 +261,7 @@
- type: IncreaseDamageOnWield
damage:
types:
Slash: 15
Heat: 15
Slash: 30 # WD
- type: Reflect
reflectProb: 1
enabled: false
@@ -299,8 +296,7 @@
variation: 0.125
activatedDamage:
types:
Slash: 15
Heat: 15
Slash: 33 # WD
Structural: 20
- type: Reflect
reflectProb: 0.8

View File

@@ -18,8 +18,8 @@
damage:
types:
# axes are kinda like sharp hammers, you know?
Blunt: 5
Slash: 13
Blunt: 3 # WD
Slash: 10 # WD
Structural: 10
soundHit:
path: "/Audio/Weapons/smash.ogg"
@@ -28,7 +28,7 @@
damage:
types:
Blunt: 2.5
Slash: 10.5
Slash: 8 # WD
Structural: 60
- type: Item
size: Ginormous

View File

@@ -14,7 +14,7 @@
wideAnimationRotation: -135
damage:
types:
Slash: 12
Slash: 10 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Sprite
@@ -42,6 +42,10 @@
- type: Item
sprite: Objects/Weapons/Melee/kitchen_knife.rsi
storedRotation: -45
- type: DamageOtherOnHit # WD
damage:
types:
Piercing: 20
- type: GuideHelp
guides:
- Chef
@@ -68,7 +72,7 @@
attackRate: 1.5
damage:
types:
Slash: 12
Slash: 13 # WD
- type: Item
size: Normal
sprite: Objects/Weapons/Melee/cleaver.rsi
@@ -100,7 +104,7 @@
- type: DamageOtherOnHit
damage:
types:
Slash: 10
Piercing: 27 # WD
- type: Item
sprite: Objects/Weapons/Melee/combat_knife.rsi
storedRotation: -45
@@ -136,7 +140,11 @@
attackRate: 1.0
damage:
types:
Slash: 18 # Same DPS as combat knife
Slash: 12 # WD
- type: DamageOtherOnHit # WD
damage:
types:
Piercing: 44
- type: Item
sprite: Objects/Weapons/Melee/kukri_knife.rsi
@@ -159,7 +167,7 @@
- type: DamageOtherOnHit
damage:
types:
Slash: 10
Piercing: 10 # WD
- type: Sprite
sprite: Clothing/Head/Hats/greyflatcap.rsi
- type: Clothing
@@ -289,7 +297,7 @@
damage:
types:
Slash: 10
Piercing: 15
Piercing: 35 # WD
- type: Item
sprite: Objects/Weapons/Melee/throwing_knife.rsi
storedRotation: -45

View File

@@ -13,7 +13,7 @@
attackRate: 1.5
damage:
types:
Slash: 19
Slash: 14 # WD
# WD edit sounds start
soundHit:
path: /Audio/White/Items/hit/sabre_hit2.ogg
@@ -27,12 +27,12 @@
storedRotation: 44 # It just works
shape:
- 0, 0, 4, 0
- type: Tag
tags:
- CaptainSabre
- type: DisarmMalus
- type: MeleeBlock
delay: 6.1
- type: Tag
tags:
- CaptainSabre
- type: entity
name: katana
@@ -51,7 +51,7 @@
wideAnimationRotation: -135
damage:
types:
Slash: 24
Slash: 20 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
@@ -80,7 +80,7 @@
wideAnimationRotation: -60
damage:
types:
Slash: 30
Slash: 33 # WD
- type: Item
size: Huge
sprite: Objects/Weapons/Melee/energykatana.rsi
@@ -123,7 +123,7 @@
wideAnimationRotation: -135
damage:
types:
Slash: 20
Slash: 17 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
@@ -155,7 +155,7 @@
attackRate: 0.75
damage:
types:
Slash: 30
Slash: 21 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item
@@ -191,7 +191,7 @@
wideAnimationRotation: -135
damage:
types:
Slash: 20
Slash: 20 # WD
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: Item

View File

@@ -14,8 +14,7 @@
attackRate: 0.75
damage:
types:
Blunt: 5
Slash: 5
Blunt: 10
Structural: 10
soundHit:
path: "/Audio/Weapons/sledgehammer_hit_1.ogg"
@@ -23,8 +22,7 @@
- type: IncreaseDamageOnWield
damage:
types:
Blunt: 10
Slash: 5
Blunt: 15
Structural: 40
- type: Item
size: Ginormous

View File

@@ -77,7 +77,7 @@
damage:
types:
Slash: 8
Piercing: 10
Piercing: 16 # WD
- type: StaminaDamageOnCollide
damage: 45
- type: StaminaDamageOnEmbed

View File

@@ -15,7 +15,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelCheckerLight
@@ -34,7 +33,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteelCheckerLight
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelCheckerDark
@@ -53,7 +51,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteelCheckerDark
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelMini
@@ -72,7 +69,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelPavement
@@ -91,7 +87,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelDiagonal
@@ -110,7 +105,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelOffset
@@ -123,7 +117,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelMono
@@ -142,7 +135,6 @@
collection: FootstepTile
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelPavementVertical
@@ -161,7 +153,6 @@
collection: FootstepTile
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelHerringbone
@@ -180,7 +171,6 @@
collection: FootstepTile
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorSteelDiagonalMini
@@ -199,7 +189,6 @@
collection: FootstepTile
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorBrassFilled
@@ -212,7 +201,6 @@
collection: FootstepHull
itemDrop: FloorTileItemBrassFilled
heatCapacity: 10000
tileRipResistance: 220
- type: tile
id: FloorBrassReebe
@@ -225,7 +213,6 @@
collection: FootstepHull
itemDrop: FloorTileItemBrassReebe
heatCapacity: 10000
tileRipResistance: 220
- type: tile
id: FloorPlastic
@@ -244,7 +231,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWood
@@ -265,7 +251,6 @@
collection: BarestepWood
itemDrop: FloorTileItemWood
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhite
@@ -284,7 +269,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhiteMini
@@ -303,7 +287,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhitePavement
@@ -322,7 +305,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhiteDiagonal
@@ -341,7 +323,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhiteOffset
@@ -354,7 +335,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhiteMono
@@ -373,7 +353,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhitePavementVertical
@@ -392,7 +371,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhiteHerringbone
@@ -411,7 +389,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhiteDiagonalMini
@@ -430,7 +407,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorWhitePlastic
@@ -449,7 +425,6 @@
collection: FootstepTile
itemDrop: FloorTileItemWhite
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorDark
@@ -468,7 +443,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkMini
@@ -487,7 +461,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkPavement
@@ -506,7 +479,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkDiagonal
@@ -525,7 +497,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkOffset
@@ -538,7 +509,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkMono
@@ -557,7 +527,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkPavementVertical
@@ -576,7 +545,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkHerringbone
@@ -595,7 +563,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkDiagonalMini
@@ -614,7 +581,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorDarkPlastic
@@ -633,7 +599,6 @@
collection: FootstepTile
itemDrop: FloorTileItemDark
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorTechMaint
@@ -646,7 +611,6 @@
collection: FootstepHull
itemDrop: FloorTileItemTechmaint
heatCapacity: 10000
tileRipResistance: 250
- type: tile
id: FloorReinforced
@@ -659,7 +623,6 @@
collection: FootstepHull
itemDrop: FloorTileItemReinforced
heatCapacity: 10000
reinforced: true
- type: tile
id: FloorMono
@@ -672,7 +635,6 @@
collection: FootstepTile
itemDrop: FloorTileItemMono
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorLino
@@ -685,7 +647,6 @@
collection: FootstepTile
itemDrop: FloorTileItemLino
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorSteelDirty
@@ -698,7 +659,6 @@
collection: FootstepPlating
itemDrop: FloorTileItemDirty
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorElevatorShaft
@@ -711,7 +671,6 @@
collection: FootstepHull
itemDrop: FloorTileItemElevatorShaft
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorMetalDiamond
@@ -724,7 +683,6 @@
collection: FootstepHull
itemDrop: FloorTileItemMetalDiamond
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorRockVault
@@ -737,7 +695,6 @@
collection: FootstepAsteroid
itemDrop: FloorTileItemRockVault
heatCapacity: 10000
tileRipResistance: 400
- type: tile
id: FloorBlue
@@ -750,7 +707,6 @@
collection: FootstepTile
itemDrop: FloorTileItemBlue
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorSteelLime
@@ -769,7 +725,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemLime
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorMining
@@ -782,7 +737,6 @@
collection: FootstepTile
itemDrop: FloorTileItemMining
heatCapacity: 10000
tileRipResistance: 250
- type: tile
id: FloorMiningDark
@@ -795,7 +749,6 @@
collection: FootstepTile
itemDrop: FloorTileItemMiningDark
heatCapacity: 10000
tileRipResistance: 250
- type: tile
id: FloorMiningLight
@@ -808,7 +761,6 @@
collection: FootstepTile
itemDrop: FloorTileItemMiningLight
heatCapacity: 10000
tileRipResistance: 250
# Departamental
- type: tile
@@ -822,7 +774,6 @@
collection: FootstepHull
itemDrop: FloorTileItemFreezer
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorShowroom
@@ -841,7 +792,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShowroom
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorHydro
@@ -854,7 +804,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemHydro
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorBar
@@ -873,7 +822,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemBar
heatCapacity: 10000
tileRipResistance: 100
- type: tile
id: FloorClown
@@ -886,7 +834,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemClown
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorMime
@@ -899,7 +846,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemMime
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorKitchen
@@ -912,7 +858,6 @@
collection: FootstepTile
itemDrop: FloorTileItemKitchen
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorLaundry
@@ -925,7 +870,6 @@
collection: FootstepTile
itemDrop: FloorTileItemLaundry
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorSteelDamaged
@@ -945,7 +889,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel #This should probably be made null when it becomes possible to make it such, in SS13 prying destroyed tiles wouldn't give you anything.
heatCapacity: 10000
tileRipResistance: 175
- type: tile
id: FloorSteelBurnt
@@ -962,7 +905,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemSteel #Same case as FloorSteelDamaged, make it null when possible
heatCapacity: 10000
tileRipResistance: 175
# Concrete
@@ -984,7 +926,6 @@
itemDrop: FloorTileItemConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorConcreteMono
@@ -1004,7 +945,6 @@
itemDrop: FloorTileItemConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorConcreteSmooth
@@ -1024,7 +964,6 @@
itemDrop: FloorTileItemConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorGrayConcrete
@@ -1044,7 +983,6 @@
itemDrop: FloorTileItemGrayConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorGrayConcreteMono
@@ -1064,7 +1002,6 @@
itemDrop: FloorTileItemGrayConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorGrayConcreteSmooth
@@ -1084,7 +1021,6 @@
itemDrop: FloorTileItemGrayConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorOldConcrete
@@ -1104,7 +1040,6 @@
itemDrop: FloorTileItemOldConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorOldConcreteMono
@@ -1124,7 +1059,6 @@
itemDrop: FloorTileItemOldConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
- type: tile
id: FloorOldConcreteSmooth
@@ -1144,7 +1078,6 @@
itemDrop: FloorTileItemOldConcrete
heatCapacity: 10000
weather: true
tileRipResistance: 300
# Carpets (non smoothing)
- type: tile
@@ -1161,7 +1094,6 @@
friction: 0.25
itemDrop: FloorTileItemArcadeBlue
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorArcadeBlue2
@@ -1177,7 +1109,6 @@
friction: 0.25
itemDrop: FloorTileItemArcadeBlue2
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorArcadeRed
@@ -1193,7 +1124,6 @@
friction: 0.25
itemDrop: FloorTileItemArcadeRed
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorEighties
@@ -1209,7 +1139,6 @@
friction: 0.25
itemDrop: FloorTileItemEighties
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorCarpetClown
@@ -1225,7 +1154,6 @@
friction: 0.25
itemDrop: FloorTileItemCarpetClown
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorCarpetOffice
@@ -1241,7 +1169,6 @@
friction: 0.25
itemDrop: FloorTileItemCarpetOffice
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorBoxing
@@ -1261,7 +1188,6 @@
friction: 0.25
itemDrop: FloorTileItemBoxing
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorGym
@@ -1281,7 +1207,6 @@
friction: 0.25
itemDrop: FloorTileItemGym
heatCapacity: 10000
tileRipResistance: 50
# Shuttle
- type: tile
@@ -1300,7 +1225,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttleWhite
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorShuttleGrey
@@ -1319,7 +1243,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttleGrey
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorShuttleBlack
@@ -1338,7 +1261,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttleBlack
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorShuttleBlue
@@ -1356,7 +1278,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttleBlue
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorShuttleOrange
@@ -1374,7 +1295,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttleOrange
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorShuttlePurple
@@ -1392,7 +1312,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttlePurple
heatCapacity: 10000
tileRipResistance: 4500
- type: tile
id: FloorShuttleRed
@@ -1410,7 +1329,6 @@
collection: FootstepFloor
itemDrop: FloorTileItemShuttleRed
heatCapacity: 10000
tileRipResistance: 4500
# Materials
@@ -1425,7 +1343,6 @@
collection: FootstepTile
itemDrop: FloorTileItemGold
heatCapacity: 10000
tileRipResistance: 600
- type: tile
id: FloorSilver
@@ -1438,7 +1355,6 @@
collection: FootstepTile
itemDrop: FloorTileItemSilver
heatCapacity: 10000
tileRipResistance: 500
- type: tile
id: FloorGlass
@@ -1451,7 +1367,6 @@
collection: FootstepTile
itemDrop: SheetGlass1
heatCapacity: 10000
tileRipResistance: 150
- type: tile
id: FloorRGlass
@@ -1470,7 +1385,6 @@
collection: FootstepTile
itemDrop: SheetRGlass1
heatCapacity: 10000
tileRipResistance: 175
# Circuits
- type: tile
@@ -1484,7 +1398,6 @@
collection: FootstepHull
itemDrop: FloorTileItemGCircuit
heatCapacity: 10000
tileRipResistance: 225
- type: tile
id: FloorBlueCircuit
@@ -1497,7 +1410,6 @@
collection: FootstepHull
itemDrop: FloorTileItemBCircuit
heatCapacity: 10000
tileRipResistance: 225
# Terrain
- type: tile
@@ -1783,7 +1695,6 @@
itemDrop: FloorTileItemFlesh
friction: 0.05 #slippy
heatCapacity: 10000
tileRipResistance: 80
- type: tile
id: FloorTechMaint2
@@ -1796,7 +1707,6 @@
collection: FootstepHull
itemDrop: FloorTileItemSteelMaint
heatCapacity: 10000
tileRipResistance: 225
- type: tile
id: FloorTechMaint3
@@ -1815,7 +1725,6 @@
collection: FootstepHull
itemDrop: FloorTileItemGratingMaint
heatCapacity: 10000
tileRipResistance: 225
- type: tile
id: FloorWoodTile
@@ -1836,7 +1745,6 @@
collection: BarestepWood
itemDrop: FloorTileItemWoodPattern
heatCapacity: 10000
tileRipResistance: 75
- type: tile
id: FloorBrokenWood
@@ -1860,7 +1768,6 @@
collection: BarestepWood
itemDrop: MaterialWoodPlank1
heatCapacity: 10000
tileRipResistance: 60
- type: tile
id: FloorWebTile
@@ -1875,7 +1782,6 @@
collection: BarestepCarpet
itemDrop: FloorTileItemWeb
heatCapacity: 10000
tileRipResistance: 30
- type: tile
id: FloorChromite
@@ -1907,7 +1813,6 @@
collection: FootstepHull
itemDrop: FloorTileItemSteel #probably should not be normally obtainable, but the game shits itself and dies when you try to put null here
heatCapacity: 10000
tileRipResistance: 500
- type: tile
id: FloorHullReinforced
@@ -1920,7 +1825,6 @@
itemDrop: FloorTileItemSteel
heatCapacity: 100000 #/tg/ has this set as "INFINITY." I don't know if that exists here so I've just added an extra 0
indestructible: true
reinforced: true
- type: tile
id: FloorReinforcedHardened
@@ -1931,7 +1835,6 @@
footstepSounds:
collection: FootstepHull
itemDrop: FloorTileItemReinforced #same case as FloorHull
reinforced: true
# Faux sci tiles
@@ -1963,7 +1866,6 @@
collection: FootstepGrass
itemDrop: FloorTileItemAstroGrass
heatCapacity: 10000
tileRipResistance: 50
- type: tile
id: FloorMowedAstroGrass
@@ -1973,7 +1875,6 @@
isSubfloor: false
deconstructTools: [ Cutting ]
itemDrop: FloorTileItemMowedAstroGrass
tileRipResistance: 50
- type: tile
id: FloorJungleAstroGrass
@@ -1983,7 +1884,6 @@
isSubfloor: false
deconstructTools: [ Cutting ]
itemDrop: FloorTileItemJungleAstroGrass
tileRipResistance: 50
# Ice
- type: tile
@@ -1999,7 +1899,6 @@
mobFrictionNoInput: 0.05
mobAcceleration: 2
itemDrop: FloorTileItemAstroIce
tileRipResistance: 50
- type: tile
id: FloorAstroSnow
@@ -2009,7 +1908,6 @@
isSubfloor: false
deconstructTools: [ Prying ]
itemDrop: FloorTileItemAstroSnow
tileRipResistance: 50
- type: tile
id: FloorWoodLarge
@@ -2030,4 +1928,3 @@
collection: BarestepWood
itemDrop: FloorTileItemWoodLarge
heatCapacity: 10000
tileRipResistance: 100

View File

@@ -1,5 +1,5 @@
- type: entity
parent: ClothingOuterBaseLarge
parent: [ClothingOuterBaseLarge, AllowSuitStorageClothing]
id: ClothingOuterArmorTemplar
name: доспехи крестоносца
description: Бог желает этого!

View File

@@ -1,5 +1,21 @@
# Так как мечей много, а смысла в них не очень - я буду писать в комментариях геймдизайнерских прикол каждого из них
- type: entity
parent: BaseItem
id: BaseHolyWeapon
abstract: true
components:
- type: HolyWeapon
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi
state: icon
- type: MeleeWeapon
soundHit:
path: /Audio/Weapons/bladeslice.ogg
# Базовая палка, чтобы как можно быстрее сменить ее.
- type: entity
parent: BaseHolyWeapon
id: NullRod
name: жезл нулификации
description: Жезл из чистого обсидиана. Само его присутствие разрушает и ослабляет "магические силы". Во всяком случае так написано в путеводителе.
@@ -11,6 +27,8 @@
damage:
types:
Blunt: 18
soundHit:
collection: MetalThud
- type: Item
size: Normal
sprite: White/Objects/Weapons/Chaplain/nullrod.rsi
@@ -43,10 +61,10 @@
- UnholyPitchfork
- WarHammer
- HyperTool
- type: HolyWeapon
# Прикольно выглядящая рука, нельзя снять и бьет ожогами.
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: GodHand
name: божья длань
description: Эта рука сияет с потрясающей силой!
@@ -63,26 +81,22 @@
wideAnimationRotation: 180
damage:
types:
Heat: 18
Heat: 15
- type: Item
size: Ginormous
sprite: White/Objects/Weapons/Chaplain/godhand.rsi
- type: Unremoveable
deleteOnDrop: true
- type: HolyWeapon
# Типичный меч, база базовая. Может блокировать, острый.
- type: entity
parent: Claymore
parent: BaseHolyWeapon
id: HolyClaymore
name: священный клеймор
description: Оружие, подходящее для крестового похода!
components:
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/claymore.rsi
- type: MeleeWeapon
damage:
types:
Slash: 33
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/claymore.rsi
slots:
@@ -91,29 +105,45 @@
- suitStorage
- type: Item
sprite: White/Objects/Weapons/Chaplain/claymore.rsi
- type: HolyWeapon
- type: MeleeWeapon
damage:
types:
Slash: 15
- type: Sharp
- type: MeleeBlock
delay: 12.1
# Отсылка на вархаммер, больше всего урона, так как не может блокировать
- type: entity
parent: HolyClaymore
parent: BaseHolyWeapon
id: Chainsword
name: цепной меч
description: Не позволь еретику жить.
components:
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi
state: icon
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi
slots:
- back
- belt
- suitStorage
- type: Item
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi
- type: MeleeWeapon
soundHit:
path: /Audio/Weapons/chainsaw.ogg
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi
- type: Item
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi
damage:
types:
Slash: 21
- type: Tool
qualities:
- Sawing
speed: 0.5
- type: HolyWeapon
- type: Sharp
# Он светится
- type: entity
parent: HolyClaymore
id: SwordGlowing
@@ -130,10 +160,10 @@
color: lightblue
- type: Item
sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi
- type: HolyWeapon
# Позволяет блокировать быстрее, средненький урон.
- type: entity
parent: Katana
parent: BaseHolyWeapon
id: HolyKatana
name: лезвие ханзо
description: Способен прорезать святой клеймор.
@@ -148,10 +178,24 @@
- suitStorage
- type: Item
sprite: White/Objects/Weapons/Chaplain/katana.rsi
- type: HolyWeapon
- type: MeleeWeapon
wideAnimationRotation: -135
damage:
types:
Slash: 13
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: DisarmMalus
- type: MeleeBlock
delay: 8.1
- type: Sharp
- type: Tag
tags:
- Katana
# Смешной меч с разбросом дамага
- type: entity
parent: HolyKatana
parent: BaseHolyWeapon
id: MultiverseBlade
name: внепространственный клинок
description: Будучи когда-то предвестником межпространственной войны, его острота сильно колеблется. Наносит от 1 до 50 урона.
@@ -170,10 +214,11 @@
- type: Item
sprite: White/Objects/Weapons/Chaplain/multiverse.rsi
- type: RandomDamage
- type: HolyWeapon
- type: Sharp
# Пробивает броню
- type: entity
parent: HolyClaymore
parent: BaseHolyWeapon
id: VorpalScythe
name: коса жнеца
description: И жрец, и жнец, и на дуде игрец! Коса способна пробить броню противника.
@@ -184,7 +229,7 @@
ignoreResistances: true
damage:
types:
Slash: 24
Slash: 14
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/scythe.rsi
slots:
@@ -192,8 +237,9 @@
- suitStorage
- type: Item
sprite: White/Objects/Weapons/Chaplain/scythe-inhands.rsi
- type: HolyWeapon
- type: Sharp
# Может пиздеть
- type: entity
parent: HolyKatana
id: PossessedBlade
@@ -218,10 +264,10 @@
- type: Examiner
- type: Item
sprite: White/Objects/Weapons/Chaplain/possessed.rsi
- type: HolyWeapon
# Приклеен к руке, быстро и громко бьет
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: ChainsawHand
name: рука-бензопила
description: Добро? Зло? Ты парень с бензопилой в руке.
@@ -251,10 +297,10 @@
qualities:
- Sawing
speed: 0.5
- type: HolyWeapon
# Нокдаунит при ударе
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: HolyWhip
name: священная плеть
description: Какая ужасная ночь на космической станции 14.
@@ -265,10 +311,11 @@
- type: MeleeWeapon
soundHit:
path: /Audio/White/Items/hit/chainhit.ogg
range: 2.5
range: 1.5
attackRate: 0.5
damage:
types:
Blunt: 18
Blunt: 10
- type: Item
size: Normal
sprite: White/Objects/Weapons/Chaplain/whip.rsi
@@ -277,10 +324,13 @@
slots:
- belt
- type: DisarmMalus
- type: HolyWeapon
- type: KnockDownOnHit
knockDownBehavior: NoDrop
knockdownTime: 0.4
# Отбрасывает при ударе и может блокировать, требует держать себя в двух руках для отброса
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: HolyStaff
name: посох монаха
description: Длинный высокий посох из полированного дерева. Традиционно используемый в боевых искусствах древней Земли, теперь он используется для преследования клоуна.
@@ -288,11 +338,6 @@
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/staff.rsi
state: icon
- type: MeleeWeapon
wideAnimationRotation: 135
damage:
types:
Blunt: 10
- type: Item
size: Huge
sprite: White/Objects/Weapons/Chaplain/staff.rsi
@@ -301,23 +346,64 @@
slots:
- back
- suitStorage
- type: MeleeWeapon
wideAnimationRotation: 135
damage:
types:
Blunt: 6
soundHit:
collection: MetalThud
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Blunt: 8
- type: MeleeThrowOnHit
lifetime: 0.2
speed: 5
fallAfterHit: true
requireWield: true
- type: UseDelay
- type: DisarmMalus
- type: MeleeBlock
delay: 6.1
- type: HolyWeapon
delay: 8.1
# Можно кинуть, если попасть нанесет ебать как много, не попадет - ты проебал ее. Далеко бьет
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: UnholyPitchfork
name: нечестивые вилы
description: Держа это, ты выглядишь абсолютно по дьявольски.
components:
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi
state: icon
- type: Item
sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi
size: Huge
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi
slots:
- back
- suitStorage
- type: MeleeWeapon
range: 2
wideAnimationRotation: -135
damage:
types:
Piercing: 8
angle: 0
animation: WeaponArcThrust
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: DamageOtherOnHit
damage:
types:
Piercing: 77
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Piercing: 4
- type: EmbeddableProjectile
offset: 0.15,0.15
- type: ThrowingAngle
@@ -337,42 +423,12 @@
restitution: 0.3
friction: 0.2
- type: Sharp
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi
state: icon
- type: MeleeWeapon
range: 2
wideAnimationRotation: -135
damage:
types:
Piercing: 15
angle: 0
animation: WeaponArcThrust
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: DamageOtherOnHit
damage:
types:
Piercing: 25
- type: Item
sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi
size: Huge
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi
slots:
- back
- suitStorage
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Piercing: 9
- type: UseDelay
- type: DisarmMalus
- type: HolyWeapon
# Высокий структурный урон
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: WarHammer
name: реликтовый боевой молот
description: Этот боевой молот обошелся священнику в сорок тысяч кредитов.
@@ -380,17 +436,6 @@
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/hammer.rsi
state: icon
- type: MeleeWeapon
wideAnimationRotation: -135
attackRate: 0.75
damage:
types:
Blunt: 24
Structural: 40
soundHit:
collection: HammerHit
soundSwing:
collection: HammerMiss
- type: Item
size: Huge
sprite: White/Objects/Weapons/Chaplain/hammer.rsi
@@ -400,14 +445,25 @@
- belt
- back
- suitStorage
- type: MeleeWeapon
wideAnimationRotation: -135
attackRate: 0.75
damage:
types:
Blunt: 16
Structural: 40
soundHit:
collection: HammerHit
soundSwing:
collection: HammerMiss
- type: DisarmMalus
- type: HolyWeapon
# Имеет все инструменты в себе, но работает медленно и почти не наносит урона
- type: entity
parent: BaseItem
parent: BaseHolyWeapon
id: HyperTool
name: гиперинструмент
description: Инструмент настолько мощный, что даже вы не можете им идеально пользоваться.
description: Кто-то додумался склеить все инструменты вместе и вот, что вышло. Настолько продуманный, что вы не понимаете, как этим адекватно пользоваться
components:
- type: Sprite
sprite: White/Objects/Weapons/Chaplain/hypertool.rsi
@@ -417,9 +473,9 @@
canHeavyAttack: false
damage:
types:
Blunt: 0
- type: StaminaDamageOnHit
damage: 40
Blunt: 4
soundHit:
collection: HyperToolUsing
- type: Item
size: Normal
sprite: White/Objects/Weapons/Chaplain/hypertool.rsi
@@ -428,4 +484,29 @@
slots:
- belt
- type: DisarmMalus
- type: HolyWeapon
- type: Tool
qualities:
- Screwing
- Prying
- Anchoring
- Cutting
- Pulsing
speed: 0.7
useSound:
collection: HyperToolUsing
- type: soundCollection
id: HyperToolUsing
files:
- /Audio/Effects/RingtoneNotes/a.ogg
- /Audio/Effects/RingtoneNotes/asharp.ogg
- /Audio/Effects/RingtoneNotes/b.ogg
- /Audio/Effects/RingtoneNotes/c.ogg
- /Audio/Effects/RingtoneNotes/csharp.ogg
- /Audio/Effects/RingtoneNotes/d.ogg
- /Audio/Effects/RingtoneNotes/dsharp.ogg
- /Audio/Effects/RingtoneNotes/e.ogg
- /Audio/Effects/RingtoneNotes/f.ogg
- /Audio/Effects/RingtoneNotes/fsharp.ogg
- /Audio/Effects/RingtoneNotes/g.ogg
- /Audio/Effects/RingtoneNotes/gsharp.ogg

View File

@@ -4,7 +4,6 @@
name: telescopic baton
description: A compact yet robust personal defense weapon. Can be concealed when folded.
components:
- type: TelescopicBaton
- type: Sprite
sprite: White/Objects/Weapons/telebaton.rsi
layers:
@@ -23,6 +22,8 @@
path: /Audio/Weapons/telescopicoff.ogg
params:
volume: -5
activatedDescription: comp-telebaton-examined-on
deactivatedDescription: comp-telebaton-examined-off
- type: Appearance
- type: GenericVisualizer
visuals:
@@ -64,3 +65,4 @@
- Belt
- type: StaticPrice
price: 150
- type: KnockDownOnHit

View File

@@ -824,7 +824,7 @@
wideAnimationRotation: -135
damage:
types:
Slash: 18
Slash: 14
soundHit:
path: /Audio/Weapons/bladeslice.ogg
- type: HolyWeapon

View File

@@ -11,7 +11,7 @@
attackRate: 5
damage:
types:
Slash: 10
Slash: 25
- type: Clothing
sprite: White/Objects/Weapons/Chaplain/hfrequency.rsi
slots:
@@ -101,6 +101,7 @@
minLifetime: 0.01
speed: 20
stunTime: 1.5
fallAfterHit: true
throwOnThrowHit: true
- type: DamageOtherOnHit
sound:

View File

@@ -4,9 +4,9 @@
SS14 имеет большое количество должностей, разделенных на семь основных отделов:
## Сервисный
В этот отдел входят уборщик, пассажиры, клоун, мим, музыкант, шеф-повар, бармен, начальник персонала и другие работники, которые существуют для обслуживания станции.
В этот отдел входят уборщик, ассистенты, клоун, мим, музыкант, шеф-повар, бармен, начальник персонала и другие работники, которые существуют для обслуживания станции.
В первую очередь это люди, которые развлекают, убирают и обслуживают остальную команду, за исключением пассажиров, у которых нет никакой конкретной работы.
В первую очередь это люди, которые развлекают, убирают и обслуживают остальную команду, за исключением ассистентов, у которых нет никакой конкретной работы.
## Карго
Снабжения или карго состоит из грузчиков, утилизаторов и квартирмейстера. Как отдел, он отвечает за распределение ресурсов и торговлю, способен покупать и продавать вещи на галактическом рынке.