Inventory sprite rotation (#22201)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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
|
||||
@@ -105,6 +107,9 @@
|
||||
state: icon
|
||||
- type: Item
|
||||
sprite: Objects/Tools/wrench.rsi
|
||||
storedSprite:
|
||||
sprite: Objects/Tools/wrench.rsi
|
||||
state: storage
|
||||
- type: ItemCooldown
|
||||
- type: MeleeWeapon
|
||||
wideAnimationRotation: 135
|
||||
@@ -141,6 +146,9 @@
|
||||
- type: Item
|
||||
sprite: Objects/Tools/crowbar.rsi
|
||||
size: Small
|
||||
storedSprite:
|
||||
sprite: Objects/Tools/crowbar.rsi
|
||||
state: storage
|
||||
- type: ItemCooldown
|
||||
- type: MeleeWeapon
|
||||
wideAnimationRotation: -135
|
||||
@@ -174,6 +182,9 @@
|
||||
state: red-icon
|
||||
- type: Item
|
||||
heldPrefix: red
|
||||
storedSprite:
|
||||
sprite: Objects/Tools/crowbar.rsi
|
||||
state: red-storage
|
||||
|
||||
- type: entity
|
||||
name: multitool
|
||||
|
||||
@@ -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
|
||||
@@ -36,6 +36,12 @@
|
||||
{
|
||||
"name": "red-equipped-BELT",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "storage"
|
||||
},
|
||||
{
|
||||
"name": "red-storage"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
BIN
Resources/Textures/Objects/Tools/crowbar.rsi/red-storage.png
Normal file
BIN
Resources/Textures/Objects/Tools/crowbar.rsi/red-storage.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 371 B |
BIN
Resources/Textures/Objects/Tools/crowbar.rsi/storage.png
Normal file
BIN
Resources/Textures/Objects/Tools/crowbar.rsi/storage.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 334 B |
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
BIN
Resources/Textures/Objects/Tools/wrench.rsi/storage.png
Normal file
BIN
Resources/Textures/Objects/Tools/wrench.rsi/storage.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 408 B |
Reference in New Issue
Block a user