From eb0a54fef295d4b05f864a0f4af404e8870d505f Mon Sep 17 00:00:00 2001 From: Menshin Date: Sun, 21 Jan 2024 10:17:17 +0100 Subject: [PATCH] PA control box part detection fix (#24356) * * Fixed rounding errors when the PA control box was checking for parts, sometimes leading to the obscure "port/starboard emitters are not detected". * Auto-rotated the PA control box toward the fuel box when checking for parts * Swapped the wired/completed state sprites for the PA control box as it appears they were inverted * Update Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- .../ParticleAcceleratorSystem.Parts.cs | 30 ++++++++++-------- .../ParticleAcceleratorSystem.cs | 1 + .../PA/control_box.rsi/completed.png | Bin 1446 -> 1422 bytes .../Generation/PA/control_box.rsi/wired.png | Bin 1441 -> 1408 bytes 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs index abc68543ff..bdbc7b3f5b 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs @@ -48,12 +48,12 @@ public sealed partial class ParticleAcceleratorSystem return; var gridUid = xform.GridUid; - if (gridUid == null || gridUid != xform.ParentUid || !_mapManager.TryGetGrid(gridUid, out var grid)) + if (gridUid == null || gridUid != xform.ParentUid || !TryComp(gridUid, out var grid)) return; // Find fuel chamber first by scanning cardinals. var fuelQuery = GetEntityQuery(); - foreach (var adjacent in grid.GetCardinalNeighborCells(xform.Coordinates)) + foreach (var adjacent in _mapSystem.GetCardinalNeighborCells(gridUid.Value, grid, xform.Coordinates)) { if (fuelQuery.HasComponent(adjacent) && partQuery.TryGetComponent(adjacent, out var partState) @@ -75,21 +75,23 @@ public sealed partial class ParticleAcceleratorSystem // You'll have to take my word for it that that breaks everything, yeah? controller.CurrentlyRescanning = true; - // Align ourselves to match fuel chamber orientation. - // This means that if you mess up the orientation of the control box it's not a big deal, - // because the sprite is far from obvious about the orientation. + // Automatically rotate the control box sprite to face the fuel chamber var fuelXform = xformQuery.GetComponent(controller.FuelChamber!.Value); - var rotation = fuelXform.LocalRotation; - _transformSystem.SetLocalRotation(uid, rotation, xform); + var fuelDir = (fuelXform.LocalPosition - xform.LocalPosition).GetDir(); + _transformSystem.SetLocalRotation(uid, fuelDir.ToAngle(), xform); // Calculate offsets for each of the parts of the PA. // These are all done relative to the fuel chamber BC that is basically the center of the machine. - var positionFuelChamber = grid.TileIndicesFor(fuelXform.Coordinates); // // - var positionEndCap = positionFuelChamber + (Vector2i) rotation.RotateVec(new Vector2(0, 1)); // n // n: End Cap - var positionPowerBox = positionFuelChamber + (Vector2i) rotation.RotateVec(new Vector2(0, -1)); // CF // C: Control Box, F: Fuel Chamber - var positionPortEmitter = positionFuelChamber + (Vector2i) rotation.RotateVec(new Vector2(1, -2)); // P // P: Power Box - var positionForeEmitter = positionFuelChamber + (Vector2i) rotation.RotateVec(new Vector2(0, -2)); // EEE // E: Emitter (Starboard, Fore, Port) - var positionStarboardEmitter = positionFuelChamber + (Vector2i) rotation.RotateVec(new Vector2(-1, -2)); // // + var rotation = fuelXform.LocalRotation; + var offsetVect = rotation.GetCardinalDir().ToIntVec(); + var orthoOffsetVect = new Vector2i(-offsetVect.Y, offsetVect.X); + + var positionFuelChamber = _mapSystem.TileIndicesFor(gridUid!.Value, grid, fuelXform.Coordinates); // n // n: End Cap + var positionEndCap = positionFuelChamber - offsetVect; // CF // C: Control Box, F: Fuel Chamber + var positionPowerBox = positionFuelChamber + offsetVect; // P // P: Power Box + var positionPortEmitter = positionFuelChamber + offsetVect * 2 + orthoOffsetVect; // EEE // E: Emitter (Starboard, Fore, Port) + var positionForeEmitter = positionFuelChamber + offsetVect * 2; + var positionStarboardEmitter = positionFuelChamber + offsetVect * 2 - orthoOffsetVect; ScanPart(gridUid!.Value, positionEndCap, rotation, out controller.EndCap, out var _, grid); ScanPart(gridUid!.Value, positionPowerBox, rotation, out controller.PowerBox, out var _, grid); @@ -137,7 +139,7 @@ public sealed partial class ParticleAcceleratorSystem } var compQuery = GetEntityQuery(); - foreach (var entity in grid.GetAnchoredEntities(coordinates)) + foreach (var entity in _mapSystem.GetAnchoredEntities(uid, grid, coordinates)) { if (compQuery.TryGetComponent(entity, out comp) && TryComp(entity, out var partState) && partState.Master == null diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs index c50e054281..ddc7e2a083 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.cs @@ -21,6 +21,7 @@ public sealed partial class ParticleAcceleratorSystem : EntitySystem [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly MapSystem _mapSystem = default!; public override void Initialize() { diff --git a/Resources/Textures/Structures/Power/Generation/PA/control_box.rsi/completed.png b/Resources/Textures/Structures/Power/Generation/PA/control_box.rsi/completed.png index 0636a46df9baaafaea66ad875e65680a6ca24945..932eed803e8b9e07262dc372fbb21200cc607978 100644 GIT binary patch delta 1403 zcmV->1%&#h3yuqrB!32COGiWi000000Qp0^e*gdlLrFwIRCwC$nmumgIuOVI3RJi- z0tDc8%msv0sZy#k_5j)&r1Tx4+##iJusXoPm8(Eist2Ed-3kaGxKPJeM58yNNST&x zY2Vrd7&0Yle#7C%P$Yr>foMSYrT=>21wM7*1M`NI@~qxfN`D1?&&TEmCj9B?>8!Px z=eg4fQ}6>DJkRs9z`1_Y2~+Vyn}+~kKA)cyzT54P=Q;M(@Ywv&mYLvpcXua&e|~;q zKA&T^+j-?5lYirS=~VEcy2j$);KJqVfU5&WmUD%;q5NwL7#n!*nckuNi*Es8-{fIR z8H*p<1_<97+kc@_Rh8EOH6}ka`$t)pxV^naS(fgE)?xJOG;i^o;U7 zK0Y>jxW0Y;b8LRVzr^-sj^h}c%?7jCtnnz_wGBoaDMRpf#YSlv)VU(hqzscxpiV z@VWHaV(KD2#1CyR*wW8RVI}2%&x-;=2)(Swgf~auGi&Ol{y&?|tYPWZ)1DT$wuSO6 zi^6IT&woSw(9B>OMkDS@%Ek%&8Ksv>HTNm6%`x}veN(;((G-jq#?(n^0GJtel8rM< z?58}|d4QBsS5?)i6`p<*qE%3C5Es||Hz69sq9|%b4C1?5lBv^`eiH(4Ot`A5YMem) zRxFO9s1on&j*-hj&&j$dw zo(}+U{{4A6@MMO@i#Q)ZbAkW}Y$w0|`tt#=J&Pb?%A{Lkv;;P#4dGPa7uNSRpjVgD z0%(+vJA3b2<3du3gpA@Y>%6T;056|!1{0V1%E@H zcNtE3cns#Nxh#B{(h;$zFn&j&ml_+H)r&T>A$$Cf_6 zwN)iaqQPcqX}zz{({xSyXLF6N@3jsorKb1H_rHJr@9=Hs6Sxf=Xrx=Zm>vy4hmJ1Q zNz=BJsXVnnQ->#h0g!D&o4m9>@PDhvp1Rv;gQ5AA>C}B?ll35OIzZC{o{^8%DSPHB zXzKVc9otyx*LccnwEMmh!cqrwC1uOWuCjFI0a8k>lVC?Bn<89eO?>%QC<70pvM;&2**2bCxwV zml`!G8EB|*eoh>APJp;60Qt4l-Llh%AKIWKv_DTx#=NdrJbzy-I{A6p6q-@eqUgOR z|Gn1Bxzb^0AHSYd9e+OHh>w!a#>f=>peOvDQv#3hJ2w9^Z delta 1428 zcmV;F1#9|_3#JQ@B!2;OQb$4nuFf3k000GGNkljxMT z|K<&czaq!L9iJP486l-q*CfpIyv6C0zY&m9s`-3=O@3rq=6^JT4}Sf^$+IlG3OSc= z8o?L;gPDoQCzHuV$@lv`vMj@?79N|wWdKh8`1p7c^4)HS$z+24e&2{!fC7NP7>Z-@ z1HgZ-LYE?U$x?s{fFJ+@GQ^nt1g8P6jaSF}*zjfm;LrK&?FK zF?tW6S>D$WFn^cWPd@}kHvp}}Gz0=5c=5nb`1GrQa}wO`c2_5-?r$@|82o@?0Gc3d zJElt@&vX6$f@8&B0IWvlCo~K&pU+X2C8pCU%Cf|Iy@r%hkDD}25yx?3PfhuGTAt^K zqDaf3Cs)8W1jghi1iP0>CqqyQ(YM zhd)hINGWxTQXDNM0nm$|z6JxTJYOI4Jl7;H{LXVc8F^ggNKwu~2B6CK#wr zC4l0ElYcrb0aVhxo71ws)iR`%iprVgza8FN{8Wzfa~(LL5pKw0aufh%+XtAHQNUrW zKIeH$cw!+4Ye1s+}FP#tk?9iv4H>lEPx{gom^=QP=1Zx^VnKLh+R8~?VVQH?4 zCXRR4#FiW;Z-v^R*7C;WXL3_`C1u0NuDZ0qyMG0m-NyP$I?~K^E{hKVmamh42$$_= zaxKp{w}#LUHb5M9*C4> ziS2f)*H`|`q{MTYVpWHE7tHepDQuu z$&Br4%s2lXPMGI*zR&SS2e0tIR{6VsfJuJ$55V0&0KnZp0Kho+^S=4L`3GF1%sH~W z-VNRY?gsF!fNyy75AcPX@(;KLc=HeNg@2pz54aV0^$+O6Kkpx4!_E5#Y&IJ#77OeB zJWm^PKku9Wq<=tFRXX!xvA|}tK^TSrfU2r=9HA(RLHF~%`3L(4aD@OM3`5N4^M>Pu ziLU$kq5Qw=R{SDFgC98FBMjj`+dqKgN1Eb$eKX^daw-3S@AdN!<0MR{Q>UDZ`+o;; zy!McBY5#yeoF@M%uNUpPDTGjQ94jG&^M0PA%Rj)BMRJ4?4f$PVZ2TvD60EYQew@Fx z4={c9OeHD2ED8X?n-D-zH1aKr;t<~w@yY;42MNNe?oJ^S$Q7k{UVll-*MP0%$L6p741)(AIhF!0 irLG~D{144{!v6+=JU8~4=?zK%0000Ox=v!-YHk!Wv~nQ!-^+ zQWARrL#9a18xG0gh%>-nKn5^P<$s>|fUiCHz{PpXo__~T^?l<9Hu&@NbEmVJ zWm&BfhQJS8;8~V+0?zr{N*D@1bZH0x#^do-!FRhIvMj@?8SWcDbTuaM$H&L3fPa2| zVmuyWx7&HO?-T!_uG6)^&*jw@{sV5D?h3dopl9mph&vbmz5@CN?Ap_7i+}SgAZ&6T zhNQmmLzjW@^?%sT_!9FnP<`Tu_Wsyzx0p;O*lxF2tyYjymiuPCUSl?!ReWk{&+GC$ zM;yl`A9|irz!3NW{}OY7@Avz%@oYB3dcDSIGy(wZ_xti4k=EJ?zFMu2BuP2T{A+MX z{D8pu`IzT9q?FEC`dMi4KOq1BqtU1`8=K9>x%4m6ImgklZSa_~?_S&*v)2v?V9s0;p?Ek>)%1sDi zk|Z%g2*dX&@0@yGPI6ubFa|JEN+X1*@CObTo(3>J_?((#v3U_6!Vg^?T;-QM$5P7Q z^;$y+VSnaY0|4F%n{aBT7Hsd@`4;x45umB8z$ zJZDD?wRI`xsb(9HVWolb!Pq>h3;-ibPLgrtFq+iH=?6$D&3?Z>niXDt6QVNEmzs0E z?){q(rC?DM;p5{2Hh$eovU%2(--G}hD~rZLN`D~y%2^ym5hjy~m*JTzg&)=_;8UMv z83<>+UPEggoWegBtIptZ{IIDpo$I7I{+t$`nf;zG*{Ea46sf+xrGE%YR#00c7Qe+5&%6e!!ow1qRCxpe+yp!D0aX z`zdhB2=)=5r{(`T5dM(@`i##n*uWP6miPLnG zPDzqf!q60UR>eDN?-QT5qddO&N~to)%JB^wP^b9;L_hQVD9lyY&lR8Nx4Lcc?SEO6 zQkJr`!9P1cpj@^}wd&Jlet?fGSI-ZaqJ4e(kedyfJu_XfO%Q8!9z-EsGr^c%i;eKzAHb0%fJDxa)lS;V*r@YeLNqRDJ*3(PaU9XjV8VW zkX1p;wsb%6y+NMBZWs&0@F(MGnt#Sd2G&-9u`Mq*DoZJmvbwr~rZxZT3|o3I-i8$F z>~9&rv<7o2Wktz#V>u$eEUabY{G|g9Jacpo{b-xvGjr@RV z;Sv?=$DMd>*IECND_uTvdrIcTO0G+S=nMsKkrLZi@dGNkl(B2@W z?-1n;|By1|K<&cq)2lnzzts; zftewtRF@ zzx)yy-2k)?(|-~OfZ){wKjF*o0?v=%X0y3CIZc0?0mk453X$ zJrBV=fS3mO8w}CKnyr+;OAZ)8X*6}26S-RTM>MuQbysdw-frnDxx^q9~k3SQv&k+PA_{6t%XUKDfTTPt8{4`YPvn4&uqOjFb-!@%PC+W=AsldoM()s=|7`)|TVX zTuQuTnI5^cX+vqrh)xCP&xxlo1m{fw$lXFo<<#LI#EcI@1j`)N_y>7|lzJEUYL-@_-=WN!|V_ue8 z&!PM$#|Q90$74ZzGS55JC3cD)bzS36S