From 4484b127c59d7b03c3b49829691b6a28a68f7dcb Mon Sep 17 00:00:00 2001 From: Perry Date: Thu, 26 Feb 2026 16:24:55 +0100 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1n=20indik=C3=A1tor=20pr=C3=A1v?= =?UTF-8?q?=C4=9B=20aktivn=C3=AD=20kamery=20pro=20oba=20hr=C3=A1=C4=8De.?= =?UTF-8?q?=20Indik=C3=A1tor=20protivn=C3=ADka=20se=20m=C4=9Bn=C3=AD=20pod?= =?UTF-8?q?le=20toho,=20jestli=20m=C3=A1=20zapnut=C3=BD=20monitor.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FNAF_Clone/CommandManager.cs | 1 + .../Content/images/SpriteSheet_monitor.png | Bin 4683 -> 5404 bytes .../Content/images/monitor-definition.xml | 10 +++++++- FNAF_Clone/EventProcessor.cs | 15 +++++++++--- FNAF_Clone/GUI/UIElement.cs | 14 ++++++++++- FNAF_Clone/GUI/UIManager.cs | 23 ++++++++++++++++-- FNAF_Server/GameLogic.cs | 2 ++ FNAF_Server/Server.cs | 4 +-- 8 files changed, 60 insertions(+), 9 deletions(-) diff --git a/FNAF_Clone/CommandManager.cs b/FNAF_Clone/CommandManager.cs index 11ccf8f..5f2999f 100644 --- a/FNAF_Clone/CommandManager.cs +++ b/FNAF_Clone/CommandManager.cs @@ -60,6 +60,7 @@ public class CommandManager { public static void SendChangeCamera(int id) { Client.Player.state.camera = id; + UIManager.ChangeCamera(id); Client.SendCommands([PlayerCommand.SWITCH_CAM(id)]); MapTileProjection tile = ClientMapManager.Get(id); // add UIManager switch camera diff --git a/FNAF_Clone/Content/images/SpriteSheet_monitor.png b/FNAF_Clone/Content/images/SpriteSheet_monitor.png index bc67efebf14745a4c495a57671e272539178058e..6b32e4e8fcbe5c5da057da9959b5c020f8bc011e 100644 GIT binary patch literal 5404 zcmeHLX;hO}8omhuf(t~kil7C{2&k>ZEx2GvRkV)8rHTw|P?SYPM8U`s5`h5)5vQ~j z2%9<$797FTx ziMYa)(*&`RB5A1EpT7A{=2VjF zW~%1qTfqhVFE690eCBB7eX2|-AeL6Z?GdM&)XKm>cAgD+j{*U___xr*wHX*HAjISM zcnZk`81!S`s3e7yYz07UNCV&m$_x;U5NLqe3y>gYktVc0n4-&*Byp4hd@=&`e9MVc zhVaQJzKBi(@pd3PDVApytyg(lS%(D9vCr2=ccI*5S!!7la})_MBT}m3D4*QxptA{) zzFGxnc%w7P3pN4-*t+ANr}>?k{|J4^!5>Kcfy8g?@()h@-*Q4Dx!k^Aq!R%=A2>k0 ztVR<64IABwQt(-v5!reGu1D$pt6Kj)EB+gwIo!qTtvdBmk^wv;m>ylPhh%s#q0ANS z0Dw?BpwlxlLbp@{vCC9Np2{UddQZAhSn!T--fFuzn$99I?(Qf%b@ z{VnTD^E;)5m{acbh@D8~g|)y(P}xs+K~>Lmq<;IfLOm2Q$eVePpGw zEZ>=-%n`{8*W@72PZ9AZQQa@j<3lV~hvcluV{Dv=>?ZZ4bo7fB#hyI!K5;cl_^Gz7 zeD6}~gKZ(IU5>(<$0IFE?KhBf4eZ+#qP8QI3p&pBluO!^aw5f@wFfNKl!@slZT#uL z^@^}_zACYhlNIisa|MyT2zm3i%sV{XWg#cmXPNburL=@<){yP0!Od6zteX=!Fqo01 z_@vf4xyk~k%}?ZnP#+KNnlV)|bZQ(k-iF(?uXg>uXV`o9#kM8m&%Fn;l3I$mf9SRrY-S(j_Bh#H-*k5 zXv)W)*746SIBtGl@AM1D-4A3U;VOXeZFaWU=u_a^_go_D-^27vu(;uFr(*J1{u%(aCFVFCq^P@!vzFO!P}unp0U|ptm!G;))OL>&d>Nbi zeJ@#2WdhNy^RY`;JiTdt7!LgO$=GD0f3MS84k@^~SYCHwk^)^k3@&x^16b8qH4%>sD z#1TuJn^73xd8H=0p~xz}Z$@Hbf27DR;|soEG9*sh3=r&>d)Q=ptcky4rBaN``w`oT zah@ScqNdf_q;Fu+zOk%PgycxZ`I+uz$ClU^?mOM$ss)z_i7lsCkygPm*d@3I0zx;a$?`V8*x$5E3s)*^fdjA0KjwZj;>_~+> zi&WnxZgQPqoOf(l?{VfW;pS*G1k_L9lau|^&=$3p2 z*IKJ6C&KhrS=PI6T0W^e373{^=c-m%tIv-sA9J<0mZ})6{ljJ$K-)H8??ktZ>JFZ4 zeyC?etLu2})IK;e3ek;DISf-9R*$mkx;YzW2r86{w;~fr)i}%*%?R(_=)3g4t7zRk$p%50bnb z>0x^5D(-yb!k`^Y91S~#KxGHHi{*|Z?Z?SV;;5F7Qo<7yv6C$S_91;P?YuqSZ9n-P z6|vYWMK-0XwKs4cnnL?!RbGZzkXX10A21%~3Zt|-rJSQGrabihj{oWc#Emz7nBnK) zC4u{M5$;YSPNcacX?F7ll5THK7>3ZLtNj;Fm&BO}kc6a&nOflio6{BYZu!ahi!hz7 zn-V??bX>8^T_YoV2irEoW6Dl1B*twY{uW#|ajr z1~a3K9pT~an%kb_N_{0NOq&DK_ccc;G#wV!?F}X7?*qtIW7B7woBi*9ia-yRZ)N&Uq(mw5FjDD>0+0y^{VY0vCNX;6ba zb^VOn71bsL+_;x10T}Z;DoFkKfDkB6`13qcppuv;zr1)>{WrjrYzZKqT1rgEJyPX% z6+{+_Sbe^4I(}_CKIZ>7l$ZcW?Dmd{=916$lqyuxEP%>(s!;Sz{9rjok(Ntqf4Ul~ z>Vp0>m|<@^p4UeUdatlK1UJ3|KUf&5qFcfzD-E;HW~v7unql?26x>|7cp<-So)FkV zU`D62TLxwVGc`k}517+oc`;G&WC;(b*zM%0DTd}ws9-ops^xI#ImBko>~{{BFh|*2 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 diff --git a/FNAF_Clone/Content/images/monitor-definition.xml b/FNAF_Clone/Content/images/monitor-definition.xml index 4985f07..c80bec1 100644 --- a/FNAF_Clone/Content/images/monitor-definition.xml +++ b/FNAF_Clone/Content/images/monitor-definition.xml @@ -1,5 +1,5 @@ - + images/SpriteSheet_monitor @@ -25,6 +25,14 @@ + + + + + + + + diff --git a/FNAF_Clone/EventProcessor.cs b/FNAF_Clone/EventProcessor.cs index ca216b4..6b3b0bb 100644 --- a/FNAF_Clone/EventProcessor.cs +++ b/FNAF_Clone/EventProcessor.cs @@ -19,16 +19,25 @@ public class EventProcessor { break; case 2: // switch cam - if (Client.Player.state.pid != e.Args[0]) return; + if (Client.Player.state.pid != e.Args[0]){ + UIManager.ChangeCameraOpponent(e.Args[1]); + break; + } if (Client.Player.state.camera != e.Args[1]) Console.WriteLine("!!! DESYNC: CAMERA STATE"); Console.WriteLine($"E: player {e.Args[0]} switched to camera {e.Args[1]}"); break; case 3: // toggle cam - if (e.Args[0] == Client.Player.state.pid && Client.Player.state.monitorUp != (e.Args[1] == 1)) Console.WriteLine("!!! DESYNC: MONITOR STATE"); + Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}"); + + if (e.Args[0] != Client.Player.state.pid){ + UIManager.ChangeMonitorStateOpponent(e.Args[1] == 1); + break; + } + + if (Client.Player.state.monitorUp != (e.Args[1] == 1)) Console.WriteLine("!!! DESYNC: MONITOR STATE"); // UIManager.ChangeMonitorState(e.Args[1] == 1); - Console.WriteLine($"E: Player {e.Args[0]} toggled monitor {(e.Args[1] == 0 ? "off" : "on")}"); break; case 4: // toggle door diff --git a/FNAF_Clone/GUI/UIElement.cs b/FNAF_Clone/GUI/UIElement.cs index d4d9d63..7166e29 100644 --- a/FNAF_Clone/GUI/UIElement.cs +++ b/FNAF_Clone/GUI/UIElement.cs @@ -14,7 +14,11 @@ public class UIElement { public bool Pressable { get; set; } = false; public bool Visible { get; set; } = true; - public (Point, Point) Bounds{ get; private set; } // TODO: Change this to support non-rectangular hitboxes + public (Point, Point) Bounds{ + get; + private set { field = value; UpdateBounds(); } + } // TODO: Change this to support non-rectangular hitboxes + private (Point, Point) screenSpaceBounds; private List textures = new(); private int currentTextureId = 0; @@ -32,6 +36,10 @@ public class UIElement { private int pixelScaleMultiplier = 1; private void LoadPixelScaleMultiplier() { pixelScaleMultiplier = (int)(UIManager.GlobalPixelMultiplier * _scaleMultiplier); // TODO: move GlobalPixelMultiplier somewhere where it would make sense + UpdateBounds(); + } + + private void UpdateBounds() { screenSpaceBounds = (Bounds.Item1.MultiplyByScalar(pixelScaleMultiplier), Bounds.Item2.MultiplyByScalar(pixelScaleMultiplier)); } @@ -85,4 +93,8 @@ public class UIElement { textures[currentTextureId].Draw(spriteBatch, screenSpaceBounds.Item1.ToVector2(), Color.White, 0, Vector2.Zero, pixelScaleMultiplier, SpriteEffects.None, 0); // texture.Draw(spriteBatch, bounds.Item1.ToVector2(), Color.White); } + + public void SetPosition(Point position) { + Bounds = (position, position + new Point(textures[0].Width, textures[0].Height)); + } } \ No newline at end of file diff --git a/FNAF_Clone/GUI/UIManager.cs b/FNAF_Clone/GUI/UIManager.cs index aae5c2b..4afd137 100644 --- a/FNAF_Clone/GUI/UIManager.cs +++ b/FNAF_Clone/GUI/UIManager.cs @@ -63,6 +63,10 @@ public class UIManager { // } } } + + monitorScreen.AddElement("eye-player", new UIElement(monitorAtlas[24], monitorScreen["room"+Client.Player.state.camera].Bounds.Item1)); + monitorScreen.AddElement("eye-opponent", new UIElement([monitorAtlas[23], monitorAtlas[22]], monitorScreen["room"+Client.Opponent.state.camera].Bounds.Item1)); + } public static void SpawnDoors(TileConnectorProjection[] doors) { @@ -126,10 +130,25 @@ public class UIManager { public static void ChangeRemoteDoorState((int, int) id, bool state) { monitorScreen["door"+Math.Max(id.Item1, id.Item2)+"-"+Math.Min(id.Item1, id.Item2)].SetTexture(state ? 1 : 0); } - + public static void ChangeMonitorState(bool state) { Screen.SetScreen(state ? ScreenTypes.CAMERAS : ScreenTypes.OFFICE); } + + public static void ChangeMonitorStateOpponent(bool state) { + monitorScreen["eye-opponent"].SetTexture(state ? 1 : 0); + } + + public static void ChangeCamera(int id) { + monitorScreen["eye-player"].SetPosition(monitorScreen["room"+id].Bounds.Item1); + } + public static void ChangeCameraOpponent(int id) { + monitorScreen["eye-opponent"].SetPosition(monitorScreen["room"+id].Bounds.Item1); + + } - + // private static Point GetRoomUIPos((int x, int y) pos) { + // return new Point(336 + (32 * pos.x), 144 + (32 * pos.y)); + // } + } \ No newline at end of file diff --git a/FNAF_Server/GameLogic.cs b/FNAF_Server/GameLogic.cs index 56e62e2..550303f 100644 --- a/FNAF_Server/GameLogic.cs +++ b/FNAF_Server/GameLogic.cs @@ -6,6 +6,8 @@ namespace FNAF_Server; public class GameLogic { + public const int START_CAMERA = 12; + public static void Init() { // Create map MapManager.InitMap(); diff --git a/FNAF_Server/Server.cs b/FNAF_Server/Server.cs index ccfb27e..c9e991d 100644 --- a/FNAF_Server/Server.cs +++ b/FNAF_Server/Server.cs @@ -25,7 +25,7 @@ public class Server { private static NetPacketProcessor processor; private static bool isRunning; - + public static void Start(int port) { writer = new NetDataWriter(); processor = new NetPacketProcessor(); @@ -102,7 +102,7 @@ public class Server { peer = peer, state = new PlayerState { pid = peer.Id, - camera = 0, + camera = GameLogic.START_CAMERA, doorStates = [false, false, false] }, username = packet.username