W/S=camera pitch; wheel zoom; canvas click coords; CamSync pitch

This commit is contained in:
RallyBlock committed 2026-11-10 01:53:34 -05:00
1 parent e1e0d95e45
commit b5a847d418
1 file changed
+76 -13
+76 -13
View File
@@ -9,6 +9,12 @@ $RPGClient::Active = 0;
$RPGClient::Yaw = 0; $RPGClient::Yaw = 0;
$RPGClient::Dist = 14; $RPGClient::Dist = 14;
$RPGClient::TopDownPitch = 1.22; $RPGClient::TopDownPitch = 1.22;
$RPGClient::Pitch = 1.22;
$RPGClient::PitchMin = 0.55;
$RPGClient::PitchMax = 1.38;
$RPGClient::PitchSpeed = 0.025;
$RPGClient::DistMin = 8;
$RPGClient::DistMax = 30;
$RPGClient::OrbitInit = 0; $RPGClient::OrbitInit = 0;
$RPGClient::HudPlaced = 0; $RPGClient::HudPlaced = 0;
$RPGClient::PlayBooted = 0; $RPGClient::PlayBooted = 0;
@@ -32,8 +38,55 @@ $RPGClient::CamSched = 0;
$RPGClient::LastClickTime = 0; $RPGClient::LastClickTime = 0;
$RPGClient::ChatOpen = 0; $RPGClient::ChatOpen = 0;
function RPGClient_NormScreenPos(%pos)
{
if (!isObject(Canvas))
{
return "0.5 0.5";
}
%ext = Canvas.getExtent();
%w = getWord(%ext, 0);
%h = getWord(%ext, 1);
if (%w < 1)
{
%w = 1;
}
if (%h < 1)
{
%h = 1;
}
%x = getWord(%pos, 0) / %w;
%y = 1 - getWord(%pos, 1) / %h;
return RPGClient_ClampNorm(%x, %y);
}
function RPGClient_ClampNorm(%x, %y)
{
if (%x < 0)
{
%x = 0;
}
if (%x > 1)
{
%x = 1;
}
if (%y < 0)
{
%y = 0;
}
if (%y > 1)
{
%y = 1;
}
return %x SPC %y;
}
function RPGClient_NormPos(%ctrl, %pos) function RPGClient_NormPos(%ctrl, %pos)
{ {
if (isObject(Canvas))
{
return RPGClient_NormScreenPos(%pos);
}
if (!isObject(%ctrl)) if (!isObject(%ctrl))
{ {
return "0.5 0.5"; return "0.5 0.5";
@@ -94,7 +147,7 @@ function RPGClient_SendClick(%button, %pos)
return; return;
} }
$RPGClient::LastClickTime = %now; $RPGClient::LastClickTime = %now;
%norm = RPGClient_NormPos(RPGClient_Mouse, %pos); %norm = RPGClient_NormScreenPos(%pos);
commandToServer('RPG_Click', %button, getWord(%norm, 0), getWord(%norm, 1), RPGClient_Aspect()); commandToServer('RPG_Click', %button, getWord(%norm, 0), getWord(%norm, 1), RPGClient_Aspect());
schedule(1, 0, RPGClient_ApplyCamera, 1); schedule(1, 0, RPGClient_ApplyCamera, 1);
} }
@@ -153,7 +206,7 @@ function RPGClient_ViewTransform(%body, %yaw, %dist, %panX, %panY)
%cx = getWord(%p, 0) + %panX; %cx = getWord(%p, 0) + %panX;
%cy = getWord(%p, 1) + %panY; %cy = getWord(%p, 1) + %panY;
%cz = getWord(%p, 2) + 1.5; %cz = getWord(%p, 2) + 1.5;
%pitch = $RPGClient::TopDownPitch; %pitch = $RPGClient::Pitch > 0 ? $RPGClient::Pitch : $RPGClient::TopDownPitch;
%bx = -mCos(%yaw) * mCos(%pitch) * %dist; %bx = -mCos(%yaw) * mCos(%pitch) * %dist;
%by = -mSin(%yaw) * mCos(%pitch) * %dist; %by = -mSin(%yaw) * mCos(%pitch) * %dist;
%bz = mSin(%pitch) * %dist; %bz = mSin(%pitch) * %dist;
@@ -194,6 +247,7 @@ function RPGClient_CameraTick()
return; return;
} }
%spin = $RPGClient::YawSpeed * 2.5; %spin = $RPGClient::YawSpeed * 2.5;
%tilt = $RPGClient::PitchSpeed * 2.5;
%zoom = $RPGClient::ZoomSpeed * 2.5; %zoom = $RPGClient::ZoomSpeed * 2.5;
%changed = 0; %changed = 0;
if ($mvLeftAction > 0) if ($mvLeftAction > 0)
@@ -208,12 +262,12 @@ function RPGClient_CameraTick()
} }
if ($mvForwardAction > 0) if ($mvForwardAction > 0)
{ {
$RPGClient::Dist = getMax(6, $RPGClient::Dist - %zoom * $mvForwardAction); $RPGClient::Pitch = getMin($RPGClient::PitchMax, $RPGClient::Pitch + %tilt * $mvForwardAction);
%changed = 1; %changed = 1;
} }
if ($mvBackwardAction > 0) if ($mvBackwardAction > 0)
{ {
$RPGClient::Dist = getMin(32, $RPGClient::Dist + %zoom * $mvBackwardAction); $RPGClient::Pitch = getMax($RPGClient::PitchMin, $RPGClient::Pitch - %tilt * $mvBackwardAction);
%changed = 1; %changed = 1;
} }
if ($RPGClient::MvL > 0) if ($RPGClient::MvL > 0)
@@ -228,12 +282,12 @@ function RPGClient_CameraTick()
} }
if ($RPGClient::MvF > 0) if ($RPGClient::MvF > 0)
{ {
$RPGClient::Dist = getMax(6, $RPGClient::Dist - %zoom * $RPGClient::MvF); $RPGClient::Pitch = getMin($RPGClient::PitchMax, $RPGClient::Pitch + %tilt * $RPGClient::MvF);
%changed = 1; %changed = 1;
} }
if ($RPGClient::MvB > 0) if ($RPGClient::MvB > 0)
{ {
$RPGClient::Dist = getMin(32, $RPGClient::Dist + %zoom * $RPGClient::MvB); $RPGClient::Pitch = getMax($RPGClient::PitchMin, $RPGClient::Pitch - %tilt * $RPGClient::MvB);
%changed = 1; %changed = 1;
} }
RPGClient_ApplyCamera(%changed || $RPGClient::MvF || $RPGClient::MvB || $RPGClient::MvL || $RPGClient::MvR); RPGClient_ApplyCamera(%changed || $RPGClient::MvF || $RPGClient::MvB || $RPGClient::MvL || $RPGClient::MvR);
@@ -452,6 +506,11 @@ function RPGClient_EnsureOverlay()
PlayGui.add(RPGClient_Mouse); PlayGui.add(RPGClient_Mouse);
PlayGui.pushToBack(RPGClient_Mouse); PlayGui.pushToBack(RPGClient_Mouse);
} }
if (isObject(RPGClient_Mouse) && isObject(Canvas))
{
%ext = Canvas.getExtent();
RPGClient_Mouse.resize(0, 0, getWord(%ext, 0), getWord(%ext, 1));
}
if ($RPGClient::Active) if ($RPGClient::Active)
{ {
RPGClient_StockMoveMapBinds(); RPGClient_StockMoveMapBinds();
@@ -540,7 +599,7 @@ function RPGClient_ApplyCamera(%forceSync)
return; return;
} }
$RPGClient::LastCamSync = %now; $RPGClient::LastCamSync = %now;
commandToServer('RPG_CamSync', $RPGClient::Yaw, $RPGClient::Dist, 0, 0); commandToServer('RPG_CamSync', $RPGClient::Yaw, $RPGClient::Dist, $RPGClient::PanX, $RPGClient::PanY, $RPGClient::Pitch);
if (RPGClient_NetCam()) if (RPGClient_NetCam())
{ {
return; return;
@@ -567,7 +626,7 @@ function RPGClient_ApplyCamera(%forceSync)
%conn.setControlObject(%cam); %conn.setControlObject(%cam);
$mvFreeLook = 0; $mvFreeLook = 0;
$firstPerson = 0; $firstPerson = 0;
%xfm = RPGClient_ViewTransform(%body, $RPGClient::Yaw, $RPGClient::Dist, 0, 0); %xfm = RPGClient_ViewTransform(%body, $RPGClient::Yaw, $RPGClient::Dist, $RPGClient::PanX, $RPGClient::PanY);
%cam.unmountImage(0); %cam.unmountImage(0);
if (!$RPGClient::OrbitInit) if (!$RPGClient::OrbitInit)
{ {
@@ -637,7 +696,7 @@ function RPGClient_ZoomIn(%val)
} }
if (%val) if (%val)
{ {
$RPGClient::Dist = getMax(6, $RPGClient::Dist - 0.8); $RPGClient::Dist = getMax($RPGClient::DistMin, $RPGClient::Dist - 1.2);
RPGClient_ApplyCamera(1); RPGClient_ApplyCamera(1);
} }
} }
@@ -654,7 +713,7 @@ function RPGClient_ZoomOut(%val)
} }
if (%val) if (%val)
{ {
$RPGClient::Dist = getMin(32, $RPGClient::Dist + 0.8); $RPGClient::Dist = getMin($RPGClient::DistMax, $RPGClient::Dist + 1.2);
RPGClient_ApplyCamera(1); RPGClient_ApplyCamera(1);
} }
} }
@@ -770,13 +829,17 @@ function RPGClient_EnsurePlayGui()
return 1; return 1;
} }
function clientCmdRPG_Camera(%yaw, %dist) function clientCmdRPG_Camera(%yaw, %dist, %pitch)
{ {
$RPGClient::Yaw = %yaw; $RPGClient::Yaw = %yaw;
if (%dist > 0) if (%dist > 0)
{ {
$RPGClient::Dist = %dist; $RPGClient::Dist = %dist;
} }
if (%pitch > 0)
{
$RPGClient::Pitch = %pitch;
}
} }
function clientCmdRPG_TopDown(%on, %yaw, %dist) function clientCmdRPG_TopDown(%on, %yaw, %dist)
@@ -1071,11 +1134,11 @@ package RPGClient_Input
{ {
if (%val > 0) if (%val > 0)
{ {
$RPGClient::Dist = getMax(6, $RPGClient::Dist - 0.35 * %val); $RPGClient::Dist = getMax($RPGClient::DistMin, $RPGClient::Dist - 0.5 * %val);
} }
else else
{ {
$RPGClient::Dist = getMin(32, $RPGClient::Dist - 0.35 * %val); $RPGClient::Dist = getMin($RPGClient::DistMax, $RPGClient::Dist - 0.5 * %val);
} }
RPGClient_ApplyCamera(1); RPGClient_ApplyCamera(1);
return; return;