diff --git a/.github/workflows/publish-testing.yml b/.github/workflows/publish-testing.yml new file mode 100644 index 0000000000..aa3b35dea1 --- /dev/null +++ b/.github/workflows/publish-testing.yml @@ -0,0 +1,45 @@ +name: Publish Testing + +concurrency: + group: publish-testing + +on: + workflow_dispatch: + schedule: + - cron: '0 10 * * *' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3.6.0 + with: + submodules: 'recursive' + - name: Setup .NET Core + uses: actions/setup-dotnet@v3.2.0 + with: + dotnet-version: 9.0.x + + - name: Get Engine Tag + run: | + cd RobustToolbox + git fetch --depth=1 + + - name: Install dependencies + run: dotnet restore + + - name: Build Packaging + run: dotnet build Content.Packaging --configuration Release --no-restore /m + + - name: Package server + run: dotnet run --project Content.Packaging server --platform win-x64 --platform linux-x64 --platform osx-x64 --platform linux-arm64 + + - name: Package client + run: dotnet run --project Content.Packaging client --no-wipe-release + + - name: Publish version + run: Tools/publish_multi_request.py --fork-id wizards-testing + env: + PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }} + GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }} diff --git a/BuildChecker/BuildChecker.csproj b/BuildChecker/BuildChecker.csproj index 63d16fa970..4bd7fcf78c 100644 --- a/BuildChecker/BuildChecker.csproj +++ b/BuildChecker/BuildChecker.csproj @@ -12,12 +12,12 @@ You want to handle the Build, Clean and Rebuild tasks to prevent missing task er If you want to learn more about these kinds of things, check out Microsoft's official documentation about MSBuild: https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild --> - + python3 py -3 {C899FCA4-7037-4E49-ABC2-44DE72487110} - .NETFramework, Version=v4.7.2 + net4.7.2 false diff --git a/Content.Benchmarks/MapLoadBenchmark.cs b/Content.Benchmarks/MapLoadBenchmark.cs index bc050b59f1..8182ba8ec6 100644 --- a/Content.Benchmarks/MapLoadBenchmark.cs +++ b/Content.Benchmarks/MapLoadBenchmark.cs @@ -46,7 +46,7 @@ public class MapLoadBenchmark PoolManager.Shutdown(); } - public static readonly string[] MapsSource = { "Empty", "Satlern", "Box", "Bagel", "Dev", "CentComm", "Core", "TestTeg", "Packed", "Omega", "Reach", "Meta", "Marathon", "MeteorArena", "Fland", "Oasis", "Cog", "Convex"}; + public static readonly string[] MapsSource = { "Empty", "Satlern", "Box", "Bagel", "Dev", "CentComm", "Core", "TestTeg", "Packed", "Omega", "Reach", "Meta", "Marathon", "MeteorArena", "Fland", "Oasis", "Convex"}; [ParamsSource(nameof(MapsSource))] public string Map; diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index b594817701..5f0a8e1f2f 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -88,6 +88,7 @@ namespace Content.Client.Actions return; component.Whitelist = state.Whitelist; + component.Blacklist = state.Blacklist; component.CanTargetSelf = state.CanTargetSelf; BaseHandleState(uid, component, state); } @@ -137,6 +138,7 @@ namespace Content.Client.Actions component.Priority = state.Priority; component.AttachedEntity = EnsureEntity(state.AttachedEntity, uid); component.RaiseOnUser = state.RaiseOnUser; + component.RaiseOnAction = state.RaiseOnAction; component.AutoPopulate = state.AutoPopulate; component.Temporary = state.Temporary; component.ItemIconStyle = state.ItemIconStyle; diff --git a/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs b/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs index 6f0e7f80da..8abf0cbd73 100644 --- a/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs +++ b/Content.Client/Atmos/Consoles/AtmosAlertsComputerBoundUserInterface.cs @@ -11,6 +11,8 @@ public sealed class AtmosAlertsComputerBoundUserInterface : BoundUserInterface protected override void Open() { + base.Open(); + _menu = new AtmosAlertsComputerWindow(this, Owner); _menu.OpenCentered(); _menu.OnClose += Close; diff --git a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs index 86cf0a9eb8..ad26436946 100644 --- a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -16,6 +16,7 @@ namespace Content.Client.Atmos.EntitySystems [Dependency] private readonly IResourceCache _resourceCache = default!; [Dependency] private readonly IOverlayManager _overlayMan = default!; [Dependency] private readonly SpriteSystem _spriteSys = default!; + [Dependency] private readonly SharedTransformSystem _xformSys = default!; private GasTileOverlay _overlay = default!; @@ -25,7 +26,7 @@ namespace Content.Client.Atmos.EntitySystems SubscribeNetworkEvent(HandleGasOverlayUpdate); SubscribeLocalEvent(OnHandleState); - _overlay = new GasTileOverlay(this, EntityManager, _resourceCache, ProtoMan, _spriteSys); + _overlay = new GasTileOverlay(this, EntityManager, _resourceCache, ProtoMan, _spriteSys, _xformSys); _overlayMan.AddOverlay(_overlay); } diff --git a/Content.Client/Atmos/Overlays/GasTileOverlay.cs b/Content.Client/Atmos/Overlays/GasTileOverlay.cs index 17027525e5..55aeaa12af 100644 --- a/Content.Client/Atmos/Overlays/GasTileOverlay.cs +++ b/Content.Client/Atmos/Overlays/GasTileOverlay.cs @@ -21,6 +21,7 @@ namespace Content.Client.Atmos.Overlays { private readonly IEntityManager _entManager; private readonly IMapManager _mapManager; + private readonly SharedTransformSystem _xformSys; public override OverlaySpace Space => OverlaySpace.WorldSpaceEntities | OverlaySpace.WorldSpaceBelowWorld; private readonly ShaderInstance _shader; @@ -46,10 +47,11 @@ namespace Content.Client.Atmos.Overlays public const int GasOverlayZIndex = (int) Shared.DrawDepth.DrawDepth.Effects; // Under ghosts, above mostly everything else - public GasTileOverlay(GasTileOverlaySystem system, IEntityManager entManager, IResourceCache resourceCache, IPrototypeManager protoMan, SpriteSystem spriteSys) + public GasTileOverlay(GasTileOverlaySystem system, IEntityManager entManager, IResourceCache resourceCache, IPrototypeManager protoMan, SpriteSystem spriteSys, SharedTransformSystem xformSys) { _entManager = entManager; _mapManager = IoCManager.Resolve(); + _xformSys = xformSys; _shader = protoMan.Index("unshaded").Instance(); ZIndex = GasOverlayZIndex; @@ -158,7 +160,8 @@ namespace Content.Client.Atmos.Overlays _fireFrameCounter, _shader, overlayQuery, - xformQuery); + xformQuery, + _xformSys); var mapUid = _mapManager.GetMapEntityId(args.MapId); @@ -180,7 +183,8 @@ namespace Content.Client.Atmos.Overlays int[] fireFrameCounter, ShaderInstance shader, EntityQuery overlayQuery, - EntityQuery xformQuery) state) => + EntityQuery xformQuery, + SharedTransformSystem xformSys) state) => { if (!state.overlayQuery.TryGetComponent(uid, out var comp) || !state.xformQuery.TryGetComponent(uid, out var gridXform)) @@ -188,7 +192,7 @@ namespace Content.Client.Atmos.Overlays return true; } - var (_, _, worldMatrix, invMatrix) = gridXform.GetWorldPositionRotationMatrixWithInv(); + var (_, _, worldMatrix, invMatrix) = state.xformSys.GetWorldPositionRotationMatrixWithInv(gridXform); state.drawHandle.SetTransform(worldMatrix); var floatBounds = invMatrix.TransformBox(state.WorldBounds).Enlarged(grid.TileSize); var localBounds = new Box2i( diff --git a/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml b/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml index 1b7bd490b8..003a2203d5 100644 --- a/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml +++ b/Content.Client/Atmos/UI/SpaceHeaterWindow.xaml @@ -1,6 +1,6 @@ + MinSize="280 160" Title="{Loc comp-space-heater-ui-title}"> diff --git a/Content.Client/Buckle/BuckleSystem.cs b/Content.Client/Buckle/BuckleSystem.cs index 035e1300ca..40b2092a26 100644 --- a/Content.Client/Buckle/BuckleSystem.cs +++ b/Content.Client/Buckle/BuckleSystem.cs @@ -3,13 +3,15 @@ using Content.Shared.Buckle; using Content.Shared.Buckle.Components; using Content.Shared.Rotation; using Robust.Client.GameObjects; -using Robust.Shared.GameStates; +using Robust.Client.Graphics; namespace Content.Client.Buckle; internal sealed class BuckleSystem : SharedBuckleSystem { [Dependency] private readonly RotationVisualizerSystem _rotationVisualizerSystem = default!; + [Dependency] private readonly IEyeManager _eye = default!; + [Dependency] private readonly SharedTransformSystem _xformSystem = default!; public override void Initialize() { @@ -17,6 +19,8 @@ internal sealed class BuckleSystem : SharedBuckleSystem SubscribeLocalEvent(OnAppearanceChange); SubscribeLocalEvent(OnStrapMoveEvent); + SubscribeLocalEvent(OnBuckledEvent); + SubscribeLocalEvent(OnUnbuckledEvent); } private void OnStrapMoveEvent(EntityUid uid, StrapComponent component, ref MoveEvent args) @@ -28,13 +32,21 @@ internal sealed class BuckleSystem : SharedBuckleSystem // This code is garbage, it doesn't work with rotated viewports. I need to finally get around to reworking // sprite rendering for entity layers & direction dependent sorting. + // Future notes: + // Right now this doesn't handle: other grids, other grids rotating, the camera rotation changing, and many other fun rotation specific things + // The entire thing should be a concern of the engine, or something engine helps to implement properly. + // Give some of the sprite rotations their own drawdepth, maybe as an offset within the rsi, or something like this + // And we won't ever need to set the draw depth manually + if (args.NewRotation == args.OldRotation) return; if (!TryComp(uid, out var strapSprite)) return; - var isNorth = Transform(uid).LocalRotation.GetCardinalDir() == Direction.North; + var angle = _xformSystem.GetWorldRotation(uid) + _eye.CurrentEye.Rotation; // Get true screen position, or close enough + + var isNorth = angle.GetCardinalDir() == Direction.North; foreach (var buckledEntity in component.BuckledEntities) { if (!TryComp(buckledEntity, out var buckle)) @@ -45,6 +57,7 @@ internal sealed class BuckleSystem : SharedBuckleSystem if (isNorth) { + // This will only assign if empty, it won't get overwritten by new depth on multiple calls, which do happen easily buckle.OriginalDrawDepth ??= buckledSprite.DrawDepth; buckledSprite.DrawDepth = strapSprite.DrawDepth - 1; } @@ -56,6 +69,42 @@ internal sealed class BuckleSystem : SharedBuckleSystem } } + /// + /// Lower the draw depth of the buckled entity without needing for the strap entity to rotate/move. + /// Only do so when the entity is facing screen-local north + /// + private void OnBuckledEvent(Entity ent, ref BuckledEvent args) + { + if (!TryComp(args.Strap, out var strapSprite)) + return; + + if (!TryComp(ent.Owner, out var buckledSprite)) + return; + + var angle = _xformSystem.GetWorldRotation(args.Strap) + _eye.CurrentEye.Rotation; // Get true screen position, or close enough + + if (angle.GetCardinalDir() != Direction.North) + return; + + ent.Comp.OriginalDrawDepth ??= buckledSprite.DrawDepth; + buckledSprite.DrawDepth = strapSprite.DrawDepth - 1; + } + + /// + /// Was the draw depth of the buckled entity lowered? Reset it upon unbuckling. + /// + private void OnUnbuckledEvent(Entity ent, ref UnbuckledEvent args) + { + if (!TryComp(ent.Owner, out var buckledSprite)) + return; + + if (!ent.Comp.OriginalDrawDepth.HasValue) + return; + + buckledSprite.DrawDepth = ent.Comp.OriginalDrawDepth.Value; + ent.Comp.OriginalDrawDepth = null; + } + private void OnAppearanceChange(EntityUid uid, BuckleComponent component, ref AppearanceChangeEvent args) { if (!TryComp(uid, out var rotVisuals)) diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml index d36718cf08..179304a978 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml @@ -58,9 +58,7 @@ StyleClasses="LabelBig" /> -