Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2013
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.69 KB | None | 0 0
  1. local localplayer = getLocalPlayer()
  2. setElementData(localplayer,"abseiling","")
  3. local vehiclesToWatch = {}
  4. local tick
  5.  
  6. function abseilBind()
  7.     local data = getElementData(localplayer,"abseiling")
  8.     if data == "" then
  9.         local veh = getPedOccupiedVehicle(localplayer)
  10.         if veh then
  11.             if getVehicleType(veh) == "Helicopter" then
  12.                 local vx,vy,vz = getElementPosition(veh)
  13.                 if not processLineOfSight(vx,vy,vz,vx,vy,vz-10,true,true,false,true,false,true,true,false,veh) then
  14.                     triggerServerEvent("doStartPlayerAbseil",localplayer)
  15.                 end
  16.             end
  17.         end
  18.     elseif data == "true" then
  19.         triggerServerEvent("doCancelPlayerAbseil",localplayer)
  20.     end
  21. end
  22. addCommandHandler("abseil",abseilBind)
  23. bindKey("b","down","abseil")
  24.  
  25. function startAbseil(veh,seat,ped)
  26.     setElementCollidableWith(source,veh,false)
  27.     setElementCollidableWith(source,ped,false)
  28.    
  29.     if source == localplayer then
  30.         addEventHandler("onClientPlayerDamage",source,cancelDamage)
  31.         setCameraClip(true,false)
  32.     end
  33.    
  34.     setElementAlpha(ped,0)
  35.    
  36.     ---[[
  37.     if seat == 0  then
  38.         attachElements(source,ped,0.5,0,0.85)
  39.     elseif seat == 1 then
  40.         attachElements(source,ped,-0.5,0,0.85)
  41.     elseif seat == 2 then
  42.         attachElements(source,ped,-0.10,0,0.85)
  43.     elseif seat == 3 then
  44.         attachElements(source,ped,0.10,0,0.85)
  45.     end
  46.     setPedAnimation(source,"SWAT","swt_vent_02",-1,false,false,false)
  47.     --]]
  48.     --[[
  49.     if seat == 0  then
  50.         attachElements(source,ped,0.15,0,0.85)
  51.     elseif seat == 1 then
  52.         attachElements(source,ped,-0.15,0,0.85)
  53.     elseif seat == 2 then
  54.         attachElements(source,ped,-0.10,0,0.85)
  55.     elseif seat == 4 then
  56.         attachElements(source,ped,0.10,0,0.85)
  57.     end
  58.     setPedAnimation(source,"SWAT","swt_vent_01",-1,false,false,false)
  59.     --]]
  60.     setTimer(abseil,3400,1,source,veh,seat,ped)
  61. end
  62. addEvent("doStartAbseil",true)
  63. addEventHandler("doStartAbseil",getRootElement(),startAbseil)
  64.  
  65. function abseil(player,veh,seat,ped)
  66.     addEventHandler("onClientPlayerWasted",player,deathAnim)
  67.    
  68.     local x,y,z = getPedBonePosition(player,2)
  69.     local rx,ry,rz = getElementRotation(player)
  70.     detachElements(player,ped)
  71.    
  72.     if player == localplayer then
  73.         triggerServerEvent("doSetPos",player,x,y,z)
  74.     end
  75.        
  76.     setElementPosition(player,x,y,z)
  77.     --setElementRotation(player,0,0,getPedRotation(player))
  78.     setPedAnimation(player,"ped","abseil",-1,false,false,true)
  79.    
  80.     setElementCollidableWith(player,veh,true)
  81.     setElementCollidableWith(player,ped,true)
  82.    
  83.     if player == localplayer then
  84.         setElementCollidableWith(player,veh,true)
  85.         setElementCollidableWith(player,ped,true)
  86.         removeEventHandler("onClientPlayerDamage",localplayer,cancelDamage)
  87.     end
  88.    
  89.     if player == localplayer then
  90.         setCameraClip(true,true)
  91.     end
  92. end
  93.  
  94. function render()
  95.     tick = tick or getTickCount()
  96.     local nowtick = getTickCount()
  97.     for i,v in ipairs(getElementsByType("player")) do
  98.         local data = getElementData(v,"abseiling")
  99.         if data ~= "" then
  100.             local ped = getElementData(v,"abseilped")
  101.             local veh = getPedOccupiedVehicle(ped)
  102.             if tonumber(data) == 0 or tonumber(data) == 2 then
  103.                 setPedRotation(v,getPedRotation(ped)+90)
  104.             elseif tonumber(data) == 1 or tonumber(data) == 3 then
  105.                 setPedRotation(v,getPedRotation(ped)-90)
  106.             elseif data == "true" then
  107.                 local x,y,z = getElementPosition(v)
  108.                 local b1x,b1y,b1z = getPedBonePosition(v,36)
  109.                 local b2x,b2y,b2z = getPedBonePosition(v,25)
  110.                 local z3 = getGroundPosition(b2x,b2y,b2z)
  111.                 local px4,py4,pz4 = getElementPosition(ped)
  112.                
  113.                 dxDrawLine3D(b1x,b1y,b1z,px4,py4,pz4,tocolor(0,0,0,255),2,false,0)
  114.                 dxDrawLine3D(b1x,b1y,b1z,b2x,b2y,b2z,tocolor(0,0,0,255),2,false,0)
  115.                 dxDrawLine3D(b2x,b2y,b2z,b2x,b2y,z3,tocolor(0,0,0,255),2,false,0)
  116.                
  117.                 if not isPedOnGround(v) and not (isElementInWater(v) or testLineAgainstWater(x,y,z+1,x,y,z-1)) then
  118.                     if v == localplayer then
  119.                         local _,_,vvelz = getElementVelocity(veh)
  120.                         local vx,vy,_ = getElementPosition(getElementData(v,"abseilped"))
  121.                         local px,py,_ = getElementPosition(v)
  122.                         local sx,sy = 0.1*(vx-px),0.1*(vy-py)
  123.                        
  124.                         local speed = tonumber(getElementData(v,"abseilspeed"))
  125.                        
  126.                         if getControlState("forwards") and not getControlState("backwards") then
  127.                             speed = speed - (getTickCount()-tick)*0.0005
  128.                             if speed < -0.4 then
  129.                                 speed = -0.4
  130.                             end
  131.                         elseif getControlState("backwards") and not getControlState("forwards") then
  132.                             speed = speed + (getTickCount()-tick)*0.0005
  133.                             if speed > -0.1 then
  134.                                 speed = -0.1
  135.                             end
  136.                         end
  137.                        
  138.                         setElementData(v,"abseilspeed",speed)
  139.                        
  140.                         setElementVelocity(v,sx,sy,speed+vvelz)
  141.                     end
  142.                 else
  143.                     setElementData(v,"abseiling","")
  144.                     setElementData(v,"abseilped","")
  145.                     setElementData(v,"abseilspeed",-0.25)
  146.                    
  147.                     setPedAnimation(v)
  148.                     removeEventHandler("onClientPlayerWasted",v,deathAnim)
  149.                     if v == localplayer then
  150.                         triggerServerEvent("doForceStopAbseiling",v,ped)
  151.                     else
  152.                         setElementCollidableWith(v,veh,true)
  153.                         setElementCollidableWith(v,ped,true)
  154.                        
  155.                         removeEventHandler("onClientPlayerDamage",v,cancelDamage)
  156.                     end
  157.                 end
  158.             end
  159.         end
  160.     end
  161.     for i,v in ipairs(vehiclesToWatch) do
  162.         if isElement(v) then
  163.             local x,y,z = getElementPosition(v)
  164.             local gz = getGroundPosition(x,y,z)
  165.             if gz then
  166.                 if z - gz <= 2 then
  167.                     triggerServerEvent("doRemovePilotDummy",v)
  168.                     table.remove(vehiclesToWatch,i)
  169.                 end
  170.             end
  171.         else
  172.             table.remove(vehiclesToWatch,i)
  173.         end
  174.     end
  175.     tick = nowtick
  176. end
  177. addEventHandler("onClientRender",getRootElement(),render)
  178.  
  179. function cancelDamage()
  180.     cancelEvent()
  181. end
  182.  
  183. function deathAnim()
  184.     if getElementData(source,"abseiling") == "true" then
  185.         local ped = getElementData(source,"abseilped")
  186.         local veh = getPedOccupiedVehicle(ped)
  187.        
  188.         setElementData(source,"abseiling","")
  189.         setElementData(source,"abseilped","")
  190.         setElementData(source,"abseilspeed",-0.25)
  191.        
  192.         setPedAnimation(source,"ped","KO_shot_front",-1,false,false,false)
  193.         removeEventHandler("onClientPlayerWasted",source,deathAnim)
  194.         if source == localplayer then
  195.             triggerServerEvent("doForceStopAbseiling",source,ped)
  196.         else
  197.             setElementCollidableWith(source,veh,true)
  198.             setElementCollidableWith(source,ped,true)
  199.             removeEventHandler("onClientPlayerDamage",source,cancelDamage)
  200.         end
  201.     end
  202. end
  203.  
  204. function cancelAbseiling()
  205.     local ped = getElementData(source,"abseilped")
  206.     setElementData(source,"abseiling","")
  207.     setElementData(source,"abseilped","")
  208.     setElementData(source,"abseilspeed",-0.25)
  209.    
  210.     setPedAnimation(source)
  211.     removeEventHandler("onClientPlayerWasted",source,deathAnim)
  212.     if source == localplayer then
  213.         triggerServerEvent("doForceStopAbseiling",source,ped)
  214.     else
  215.         setElementCollidableWith(source,veh,true)
  216.         setElementCollidableWith(source,ped,true)
  217.         removeEventHandler("onClientPlayerDamage",source,cancelDamage)
  218.     end
  219. end
  220. addEvent("doCancelAbseil",true)
  221. addEventHandler("doCancelAbseil",getRootElement(),cancelAbseiling)
  222.  
  223. function getMatrixOffsets(element,x,y,z)
  224.     local matrix = getElementMatrix(element)
  225.     local offX = x * matrix[1][1] + y * matrix[2][1] + z * matrix[3][1] + matrix[4][1]
  226.     local offY = x * matrix[1][2] + y * matrix[2][2] + z * matrix[3][2] + matrix[4][2]
  227.     local offZ = x * matrix[1][3] + y * matrix[2][3] + z * matrix[3][3] + matrix[4][3]
  228.     return offX, offY, offZ
  229. end
  230.  
  231. function addVehicleToWatch()
  232.     table.insert(vehiclesToWatch,source)
  233. end
  234. addEvent("doAddVehicleToWatch",true)
  235. addEventHandler("doAddVehicleToWatch",getRootElement(),addVehicleToWatch)
  236.  
  237. function removeVehicleToWatch()
  238.     for i,v in ipairs(vehiclesToWatch) do
  239.         if v == source then
  240.             table.remove(vehiclesToWatch,i)
  241.             break
  242.         end
  243.     end
  244. end
  245. addEvent("doRemoveVehicleToWatch",true)
  246. addEventHandler("doRemoveVehicleToWatch",getRootElement(),removeVehicleToWatch)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement