Advertisement
Guest User

50p

a guest
Jun 16th, 2009
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.90 KB | None | 0 0
  1. local sizeFactor = 10
  2. local me = getLocalPlayer()
  3.  
  4. local cars = {}     -- { player = { {bone1,bone2} = car, ... }, player = ... }
  5. local prevX, prevY, prevZ
  6. local deg = math.deg
  7. local rad = math.rad
  8. local pi = math.pi
  9. local cos = math.cos
  10. local sin = math.sin
  11. local atan2 = math.atan2
  12. local sqrt = math.sqrt
  13.  
  14. local screenWidth, screenHeight = guiGetScreenSize()
  15.  
  16. local phi, theta = 0, 0
  17.  
  18. local connections = {
  19.     -- spine
  20.     --{ 1, 2 },
  21.     { 2, 3, forward=true },
  22.     --{ 3, 4 },
  23.     { 4, 5 },
  24.     -- right arm
  25.     { 22, 23 },
  26.     { 23, 24 },
  27.     -- left arm
  28.     { 32, 33 },
  29.     { 33, 34 },
  30.     -- right leg
  31.     { 51, 52, forward=true },
  32.     { 52, 53, forward=true },
  33.     -- left leg
  34.     { 41, 42, forward=true },
  35.     { 42, 43, forward=true }
  36. }
  37.  
  38. function joinHandler(player)
  39.     player = player or source
  40.    
  41.     cars[player] = {}
  42.     local color = math.random(0, 126)
  43.     for _,connection in ipairs(connections) do
  44.         local vehicle = createVehicle(415, 0, 0, 3)
  45.         setVehicleColor(vehicle, color, color, color, color)
  46.         setVehicleFrozen(vehicle, true)
  47.         setElementCollisionsEnabled(vehicle, false)
  48.         cars[player][connection] = vehicle
  49.     end
  50.     setElementAlpha(player, 0)
  51.     addEventHandler('onClientRender', getRootElement(), onRender)
  52.     addEventHandler('onClientCursorMove', getRootElement(), onMouseMove)
  53. end
  54.  
  55. addEventHandler('onClientResourceStart', getResourceRootElement(getThisResource()),
  56.     function()
  57.         setTimer(init, 1000, 1)
  58.     end
  59. )
  60.  
  61. function init()
  62.     for _,player in ipairs(getElementsByType('player')) do
  63.         joinHandler(player)
  64.     end
  65.     setGameSpeed(0.5)
  66.     phi = rad(getPlayerRotation(me) + 90 + 180)
  67. end
  68.  
  69. addEventHandler('onClientPlayerJoin', getRootElement(), joinHandler)
  70.  
  71. addEventHandler('onClientPlayerQuit', getRootElement(),
  72.     function()
  73.         if not cars[source] then
  74.             return
  75.         end
  76.         for _,car in pairs(cars[source]) do
  77.             destroyElement(car)
  78.         end
  79.         cars[source] = nil
  80.     end
  81. )
  82.  
  83. addEventHandler('onClientResourceStop', getResourceRootElement(getThisResource()),
  84.     function()
  85.         for i,player in ipairs(getElementsByType('player')) do
  86.             setElementAlpha(player, 255)
  87.         end
  88.         setCameraTarget(me)
  89.         toggleAllControls(true)
  90.         setGameSpeed(1)
  91.     end
  92. )
  93.  
  94. local function scale(factor, baseX, baseY, baseZ, x, y, z)
  95.     return baseX + factor*(x-baseX), baseY + factor*(y-baseY), baseZ + factor*(z-baseZ)
  96. end
  97.  
  98. local function angleDiff(angle1, angle2)
  99.     angle1, angle2 = angle1 % 360, angle2 % 360
  100.     local smallest = math.min(angle1, angle2)
  101.     local largest = math.max(angle1, angle2)
  102.     return math.min(largest - smallest, smallest - (largest - 360))
  103. end
  104.  
  105. function onRender()
  106.     for player,connections in pairs(cars) do
  107.         -- place cars
  108.         local baseX, baseY, baseZ = getElementPosition(player)
  109.         local playerRZ = getPlayerRotation(player)
  110.         baseZ = baseZ - getElementDistanceFromCentreOfMassToBaseOfModel(player)
  111.         for connection,car in pairs(connections) do
  112.             local x1, y1, z1 = scale(sizeFactor, baseX, baseY, baseZ, getPedBonePosition(player, connection[1]))
  113.             z1 = z1 - 1.3
  114.             local x2, y2, z2 = scale(sizeFactor, baseX, baseY, baseZ, getPedBonePosition(player, connection[2]))
  115.             z2 = z2 - 1.3
  116.             setElementPosition(car, x1 + (x2 - x1)/2, y1 + (y2 - y1)/2, z1 + (z2 - z1)/2)          
  117.             local partRX = deg(atan2(z2 - z1, sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))))
  118.             local partRZ = deg(atan2(-(x2-x1), y2-y1))
  119.             if connection.forward then
  120.                 if angleDiff(partRZ, playerRZ) >= 90 then
  121.                     partRX = partRX - 2*(partRX-270)
  122.                     partRZ = partRZ + 180
  123.                 end
  124.                 if math.abs((partRX % 360) - 90) < 10 or math.abs((partRX % 360) - 270) < 10 then
  125.                     partRZ = playerRZ
  126.                 end
  127.             end
  128.             setElementRotation(car, partRX, 0, partRZ)
  129.         end
  130.     end
  131.    
  132.     local x, y, z = getElementPosition(me)
  133.     -- move local player faster
  134.     if getPedTask(me, 'primary', 0) ~= 'TASK_SIMPLE_FALL' and prevX then
  135.         x, y = scale(sizeFactor, prevX, prevY, prevZ, x, y, z)
  136.         if isPlayerOnGround(me) then
  137.             local hit, tempX, tempY, tempZ
  138.             hit, tempX, tempY, tempZ = processLineOfSight(x, y, z + 3, x, y, z - 20, true, true, false)
  139.             if hit then
  140.                 z = tempZ + getElementDistanceFromCentreOfMassToBaseOfModel(me)
  141.             end
  142.         end
  143.         setElementPosition(me, x, y, z)
  144.     end
  145.     prevX, prevY, prevZ = x, y, z
  146.    
  147.     -- place camera
  148.     local camX = x + 4*sizeFactor*cos(phi)*cos(theta)
  149.     local camY = y + 4*sizeFactor*sin(phi)*cos(theta)
  150.     local camZ = z + 0.6*sizeFactor + 2*sizeFactor*sin(theta)
  151.     local camLookZ = z + 0.5*sizeFactor
  152.     local hit, hitX, hitY, hitZ = processLineOfSight(x, y, camLookZ, camX, camY, camZ, true, false, false)
  153.     if hit then
  154.         camX, camY, camZ = scale(0.9, x, y, camLookZ, hitX, hitY, hitZ)
  155.     end
  156.     setCameraMatrix(camX, camY, camZ, x, y, camLookZ)
  157. end
  158.  
  159. function onMouseMove(relX, relY, absX, absY)
  160.     if isMTAWindowActive() then
  161.         return
  162.     end
  163.     absX = absX - screenWidth/2
  164.     absY = absY - screenHeight/2
  165.     phi = (phi - 0.005*absX) % (2*pi)
  166.     theta = theta + 0.005*absY
  167.     if theta > 0.4*pi then
  168.         theta = 0.4*pi
  169.     elseif theta < -0.4*pi then
  170.         theta = -0.4*pi
  171.     end
  172. end
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement