From 93bf6c9cff16edd4d3449c334bec7af9ca85875d Mon Sep 17 00:00:00 2001 From: RallyBlock Date: Mon, 9 Nov 2026 20:17:45 -0500 Subject: [PATCH] fix WASD pan: no orbit reset; HUD bottom; ESC cursor --- client.cs | 96 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 83 insertions(+), 13 deletions(-) diff --git a/client.cs b/client.cs index ba0bcc4..7f21d8d 100644 --- a/client.cs +++ b/client.cs @@ -10,13 +10,14 @@ $RPGClient::TopDownPitch = 0.95; $RPGClient::PanX = 0; $RPGClient::PanY = 0; $RPGClient::PanMax = 48; -$RPGClient::PanSpeed = 0.42; +$RPGClient::PanSpeed = 0.9; $RPGClient::CamTickSched = 0; $RPGClient::LastCamSync = 0; $RPGClient::MvF = 0; $RPGClient::MvB = 0; $RPGClient::MvL = 0; $RPGClient::MvR = 0; +$RPGClient::CamModeReady = 0; $RPGClient::HelloPending = 0; $RPGClient::HelloLast = ""; $RPGClient::TopDownWatchSched = 0; @@ -205,10 +206,21 @@ function RPGClient_CameraTick() $RPGClient::PanY = $RPGClient::PanY + %rightY * %speed * $RPGClient::MvR; } RPGClient_ClampPan(); + RPGClient_BumpKeyMap(); RPGClient_ApplyCamera(0); $RPGClient::CamTickSched = schedule(32, 0, RPGClient_CameraTick); } +function RPGClient_BumpKeyMap() +{ + if (!$RPGClient::Active || !isObject(RPGClient_KeyMap)) + { + return; + } + RPGClient_KeyMap.pop(); + RPGClient_KeyMap.push(); +} + function RPGClient_StartCameraTick() { cancel($RPGClient::CamTickSched); @@ -303,6 +315,8 @@ function RPGClient_EnableOverlay() RPGClient_KeyMap.bind(keyboard, m, RPGClient_ToggleCursor); RPGClient_KeyMap.bind(keyboard0, m, RPGClient_ToggleCursor); RPGClient_KeyMap.push(); + RPGClient_BumpKeyMap(); + $RPGClient::CamModeReady = 0; $mvFreeLook = 0; $firstPerson = 0; if (isObject(Canvas) && !Canvas.isCursorOn()) @@ -343,6 +357,16 @@ function RPGClient_DisableOverlay() RPGClient_Mouse.delete(); } $RPGClient::Active = 0; + $RPGClient::CamModeReady = 0; +} + +function RPGClient_InitCameraMode(%cam, %body) +{ + %cam.unmountImage(0); + %cam.setMode("Corpse", %body); + %cam.mode = "Corpse"; + %cam.thirdPersonOnly = 1; + $RPGClient::CamModeReady = 1; } function RPGClient_ApplyCamera(%forceSync) @@ -381,13 +405,12 @@ function RPGClient_ApplyCamera(%forceSync) $mvBackwardAction = 0; $mvLeftAction = 0; $mvRightAction = 0; - %cam.unmountImage(0); + if (!$RPGClient::CamModeReady) + { + RPGClient_InitCameraMode(%cam, %body); + } %xfm = RPGClient_ViewTransform(%body, $RPGClient::Yaw, $RPGClient::Dist, $RPGClient::PanX, $RPGClient::PanY); %cam.setTransform(%xfm); - %cam.setMode("Corpse", %body); - %cam.setOrbitMode(%body, %xfm, 0, 32, $RPGClient::Dist); - %cam.mode = "Corpse"; - %cam.thirdPersonOnly = 1; %now = getSimTime(); if (%forceSync || %now - $RPGClient::LastCamSync > 120) { @@ -551,6 +574,8 @@ function clientCmdRPG_TopDown(%on, %yaw, %dist) RPGClient_StartCameraTick(); RPGClient_ScheduleCamera(); RPGClient_EnsureCursor(); + RPGClient_Hud_Ensure(); + RPGClient_Hud_SyncLayout(); } else { @@ -607,15 +632,31 @@ function RPGClient_Hud_Ensure() new GuiTextCtrl(RPGClient_Hud) { horizSizing = "width"; - vertSizing = "top"; - position = "8 8"; - extent = "600 24"; + vertSizing = "bottom"; + position = "8 72"; + extent = "640 22"; profile = "ChatHudMessageProfile"; text = ""; }; PlayGui.add(RPGClient_Hud); } +function RPGClient_Hud_SyncLayout() +{ + if (!isObject(RPGClient_Hud) || !isObject(Canvas)) + { + return; + } + %ext = Canvas.getExtent(); + %w = getWord(%ext, 0); + %h = getWord(%ext, 1); + if (%w > 0) + { + RPGClient_Hud.setExtent(%w - 16, 22); + RPGClient_Hud.setPosition(8, %h - 94); + } +} + function RPGClient_Hud_Update(%hp, %maxHp, %silver, %load, %cap, %skillId, %skillValue, %tHp, %tMax) { if (!$RPGClient::Active) @@ -623,6 +664,8 @@ function RPGClient_Hud_Update(%hp, %maxHp, %silver, %load, %cap, %skillId, %skil return; } RPGClient_Hud_Ensure(); + RPGClient_Hud_SyncLayout(); + PlayGui.bringToFront(RPGClient_Hud); %t = ""; if (%tMax > 0) { @@ -709,7 +752,11 @@ package RPGClient_MoveMap { if ($RPGClient::Active) { - $RPGClient::MvF = %val * $RunMultiplier; + $RPGClient::MvF = %val; + if (%val && $RunMultiplier > 1) + { + $RPGClient::MvF = %val * $RunMultiplier; + } $mvForwardAction = 0; return; } @@ -720,7 +767,11 @@ package RPGClient_MoveMap { if ($RPGClient::Active) { - $RPGClient::MvB = %val * $RunMultiplier; + $RPGClient::MvB = %val; + if (%val && $RunMultiplier > 1) + { + $RPGClient::MvB = %val * $RunMultiplier; + } $mvBackwardAction = 0; return; } @@ -731,7 +782,11 @@ package RPGClient_MoveMap { if ($RPGClient::Active) { - $RPGClient::MvL = %val * $RunMultiplier; + $RPGClient::MvL = %val; + if (%val && $RunMultiplier > 1) + { + $RPGClient::MvL = %val * $RunMultiplier; + } $mvLeftAction = 0; return; } @@ -742,7 +797,11 @@ package RPGClient_MoveMap { if ($RPGClient::Active) { - $RPGClient::MvR = %val * $RunMultiplier; + $RPGClient::MvR = %val; + if (%val && $RunMultiplier > 1) + { + $RPGClient::MvR = %val * $RunMultiplier; + } $mvRightAction = 0; return; } @@ -773,6 +832,16 @@ activatePackage(RPGClient_MoveMap); package RPGClient_Cursor { + function GuiCanvas::checkCursor(%this) + { + Parent::checkCursor(%this); + if ($RPGClient::Active && !%this.isCursorOn()) + { + lockMouse(0); + %this.cursorOn(); + } + } + function escapeMenu::toggle(%this) { if (%this.isAwake()) @@ -781,6 +850,7 @@ package RPGClient_Cursor if ($RPGClient::Active) { schedule(0, 0, RPGClient_EnsureCursor); + schedule(0, 0, RPGClient_BumpKeyMap); } return; }