forked from Simple-Station/Einstein-Engines
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Mass Engine Update (Simple-Station#1220)
<!-- This is a semi-strict format, you can add/remove sections as needed but the order/format should be kept the same Remove these comments before submitting --> # Description <!-- Explain this PR in as much detail as applicable Some example prompts to consider: How might this affect the game? The codebase? What might be some alternatives to this? How/Who does this benefit/hurt [the game/codebase]? --> An attempt to do all engine updates in one go. Not focusing on content associated, only what's needed for it to run and any bug fixes. --- # TODO - [x] Fix bug where unbuckling resets you to lying down. - [x] Fix bug where you can no longer get up after lying down. - [x] See what else I broke. --- --------- Signed-off-by: sleepyyapril <[email protected]> Co-authored-by: metalgearsloth <[email protected]> Co-authored-by: Leon Friedrich <[email protected]> Co-authored-by: Tayrtahn <[email protected]> Co-authored-by: VMSolidus <[email protected]> Co-authored-by: Nemanja <[email protected]> Co-authored-by: ShadowCommander <[email protected]> Co-authored-by: Plykiya <[email protected]> Co-authored-by: plykiya <[email protected]> Co-authored-by: Pieter-Jan Briers <[email protected]> Co-authored-by: metalgearsloth <[email protected]> Co-authored-by: Chief-Engineer <[email protected]> Co-authored-by: deltanedas <[email protected]>
- Loading branch information
1 parent
bdbc394
commit f95774b
Showing
713 changed files
with
11,681 additions
and
4,685 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,145 +1,17 @@ | ||
using System.Numerics; | ||
using Robust.Client.GameObjects; | ||
using Robust.Client.Graphics; | ||
using Robust.Client.Utility; | ||
using Robust.Shared.Graphics; | ||
using static Robust.Client.GameObjects.SpriteComponent; | ||
using Direction = Robust.Shared.Maths.Direction; | ||
namespace Content.Client.Clickable; | ||
|
||
namespace Content.Client.Clickable | ||
[RegisterComponent] | ||
public sealed partial class ClickableComponent : Component | ||
{ | ||
[RegisterComponent] | ||
public sealed partial class ClickableComponent : Component | ||
{ | ||
[Dependency] private readonly IClickMapManager _clickMapManager = default!; | ||
|
||
[DataField("bounds")] public DirBoundData? Bounds; | ||
|
||
/// <summary> | ||
/// Used to check whether a click worked. Will first check if the click falls inside of some explicit bounding | ||
/// boxes (see <see cref="Bounds"/>). If that fails, attempts to use automatically generated click maps. | ||
/// </summary> | ||
/// <param name="worldPos">The world position that was clicked.</param> | ||
/// <param name="drawDepth"> | ||
/// The draw depth for the sprite that captured the click. | ||
/// </param> | ||
/// <returns>True if the click worked, false otherwise.</returns> | ||
public bool CheckClick(SpriteComponent sprite, TransformComponent transform, EntityQuery<TransformComponent> xformQuery, Vector2 worldPos, IEye eye, out int drawDepth, out uint renderOrder, out float bottom) | ||
{ | ||
if (!sprite.Visible) | ||
{ | ||
drawDepth = default; | ||
renderOrder = default; | ||
bottom = default; | ||
return false; | ||
} | ||
|
||
drawDepth = sprite.DrawDepth; | ||
renderOrder = sprite.RenderOrder; | ||
var (spritePos, spriteRot) = transform.GetWorldPositionRotation(xformQuery); | ||
var spriteBB = sprite.CalculateRotatedBoundingBox(spritePos, spriteRot, eye.Rotation); | ||
bottom = Matrix3Helpers.CreateRotation(eye.Rotation).TransformBox(spriteBB).Bottom; | ||
|
||
Matrix3x2.Invert(sprite.GetLocalMatrix(), out var invSpriteMatrix); | ||
|
||
// This should have been the rotation of the sprite relative to the screen, but this is not the case with no-rot or directional sprites. | ||
var relativeRotation = (spriteRot + eye.Rotation).Reduced().FlipPositive(); | ||
|
||
Angle cardinalSnapping = sprite.SnapCardinals ? relativeRotation.GetCardinalDir().ToAngle() : Angle.Zero; | ||
|
||
// First we get `localPos`, the clicked location in the sprite-coordinate frame. | ||
var entityXform = Matrix3Helpers.CreateInverseTransform(transform.WorldPosition, sprite.NoRotation ? -eye.Rotation : spriteRot - cardinalSnapping); | ||
var localPos = Vector2.Transform(Vector2.Transform(worldPos, entityXform), invSpriteMatrix); | ||
|
||
// Check explicitly defined click-able bounds | ||
if (CheckDirBound(sprite, relativeRotation, localPos)) | ||
return true; | ||
|
||
// Next check each individual sprite layer using automatically computed click maps. | ||
foreach (var spriteLayer in sprite.AllLayers) | ||
{ | ||
if (!spriteLayer.Visible || spriteLayer is not Layer layer) | ||
continue; | ||
|
||
// Check the layer's texture, if it has one | ||
if (layer.Texture != null) | ||
{ | ||
// Convert to image coordinates | ||
var imagePos = (Vector2i) (localPos * EyeManager.PixelsPerMeter * new Vector2(1, -1) + layer.Texture.Size / 2f); | ||
|
||
if (_clickMapManager.IsOccluding(layer.Texture, imagePos)) | ||
return true; | ||
} | ||
|
||
// Either we weren't clicking on the texture, or there wasn't one. In which case: check the RSI next | ||
if (layer.ActualRsi is not { } rsi || !rsi.TryGetState(layer.State, out var rsiState)) | ||
continue; | ||
|
||
var dir = Layer.GetDirection(rsiState.RsiDirections, relativeRotation); | ||
[DataField] public DirBoundData? Bounds; | ||
|
||
// convert to layer-local coordinates | ||
layer.GetLayerDrawMatrix(dir, out var matrix); | ||
Matrix3x2.Invert(matrix, out var inverseMatrix); | ||
var layerLocal = Vector2.Transform(localPos, inverseMatrix); | ||
|
||
// Convert to image coordinates | ||
var layerImagePos = (Vector2i) (layerLocal * EyeManager.PixelsPerMeter * new Vector2(1, -1) + rsiState.Size / 2f); | ||
|
||
// Next, to get the right click map we need the "direction" of this layer that is actually being used to draw the sprite on the screen. | ||
// This **can** differ from the dir defined before, but can also just be the same. | ||
if (sprite.EnableDirectionOverride) | ||
dir = sprite.DirectionOverride.Convert(rsiState.RsiDirections); | ||
dir = dir.OffsetRsiDir(layer.DirOffset); | ||
|
||
if (_clickMapManager.IsOccluding(layer.ActualRsi!, layer.State, dir, layer.AnimationFrame, layerImagePos)) | ||
return true; | ||
} | ||
|
||
drawDepth = default; | ||
renderOrder = default; | ||
bottom = default; | ||
return false; | ||
} | ||
|
||
public bool CheckDirBound(SpriteComponent sprite, Angle relativeRotation, Vector2 localPos) | ||
{ | ||
if (Bounds == null) | ||
return false; | ||
|
||
// These explicit bounds only work for either 1 or 4 directional sprites. | ||
|
||
// This would be the orientation of a 4-directional sprite. | ||
var direction = relativeRotation.GetCardinalDir(); | ||
|
||
var modLocalPos = sprite.NoRotation | ||
? localPos | ||
: direction.ToAngle().RotateVec(localPos); | ||
|
||
// First, check the bounding box that is valid for all orientations | ||
if (Bounds.All.Contains(modLocalPos)) | ||
return true; | ||
|
||
// Next, get and check the appropriate bounding box for the current sprite orientation | ||
var boundsForDir = (sprite.EnableDirectionOverride ? sprite.DirectionOverride : direction) switch | ||
{ | ||
Direction.East => Bounds.East, | ||
Direction.North => Bounds.North, | ||
Direction.South => Bounds.South, | ||
Direction.West => Bounds.West, | ||
_ => throw new InvalidOperationException() | ||
}; | ||
|
||
return boundsForDir.Contains(modLocalPos); | ||
} | ||
|
||
[DataDefinition] | ||
public sealed partial class DirBoundData | ||
{ | ||
[DataField("all")] public Box2 All; | ||
[DataField("north")] public Box2 North; | ||
[DataField("south")] public Box2 South; | ||
[DataField("east")] public Box2 East; | ||
[DataField("west")] public Box2 West; | ||
} | ||
[DataDefinition] | ||
public sealed partial class DirBoundData | ||
{ | ||
[DataField] public Box2 All; | ||
[DataField] public Box2 North; | ||
[DataField] public Box2 South; | ||
[DataField] public Box2 East; | ||
[DataField] public Box2 West; | ||
} | ||
} |
Oops, something went wrong.