mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-22 07:58:06 +03:00
Merge branch 'master' into pr/DEATHB4DEFEAT/540
This commit is contained in:
@@ -13,9 +13,33 @@ public sealed partial class MobReplacementRuleComponent : Component
|
||||
[DataField]
|
||||
public EntProtoId Proto = "MobMimic";
|
||||
|
||||
[DataField]
|
||||
public int NumberToReplace { get; set; }
|
||||
|
||||
[DataField]
|
||||
public string Announcement = "station-event-rampant-intelligence-announcement";
|
||||
|
||||
/// <summary>
|
||||
/// Chance per-entity.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Chance = 0.001f;
|
||||
|
||||
[DataField]
|
||||
public bool DoAnnouncement = true;
|
||||
|
||||
[DataField]
|
||||
public float MimicMeleeDamage = 20f;
|
||||
|
||||
[DataField]
|
||||
public float MimicMoveSpeed = 1f;
|
||||
|
||||
[DataField]
|
||||
public string MimicAIType = "SimpleHostileCompound";
|
||||
|
||||
[DataField]
|
||||
public bool MimicSmashGlass = true;
|
||||
|
||||
[DataField]
|
||||
public bool VendorModify = true;
|
||||
}
|
||||
|
||||
@@ -1,15 +1,44 @@
|
||||
using System.Numerics;
|
||||
using Content.Server.Antag.Mimic;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.GameTicking.Rules;
|
||||
using Content.Server.GameTicking.Rules.Components;
|
||||
using Content.Server.NPC.Systems;
|
||||
using Content.Server.Station.Systems;
|
||||
using Content.Server.GameTicking;
|
||||
using Content.Shared.VendingMachines;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using System.Linq;
|
||||
using Robust.Shared.Physics;
|
||||
using Content.Shared.Movement.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Server.NPC.HTN;
|
||||
using Content.Server.NPC;
|
||||
using Content.Shared.Weapons.Melee;
|
||||
using Content.Server.Advertise;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Shared.CombatMode;
|
||||
|
||||
namespace Content.Server.Antag;
|
||||
|
||||
public sealed class MobReplacementRuleSystem : GameRuleSystem<MobReplacementRuleComponent>
|
||||
{
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly StationSystem _station = default!;
|
||||
[Dependency] private readonly GameTicker _gameTicker = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
[Dependency] private readonly IComponentFactory _componentFactory = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
|
||||
[Dependency] private readonly NPCSystem _npc = default!;
|
||||
[Dependency] private readonly TransformSystem _transform = default!;
|
||||
[Dependency] private readonly AdvertiseSystem _advertise = default!;
|
||||
|
||||
|
||||
protected override void Started(EntityUid uid, MobReplacementRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
|
||||
{
|
||||
@@ -17,21 +46,134 @@ public sealed class MobReplacementRuleSystem : GameRuleSystem<MobReplacementRule
|
||||
|
||||
var query = AllEntityQuery<VendingMachineComponent, TransformComponent>();
|
||||
var spawns = new List<(EntityUid Entity, EntityCoordinates Coordinates)>();
|
||||
var stations = _gameTicker.GetSpawnableStations();
|
||||
|
||||
while (query.MoveNext(out var vendingUid, out _, out var xform))
|
||||
{
|
||||
if (!_random.Prob(component.Chance))
|
||||
var ownerStation = _station.GetOwningStation(vendingUid);
|
||||
|
||||
if (ownerStation == null
|
||||
|| ownerStation != stations[0])
|
||||
continue;
|
||||
|
||||
// Make sure that we aren't running this on something that is already a mimic
|
||||
if (HasComp<CombatModeComponent>(vendingUid))
|
||||
continue;
|
||||
|
||||
spawns.Add((vendingUid, xform.Coordinates));
|
||||
}
|
||||
|
||||
foreach (var entity in spawns)
|
||||
if (spawns == null)
|
||||
{
|
||||
var coordinates = entity.Coordinates;
|
||||
Del(entity.Entity);
|
||||
//WTF THE STATION DOESN'T EXIST! WE MUST BE IN A TEST! QUICK, PUT A MIMIC AT 0,0!!!
|
||||
Spawn(component.Proto, new EntityCoordinates(uid, new Vector2(0, 0)));
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is intentionally not clamped. If a server host wants to replace every vending machine in the entire station with a mimic, who am I to stop them?
|
||||
var k = MathF.MaxMagnitude(component.NumberToReplace, 1);
|
||||
while (k > 0 && spawns != null && spawns.Count > 0)
|
||||
{
|
||||
if (k > 1)
|
||||
{
|
||||
var spawnLocation = _random.PickAndTake(spawns);
|
||||
BuildAMimicWorkshop(spawnLocation.Entity, component);
|
||||
}
|
||||
else
|
||||
{
|
||||
BuildAMimicWorkshop(spawns[0].Entity, component);
|
||||
}
|
||||
|
||||
Spawn(component.Proto, coordinates);
|
||||
if (k == MathF.MaxMagnitude(component.NumberToReplace, 1)
|
||||
&& component.DoAnnouncement)
|
||||
_chat.DispatchStationAnnouncement(stations[0], Loc.GetString("station-event-rampant-intelligence-announcement"), playDefaultSound: true,
|
||||
colorOverride: Color.Red, sender: "Central Command");
|
||||
|
||||
k--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// It's like Build a Bear, but MURDER
|
||||
/// </summary>
|
||||
/// <param name="uid"></param>
|
||||
public void BuildAMimicWorkshop(EntityUid uid, MobReplacementRuleComponent component)
|
||||
{
|
||||
var metaData = MetaData(uid);
|
||||
var vendorPrototype = metaData.EntityPrototype;
|
||||
var mimicProto = _prototype.Index<EntityPrototype>(component.Proto);
|
||||
|
||||
var vendorComponents = vendorPrototype?.Components.Keys
|
||||
.Where(n => n != "Transform" && n != "MetaData")
|
||||
.Select(name => (name, _componentFactory.GetRegistration(name).Type))
|
||||
.ToList() ?? new List<(string name, Type type)>();
|
||||
|
||||
var mimicComponents = mimicProto?.Components.Keys
|
||||
.Where(n => n != "Transform" && n != "MetaData")
|
||||
.Select(name => (name, _componentFactory.GetRegistration(name).Type))
|
||||
.ToList() ?? new List<(string name, Type type)>();
|
||||
|
||||
foreach (var name in mimicComponents.Except(vendorComponents))
|
||||
{
|
||||
var newComponent = _componentFactory.GetComponent(name.name);
|
||||
EntityManager.AddComponent(uid, newComponent);
|
||||
}
|
||||
|
||||
var xform = Transform(uid);
|
||||
if (xform.Anchored)
|
||||
_transform.Unanchor(uid, xform);
|
||||
|
||||
SetupMimicNPC(uid, component);
|
||||
|
||||
if (TryComp<AdvertiseComponent>(uid, out var vendor)
|
||||
&& component.VendorModify)
|
||||
SetupMimicVendor(uid, component, vendor);
|
||||
}
|
||||
/// <summary>
|
||||
/// This handles getting the entity ready to be a hostile NPC
|
||||
/// </summary>
|
||||
/// <param name="uid"></param>
|
||||
/// <param name="component"></param>
|
||||
private void SetupMimicNPC(EntityUid uid, MobReplacementRuleComponent component)
|
||||
{
|
||||
_physics.SetBodyType(uid, BodyType.KinematicController);
|
||||
_npcFaction.AddFaction(uid, "SimpleHostile");
|
||||
|
||||
var melee = EnsureComp<MeleeWeaponComponent>(uid);
|
||||
melee.Angle = 0;
|
||||
DamageSpecifier dspec = new()
|
||||
{
|
||||
DamageDict = new()
|
||||
{
|
||||
{ "Blunt", component.MimicMeleeDamage }
|
||||
}
|
||||
};
|
||||
melee.Damage = dspec;
|
||||
|
||||
var movementSpeed = EnsureComp<MovementSpeedModifierComponent>(uid);
|
||||
(movementSpeed.BaseSprintSpeed, movementSpeed.BaseWalkSpeed) = (component.MimicMoveSpeed, component.MimicMoveSpeed);
|
||||
|
||||
var htn = EnsureComp<HTNComponent>(uid);
|
||||
htn.RootTask = new HTNCompoundTask() { Task = component.MimicAIType };
|
||||
htn.Blackboard.SetValue(NPCBlackboard.NavSmash, component.MimicSmashGlass);
|
||||
_npc.WakeNPC(uid, htn);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handling specific interactions with vending machines
|
||||
/// </summary>
|
||||
/// <param name="uid"></param>
|
||||
/// <param name="mimicComponent"></param>
|
||||
/// <param name="vendorComponent"></param>
|
||||
private void SetupMimicVendor(EntityUid uid, MobReplacementRuleComponent mimicComponent, AdvertiseComponent vendorComponent)
|
||||
{
|
||||
vendorComponent.MinimumWait = 5;
|
||||
vendorComponent.MaximumWait = 15;
|
||||
_advertise.SayAdvertisement(uid, vendorComponent);
|
||||
_advertise.RefreshTimer(uid, vendorComponent);
|
||||
|
||||
if (TryComp<ApcPowerReceiverComponent>(uid, out var aPC))
|
||||
aPC.NeedsPower = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,9 +12,14 @@ 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; }
|
||||
@@ -26,6 +31,7 @@ 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
|
||||
@@ -41,9 +47,14 @@ 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);
|
||||
@@ -55,6 +66,7 @@ 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
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;
|
||||
@@ -49,8 +50,7 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
comp.Accumulator = 0f;
|
||||
toRemove.Add(ent);
|
||||
|
||||
if (HasComp<MobStateComponent>(uid) &&
|
||||
TryComp<PhysicsComponent>(uid, out var body))
|
||||
if (TryComp<PhysicsComponent>(uid, out var body))
|
||||
{
|
||||
_physics.SetBodyStatus(uid, body, BodyStatus.OnGround);
|
||||
}
|
||||
@@ -70,27 +70,10 @@ 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...
|
||||
@@ -120,7 +103,8 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
var gridWorldRotation = xforms.GetComponent(gridAtmosphere).WorldRotation;
|
||||
|
||||
// If we're using monstermos, smooth out the yeet direction to follow the flow
|
||||
if (MonstermosEqualization)
|
||||
//TODO This is bad, don't run this. It just makes the throws worse by somehow rounding them to orthogonal
|
||||
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.
|
||||
@@ -160,7 +144,7 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
(entity, pressureMovements),
|
||||
gridAtmosphere.Comp.UpdateCounter,
|
||||
tile.PressureDifference,
|
||||
tile.PressureDirection, 0,
|
||||
tile.PressureDirection,
|
||||
tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid,
|
||||
gridWorldRotation,
|
||||
xforms.GetComponent(entity),
|
||||
@@ -181,12 +165,29 @@ 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,
|
||||
@@ -199,50 +200,28 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
if (!Resolve(uid, ref xform))
|
||||
return;
|
||||
|
||||
// TODO ATMOS stuns?
|
||||
|
||||
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))))
|
||||
if (physics.BodyType != BodyType.Static
|
||||
&& !float.IsPositiveInfinity(component.MoveResist))
|
||||
{
|
||||
if (HasComp<MobStateComponent>(uid))
|
||||
var moveForce = pressureDifference * MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass);
|
||||
if (HasComp<HumanoidAppearanceComponent>(ent))
|
||||
moveForce *= HumanoidThrowMultiplier;
|
||||
if (moveForce > physics.Mass)
|
||||
{
|
||||
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: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs.
|
||||
//TODO Consider replacing throw target with proper trigonometry angles.
|
||||
if (throwTarget != EntityCoordinates.Invalid)
|
||||
{
|
||||
var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized();
|
||||
_physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics);
|
||||
var pos = throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition + dirVec;
|
||||
_throwing.TryThrow(uid, pos.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce);
|
||||
}
|
||||
else
|
||||
{
|
||||
moveForce = MathF.Min(moveForce, SpaceWindMaxPushForce);
|
||||
_physics.ApplyLinearImpulse(uid, dirVec * moveForce, body: physics);
|
||||
_throwing.TryThrow(uid, dirVec.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce);
|
||||
}
|
||||
|
||||
component.LastHighPressureMovementAirCycle = cycle;
|
||||
|
||||
@@ -5,11 +5,13 @@ 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
|
||||
{
|
||||
public sealed partial class AtmosphereSystem
|
||||
@@ -137,7 +139,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 (giverTilesLength > logN && takerTilesLength > logN)
|
||||
if (!MonstermosUseExpensiveAirflow && giverTilesLength > logN && takerTilesLength > logN)
|
||||
{
|
||||
// Even if it fails, it will speed up the next part.
|
||||
Array.Sort(_equalizeTiles, 0, tileCount, _monstermosComparer);
|
||||
@@ -550,7 +552,8 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
}
|
||||
|
||||
InvalidateVisuals(ent, otherTile);
|
||||
HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.MonstermosInfo.CurrentTransferAmount);
|
||||
if (MonstermosRipTiles && otherTile.PressureDifference > MonstermosRipTilesMinimumPressure)
|
||||
HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.PressureDifference);
|
||||
}
|
||||
|
||||
if (GridImpulse && tileCount > 0)
|
||||
@@ -682,14 +685,14 @@ namespace Content.Server.Atmos.EntitySystems
|
||||
adj.MonstermosInfo[idx.ToOppositeDir()] -= amount;
|
||||
}
|
||||
|
||||
private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float sum)
|
||||
private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float delta)
|
||||
{
|
||||
if (!MonstermosRipTiles)
|
||||
if (!mapGrid.TryGetTileRef(tile.GridIndices, out var tileRef))
|
||||
return;
|
||||
var tileref = tileRef.Tile;
|
||||
|
||||
var chance = MathHelper.Clamp(0.01f + (sum / SpacingMaxWind) * 0.3f, 0.003f, 0.3f);
|
||||
|
||||
if (sum > 20 && _robustRandom.Prob(chance))
|
||||
var tileDef = (ContentTileDefinition) _tileDefinitionManager[tileref.TypeId];
|
||||
if (!tileDef.Reinforced && tileDef.TileRipResistance < delta * MonstermosRipTilesPressureOffset)
|
||||
PryTile(mapGrid, tile.GridIndices);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ 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;
|
||||
@@ -37,6 +38,7 @@ 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;
|
||||
|
||||
@@ -241,6 +241,17 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
if (string.IsNullOrEmpty(message))
|
||||
return;
|
||||
|
||||
// Check if the message is in sign language
|
||||
if (desiredType == InGameICChatType.Speak || desiredType == InGameICChatType.Whisper)
|
||||
{
|
||||
var language = languageOverride ?? _language.GetLanguage(source);
|
||||
if (language.SignLanguage ?? false)
|
||||
{
|
||||
SendEntityEmote(source, message, range, nameOverride, ignoreActionBlocker, signLanguage: true, languageOverride: languageOverride);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// This message may have a radio prefix, and should then be whispered to the resolved radio channel
|
||||
if (checkRadioPrefix)
|
||||
{
|
||||
@@ -573,7 +584,9 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
bool hideLog = false,
|
||||
bool checkEmote = true,
|
||||
bool ignoreActionBlocker = false,
|
||||
NetUserId? author = null
|
||||
NetUserId? author = null,
|
||||
LanguagePrototype? languageOverride = null,
|
||||
bool? signLanguage = false
|
||||
)
|
||||
{
|
||||
if (!_actionBlocker.CanEmote(source) && !ignoreActionBlocker)
|
||||
@@ -583,15 +596,32 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
var ent = Identity.Entity(source, EntityManager);
|
||||
string name = FormattedMessage.EscapeText(nameOverride ?? Name(ent));
|
||||
|
||||
var language = languageOverride ?? _language.GetLanguage(source);
|
||||
|
||||
// Emotes use Identity.Name, since it doesn't actually involve your voice at all.
|
||||
var wrappedMessage = Loc.GetString("chat-manager-entity-me-wrap-message",
|
||||
("entityName", name),
|
||||
("entity", ent),
|
||||
("message", FormattedMessage.RemoveMarkup(action)));
|
||||
var wrappedMessage = "";
|
||||
var obfuscatedWrappedMessage = "";
|
||||
if (signLanguage == true)
|
||||
{
|
||||
wrappedMessage = Loc.GetString("entity-signlanguage-message",
|
||||
("entityName", name),
|
||||
("message", FormattedMessage.EscapeText(action)));
|
||||
|
||||
obfuscatedWrappedMessage = Loc.GetString(_language.ObfuscateSpeech(action, language),
|
||||
("entityName", name));
|
||||
}
|
||||
else
|
||||
{
|
||||
wrappedMessage = Loc.GetString("chat-manager-entity-me-wrap-message",
|
||||
("entityName", name),
|
||||
("entity", ent),
|
||||
("message", FormattedMessage.RemoveMarkup(action)));
|
||||
|
||||
}
|
||||
|
||||
if (checkEmote)
|
||||
TryEmoteChatInput(source, action);
|
||||
SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage: "", source, range, author);
|
||||
SendInVoiceRange(ChatChannel.Emotes, name, action, wrappedMessage, obfuscated: "", obfuscatedWrappedMessage, source, range, author, signLanguage: true);
|
||||
if (!hideLog)
|
||||
if (name != Name(source))
|
||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Emote from {ToPrettyString(source):user} as {name}: {action}");
|
||||
@@ -705,7 +735,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
/// <summary>
|
||||
/// Sends a chat message to the given players in range of the source entity.
|
||||
/// </summary>
|
||||
private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null)
|
||||
private void SendInVoiceRange(ChatChannel channel, string name, string message, string wrappedMessage, string obfuscated, string obfuscatedWrappedMessage, EntityUid source, ChatTransmitRange range, NetUserId? author = null, LanguagePrototype? languageOverride = null, bool? signLanguage = false)
|
||||
{
|
||||
var language = languageOverride ?? _language.GetLanguage(source);
|
||||
foreach (var (session, data) in GetRecipients(source, VoiceRange))
|
||||
@@ -718,9 +748,17 @@ public sealed partial class ChatSystem : SharedChatSystem
|
||||
continue;
|
||||
EntityUid listener = session.AttachedEntity.Value;
|
||||
|
||||
// Quickly Checking if the Emote is a real one or Sign Language.
|
||||
var notSignLanguage = false;
|
||||
if (channel == ChatChannel.Emotes)
|
||||
{
|
||||
notSignLanguage = true;
|
||||
if (signLanguage == true)
|
||||
notSignLanguage = false;
|
||||
}
|
||||
|
||||
// If the channel does not support languages, or the entity can understand the message, send the original message, otherwise send the obfuscated version
|
||||
if (channel == ChatChannel.LOOC || channel == ChatChannel.Emotes || _language.CanUnderstand(listener, language.ID))
|
||||
if (channel == ChatChannel.LOOC || notSignLanguage || _language.CanUnderstand(listener, language.ID))
|
||||
{
|
||||
_chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.Channel, author: author);
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace Content.Server.GameTicking
|
||||
// Mainly to avoid allocations.
|
||||
private readonly List<EntityCoordinates> _possiblePositions = new();
|
||||
|
||||
private List<EntityUid> GetSpawnableStations()
|
||||
public List<EntityUid> GetSpawnableStations()
|
||||
{
|
||||
var spawnableStations = new List<EntityUid>();
|
||||
var query = EntityQueryEnumerator<StationJobsComponent, StationSpawningComponent>();
|
||||
|
||||
@@ -161,8 +161,9 @@ public sealed class TemperatureSystem : EntitySystem
|
||||
{
|
||||
return Atmospherics.MinimumHeatCapacity;
|
||||
}
|
||||
|
||||
return comp.SpecificHeat * physics.FixturesMass;
|
||||
if (physics.Mass < 1)
|
||||
return comp.SpecificHeat;
|
||||
else return comp.SpecificHeat * physics.FixturesMass;
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, InternalTemperatureComponent comp, MapInitEvent args)
|
||||
|
||||
@@ -1158,7 +1158,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", 30f, CVar.SERVERONLY);
|
||||
CVarDef.Create("atmos.space_wind_max_velocity", 15f, CVar.SERVERONLY);
|
||||
|
||||
/// <summary>
|
||||
/// The maximum force that may be applied to an object by pushing (i.e. not throwing) atmospheric pressure differences.
|
||||
@@ -1167,6 +1167,24 @@ namespace Content.Shared.CCVar
|
||||
public static readonly CVarDef<float> SpaceWindMaxPushForce =
|
||||
CVarDef.Create("atmos.space_wind_max_push_force", 20f, 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.04f, CVar.SERVERONLY);
|
||||
|
||||
/// <summary>
|
||||
/// Whether monstermos tile equalization is enabled.
|
||||
/// </summary>
|
||||
@@ -1188,7 +1206,21 @@ 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", false, CVar.SERVERONLY);
|
||||
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);
|
||||
|
||||
/// <summary>
|
||||
/// Whether explosive depressurization will cause the grid to gain an impulse.
|
||||
@@ -1219,6 +1251,13 @@ 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>
|
||||
@@ -1275,6 +1314,13 @@ 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
|
||||
*/
|
||||
|
||||
@@ -16,7 +16,13 @@ public sealed class LanguagePrototype : IPrototype
|
||||
|
||||
[DataField("fontSize")]
|
||||
public int? FontSize;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// If true, will mark the language as a SignLanguage and will be handled as such.
|
||||
/// </summary>
|
||||
[DataField("signLanguage")]
|
||||
public bool? SignLanguage;
|
||||
|
||||
/// <summary>
|
||||
/// Obfuscation method used by this language. By default, uses <see cref="ObfuscationMethod.Default"/>
|
||||
/// </summary>
|
||||
|
||||
@@ -121,5 +121,11 @@ namespace Content.Shared.Maps
|
||||
{
|
||||
TileId = id;
|
||||
}
|
||||
|
||||
[DataField]
|
||||
public bool Reinforced = false;
|
||||
|
||||
[DataField]
|
||||
public float TileRipResistance = 125f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4529,3 +4529,31 @@ Entries:
|
||||
wear due to having digitigrade legs.
|
||||
id: 6168
|
||||
time: '2024-07-18T02:34:52.0000000+00:00'
|
||||
- author: Mnemotechnician
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Foreigner translator should now consume power, as intended.
|
||||
id: 6169
|
||||
time: '2024-07-18T08:22:52.0000000+00:00'
|
||||
- author: VMSolidus
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Atmospheric "Throws" are now calculated using object mass, and behave
|
||||
accordingly. Tiny objects will shoot out of rooms quite fast!
|
||||
id: 6170
|
||||
time: '2024-07-18T08:24:58.0000000+00:00'
|
||||
- author: VMSolidus
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Rampant Brand Intelligence has been spotted infesting NT Stations, be on
|
||||
the lookout for highly aggressive vending machines.
|
||||
id: 6171
|
||||
time: '2024-07-18T19:30:00.0000000+00:00'
|
||||
- author: FoxxoTrystan
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added the ability to speak with Sign Language.
|
||||
id: 6172
|
||||
time: '2024-07-19T17:20:30.0000000+00:00'
|
||||
|
||||
@@ -4,6 +4,9 @@ language-Universal-description = What are you?
|
||||
language-GalacticCommon-name = Galactic common
|
||||
language-GalacticCommon-description = The standard Galatic language, most commonly used for inter-species communications and legal work.
|
||||
|
||||
language-SignLanguage-name = Sign Language
|
||||
language-SignLanguage-description = The standard Galactic sign language, used by those that are unable to speak Galactic Common or at all.
|
||||
|
||||
language-Bubblish-name = Bubblish
|
||||
language-Bubblish-description = The language of Slimes. Being a mixture of bubbling noises and pops it's very difficult to speak for humans without the use of mechanical aids.
|
||||
|
||||
|
||||
4
Resources/Locale/en-US/language/sign-language.ftl
Normal file
4
Resources/Locale/en-US/language/sign-language.ftl
Normal file
@@ -0,0 +1,4 @@
|
||||
entity-signlanguage-message = [italic]{$entityName} signs "[BubbleContent]{$message}[/BubbleContent]"[/italic]
|
||||
|
||||
language-signlanguage-1 = [italic]{$entityName} signs something.[/italic]
|
||||
language-signlanguage-2 = [italic]{$entityName} makes weird hand gestures.[/italic]
|
||||
@@ -0,0 +1 @@
|
||||
station-event-rampant-intelligence-announcement = Rampant brand intelligence has been detected board your station. Please inspect any vendors for aggressive marketing tactics, and reboot them if necessary.
|
||||
@@ -23,7 +23,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.25
|
||||
density: 10
|
||||
density: 0.8
|
||||
mask:
|
||||
- FlyingMobMask
|
||||
layer:
|
||||
@@ -89,7 +89,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.1
|
||||
density: 30
|
||||
density: 0.1
|
||||
mask:
|
||||
- FlyingMobMask
|
||||
layer:
|
||||
@@ -346,7 +346,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.2
|
||||
density: 100
|
||||
density: 0.0007
|
||||
mask:
|
||||
- SmallMobMask
|
||||
layer:
|
||||
@@ -449,7 +449,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.2
|
||||
density: 120
|
||||
density: 0.007
|
||||
mask:
|
||||
- SmallMobMask
|
||||
layer:
|
||||
@@ -1585,7 +1585,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.2
|
||||
density: 100
|
||||
density: 0.76
|
||||
mask:
|
||||
- SmallMobMask
|
||||
layer:
|
||||
@@ -2547,7 +2547,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 50 #They actually are pretty light, I looked it up
|
||||
density: 16.66
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
@@ -2630,7 +2630,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 50
|
||||
density: 25.5
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
@@ -2785,7 +2785,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 15
|
||||
density: 9
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
@@ -2938,6 +2938,17 @@
|
||||
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
|
||||
@@ -2973,6 +2984,17 @@
|
||||
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
|
||||
@@ -3059,7 +3081,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 5
|
||||
density: 4
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
@@ -3136,7 +3158,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.2
|
||||
density: 120
|
||||
density: 0.8
|
||||
mask:
|
||||
- SmallMobMask
|
||||
layer:
|
||||
@@ -3263,7 +3285,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 250
|
||||
density: 750
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
@@ -3340,7 +3362,7 @@
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 100 # High, because wood is heavy.
|
||||
density: 15
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
- type: entity
|
||||
name: Mimic
|
||||
id: MobMimic
|
||||
parent: [ SimpleMobBase, MobCombat ]
|
||||
description: Surprise. # When this gets a proper write this should use the object's actual description >:)
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- FootstepSound
|
||||
- type: Clickable
|
||||
- type: CombatMode
|
||||
- type: InteractionOutline
|
||||
- type: InputMover
|
||||
- type: Input
|
||||
context: "human"
|
||||
- type: MobMover
|
||||
- type: NpcFactionMember
|
||||
factions:
|
||||
@@ -20,6 +24,7 @@
|
||||
- type: Icon
|
||||
sprite: Structures/Machines/VendingMachines/cola.rsi
|
||||
state: normal
|
||||
- type: Physics
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
fix1:
|
||||
@@ -38,6 +43,3 @@
|
||||
damage:
|
||||
types:
|
||||
Blunt: 20
|
||||
- type: MovementSpeedModifier
|
||||
baseWalkSpeed : 1
|
||||
baseSprintSpeed : 1
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
# Translator that doesn't need power to work
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
id: TranslatorUnpowered
|
||||
@@ -29,37 +30,38 @@
|
||||
unequipDelay: 0.3
|
||||
quickEquip: false # Would conflict
|
||||
|
||||
# Base translator that uses a power cell. Starts with an empty slot.
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
id: Translator
|
||||
id: TranslatorPoweredBase
|
||||
parent: [ TranslatorUnpowered, PowerCellSlotMediumItem ]
|
||||
suffix: Powered
|
||||
components:
|
||||
- type: PowerCellDraw
|
||||
drawRate: 1
|
||||
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
id: TranslatorEmpty
|
||||
parent: Translator
|
||||
suffix: Empty
|
||||
components:
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
cell_slot:
|
||||
name: power-cell-slot-component-slot-name-default
|
||||
|
||||
# Normal translator with medium power cell in it
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
id: Translator
|
||||
parent: [ PowerCellSlotMediumItem, TranslatorPoweredBase ]
|
||||
suffix: Powered
|
||||
|
||||
# Normal translator with a high power cell and special appearance
|
||||
- type: entity
|
||||
noSpawn: true
|
||||
id: TranslatorForeigner
|
||||
parent: [ TranslatorUnpowered, PowerCellSlotHighItem ]
|
||||
parent: [ PowerCellSlotHighItem, TranslatorPoweredBase ]
|
||||
name: foreigner's translator
|
||||
description: A special-issue translator that helps foreigner's speak and understand this station's primary language.
|
||||
|
||||
|
||||
- type: entity
|
||||
id: CanilunztTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Canilunzt translator
|
||||
description: Translates speech between Canilunzt and Galactic Common, allowing your local yeepers to communicate with the locals and vice versa!
|
||||
components:
|
||||
@@ -76,7 +78,7 @@
|
||||
|
||||
- type: entity
|
||||
id: BubblishTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Bubblish translator
|
||||
description: Translates speech between Bubblish and Galactic Common, helping communicate with slimes and slime people.
|
||||
components:
|
||||
@@ -93,7 +95,7 @@
|
||||
|
||||
- type: entity
|
||||
id: NekomimeticTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Nekomimetic translator
|
||||
description: Translates speech between Nekomimetic and Galactic Common, enabling you to communicate with your pet cats.
|
||||
components:
|
||||
@@ -110,7 +112,7 @@
|
||||
|
||||
- type: entity
|
||||
id: DraconicTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Draconic translator
|
||||
description: Translates speech between Draconic and Galactic Common, making it easier to understand your local Uniathi.
|
||||
components:
|
||||
@@ -127,7 +129,7 @@
|
||||
|
||||
- type: entity
|
||||
id: SolCommonTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Sol Common translator
|
||||
description: Translates speech between Sol Common and Galactic Common. Like a true Earthman!
|
||||
components:
|
||||
@@ -144,7 +146,7 @@
|
||||
|
||||
- type: entity
|
||||
id: RootSpeakTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: RootSpeak translator
|
||||
description: Translates speech between RootSpeak and Galactic Common. You may now speak for the trees.
|
||||
components:
|
||||
@@ -161,7 +163,7 @@
|
||||
|
||||
- type: entity
|
||||
id: MofficTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Moffic translator
|
||||
description: Translates speech between Moffic and Galactic Common, helping you understand the buzzes of your pet mothroach!
|
||||
components:
|
||||
@@ -178,7 +180,7 @@
|
||||
|
||||
- type: entity
|
||||
id: XenoTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Xeno translator
|
||||
description: Translates speech between Xeno and Galactic Common. This will probably not help you survive an encounter, though.
|
||||
components:
|
||||
@@ -194,7 +196,7 @@
|
||||
|
||||
- type: entity
|
||||
id: AnimalTranslator
|
||||
parent: [ TranslatorEmpty ]
|
||||
parent: [ TranslatorPoweredBase ]
|
||||
name: Animal translator
|
||||
description: Translates all the cutes noises that most animals make into a more understandable form!
|
||||
components:
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
- MachineMask
|
||||
layer:
|
||||
- MachineLayer
|
||||
density: 200
|
||||
density: 1000
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
|
||||
@@ -447,3 +447,4 @@
|
||||
minimumPlayers: 20
|
||||
weight: 5
|
||||
- type: MobReplacementRule
|
||||
numberToReplace: 1
|
||||
|
||||
@@ -35,6 +35,15 @@
|
||||
- nah
|
||||
- wah
|
||||
|
||||
- type: language
|
||||
id: SignLanguage
|
||||
signLanguage: true
|
||||
obfuscation:
|
||||
!type:ReplacementObfuscation
|
||||
replacement:
|
||||
- "language-signlanguage-1"
|
||||
- "language-signlanguage-2"
|
||||
|
||||
# Spoken by slimes.
|
||||
- type: language
|
||||
id: Bubblish
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelCheckerLight
|
||||
@@ -33,6 +34,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteelCheckerLight
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelCheckerDark
|
||||
@@ -51,6 +53,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteelCheckerDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelMini
|
||||
@@ -69,6 +72,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelPavement
|
||||
@@ -87,6 +91,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelDiagonal
|
||||
@@ -105,6 +110,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelOffset
|
||||
@@ -117,6 +123,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelMono
|
||||
@@ -135,6 +142,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelPavementVertical
|
||||
@@ -153,6 +161,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelHerringbone
|
||||
@@ -171,6 +180,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelDiagonalMini
|
||||
@@ -189,6 +199,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorBrassFilled
|
||||
@@ -201,6 +212,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemBrassFilled
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 220
|
||||
|
||||
- type: tile
|
||||
id: FloorBrassReebe
|
||||
@@ -213,6 +225,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemBrassReebe
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 220
|
||||
|
||||
- type: tile
|
||||
id: FloorPlastic
|
||||
@@ -231,6 +244,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWood
|
||||
@@ -251,6 +265,7 @@
|
||||
collection: BarestepWood
|
||||
itemDrop: FloorTileItemWood
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhite
|
||||
@@ -269,6 +284,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhiteMini
|
||||
@@ -287,6 +303,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhitePavement
|
||||
@@ -305,6 +322,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhiteDiagonal
|
||||
@@ -323,6 +341,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhiteOffset
|
||||
@@ -335,6 +354,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhiteMono
|
||||
@@ -353,6 +373,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhitePavementVertical
|
||||
@@ -371,6 +392,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhiteHerringbone
|
||||
@@ -389,6 +411,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhiteDiagonalMini
|
||||
@@ -407,6 +430,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorWhitePlastic
|
||||
@@ -425,6 +449,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorDark
|
||||
@@ -443,6 +468,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkMini
|
||||
@@ -461,6 +487,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkPavement
|
||||
@@ -479,6 +506,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkDiagonal
|
||||
@@ -497,6 +525,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkOffset
|
||||
@@ -509,6 +538,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkMono
|
||||
@@ -527,6 +557,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkPavementVertical
|
||||
@@ -545,6 +576,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkHerringbone
|
||||
@@ -563,6 +595,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkDiagonalMini
|
||||
@@ -581,6 +614,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorDarkPlastic
|
||||
@@ -599,6 +633,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorTechMaint
|
||||
@@ -611,6 +646,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemTechmaint
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 250
|
||||
|
||||
- type: tile
|
||||
id: FloorReinforced
|
||||
@@ -623,6 +659,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemReinforced
|
||||
heatCapacity: 10000
|
||||
reinforced: true
|
||||
|
||||
- type: tile
|
||||
id: FloorMono
|
||||
@@ -635,6 +672,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemMono
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorLino
|
||||
@@ -647,6 +685,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemLino
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelDirty
|
||||
@@ -659,6 +698,7 @@
|
||||
collection: FootstepPlating
|
||||
itemDrop: FloorTileItemDirty
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorElevatorShaft
|
||||
@@ -671,6 +711,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemElevatorShaft
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorMetalDiamond
|
||||
@@ -683,6 +724,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemMetalDiamond
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorRockVault
|
||||
@@ -695,6 +737,7 @@
|
||||
collection: FootstepAsteroid
|
||||
itemDrop: FloorTileItemRockVault
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 400
|
||||
|
||||
- type: tile
|
||||
id: FloorBlue
|
||||
@@ -707,6 +750,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemBlue
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelLime
|
||||
@@ -725,6 +769,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemLime
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorMining
|
||||
@@ -737,6 +782,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemMining
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 250
|
||||
|
||||
- type: tile
|
||||
id: FloorMiningDark
|
||||
@@ -749,6 +795,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemMiningDark
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 250
|
||||
|
||||
- type: tile
|
||||
id: FloorMiningLight
|
||||
@@ -761,6 +808,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemMiningLight
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 250
|
||||
|
||||
# Departamental
|
||||
- type: tile
|
||||
@@ -774,6 +822,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemFreezer
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorShowroom
|
||||
@@ -786,6 +835,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShowroom
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorHydro
|
||||
@@ -798,6 +848,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemHydro
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorBar
|
||||
@@ -816,6 +867,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemBar
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
- type: tile
|
||||
id: FloorClown
|
||||
@@ -828,6 +880,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemClown
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorMime
|
||||
@@ -840,6 +893,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemMime
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorKitchen
|
||||
@@ -852,6 +906,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemKitchen
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorLaundry
|
||||
@@ -864,6 +919,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemLaundry
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorSteelDamaged
|
||||
@@ -883,6 +939,7 @@
|
||||
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
|
||||
@@ -899,6 +956,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemSteel #Same case as FloorSteelDamaged, make it null when possible
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 175
|
||||
|
||||
|
||||
# Concrete
|
||||
@@ -920,6 +978,7 @@
|
||||
itemDrop: FloorTileItemConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorConcreteMono
|
||||
@@ -939,6 +998,7 @@
|
||||
itemDrop: FloorTileItemConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorConcreteSmooth
|
||||
@@ -958,6 +1018,7 @@
|
||||
itemDrop: FloorTileItemConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorGrayConcrete
|
||||
@@ -977,6 +1038,7 @@
|
||||
itemDrop: FloorTileItemGrayConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorGrayConcreteMono
|
||||
@@ -996,6 +1058,7 @@
|
||||
itemDrop: FloorTileItemGrayConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorGrayConcreteSmooth
|
||||
@@ -1015,6 +1078,7 @@
|
||||
itemDrop: FloorTileItemGrayConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorOldConcrete
|
||||
@@ -1034,6 +1098,7 @@
|
||||
itemDrop: FloorTileItemOldConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorOldConcreteMono
|
||||
@@ -1053,6 +1118,7 @@
|
||||
itemDrop: FloorTileItemOldConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
- type: tile
|
||||
id: FloorOldConcreteSmooth
|
||||
@@ -1072,6 +1138,7 @@
|
||||
itemDrop: FloorTileItemOldConcrete
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
tileRipResistance: 300
|
||||
|
||||
# Carpets (non smoothing)
|
||||
- type: tile
|
||||
@@ -1088,6 +1155,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemArcadeBlue
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorArcadeBlue2
|
||||
@@ -1103,6 +1171,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemArcadeBlue2
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorArcadeRed
|
||||
@@ -1118,6 +1187,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemArcadeRed
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorEighties
|
||||
@@ -1133,6 +1203,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemEighties
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorCarpetClown
|
||||
@@ -1148,6 +1219,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemCarpetClown
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorCarpetOffice
|
||||
@@ -1163,6 +1235,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemCarpetOffice
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorBoxing
|
||||
@@ -1182,6 +1255,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemBoxing
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorGym
|
||||
@@ -1201,6 +1275,7 @@
|
||||
friction: 0.25
|
||||
itemDrop: FloorTileItemGym
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
# Shuttle
|
||||
- type: tile
|
||||
@@ -1214,6 +1289,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttleWhite
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorShuttleGrey
|
||||
@@ -1226,6 +1302,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttleGrey
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorShuttleBlack
|
||||
@@ -1238,6 +1315,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttleBlack
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorShuttleBlue
|
||||
@@ -1250,6 +1328,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttleBlue
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorShuttleOrange
|
||||
@@ -1262,6 +1341,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttleOrange
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorShuttlePurple
|
||||
@@ -1274,6 +1354,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttlePurple
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
- type: tile
|
||||
id: FloorShuttleRed
|
||||
@@ -1286,6 +1367,7 @@
|
||||
collection: FootstepFloor
|
||||
itemDrop: FloorTileItemShuttleRed
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 4500
|
||||
|
||||
|
||||
# Materials
|
||||
@@ -1300,6 +1382,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemGold
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 600
|
||||
|
||||
- type: tile
|
||||
id: FloorSilver
|
||||
@@ -1312,6 +1395,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: FloorTileItemSilver
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 500
|
||||
|
||||
- type: tile
|
||||
id: FloorGlass
|
||||
@@ -1330,6 +1414,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: SheetGlass1
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 150
|
||||
|
||||
- type: tile
|
||||
id: FloorRGlass
|
||||
@@ -1348,6 +1433,7 @@
|
||||
collection: FootstepTile
|
||||
itemDrop: SheetRGlass1
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 175
|
||||
|
||||
# Circuits
|
||||
- type: tile
|
||||
@@ -1361,6 +1447,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemGCircuit
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 225
|
||||
|
||||
- type: tile
|
||||
id: FloorBlueCircuit
|
||||
@@ -1373,6 +1460,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemBCircuit
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 225
|
||||
|
||||
# Terrain
|
||||
- type: tile
|
||||
@@ -1666,6 +1754,7 @@
|
||||
itemDrop: FloorTileItemFlesh
|
||||
friction: 0.05 #slippy
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 80
|
||||
|
||||
- type: tile
|
||||
id: FloorTechMaint2
|
||||
@@ -1678,6 +1767,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemSteelMaint
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 225
|
||||
|
||||
- type: tile
|
||||
id: FloorTechMaint3
|
||||
@@ -1696,6 +1786,7 @@
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemGratingMaint
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 225
|
||||
|
||||
- type: tile
|
||||
id: FloorWoodTile
|
||||
@@ -1716,6 +1807,7 @@
|
||||
collection: BarestepWood
|
||||
itemDrop: FloorTileItemWoodPattern
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 75
|
||||
|
||||
- type: tile
|
||||
id: FloorBrokenWood
|
||||
@@ -1739,6 +1831,7 @@
|
||||
collection: BarestepWood
|
||||
itemDrop: MaterialWoodPlank1
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 60
|
||||
|
||||
- type: tile
|
||||
id: FloorWebTile
|
||||
@@ -1753,6 +1846,7 @@
|
||||
collection: BarestepCarpet
|
||||
itemDrop: FloorTileItemWeb
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 30
|
||||
|
||||
- type: tile
|
||||
id: FloorChromite
|
||||
@@ -1784,6 +1878,7 @@
|
||||
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
|
||||
@@ -1796,6 +1891,7 @@
|
||||
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
|
||||
@@ -1806,6 +1902,7 @@
|
||||
footstepSounds:
|
||||
collection: FootstepHull
|
||||
itemDrop: FloorTileItemReinforced #same case as FloorHull
|
||||
reinforced: true
|
||||
|
||||
# Faux sci tiles
|
||||
|
||||
@@ -1837,6 +1934,7 @@
|
||||
collection: FootstepGrass
|
||||
itemDrop: FloorTileItemAstroGrass
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorMowedAstroGrass
|
||||
@@ -1846,6 +1944,7 @@
|
||||
isSubfloor: false
|
||||
deconstructTools: [ Cutting ]
|
||||
itemDrop: FloorTileItemMowedAstroGrass
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorJungleAstroGrass
|
||||
@@ -1855,6 +1954,7 @@
|
||||
isSubfloor: false
|
||||
deconstructTools: [ Cutting ]
|
||||
itemDrop: FloorTileItemJungleAstroGrass
|
||||
tileRipResistance: 50
|
||||
|
||||
# Ice
|
||||
- type: tile
|
||||
@@ -1870,6 +1970,7 @@
|
||||
mobFrictionNoInput: 0.05
|
||||
mobAcceleration: 2
|
||||
itemDrop: FloorTileItemAstroIce
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorAstroSnow
|
||||
@@ -1879,6 +1980,7 @@
|
||||
isSubfloor: false
|
||||
deconstructTools: [ Prying ]
|
||||
itemDrop: FloorTileItemAstroSnow
|
||||
tileRipResistance: 50
|
||||
|
||||
- type: tile
|
||||
id: FloorWoodLarge
|
||||
@@ -1899,3 +2001,4 @@
|
||||
collection: BarestepWood
|
||||
itemDrop: FloorTileItemWoodLarge
|
||||
heatCapacity: 10000
|
||||
tileRipResistance: 100
|
||||
|
||||
Reference in New Issue
Block a user