Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.53 KB | None | 0 0
  1. ESX = nil
  2. local FirstSpawn = true
  3. local LastSkin = nil
  4. local PlayerLoaded = false
  5. local cam = nil
  6. local isCameraActive = false
  7. local zoomOffset = 0.0
  8. local camOffset = 0.0
  9. local heading = 90.0
  10.  
  11. Citizen.CreateThread(function()
  12. while ESX == nil do
  13. TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
  14. Citizen.Wait(0)
  15. end
  16. end)
  17.  
  18. function OpenMenu(submitCb, cancelCb, restrict)
  19.  
  20. local playerPed = GetPlayerPed(-1)
  21.  
  22. TriggerEvent('skinchanger:getSkin', function(skin)
  23. LastSkin = skin
  24. end)
  25.  
  26. TriggerEvent('skinchanger:getData', function(components, maxVals)
  27.  
  28. local elements = {}
  29. local _components = {}
  30.  
  31. -- Restrict menu
  32. if restrict == nil then
  33. for i=1, #components, 1 do
  34. _components[i] = components[i]
  35. end
  36. else
  37. for i=1, #components, 1 do
  38.  
  39. local found = false
  40.  
  41. for j=1, #restrict, 1 do
  42. if components[i].name == restrict[j] then
  43. found = true
  44. end
  45. end
  46.  
  47. if found then
  48. table.insert(_components, components[i])
  49. end
  50.  
  51. end
  52. end
  53.  
  54. -- Insert elements
  55. for i=1, #_components, 1 do
  56.  
  57. local value = _components[i].value
  58. local componentId = _components[i].componentId
  59.  
  60. if componentId == 0 then
  61. value = GetPedPropIndex(playerPed, _components[i].componentId)
  62. end
  63.  
  64. local data = {
  65. label = _components[i].label,
  66. name = _components[i].name,
  67. value = value,
  68. min = _components[i].min,
  69. textureof = _components[i].textureof,
  70. zoomOffset= _components[i].zoomOffset,
  71. camOffset = _components[i].camOffset,
  72. type = 'slider'
  73. }
  74.  
  75. for k,v in pairs(maxVals) do
  76. if k == _components[i].name then
  77. data.max = v
  78. end
  79. end
  80.  
  81. table.insert(elements, data)
  82.  
  83. end
  84.  
  85. CreateSkinCam()
  86. zoomOffset = _components[1].zoomOffset
  87. camOffset = _components[1].camOffset
  88.  
  89. ESX.UI.Menu.Open(
  90. 'default', GetCurrentResourceName(), 'skin',
  91. {
  92. title = _U('skin_menu'),
  93. align = 'top-left',
  94. elements = elements
  95. },
  96. function(data, menu)
  97.  
  98. TriggerEvent('skinchanger:getSkin', function(skin)
  99. LastSkin = skin
  100. end)
  101.  
  102. submitCb(data, menu)
  103. DeleteSkinCam()
  104. end,
  105. function(data, menu)
  106.  
  107. menu.close()
  108.  
  109. DeleteSkinCam()
  110.  
  111. TriggerEvent('skinchanger:loadSkin', LastSkin)
  112.  
  113. if cancelCb ~= nil then
  114. cancelCb(data, menu)
  115. end
  116.  
  117. end,
  118. function(data, menu)
  119.  
  120. TriggerEvent('skinchanger:getSkin', function(skin)
  121.  
  122. zoomOffset = data.current.zoomOffset
  123. camOffset = data.current.camOffset
  124.  
  125. if skin[data.current.name] ~= data.current.value then
  126.  
  127. -- Change skin element
  128. TriggerEvent('skinchanger:change', data.current.name, data.current.value)
  129.  
  130. -- Update max values
  131. TriggerEvent('skinchanger:getData', function(components, maxVals)
  132.  
  133. for i=1, #elements, 1 do
  134.  
  135. local newData = {}
  136.  
  137. newData.max = maxVals[elements[i].name]
  138.  
  139. if elements[i].textureof ~= nil and data.current.name == elements[i].textureof then
  140. newData.value = 0
  141. end
  142.  
  143. menu.update({name = elements[i].name}, newData)
  144.  
  145. end
  146.  
  147. menu.refresh()
  148.  
  149. end)
  150.  
  151. end
  152.  
  153. end)
  154.  
  155. end,
  156. function()
  157. DeleteSkinCam()
  158. end
  159. )
  160.  
  161. end)
  162.  
  163. end
  164.  
  165. function CreateSkinCam()
  166. if not DoesCamExist(cam) then
  167. cam = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
  168. end
  169. SetCamActive(cam, true)
  170. RenderScriptCams(true, true, 500, true, true)
  171. isCameraActive = true
  172. SetCamRot(cam, 0.0, 0.0, 270.0, true)
  173. SetEntityHeading(playerPed, 90.0)
  174. end
  175.  
  176. function DeleteSkinCam()
  177. isCameraActive = false
  178. SetCamActive(cam, false)
  179. RenderScriptCams(false, true, 500, true, true)
  180. cam = nil
  181. end
  182.  
  183. Citizen.CreateThread(function()
  184. while true do
  185. Citizen.Wait(0)
  186. if isCameraActive then
  187. DisableControlAction(2, 30, true)
  188. DisableControlAction(2, 31, true)
  189. DisableControlAction(2, 32, true)
  190. DisableControlAction(2, 33, true)
  191. DisableControlAction(2, 34, true)
  192. DisableControlAction(2, 35, true)
  193.  
  194. DisableControlAction(0, 25, true) -- Input Aim
  195. DisableControlAction(0, 24, true) -- Input Attack
  196.  
  197. local playerPed = GetPlayerPed(-1)
  198. local coords = GetEntityCoords(playerPed)
  199.  
  200. local angle = heading * math.pi / 180.0
  201. local theta = {
  202. x = math.cos(angle),
  203. y = math.sin(angle)
  204. }
  205. local pos = {
  206. x = coords.x + (zoomOffset * theta.x),
  207. y = coords.y + (zoomOffset * theta.y),
  208. }
  209.  
  210. local angleToLook = heading - 140.0
  211. if angleToLook > 360 then
  212. angleToLook = angleToLook - 360
  213. elseif angleToLook < 0 then
  214. angleToLook = angleToLook + 360
  215. end
  216. angleToLook = angleToLook * math.pi / 180.0
  217. local thetaToLook = {
  218. x = math.cos(angleToLook),
  219. y = math.sin(angleToLook)
  220. }
  221. local posToLook = {
  222. x = coords.x + (zoomOffset * thetaToLook.x),
  223. y = coords.y + (zoomOffset * thetaToLook.y),
  224. }
  225.  
  226. SetCamCoord(cam, pos.x, pos.y, coords.z + camOffset)
  227. PointCamAtCoord(cam, posToLook.x, posToLook.y, coords.z + camOffset)
  228.  
  229. SetTextComponentFormat("STRING")
  230. AddTextComponentString(_U('use_rotate_view'))
  231. DisplayHelpTextFromStringLabel(0, 0, 0, -1)
  232. end
  233. end
  234. end)
  235.  
  236. Citizen.CreateThread(function()
  237. local angle = 90
  238. while true do
  239. Citizen.Wait(0)
  240. if isCameraActive then
  241. if IsControlPressed(0, 108) then
  242. angle = angle - 1
  243. elseif IsControlPressed(0, 109) then
  244. angle = angle + 1
  245. end
  246. if angle > 360 then
  247. angle = angle - 360
  248. elseif angle < 0 then
  249. angle = angle + 360
  250. end
  251. heading = angle + 0.0
  252. end
  253. end
  254. end)
  255.  
  256. function OpenSaveableMenu(submitCb, cancelCb, restrict)
  257.  
  258. TriggerEvent('skinchanger:getSkin', function(skin)
  259. LastSkin = skin
  260. end)
  261.  
  262. OpenMenu(function(data, menu)
  263.  
  264. menu.close()
  265.  
  266. DeleteSkinCam()
  267.  
  268. TriggerEvent('skinchanger:getSkin', function(skin)
  269.  
  270. TriggerServerEvent('esx_skin:save', skin)
  271.  
  272. if submitCb ~= nil then
  273. submitCb(data, menu)
  274. end
  275.  
  276. end)
  277.  
  278. end, cancelCb, restrict)
  279.  
  280. end
  281.  
  282. AddEventHandler('playerSpawned', function()
  283.  
  284. Citizen.CreateThread(function()
  285.  
  286. while not PlayerLoaded do
  287. Citizen.Wait(0)
  288. end
  289.  
  290. if FirstSpawn then
  291.  
  292. ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin, jobSkin)
  293.  
  294. if skin == nil then
  295. TriggerEvent('skinchanger:loadSkin', {sex = 0}, OpenSaveableMenu)
  296. else
  297. TriggerEvent('skinchanger:loadSkin', skin)
  298. end
  299.  
  300. end)
  301.  
  302. FirstSpawn = false
  303.  
  304. end
  305.  
  306. end)
  307.  
  308. end)
  309.  
  310. RegisterNetEvent('esx:playerLoaded')
  311. AddEventHandler('esx:playerLoaded', function(xPlayer)
  312. PlayerLoaded = true
  313. end)
  314.  
  315. AddEventHandler('esx_skin:getLastSkin', function(cb)
  316. cb(LastSkin)
  317. end)
  318.  
  319. AddEventHandler('esx_skin:setLastSkin', function(skin)
  320. LastSkin = skin
  321. end)
  322.  
  323. RegisterNetEvent('esx_skin:openMenu')
  324. AddEventHandler('esx_skin:openMenu', function(submitCb, cancelCb)
  325. OpenMenu(submitCb, cancelCb, nil)
  326. end)
  327.  
  328. RegisterNetEvent('esx_skin:openRestrictedMenu')
  329. AddEventHandler('esx_skin:openRestrictedMenu', function(submitCb, cancelCb, restrict)
  330. OpenMenu(submitCb, cancelCb, restrict)
  331. end)
  332.  
  333. RegisterNetEvent('esx_skin:openSaveableMenu')
  334. AddEventHandler('esx_skin:openSaveableMenu', function(submitCb, cancelCb)
  335. OpenSaveableMenu(submitCb, cancelCb, nil)
  336. end)
  337.  
  338. RegisterNetEvent('esx_skin:openSaveableRestrictedMenu')
  339. AddEventHandler('esx_skin:openSaveableRestrictedMenu', function(submitCb, cancelCb, restrict)
  340. OpenSaveableMenu(submitCb, cancelCb, restrict)
  341. end)
  342.  
  343. RegisterNetEvent('esx_skin:requestSaveSkin')
  344. AddEventHandler('esx_skin:requestSaveSkin', function()
  345. TriggerEvent('skinchanger:getSkin', function(skin)
  346. TriggerServerEvent('esx_skin:responseSaveSkin', skin)
  347. end)
  348. end)
  349.  
  350. Citizen.CreateThread(function()
  351. while true do
  352.  
  353. Citizen.Wait(0)
  354.  
  355. local playerPed = GetPlayerPed(-1)
  356.  
  357. if IsEntityDead(playerPed) then
  358. HasLoadedModel = false
  359. end
  360.  
  361. end
  362. end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement