]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Inventory sprite rotation (#22201)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Thu, 7 Dec 2023 00:59:16 +0000 (19:59 -0500)
committerGitHub <noreply@github.com>
Thu, 7 Dec 2023 00:59:16 +0000 (11:59 +1100)
Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs
Content.Shared/Item/ItemComponent.cs
Resources/Prototypes/Entities/Objects/Tools/tools.yml
Resources/Textures/Objects/Tools/crowbar.rsi/meta.json
Resources/Textures/Objects/Tools/crowbar.rsi/red-storage.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/crowbar.rsi/storage.png [new file with mode: 0644]
Resources/Textures/Objects/Tools/wrench.rsi/meta.json
Resources/Textures/Objects/Tools/wrench.rsi/storage.png [new file with mode: 0644]

index e4f3506baa1b98df39188f6c5bea8f0465b81de3..1441681e6805f93b0729ba7385c660b1260eb890 100644 (file)
@@ -78,7 +78,7 @@ public sealed class ItemGridPiece : Control
         base.Draw(handle);
 
         // really just an "oh shit" catch.
-        if (!_entityManager.EntityExists(Entity))
+        if (!_entityManager.EntityExists(Entity) || !_entityManager.TryGetComponent<ItemComponent>(Entity, out var itemComponent))
         {
             Dispose();
             return;
@@ -87,7 +87,7 @@ public sealed class ItemGridPiece : Control
         if (_storageController.IsDragging && _storageController.CurrentlyDragging == this)
             return;
 
-        var adjustedShape = _entityManager.System<ItemSystem>().GetAdjustedItemShape((Entity, null), Location.Rotation, Vector2i.Zero);
+        var adjustedShape = _entityManager.System<ItemSystem>().GetAdjustedItemShape((Entity, itemComponent), Location.Rotation, Vector2i.Zero);
         var boundingGrid = adjustedShape.GetBoundingBox();
         var size = _centerTexture!.Size * 2 * UIScale;
 
@@ -130,15 +130,37 @@ public sealed class ItemGridPiece : Control
         }
 
         // typically you'd divide by two, but since the textures are half a tile, this is done implicitly
-        var iconOffset = new Vector2((boundingGrid.Width + 1) * size.X ,
+        var iconPosition = new Vector2((boundingGrid.Width + 1) * size.X ,
             (boundingGrid.Height + 1) * size.Y);
+        var iconRotation = Location.Rotation + Angle.FromDegrees(itemComponent.StoredRotation);
 
-        _entityManager.System<SpriteSystem>().ForceUpdate(Entity);
-        handle.DrawEntity(Entity,
-            PixelPosition + iconOffset,
-            Vector2.One * 2 * UIScale,
-            Angle.Zero,
-            overrideDirection: Direction.South);
+        if (itemComponent.StoredSprite is { } storageSprite)
+        {
+            var scale = 2 * UIScale;
+            var offset = (((Box2) boundingGrid).Size - Vector2.One) * size;
+            var sprite = _entityManager.System<SpriteSystem>().Frame0(storageSprite);
+
+            var spriteBox = new Box2Rotated(new Box2(0f, sprite.Height * scale, sprite.Width * scale, 0f), -iconRotation, Vector2.Zero);
+            var root = spriteBox.CalcBoundingBox().BottomLeft;
+            var pos = PixelPosition * 2
+                      + (Parent?.GlobalPixelPosition ?? Vector2.Zero)
+                      + offset;
+
+            handle.SetTransform(pos, iconRotation);
+            var box = new UIBox2(root, root + sprite.Size * scale);
+            handle.DrawTextureRect(sprite, box);
+            handle.SetTransform(Matrix3.Identity);
+        }
+        else
+        {
+            _entityManager.System<SpriteSystem>().ForceUpdate(Entity);
+            handle.DrawEntity(Entity,
+                PixelPosition + iconPosition,
+                Vector2.One * 2 * UIScale,
+                Angle.Zero,
+                eyeRotation: iconRotation,
+                overrideDirection: Direction.South);
+        }
     }
 
     protected override bool HasPoint(Vector2 point)
index 21926882a0b8d3cf724b44a8077b0710a6957a2d..1cb51b6ea060f76a7023a9a5e2d9d167c6de081d 100644 (file)
@@ -2,6 +2,7 @@ using Content.Shared.Hands.Components;
 using Robust.Shared.GameStates;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Serialization;
+using Robust.Shared.Utility;
 
 namespace Content.Shared.Item;
 
@@ -41,6 +42,18 @@ public sealed partial class ItemComponent : Component
     /// </summary>
     [DataField, AutoNetworkedField]
     public List<Box2i>? Shape;
+
+    /// <summary>
+    /// A sprite used to depict this entity specifically when it is displayed in the storage UI.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public SpriteSpecifier? StoredSprite;
+
+    /// <summary>
+    /// An additional angle offset, in degrees, applied to the visual depiction of the item when displayed in the storage UI.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public float StoredRotation = 0;
 }
 
 [Serializable, NetSerializable]
index 566c72dafd87e9c7f37ea2a22f26e8fc21b2dc8c..54200f10e8e64664b12a63feeca2aada30ad8b7c 100644 (file)
@@ -37,6 +37,7 @@
           cutters: Rainbow
   - type: Item
     sprite: Objects/Tools/wirecutters.rsi
+    storedRotation: -90
   - type: LatticeCutting
   - type: PhysicalComposition
     materialComposition:
@@ -64,6 +65,7 @@
       - state: screwdriver-screwybits
   - type: Item
     sprite: Objects/Tools/screwdriver.rsi
+    storedRotation: -90
   - type: ItemCooldown
   - type: MeleeWeapon
     wideAnimationRotation: -90
     state: icon
   - type: Item
     sprite: Objects/Tools/wrench.rsi
+    storedSprite:
+      sprite: Objects/Tools/wrench.rsi
+      state: storage
   - type: ItemCooldown
   - type: MeleeWeapon
     wideAnimationRotation: 135
   - type: Item
     sprite: Objects/Tools/crowbar.rsi
     size: Small
+    storedSprite:
+      sprite: Objects/Tools/crowbar.rsi
+      state: storage
   - type: ItemCooldown
   - type: MeleeWeapon
     wideAnimationRotation: -135
     state: red-icon
   - type: Item
     heldPrefix: red
+    storedSprite:
+      sprite: Objects/Tools/crowbar.rsi
+      state: red-storage
 
 - type: entity
   name: multitool
index 1778efa00c7926a34e401adfc8d196073c0afa80..d4cab89f8ef78737dd1802c3eb513bb140c0a01d 100644 (file)
@@ -1,7 +1,7 @@
 {
   "version": 1,
   "license": "CC-BY-SA-3.0",
-  "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/eea0599511b088fdab9d43e562210cdbd51c6a98",
+  "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/eea0599511b088fdab9d43e562210cdbd51c6a98, storage and red-storage by Flareguy",
   "size": {
     "x": 32,
     "y": 32
     {
       "name": "red-equipped-BELT",
       "directions": 4
+    },
+    {
+      "name": "storage"
+    },
+    {
+      "name": "red-storage"
     }
   ]
 }
diff --git a/Resources/Textures/Objects/Tools/crowbar.rsi/red-storage.png b/Resources/Textures/Objects/Tools/crowbar.rsi/red-storage.png
new file mode 100644 (file)
index 0000000..11aa1e0
Binary files /dev/null and b/Resources/Textures/Objects/Tools/crowbar.rsi/red-storage.png differ
diff --git a/Resources/Textures/Objects/Tools/crowbar.rsi/storage.png b/Resources/Textures/Objects/Tools/crowbar.rsi/storage.png
new file mode 100644 (file)
index 0000000..268c5bd
Binary files /dev/null and b/Resources/Textures/Objects/Tools/crowbar.rsi/storage.png differ
index 9f7b9badd5d455c3502f97cdec102702654ad78c..a2c8f06819b0baca1eff06d335213336bdc58860 100644 (file)
@@ -1,7 +1,7 @@
 {
   "version": 1,
   "license": "CC-BY-SA-3.0",
-  "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d",
+  "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d, storage by EmoGarbage404 (github)",
   "size": {
     "x": 32,
     "y": 32
@@ -21,6 +21,9 @@
     {
       "name": "equipped-BELT",
       "directions": 4
+    },
+    {
+      "name": "storage"
     }
   ]
 }
diff --git a/Resources/Textures/Objects/Tools/wrench.rsi/storage.png b/Resources/Textures/Objects/Tools/wrench.rsi/storage.png
new file mode 100644 (file)
index 0000000..54d1d9b
Binary files /dev/null and b/Resources/Textures/Objects/Tools/wrench.rsi/storage.png differ