Skip to content

Commit 59a671d

Browse files
committed
Add InterpolateCameraPos and InterpolateCameraLookAt
1 parent f4a959e commit 59a671d

File tree

2 files changed

+71
-3
lines changed

2 files changed

+71
-3
lines changed

amx/client/client.lua

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,62 @@ function showIntroScene()
261261
introSceneShown = true
262262
end
263263

264+
-----------------------------
265+
-- Camera Interpolation
266+
--Originally from https://wiki.multitheftauto.com/wiki/SmoothMoveCamera
267+
268+
local sm = {}
269+
sm.moov = 0
270+
sm.objCamPos,sm.objLookAt = nil,nil
271+
272+
function removeCamHandler()
273+
outputConsole('removeCamHandler was called')
274+
if(sm.moov == 1) then
275+
outputConsole('Destroying cam handler...')
276+
sm.moov = 0
277+
end
278+
end
279+
280+
function camRender()
281+
if (sm.moov == 1) then
282+
local x1,y1,z1,x2,y2,z2 = 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
283+
if sm.objCamPos ~= nil then
284+
x1,y1,z1 = getElementPosition(sm.objCamPos)
285+
end
286+
if sm.objLookAt ~= nil then
287+
x2,y2,z2 = getElementPosition(sm.objLookAt)
288+
end
289+
--outputConsole(string.format("Current Camera Matrix is: CamPos: %f %f %f CamLookAt: %f %f %f", x1,y1,z1,x2,y2,z2))
290+
setCameraMatrix(x1,y1,z1,x2,y2,z2)
291+
else
292+
removeEventHandler("onClientPreRender", root, camRender)
293+
end
294+
end
295+
296+
function setupCameraObject(camObj, FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
297+
sm.moov = 1
298+
camObj = createObject(1337, FromX, FromY, FromZ)
299+
setElementCollisionsEnabled (camObj, false)
300+
setElementAlpha(camObj, 0)
301+
setObjectScale(camObj, 0.01)
302+
moveObject(camObj, time, ToX, ToY, ToZ, ToX, ToY, ToZ, "InOutQuad")
303+
setTimer(removeCamHandler,time,1)
304+
setTimer(destroyElement,time,1,camObj)
305+
return camObj
306+
end
307+
308+
function InterpolateCameraPos(FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
309+
outputConsole(string.format("InterpolateCameraPos called with args %f %f %f %f %f %f %d %d", FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut))
310+
sm.objCamPos = setupCameraObject(sm.objCamPos, FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
311+
addEventHandler("onClientPreRender", root, camRender)
312+
return true
313+
end
314+
function InterpolateCameraLookAt(FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
315+
outputConsole(string.format("InterpolateCameraLookAt called with args %f %f %f %f %f %f %d %d", FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut))
316+
sm.objLookAt = setupCameraObject(sm.objLookAt, FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
317+
addEventHandler("onClientPreRender", root, camRender)
318+
return true
319+
end
264320
-----------------------------
265321
-- Player objects
266322
function RemoveBuildingForPlayer(model, x, y, z, radius)

amx/server/syscalls.lua

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,14 @@ function RemoveBuildingForPlayer(amx, player, model, x, y, z, radius)
845845
clientCall(player, 'RemoveBuildingForPlayer', model, x, y, z, radius)
846846
end
847847

848+
--playerid, Float:FromX, Float:FromY, Float:FromZ, Float:ToX, Float:ToY, Float:ToZ, time, cut = CAMERA_CUT
849+
function InterpolateCameraPos(amx, player, FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
850+
clientCall(player, 'InterpolateCameraPos', FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
851+
end
852+
function InterpolateCameraLookAt(amx, player, FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
853+
clientCall(player, 'InterpolateCameraLookAt', FromX, FromY, FromZ, ToX, ToY, ToZ, time, cut)
854+
end
855+
848856
function EnableVehicleFriendlyFire(amx)
849857
return 1;
850858
end
@@ -1145,6 +1153,8 @@ function SendRconCommand(amx, command)
11451153
end
11461154

11471155
function SetCameraBehindPlayer(amx, player)
1156+
--In samp calling SetCameraBehindPlayer also unsets camera interpolation
1157+
clientCall(player, 'removeCamHandler')
11481158
setCameraTarget(player, player)
11491159
end
11501160

@@ -1664,6 +1674,8 @@ function TogglePlayerSpectating(amx, player, enable)
16641674
if isPedDead(player) then
16651675
spawnPlayerBySelectedClass(player)
16661676
end
1677+
--In samp calling TogglePlayerSpectating also unsets camera interpolation
1678+
clientCall(player, 'removeCamHandler')
16671679
setCameraTarget(player, player)
16681680
setPlayerHudComponentVisible(player, 'radar', true)
16691681
setPlayerState(player, PLAYER_STATE_ONFOOT)
@@ -3237,7 +3249,9 @@ g_SAMPSyscallPrototypes = {
32373249
memcpy = {'r', 'r', 'i', 'i', 'i'},
32383250
RemoveBuildingForPlayer = {'p', 'i', 'f', 'f', 'f', 'f'},
32393251
ManualVehicleEngineAndLights = {},
3240-
3252+
InterpolateCameraPos = {'p', 'f', 'f', 'f', 'f', 'f', 'f', 'i', 'i'},
3253+
InterpolateCameraLookAt = {'p', 'f', 'f', 'f', 'f', 'f', 'f', 'i', 'i'},
3254+
32413255
-- more dummies (unimplemented)
32423256
EnableVehicleFriendlyFire = {},
32433257
DisableRemoteVehicleCollisions = {'p', 'i'},
@@ -3266,8 +3280,6 @@ g_SAMPSyscallPrototypes = {
32663280
GetActorPos = {'i', 'r', 'r', 'r'}, --r since the vals should be passed by ref
32673281
GetPVarsUpperIndex = {'p'},
32683282
GetPVarNameAtIndex = {'p', 'i', 'r', 'i'},
3269-
InterpolateCameraPos = {'p', 'f', 'f', 'f', 'f', 'f', 'f', 'i', 'i'},
3270-
InterpolateCameraLookAt = {'p', 'f', 'f', 'f', 'f', 'f', 'f', 'i', 'i'},
32713283
RemovePlayerAttachedObject = {'p', 'i'},
32723284
SetVehicleParamsCarWindows = {'v', 'i', 'i', 'i', 'i'},
32733285
GetPlayerVersion = {'p', 's', 'i'},

0 commit comments

Comments
 (0)