103 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- variables
 | |
| local config = require 'config'
 | |
| 
 | |
| -- functions --
 | |
| local function Draw3DText(x, y, z, text)
 | |
| 	local onScreen, _x, _y = World3dToScreen2d(x, y, z)
 | |
|     local px,py,pz=table.unpack(GetGameplayCamCoords())
 | |
|     local dist = #(vec3(px,py,pz) - vec3(x,y,z))
 | |
| 
 | |
|     local scale = (1/dist)*2
 | |
|     local fov = (1/GetGameplayCamFov())*100
 | |
|     
 | |
| 	if onScreen then
 | |
| 		SetTextScale(0.4, 0.4)
 | |
| 		SetTextFont(4)
 | |
| 		SetTextProportional(1)
 | |
| 		SetTextColour(255, 255, 255, 215)
 | |
| 		SetTextDropShadow(0, 0, 0, 55)
 | |
| 		SetTextEdge(0, 0, 0, 150)
 | |
| 		SetTextDropShadow()
 | |
| 		SetTextOutline()
 | |
| 		SetTextCentre(1)
 | |
|         SetTextEntry("STRING")
 | |
| 		AddTextComponentString(text)
 | |
| 		DrawText(_x,_y)
 | |
| 	end
 | |
| end
 | |
| 
 | |
| local function Teleport(pos)
 | |
|     local x, y, z = pos.x, pos.y, pos.z
 | |
| 
 | |
|     RequestCollisionAtCoord(x, y, z)
 | |
|     NewLoadSceneStart(x, y, z, x, y, z, 50.0, 0)
 | |
| 
 | |
|     local sceneLoadTimer = GetGameTimer()
 | |
|     while not IsNewLoadSceneLoaded() do
 | |
|         if GetGameTimer() - sceneLoadTimer > 500 then break end
 | |
|         Wait(0)
 | |
|     end
 | |
| 
 | |
|     SetEntityCoords(cache.ped, x, y, z)
 | |
|     sceneLoadTimer = GetGameTimer()
 | |
| 
 | |
|     while not HasCollisionLoadedAroundEntity(cache.ped) do
 | |
|         if GetGameTimer() - sceneLoadTimer > 500 then break end
 | |
|         Wait(0)
 | |
|     end
 | |
| 
 | |
|     local foundNewZ, newZ = GetGroundZFor_3dCoord(x, y, z, 0, 0)
 | |
|     if foundNewZ and newZ > 0 then z = newZ end
 | |
| 
 | |
|     SetEntityCoords(cache.ped, x, y, z)
 | |
|     NewLoadSceneStop()
 | |
| 
 | |
|     NetworkFadeInEntity(cache.ped, 1)
 | |
|     DoScreenFadeIn(1000)
 | |
| end
 | |
| 
 | |
| -- main functions --
 | |
| local function OpenUI(current, floors)
 | |
|     SetNuiFocus(true, true)
 | |
|     SendNUIMessage({ 
 | |
|         action = 'SHOW_UI',
 | |
|         current = current,
 | |
|         floors = floors
 | |
|     })
 | |
| end
 | |
| 
 | |
| -- NUI Callbacks --
 | |
| RegisterNUICallback('CLOSE_UI', function()
 | |
|     SetNuiFocus(false, false)
 | |
| end)
 | |
| 
 | |
| RegisterNUICallback('TELEPORT', function(data, cb)
 | |
|     Teleport(vec3(data.pos.x, data.pos.y, data.pos.z))
 | |
| end)
 | |
| 
 | |
| RegisterNUICallback('USE_ELEVATOR', function(data, cb)
 | |
|     NetworkFadeOutEntity(cache.ped, true, false)
 | |
|     DoScreenFadeOut(1000)
 | |
| end)
 | |
| 
 | |
| -- setup points --
 | |
| local draw = config.draw_dist
 | |
| local interact = config.interact_dist
 | |
| local open = config.texts.open
 | |
| for _, data in each(config.elevators) do
 | |
|     for _, floor in each(data) do
 | |
| 
 | |
|         local point = lib.points.new({
 | |
|             coords = floor.pos,
 | |
|             distance = draw
 | |
|         })
 | |
|         
 | |
|         function point:nearby()
 | |
|             Draw3DText(self.coords.x, self.coords.y, self.coords.z, open)
 | |
| 
 | |
|             if self.currentDistance < interact and IsControlJustReleased(0, 38) then
 | |
|                 OpenUI(floor.number, data)
 | |
|             end
 | |
|         end
 | |
|     end
 | |
| end
 | 
