Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local sizeFactor = 10
- local me = getLocalPlayer()
- local cars = {} -- { player = { {bone1,bone2} = car, ... }, player = ... }
- local prevX, prevY, prevZ
- local deg = math.deg
- local rad = math.rad
- local pi = math.pi
- local cos = math.cos
- local sin = math.sin
- local atan2 = math.atan2
- local sqrt = math.sqrt
- local screenWidth, screenHeight = guiGetScreenSize()
- local phi, theta = 0, 0
- local connections = {
- -- spine
- --{ 1, 2 },
- { 2, 3, forward=true },
- --{ 3, 4 },
- { 4, 5 },
- -- right arm
- { 22, 23 },
- { 23, 24 },
- -- left arm
- { 32, 33 },
- { 33, 34 },
- -- right leg
- { 51, 52, forward=true },
- { 52, 53, forward=true },
- -- left leg
- { 41, 42, forward=true },
- { 42, 43, forward=true }
- }
- function joinHandler(player)
- player = player or source
- cars[player] = {}
- local color = math.random(0, 126)
- for _,connection in ipairs(connections) do
- local vehicle = createVehicle(415, 0, 0, 3)
- setVehicleColor(vehicle, color, color, color, color)
- setVehicleFrozen(vehicle, true)
- setElementCollisionsEnabled(vehicle, false)
- cars[player][connection] = vehicle
- end
- setElementAlpha(player, 0)
- addEventHandler('onClientRender', getRootElement(), onRender)
- addEventHandler('onClientCursorMove', getRootElement(), onMouseMove)
- end
- addEventHandler('onClientResourceStart', getResourceRootElement(getThisResource()),
- function()
- setTimer(init, 1000, 1)
- end
- )
- function init()
- for _,player in ipairs(getElementsByType('player')) do
- joinHandler(player)
- end
- setGameSpeed(0.5)
- phi = rad(getPlayerRotation(me) + 90 + 180)
- end
- addEventHandler('onClientPlayerJoin', getRootElement(), joinHandler)
- addEventHandler('onClientPlayerQuit', getRootElement(),
- function()
- if not cars[source] then
- return
- end
- for _,car in pairs(cars[source]) do
- destroyElement(car)
- end
- cars[source] = nil
- end
- )
- addEventHandler('onClientResourceStop', getResourceRootElement(getThisResource()),
- function()
- for i,player in ipairs(getElementsByType('player')) do
- setElementAlpha(player, 255)
- end
- setCameraTarget(me)
- toggleAllControls(true)
- setGameSpeed(1)
- end
- )
- local function scale(factor, baseX, baseY, baseZ, x, y, z)
- return baseX + factor*(x-baseX), baseY + factor*(y-baseY), baseZ + factor*(z-baseZ)
- end
- local function angleDiff(angle1, angle2)
- angle1, angle2 = angle1 % 360, angle2 % 360
- local smallest = math.min(angle1, angle2)
- local largest = math.max(angle1, angle2)
- return math.min(largest - smallest, smallest - (largest - 360))
- end
- function onRender()
- for player,connections in pairs(cars) do
- -- place cars
- local baseX, baseY, baseZ = getElementPosition(player)
- local playerRZ = getPlayerRotation(player)
- baseZ = baseZ - getElementDistanceFromCentreOfMassToBaseOfModel(player)
- for connection,car in pairs(connections) do
- local x1, y1, z1 = scale(sizeFactor, baseX, baseY, baseZ, getPedBonePosition(player, connection[1]))
- z1 = z1 - 1.3
- local x2, y2, z2 = scale(sizeFactor, baseX, baseY, baseZ, getPedBonePosition(player, connection[2]))
- z2 = z2 - 1.3
- setElementPosition(car, x1 + (x2 - x1)/2, y1 + (y2 - y1)/2, z1 + (z2 - z1)/2)
- local partRX = deg(atan2(z2 - z1, sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))))
- local partRZ = deg(atan2(-(x2-x1), y2-y1))
- if connection.forward then
- if angleDiff(partRZ, playerRZ) >= 90 then
- partRX = partRX - 2*(partRX-270)
- partRZ = partRZ + 180
- end
- if math.abs((partRX % 360) - 90) < 10 or math.abs((partRX % 360) - 270) < 10 then
- partRZ = playerRZ
- end
- end
- setElementRotation(car, partRX, 0, partRZ)
- end
- end
- local x, y, z = getElementPosition(me)
- -- move local player faster
- if getPedTask(me, 'primary', 0) ~= 'TASK_SIMPLE_FALL' and prevX then
- x, y = scale(sizeFactor, prevX, prevY, prevZ, x, y, z)
- if isPlayerOnGround(me) then
- local hit, tempX, tempY, tempZ
- hit, tempX, tempY, tempZ = processLineOfSight(x, y, z + 3, x, y, z - 20, true, true, false)
- if hit then
- z = tempZ + getElementDistanceFromCentreOfMassToBaseOfModel(me)
- end
- end
- setElementPosition(me, x, y, z)
- end
- prevX, prevY, prevZ = x, y, z
- -- place camera
- local camX = x + 4*sizeFactor*cos(phi)*cos(theta)
- local camY = y + 4*sizeFactor*sin(phi)*cos(theta)
- local camZ = z + 0.6*sizeFactor + 2*sizeFactor*sin(theta)
- local camLookZ = z + 0.5*sizeFactor
- local hit, hitX, hitY, hitZ = processLineOfSight(x, y, camLookZ, camX, camY, camZ, true, false, false)
- if hit then
- camX, camY, camZ = scale(0.9, x, y, camLookZ, hitX, hitY, hitZ)
- end
- setCameraMatrix(camX, camY, camZ, x, y, camLookZ)
- end
- function onMouseMove(relX, relY, absX, absY)
- if isMTAWindowActive() then
- return
- end
- absX = absX - screenWidth/2
- absY = absY - screenHeight/2
- phi = (phi - 0.005*absX) % (2*pi)
- theta = theta + 0.005*absY
- if theta > 0.4*pi then
- theta = 0.4*pi
- elseif theta < -0.4*pi then
- theta = -0.4*pi
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement