153 lines
		
	
	
		
			No EOL
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			No EOL
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local interactable = false
 | |
| local interactions = {}
 | |
| local keyCodes = {
 | |
|     ["A"] = 34,   ["B"] = 29,   ["C"] = 26,   ["D"] = 9,    ["E"] = 38,
 | |
|     ["F"] = 23,   ["G"] = 47,   ["H"] = 74,   ["I"] = 311,  ["J"] = 245,
 | |
|     ["K"] = 311,  ["L"] = 182,  ["M"] = 244,  ["N"] = 249,  ["O"] = 79,
 | |
|     ["P"] = 199,  ["Q"] = 44,   ["R"] = 45,   ["S"] = 8,    ["T"] = 245,
 | |
|     ["U"] = 303,  ["V"] = 0,    ["W"] = 32,   ["X"] = 73,   ["Y"] = 246,
 | |
|     ["Z"] = 20,   ["NUMPAD_0"] = 92, ["NUMPAD_1"] = 36, ["NUMPAD_2"] = 37, ["NUMPAD_3"] = 38,
 | |
|     ["NUMPAD_4"] = 39, ["NUMPAD_5"] = 40, ["NUMPAD_6"] = 41, ["NUMPAD_7"] = 42, ["NUMPAD_8"] = 43,
 | |
|     ["NUMPAD_9"] = 44, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F4"] = 166,
 | |
|     ["F5"] = 167, ["F6"] = 168, ["F7"] = 169, ["F8"] = 170, ["F9"] = 171,
 | |
|     ["F10"] = 172, ["F11"] = 173, ["F12"] = 174
 | |
| }
 | |
| 
 | |
| CreateThread(function()
 | |
|     local bounceAmplitude = 0.1 
 | |
|     local bounceSpeed = 2.0 
 | |
| 
 | |
|     while true do
 | |
|         local wait = 500  
 | |
| 
 | |
|         local playerCoords = GetEntityCoords(PlayerPedId())
 | |
| 
 | |
|         for _, interaction in ipairs(interactions) do
 | |
|             local startZ = interaction.coords.z 
 | |
|             local time = GetGameTimer() / 1000.0
 | |
|             local offset = math.sin(time * bounceSpeed) * bounceAmplitude
 | |
|             local currentZ = startZ + offset
 | |
| 
 | |
|             local distance = #(playerCoords - interaction.coords)
 | |
| 
 | |
|             if distance < interaction.distance and distance >= 2.0 then
 | |
|                 Draw3DIcon(interaction.coords.x, interaction.coords.y, currentZ, 'p_interaction', 'target')
 | |
|                 wait = 0  
 | |
|             elseif distance < 2.0 then
 | |
|                 Draw3DIconWithText(interaction.coords.x, interaction.coords.y, currentZ, 'p_interaction', 'key_bg', interaction.key)
 | |
|                 Draw3DMessage(interaction.coords.x + 0.05, interaction.coords.y, currentZ, interaction.message)
 | |
|                 if IsControlJustReleased(1, keyCodes[interaction.key]) then 
 | |
|                     if interaction.type == 'client' then
 | |
|                         TriggerEvent(interaction.event)
 | |
|                     elseif interaction.type == 'server' then
 | |
|                         TriggerServerEvent(interaction.event)
 | |
|                     end
 | |
|                 end
 | |
|                 wait = 0  
 | |
|             end
 | |
|         end
 | |
| 
 | |
|         Wait(wait)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| 
 | |
| function Draw3DIcon(x, y, z, dict, txtName)
 | |
|     if not HasStreamedTextureDictLoaded(dict) then
 | |
|         RequestStreamedTextureDict(dict, true)
 | |
|         while not HasStreamedTextureDictLoaded(dict) do
 | |
|             Wait(0)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     local onScreen, _x, _y = World3dToScreen2d(x, y, z)
 | |
|     local px, py, pz = table.unpack(GetGameplayCamCoords())
 | |
| 
 | |
|     local size = 0.025 
 | |
|     DrawSprite(dict, txtName, _x, _y, size, size, 0.0, 255, 255, 255, 255)
 | |
| end
 | |
| 
 | |
| function Draw3DIconWithText(x, y, z, dict, iconName, key)
 | |
|     if not HasStreamedTextureDictLoaded(dict) then
 | |
|         RequestStreamedTextureDict(dict, true)
 | |
|         while not HasStreamedTextureDictLoaded(dict) do
 | |
|             Wait(0)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     local onScreen, _x, _y = World3dToScreen2d(x, y, z)
 | |
|     local px, py, pz = table.unpack(GetGameplayCamCoords())
 | |
| 
 | |
|     local width = 0.02 
 | |
|     local height = 0.03 
 | |
| 
 | |
|     DrawSprite(dict, iconName, _x, _y, width, height, 0.0, 255, 255, 255, 255)
 | |
| 
 | |
| 
 | |
|     SetTextScale(0.55, 0.55)
 | |
|     SetTextFont(2)
 | |
|     SetTextProportional(1)
 | |
|     SetTextColour(255, 255, 255, 255)
 | |
|     SetTextEntry("STRING")
 | |
|     SetTextCentre(1)
 | |
|     AddTextComponentString(key)
 | |
|     DrawText(_x, _y - 0.018) 
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| function Draw3DMessage(x, y, z, message)
 | |
| 
 | |
|     local onScreen, _x, _y = World3dToScreen2d(x, y, z)
 | |
|     local px, py, pz = table.unpack(GetGameplayCamCoords())
 | |
| 
 | |
|     local textLength = string.len(message)
 | |
|     local width = 0.08 
 | |
|     local height = 0.03 
 | |
|     local baseOffsetX = 0.025
 | |
| 
 | |
|     local offsetX = baseOffsetX + (textLength > 5 and 0.015 * math.pow((textLength - 5), 0.5) or 0)    
 | |
| 
 | |
|     local textSize = 0.45 
 | |
|     local textOffsetY = 0.017
 | |
|     local textOffsetX = 0.001 
 | |
| 
 | |
|     local adjustedX = _x + offsetX
 | |
| 
 | |
|     SetTextScale(textSize, textSize)
 | |
|     SetTextFont(4)
 | |
|     SetTextProportional(1)
 | |
|     SetTextColour(255, 255, 255, 255)
 | |
|     SetTextEntry("STRING")
 | |
|     SetTextCentre(2)
 | |
| 
 | |
|     AddTextComponentString(message)
 | |
|     DrawText(adjustedX - textOffsetX, _y - textOffsetY) 
 | |
| end
 | |
| 
 | |
| function AddInteraction(id, coords, distance, type, event, key, message)
 | |
|     for _, interaction in ipairs(interactions) do
 | |
|         if interaction.id == id then
 | |
|             return 
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     table.insert(interactions, {
 | |
|         id = id,
 | |
|         coords = coords,
 | |
|         distance = distance,
 | |
|         type = type,
 | |
|         event = event,
 | |
|         key = key,
 | |
|         message = message
 | |
|     })
 | |
| end
 | |
| 
 | |
| function RemoveInteraction(id)
 | |
|     for i, interaction in ipairs(interactions) do
 | |
|         if interaction.id == id then
 | |
|             table.remove(interactions, i)
 | |
|             break
 | |
|         end
 | |
|     end
 | |
| end | 
