]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Coordinates Disks & Shuttle FTL Travel (#23240)
authorSlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Mon, 1 Apr 2024 04:50:00 +0000 (06:50 +0200)
committerGitHub <noreply@github.com>
Mon, 1 Apr 2024 04:50:00 +0000 (15:50 +1100)
* Adds the CentComm Disk and configures it to work with direct-use shuttles

* Added functionality for drone shuttles (i.e. cargo shuttle)

* Adds support for pods, and a disk console object for disks to be inserted into. Also sprites.

* Added the disk to HoP's locker

* Removed leftover logs & comments

* Fix for integration test

* Apply suggestions from code review (formatting & proper DataField)

Co-authored-by: 0x6273 <0x40@keemail.me>
* Fix integration test & changes based on code review

* Includes Disk Cases to contain Coordinate Disks, which are now CDs instead of Floppy Disks

* Check pods & non-evac shuttles for CentCom travel, even in FTL

* Import

* Remove CentCom travel restrictions & pod disk consoles

* Major changes that changes the coordinates disk system to work with salvage expeditions

* Missed CC diskcase removal

* Fix build

* Review suggestions and changes

* Major additional changes after merge

* Minor tag miss

* Integration test fix

* review

---------

Co-authored-by: 0x6273 <0x40@keemail.me>
Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
24 files changed:
Content.Client/Shuttles/UI/MapScreen.xaml.cs
Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs
Content.Server/Salvage/SalvageSystem.Expeditions.cs
Content.Server/Salvage/SalvageSystem.cs
Content.Server/Salvage/SpawnSalvageMissionJob.cs
Content.Server/Shuttles/Components/EscapePodComponent.cs
Content.Server/Shuttles/Components/ShuttleConsoleComponent.cs
Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs
Content.Server/Shuttles/Systems/ShuttleConsoleSystem.FTL.cs
Content.Shared/Salvage/Expeditions/SalvageExpeditions.cs
Content.Shared/Shuttles/Components/FTLDestinationComponent.cs
Content.Shared/Shuttles/Components/SharedShuttleConsoleComponent.cs
Content.Shared/Shuttles/Components/ShuttleDestinationCoordinatesComponent.cs [new file with mode: 0644]
Content.Shared/Shuttles/Systems/SharedShuttleSystem.cs
Resources/Prototypes/Entities/Objects/Misc/cds.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Objects/Misc/diskcases.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
Resources/Prototypes/tags.yml
Resources/Textures/Objects/Misc/cd.rsi/icon.png [new file with mode: 0644]
Resources/Textures/Objects/Misc/cd.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Objects/Misc/diskcases.rsi/icon_base.png [new file with mode: 0644]
Resources/Textures/Objects/Misc/diskcases.rsi/icon_cargo.png [new file with mode: 0644]
Resources/Textures/Objects/Misc/diskcases.rsi/icon_cc.png [new file with mode: 0644]
Resources/Textures/Objects/Misc/diskcases.rsi/meta.json [new file with mode: 0644]

index 225d1be14e5e4a7d572b4aec7630ad458d6b2d40..10800b8c5f780cb4caf79c474fa3eef341a6e46b 100644 (file)
@@ -263,9 +263,10 @@ public sealed partial class MapScreen : BoxContainer
 
         while (mapComps.MoveNext(out var mapComp, out var mapXform, out var mapMetadata))
         {
-            if (!_shuttles.CanFTLTo(_shuttleEntity.Value, mapComp.MapId))
-               continue;
-
+            if (_console != null && !_shuttles.CanFTLTo(_shuttleEntity.Value, mapComp.MapId, _console.Value))
+            {
+                continue;
+            }
             var mapName = mapMetadata.EntityName;
 
             if (string.IsNullOrEmpty(mapName))
@@ -310,7 +311,6 @@ public sealed partial class MapScreen : BoxContainer
             };
 
             _mapHeadings.Add(mapComp.MapId, gridContents);
-
             foreach (var grid in _mapManager.GetAllMapGrids(mapComp.MapId))
             {
                 _entManager.TryGetComponent(grid.Owner, out IFFComponent? iffComp);
@@ -327,8 +327,8 @@ public sealed partial class MapScreen : BoxContainer
                 {
                     AddMapObject(mapComp.MapId, gridObj);
                 }
-                else if (iffComp == null ||
-                         (iffComp.Flags & IFFFlags.Hide) == 0x0)
+                else if (!_shuttles.IsBeaconMap(_mapManager.GetMapEntityId(mapComp.MapId)) && (iffComp == null ||
+                         (iffComp.Flags & IFFFlags.Hide) == 0x0))
                 {
                     _pendingMapObjects.Add((mapComp.MapId, gridObj));
                 }
index f7f3718208ed38b607895fdb9d7341042b017051..61636bea7c9cf75c98b2483077d54e22182d4366 100644 (file)
@@ -1,10 +1,16 @@
+using Content.Shared.Shuttles.Components;
 using Content.Shared.Procedural;
 using Content.Shared.Salvage.Expeditions;
+using Content.Shared.Dataset;
+using Robust.Shared.Prototypes;
 
 namespace Content.Server.Salvage;
 
 public sealed partial class SalvageSystem
 {
+    [ValidatePrototypeId<EntityPrototype>]
+    public const string CoordinatesDisk = "CoordinatesDisk";
+
     private void OnSalvageClaimMessage(EntityUid uid, SalvageExpeditionConsoleComponent component, ClaimSalvageMessage args)
     {
         var station = _station.GetOwningStation(uid);
@@ -15,11 +21,16 @@ public sealed partial class SalvageSystem
         if (!data.Missions.TryGetValue(args.Index, out var missionparams))
             return;
 
-        SpawnMission(missionparams, station.Value);
+        var cdUid = Spawn(CoordinatesDisk, Transform(uid).Coordinates);
+        SpawnMission(missionparams, station.Value, cdUid);
 
         data.ActiveMission = args.Index;
         var mission = GetMission(_prototypeManager.Index<SalvageDifficultyPrototype>(missionparams.Difficulty), missionparams.Seed);
         data.NextOffer = _timing.CurTime + mission.Duration + TimeSpan.FromSeconds(1);
+
+        _labelSystem.Label(cdUid, GetFTLName(_prototypeManager.Index<DatasetPrototype>("names_borer"), missionparams.Seed));
+        _audio.PlayPvs(component.PrintSound, uid);
+
         UpdateConsoles((station.Value, data));
     }
 
index 7e4a9c9310e1accf674694d28b5e2b8675909a8a..839730ec8733d584beee9ef08345dcbd5e0504d3 100644 (file)
@@ -8,6 +8,7 @@ using Content.Shared.Salvage.Expeditions;
 using Robust.Shared.CPUJob.JobQueues;
 using Robust.Shared.CPUJob.JobQueues.Queues;
 using Robust.Shared.GameStates;
+using Robust.Shared.Map;
 
 namespace Content.Server.Salvage;
 
@@ -148,7 +149,7 @@ public sealed partial class SalvageSystem
         return new SalvageExpeditionConsoleState(component.NextOffer, component.Claimed, component.Cooldown, component.ActiveMission, missions);
     }
 
-    private void SpawnMission(SalvageMissionParams missionParams, EntityUid station)
+    private void SpawnMission(SalvageMissionParams missionParams, EntityUid station, EntityUid? coordinatesDisk)
     {
         var cancelToken = new CancellationTokenSource();
         var job = new SpawnSalvageMissionJob(
@@ -162,7 +163,9 @@ public sealed partial class SalvageSystem
             _biome,
             _dungeon,
             _metaData,
+            _transform,
             station,
+            coordinatesDisk,
             missionParams,
             cancelToken.Token);
 
index a1a3b686b2f9784efd0a2954f220ad301640dd62..9af4736345ed8ac5ff1f8926411f55e177b14dfd 100644 (file)
@@ -32,6 +32,7 @@ using Robust.Shared.Audio;
 using Robust.Shared.Audio.Systems;
 using Robust.Shared.Map.Components;
 using Robust.Shared.Timing;
+using Content.Server.Labels;
 
 namespace Content.Server.Salvage
 {
@@ -39,6 +40,7 @@ namespace Content.Server.Salvage
     {
         [Dependency] private readonly IChatManager _chat = default!;
         [Dependency] private readonly IConfigurationManager _configurationManager = default!;
+        [Dependency] private readonly IEntityManager _entManager = default!;
         [Dependency] private readonly IGameTiming _timing = default!;
         [Dependency] private readonly ILogManager _logManager = default!;
         [Dependency] private readonly IMapManager _mapManager = default!;
@@ -48,6 +50,7 @@ namespace Content.Server.Salvage
         [Dependency] private readonly BiomeSystem _biome = default!;
         [Dependency] private readonly DungeonSystem _dungeon = default!;
         [Dependency] private readonly GravitySystem _gravity = default!;
+        [Dependency] private readonly LabelSystem _labelSystem = default!;
         [Dependency] private readonly MapLoaderSystem _map = default!;
         [Dependency] private readonly MetaDataSystem _metaData = default!;
         [Dependency] private readonly RadioSystem _radioSystem = default!;
index e2b17b58724dd5ac8c5911bd0d82eb169fcafb75..180c8d145cf131c329a386db390c8f640f186478 100644 (file)
@@ -33,6 +33,9 @@ using Robust.Shared.Prototypes;
 using Robust.Shared.Random;
 using Robust.Shared.Timing;
 using Robust.Shared.Utility;
+using Content.Server.Shuttles.Components;
+using Content.Shared.Coordinates;
+using Content.Shared.Shuttles.Components;
 
 namespace Content.Server.Salvage;
 
@@ -46,8 +49,10 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
     private readonly BiomeSystem _biome;
     private readonly DungeonSystem _dungeon;
     private readonly MetaDataSystem _metaData;
+    private readonly SharedTransformSystem _xforms;
 
     public readonly EntityUid Station;
+    public readonly EntityUid? CoordinatesDisk;
     private readonly SalvageMissionParams _missionParams;
 
     private readonly ISawmill _sawmill;
@@ -63,7 +68,9 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
         BiomeSystem biome,
         DungeonSystem dungeon,
         MetaDataSystem metaData,
+        SharedTransformSystem xform,
         EntityUid station,
+        EntityUid? coordinatesDisk,
         SalvageMissionParams missionParams,
         CancellationToken cancellation = default) : base(maxTime, cancellation)
     {
@@ -75,7 +82,9 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
         _biome = biome;
         _dungeon = dungeon;
         _metaData = metaData;
+        _xforms = xform;
         Station = station;
+        CoordinatesDisk = coordinatesDisk;
         _missionParams = missionParams;
         _sawmill = logManager.GetSawmill("salvage_job");
 #if !DEBUG
@@ -94,6 +103,18 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
         var random = new Random(_missionParams.Seed);
         var destComp = _entManager.AddComponent<FTLDestinationComponent>(mapUid);
         destComp.BeaconsOnly = true;
+        destComp.RequireCoordinateDisk = true;
+        destComp.Enabled = true;
+        _metaData.SetEntityName(mapUid, SharedSalvageSystem.GetFTLName(_prototypeManager.Index<DatasetPrototype>("names_borer"), _missionParams.Seed));
+        _entManager.AddComponent<FTLBeaconComponent>(mapUid);
+
+        // Saving the mission mapUid to a CD is made optional, in case one is somehow made in a process without a CD entity
+        if (CoordinatesDisk.HasValue)
+        {
+            var cd = _entManager.EnsureComponent<ShuttleDestinationCoordinatesComponent>(CoordinatesDisk.Value);
+            cd.Destination = mapUid;
+            _entManager.Dirty(CoordinatesDisk.Value, cd);
+        }
 
         // Setup mission configs
         // As we go through the config the rating will deplete so we'll go for most important to least important.
@@ -144,11 +165,6 @@ public sealed class SpawnSalvageMissionJob : Job<bool>
         expedition.EndTime = _timing.CurTime + mission.Duration;
         expedition.MissionParams = _missionParams;
 
-        // Don't want consoles to have the incorrect name until refreshed.
-        var ftlUid = _entManager.CreateEntityUninitialized("FTLPoint", new EntityCoordinates(mapUid, grid.TileSizeHalfVector));
-        _metaData.SetEntityName(ftlUid, SharedSalvageSystem.GetFTLName(_prototypeManager.Index<DatasetPrototype>("names_borer"), _missionParams.Seed));
-        _entManager.InitializeAndStartEntity(ftlUid);
-
         var landingPadRadius = 24;
         var minDungeonOffset = landingPadRadius + 4;
 
index 72c8024e12bfa7bc476fd60887b9d932a941c6fa..d717e97441bac57732591ddb73db371554498671 100644 (file)
@@ -9,7 +9,7 @@ namespace Content.Server.Shuttles.Components;
 [RegisterComponent, Access(typeof(EmergencyShuttleSystem)), AutoGenerateComponentPause]
 public sealed partial class EscapePodComponent : Component
 {
-    [DataField("launchTime", customTypeSerializer:typeof(TimeOffsetSerializer))]
+    [DataField(customTypeSerializer:typeof(TimeOffsetSerializer))]
     [AutoPausedField]
     public TimeSpan? LaunchTime;
 }
index 91cecde0445d96b279c7c6db26e933394a0b1241..03e262cef5071acd90c9fc1a68126fa8178c7b26 100644 (file)
@@ -14,5 +14,11 @@ namespace Content.Server.Shuttles.Components
         /// </summary>
         [DataField("zoom")]
         public Vector2 Zoom = new(1.5f, 1.5f);
+
+        /// <summary>
+        /// Should this console have access to restricted FTL destinations?
+        /// </summary>
+        [ViewVariables(VVAccess.ReadWrite), DataField("whitelistSpecific")]
+        public List<EntityUid> FTLWhitelist = new List<EntityUid>();
     }
 }
index a7f83f2e158be7783f582dcff7cfd77152f51fbb..c043861b377509117553ea0d47c1981d2ce4cdb9 100644 (file)
@@ -418,7 +418,7 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem
         }
 
         var mapId = _mapManager.CreateMap();
-        var grid = _map.LoadGrid(mapId, component.Map.ToString(),  new MapLoadOptions()
+        var grid = _map.LoadGrid(mapId, component.Map.ToString(), new MapLoadOptions()
         {
             LoadMap = false,
         });
index 7606d190a45c481d951508a47e1ee73a7e4afe65..c214bb015c91cfd56dda30b7d1ae01308302abf6 100644 (file)
@@ -44,6 +44,10 @@ public sealed partial class ShuttleConsoleSystem
         }
 
         var nCoordinates = new NetCoordinates(GetNetEntity(targetXform.ParentUid), targetXform.LocalPosition);
+        if (targetXform.ParentUid == EntityUid.Invalid)
+        {
+            nCoordinates = new NetCoordinates(GetNetEntity(beaconEnt), targetXform.LocalPosition);
+        }
 
         // Check target exists
         if (!_shuttle.CanFTLBeacon(nCoordinates))
@@ -128,7 +132,7 @@ public sealed partial class ShuttleConsoleSystem
         }
 
         // Check shuttle can FTL to this target.
-        if (!_shuttle.CanFTLTo(shuttleUid.Value, targetMap))
+        if (!_shuttle.CanFTLTo(shuttleUid.Value, targetMap, ent))
         {
             return;
         }
index fe4d59b81a8f0450c72617a68dd730127c0bfd16..4844a1f3fd3cc5971f0798cea08f057d00f8f980 100644 (file)
@@ -1,4 +1,5 @@
 using Content.Shared.Salvage.Expeditions.Modifiers;
+using Robust.Shared.Audio;
 using Robust.Shared.GameStates;
 using Robust.Shared.Serialization;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
@@ -30,7 +31,11 @@ public sealed class SalvageExpeditionConsoleState : BoundUserInterfaceState
 [RegisterComponent, NetworkedComponent]
 public sealed partial class SalvageExpeditionConsoleComponent : Component
 {
-
+    /// <summary>
+    /// The sound made when spawning a coordinates disk
+    /// </summary>
+    [DataField]
+    public SoundSpecifier PrintSound = new SoundPathSpecifier("/Audio/Machines/terminal_insert_disc.ogg");
 }
 
 [Serializable, NetSerializable]
index 58cff96c2bcc0047c94649ec2f80cb085024031f..d4bc536a29bbf0df9fce432c7dded9340ec20c68 100644 (file)
@@ -23,4 +23,10 @@ public sealed partial class FTLDestinationComponent : Component
     /// </summary>
     [DataField, AutoNetworkedField]
     public bool BeaconsOnly;
+
+    /// <summary>
+    /// Shuttles must use a corresponding CD to travel to this location.
+    /// </summary>
+    [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+    public bool RequireCoordinateDisk = false;
 }
index 436c830d20b0d9b9ccdf3f16a327558db04c394b..2ee03210ba901a1acea4493bd54644df8244876a 100644 (file)
@@ -9,7 +9,7 @@ namespace Content.Shared.Shuttles.Components
     [NetworkedComponent]
     public abstract partial class SharedShuttleConsoleComponent : Component
     {
-
+        public static string DiskSlotName = "disk_slot";
     }
 
     [Serializable, NetSerializable]
diff --git a/Content.Shared/Shuttles/Components/ShuttleDestinationCoordinatesComponent.cs b/Content.Shared/Shuttles/Components/ShuttleDestinationCoordinatesComponent.cs
new file mode 100644 (file)
index 0000000..009dee4
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Content.Shared.Shuttles.Components;
+using Robust.Shared.GameStates;
+
+/// <summary>
+/// Enables a shuttle to travel to a destination with an item inserted into its console
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class ShuttleDestinationCoordinatesComponent : Component
+{
+    /// <summary>
+    /// Uid for entity containing the FTLDestination component
+    /// </summary>
+    [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+    public EntityUid? Destination;
+}
index ca25a49b23fe2b93dc3ad8942618604dc400eac8..d859d9f4859093f4c8fa70c3f25590a6a66f4f17 100644 (file)
@@ -1,3 +1,4 @@
+using Content.Shared.Containers.ItemSlots;
 using Content.Shared.Shuttles.BUIStates;
 using Content.Shared.Shuttles.Components;
 using Content.Shared.Shuttles.UI.MapObjects;
@@ -10,7 +11,8 @@ namespace Content.Shared.Shuttles.Systems;
 
 public abstract partial class SharedShuttleSystem : EntitySystem
 {
-    [Dependency] private   readonly IMapManager _mapManager = default!;
+    [Dependency] private readonly IMapManager _mapManager = default!;
+    [Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
     [Dependency] protected readonly SharedMapSystem Maps = default!;
     [Dependency] protected readonly SharedTransformSystem XformSystem = default!;
 
@@ -34,7 +36,7 @@ public abstract partial class SharedShuttleSystem : EntitySystem
     /// <summary>
     /// Returns whether an entity can FTL to the specified map.
     /// </summary>
-    public bool CanFTLTo(EntityUid shuttleUid, MapId targetMap)
+    public bool CanFTLTo(EntityUid shuttleUid, MapId targetMap, EntityUid consoleUid)
     {
         var mapUid = _mapManager.GetMapEntityId(targetMap);
         var shuttleMap = _xformQuery.GetComponent(shuttleUid).MapID;
@@ -42,10 +44,40 @@ public abstract partial class SharedShuttleSystem : EntitySystem
         if (shuttleMap == targetMap)
             return true;
 
-        if (!TryComp<FTLDestinationComponent>(mapUid, out var destination) ||
-            !destination.Enabled)
-        {
+        if (!TryComp<FTLDestinationComponent>(mapUid, out var destination) || !destination.Enabled)
             return false;
+
+        if (destination.RequireCoordinateDisk)
+        {
+            if (!TryComp<ItemSlotsComponent>(consoleUid, out var slot))
+            {
+                return false;
+            }
+
+            if (!_itemSlots.TryGetSlot(consoleUid, SharedShuttleConsoleComponent.DiskSlotName, out var itemSlot, component: slot) || !itemSlot.HasItem)
+            {
+                return false;
+            }
+
+            if (itemSlot.Item is { Valid: true } disk)
+            {
+                ShuttleDestinationCoordinatesComponent? diskCoordinates = null;
+                if (!Resolve(disk, ref diskCoordinates))
+                {
+                    return false;
+                }
+
+                var diskCoords = diskCoordinates.Destination;
+
+                if (diskCoords == null || !TryComp<FTLDestinationComponent>(diskCoords.Value, out var diskDestination) || diskDestination != destination)
+                {
+                    return false;
+                }
+            }
+            else
+            {
+                return false;
+            }
         }
 
         if (HasComp<FTLMapComponent>(mapUid))
diff --git a/Resources/Prototypes/Entities/Objects/Misc/cds.yml b/Resources/Prototypes/Entities/Objects/Misc/cds.yml
new file mode 100644 (file)
index 0000000..a80a7d1
--- /dev/null
@@ -0,0 +1,19 @@
+- type: entity
+  name: coordinates disk
+  parent: BaseItem
+  id: CoordinatesDisk
+  description: A disk containing the coordinates to a location in space. Necessary for any FTL-traversing vessel to reach their destination. Fits inside shuttle consoles.
+  components:
+  - type: Sprite
+    sprite: Objects/Misc/cd.rsi
+    state: icon
+  - type: StaticPrice
+    price: 100
+  - type: Tag
+    tags:
+    - CoordinatesDisk
+  - type: DamageOtherOnHit
+    damage:
+      types:
+        Slash: 1
+  - type: ShuttleDestinationCoordinates
diff --git a/Resources/Prototypes/Entities/Objects/Misc/diskcases.yml b/Resources/Prototypes/Entities/Objects/Misc/diskcases.yml
new file mode 100644 (file)
index 0000000..da86d7a
--- /dev/null
@@ -0,0 +1,21 @@
+- type: entity
+  name: diskcase
+  parent: BaseStorageItem
+  id: DiskCase
+  description: Case for storing a coordinates disk.
+  components:
+  - type: Sprite
+    sprite: Objects/Misc/diskcases.rsi
+    state: icon_base
+  - type: Storage
+    grid:
+    - 0,0,0,1
+    maxItemSize: Normal
+    whitelist:
+      tags:
+        - Document
+        - CoordinatesDisk
+    storageOpenSound: /Audio/Machines/screwdriveropen.ogg
+    storageCloseSound: /Audio/Machines/screwdriverclose.ogg
+    storageInsertSound: /Audio/Items/crowbar.ogg
+    storageRemoveSound: /Audio/Items/crowbar.ogg
index 8f58464bd4381406aaf9068d584b7048034eddcd..5a3dc37582432f36347bc7d431b1710cc46999c4 100644 (file)
     color: "#43ccb5"
   - type: Rotatable
     rotateWhileAnchored: true
+  - type: ItemSlots
+    slots:
+      disk_slot:
+        name: Disk
+        insertSound:
+          path: /Audio/Machines/terminal_insert_disc.ogg
+        ejectSound:
+          path: /Audio/Machines/terminal_insert_disc.ogg
+        whitelist:
+          components:
+          - ShuttleDestinationCoordinates
+  - type: ContainerContainer
+    containers:
+      board: !type:Container
+        ents: []
+      disk_slot: !type:ContainerSlot {}
 
 - type: entity
   parent: BaseComputerShuttle
index 303a9b7c87b3720d0c2f4f2dae472b5100fc2ce0..961912d6092bf97b54c50a13d994a5b8ec344cf5 100644 (file)
 - type: Tag
   id: ConveyorAssembly
 
+- type: Tag
+  id: CoordinatesDisk
+
 - type: Tag #Ohioans die happy
   id: Corn
 
diff --git a/Resources/Textures/Objects/Misc/cd.rsi/icon.png b/Resources/Textures/Objects/Misc/cd.rsi/icon.png
new file mode 100644 (file)
index 0000000..346d8c1
Binary files /dev/null and b/Resources/Textures/Objects/Misc/cd.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Misc/cd.rsi/meta.json b/Resources/Textures/Objects/Misc/cd.rsi/meta.json
new file mode 100644 (file)
index 0000000..7f5e1ec
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by SlamBamActionman",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon"
+    }
+  ]
+}
diff --git a/Resources/Textures/Objects/Misc/diskcases.rsi/icon_base.png b/Resources/Textures/Objects/Misc/diskcases.rsi/icon_base.png
new file mode 100644 (file)
index 0000000..11fb714
Binary files /dev/null and b/Resources/Textures/Objects/Misc/diskcases.rsi/icon_base.png differ
diff --git a/Resources/Textures/Objects/Misc/diskcases.rsi/icon_cargo.png b/Resources/Textures/Objects/Misc/diskcases.rsi/icon_cargo.png
new file mode 100644 (file)
index 0000000..4bee922
Binary files /dev/null and b/Resources/Textures/Objects/Misc/diskcases.rsi/icon_cargo.png differ
diff --git a/Resources/Textures/Objects/Misc/diskcases.rsi/icon_cc.png b/Resources/Textures/Objects/Misc/diskcases.rsi/icon_cc.png
new file mode 100644 (file)
index 0000000..a0dd3a8
Binary files /dev/null and b/Resources/Textures/Objects/Misc/diskcases.rsi/icon_cc.png differ
diff --git a/Resources/Textures/Objects/Misc/diskcases.rsi/meta.json b/Resources/Textures/Objects/Misc/diskcases.rsi/meta.json
new file mode 100644 (file)
index 0000000..714b0b1
--- /dev/null
@@ -0,0 +1,20 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by SlamBamActionman",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon_base"
+    },
+    {
+      "name": "icon_cc"
+    },
+    {
+      "name": "icon_cargo"
+    }
+  ]
+}