fixes etc
This commit is contained in:
		
							parent
							
								
									4a0c8c6204
								
							
						
					
					
						commit
						453b281a4b
					
				
					 644 changed files with 1907 additions and 2456 deletions
				
			
		
							
								
								
									
										395
									
								
								resources/[standalone]/rpemotes-reborn/client/Utils.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										395
									
								
								resources/[standalone]/rpemotes-reborn/client/Utils.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,395 @@ | |||
| -- You can edit this function to add support for your favorite notification system | ||||
| function SimpleNotify(message) | ||||
|     if Config.NotificationsAsChatMessage then | ||||
|         TriggerEvent("chat:addMessage", { color = { 255, 255, 255 }, args = { tostring(message) } }) | ||||
|     else | ||||
|         BeginTextCommandThefeedPost("STRING") | ||||
|         AddTextComponentSubstringPlayerName(message) | ||||
|         EndTextCommandThefeedPostTicker(true, true) | ||||
|     end | ||||
| end | ||||
|  | ||||
| -- Don't touch after this line if you don't know what you're doing | ||||
| CreateExport = function(name, func) | ||||
|     AddEventHandler('__cfx_export_rpemotes_'..name, function(setCb) | ||||
|         setCb(function(...) | ||||
|             return func(...) | ||||
|         end) | ||||
|     end) | ||||
|     exports(name, func) | ||||
| end | ||||
|  | ||||
| function DebugPrint(...) | ||||
|     if Config.DebugDisplay then | ||||
|         print(...) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function FirstToUpper(str) | ||||
|     return (str:gsub("^%l", string.upper)) | ||||
| end | ||||
|  | ||||
| function IsPlayerAiming(player) | ||||
|     return (IsPlayerFreeAiming(player) or IsAimCamActive() or IsAimCamThirdPersonActive()) and | ||||
|     tonumber(GetSelectedPedWeapon(player)) ~= tonumber(GetHashKey("WEAPON_UNARMED")) | ||||
| end | ||||
|  | ||||
| function CanPlayerCrouchCrawl(playerPed) | ||||
|     if not IsPedOnFoot(playerPed) or IsPedJumping(playerPed) or IsPedFalling(playerPed) or IsPedInjured(playerPed) or IsPedInMeleeCombat(playerPed) or IsPedRagdoll(playerPed) then | ||||
|         return false | ||||
|     end | ||||
|  | ||||
|     return true | ||||
| end | ||||
|  | ||||
| function PlayAnimOnce(playerPed, animDict, animName, blendInSpeed, blendOutSpeed, duration, startTime) | ||||
|     LoadAnim(animDict) | ||||
|     TaskPlayAnim(playerPed, animDict, animName, blendInSpeed or 2.0, blendOutSpeed or 2.0, duration or -1, 0, | ||||
|         startTime or 0.0, false, false, false) | ||||
|     RemoveAnimDict(animDict) | ||||
| end | ||||
|  | ||||
| function ChangeHeadingSmooth(playerPed, amount, time) | ||||
|     local times = math.abs(amount) | ||||
|     local test = amount / times | ||||
|     local wait = time / times | ||||
|  | ||||
|     for _i = 1, times do | ||||
|         Wait(wait) | ||||
|         SetEntityHeading(playerPed, GetEntityHeading(playerPed) + test) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function EmoteChatMessage(msg, multiline) | ||||
|     if msg then | ||||
|         TriggerEvent("chat:addMessage", { | ||||
|             multiline = multiline == true or false, | ||||
|             color = { 255, 255, 255 }, | ||||
|             args = { "^1Help^0", tostring(msg) } | ||||
|         }) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function PairsByKeys(t, f) | ||||
|     local a = {} | ||||
|     for n in pairs(t) do | ||||
|         table.insert(a, n) | ||||
|     end | ||||
|     table.sort(a, f) | ||||
|     local i = 0             -- iterator variable | ||||
|     local iter = function() -- iterator function | ||||
|         i = i + 1 | ||||
|         if a[i] == nil then | ||||
|             return nil | ||||
|         else | ||||
|             return a[i], t[a[i]] | ||||
|         end | ||||
|     end | ||||
|     return iter | ||||
| end | ||||
|  | ||||
| function LoadAnim(dict) | ||||
|     if not DoesAnimDictExist(dict) then | ||||
|         return false | ||||
|     end | ||||
|  | ||||
|     local timeout = 2000 | ||||
|     while not HasAnimDictLoaded(dict) and timeout > 0 do | ||||
|         RequestAnimDict(dict) | ||||
|         Wait(5) | ||||
|         timeout = timeout - 5 | ||||
|     end | ||||
|     if timeout == 0 then | ||||
|         DebugPrint("Loading anim dict " .. dict .. " timed out") | ||||
|         return false | ||||
|     else | ||||
|         return true | ||||
|     end | ||||
| end | ||||
|  | ||||
| function LoadPropDict(model) | ||||
|     if not HasModelLoaded(GetHashKey(model)) then | ||||
|         RequestModel(GetHashKey(model)) | ||||
|         local timeout = 2000 | ||||
|         while not HasModelLoaded(GetHashKey(model)) and timeout > 0 do | ||||
|             Wait(5) | ||||
|             timeout = timeout - 5 | ||||
|         end | ||||
|         if timeout == 0 then | ||||
|             DebugPrint("Loading model " .. model .. " timed out") | ||||
|             return | ||||
|         end | ||||
|     end | ||||
| end | ||||
|  | ||||
| function TableHasKey(table, key) | ||||
|     return table[key] ~= nil | ||||
| end | ||||
|  | ||||
| function RequestWalking(set) | ||||
|     local timeout = GetGameTimer() + 5000 | ||||
|     while not HasAnimSetLoaded(set) and GetGameTimer() < timeout do | ||||
|         RequestAnimSet(set) | ||||
|         Wait(5) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function GetPedInFront() | ||||
|     local player = PlayerId() | ||||
|     local plyPed = GetPlayerPed(player) | ||||
|     local plyPos = GetEntityCoords(plyPed, false) | ||||
|     local plyOffset = GetOffsetFromEntityInWorldCoords(plyPed, 0.0, 1.3, 0.0) | ||||
|     local rayHandle = StartShapeTestCapsule(plyPos.x, plyPos.y, plyPos.z, plyOffset.x, plyOffset.y, plyOffset.z, 10.0, 12 | ||||
|     , plyPed, 7) | ||||
|     local _, _, _, _, ped2 = GetShapeTestResult(rayHandle) | ||||
|     return ped2 | ||||
| end | ||||
|  | ||||
| function NearbysOnCommand(source, args, raw) | ||||
|     local NearbysCommand = "" | ||||
|     for a, b in PairsByKeys(RP) do | ||||
|         if type(b) == "table" and b.category == "Shared" then | ||||
|             NearbysCommand = NearbysCommand .. a .. ", " | ||||
|         end | ||||
|     end | ||||
|     EmoteChatMessage(NearbysCommand) | ||||
|     EmoteChatMessage(Translate('emotemenucmd')) | ||||
| end | ||||
|  | ||||
| function GetClosestPlayer() | ||||
|     local players = GetPlayers() | ||||
|     local closestDistance = -1 | ||||
|     local closestPlayer | ||||
|     local ped = PlayerPedId() | ||||
|     local pedCoords = GetEntityCoords(ped, false) | ||||
|  | ||||
|     for index, value in ipairs(players) do | ||||
|         local target = GetPlayerPed(value) | ||||
|         if (target ~= ped) then | ||||
|             local targetCoords = GetEntityCoords(GetPlayerPed(value), false) | ||||
|             local distance = GetDistanceBetweenCoords(targetCoords["x"], targetCoords["y"], targetCoords["z"], | ||||
|                 pedCoords["x"], pedCoords["y"], pedCoords["z"], true) | ||||
|             if (closestDistance == -1 or closestDistance > distance) then | ||||
|                 closestPlayer = value | ||||
|                 closestDistance = distance | ||||
|             end | ||||
|         end | ||||
|     end | ||||
|     return closestPlayer, closestDistance | ||||
| end | ||||
|  | ||||
| function GetPlayers() | ||||
|     local players = {} | ||||
|  | ||||
|     for i = 0, 255 do | ||||
|         if NetworkIsPlayerActive(i) then | ||||
|             table.insert(players, i) | ||||
|         end | ||||
|     end | ||||
|  | ||||
|     return players | ||||
| end | ||||
|  | ||||
| -- Function that'll check if player is already proning, using news cam or else | ||||
|  | ||||
| ---@param ignores? table | nil key string is the ignored value | ||||
| function IsInActionWithErrorMessage(ignores) | ||||
|     if ignores then DebugPrint(ignores) end | ||||
|     DebugPrint('IsProne', IsProne) | ||||
|     DebugPrint('IsUsingNewscam', IsUsingNewscam) | ||||
|     DebugPrint('IsUsingBinoculars', IsUsingBinoculars) | ||||
|     if (ignores == nil) then ignores = {} end | ||||
|  | ||||
|     if not ignores['IsProne'] and IsProne then | ||||
|         EmoteChatMessage(Translate('no_anim_crawling')) | ||||
|         return true | ||||
|     end | ||||
|     if not ignores['IsUsingNewscam'] and IsUsingNewscam then | ||||
|         -- TODO: use specific error message | ||||
|         EmoteChatMessage(Translate('no_anim_right_now')) | ||||
|         return true | ||||
|     end | ||||
|     if not ignores['IsUsingBinoculars'] and IsUsingBinoculars then | ||||
|         -- TODO: use specific error message | ||||
|         EmoteChatMessage(Translate('no_anim_right_now')) | ||||
|         return true | ||||
|     end | ||||
|  | ||||
|     return false | ||||
| end | ||||
|  | ||||
| function HideHUDThisFrame() | ||||
|     HideHelpTextThisFrame() | ||||
|     HideHudAndRadarThisFrame() | ||||
|     HideHudComponentThisFrame(19) -- weapon wheel | ||||
|     HideHudComponentThisFrame(1)  -- Wanted Stars | ||||
|     HideHudComponentThisFrame(2)  -- Weapon icon | ||||
|     HideHudComponentThisFrame(3)  -- Cash | ||||
|     HideHudComponentThisFrame(4)  -- MP CASH | ||||
|     HideHudComponentThisFrame(13) -- Cash Change | ||||
|     HideHudComponentThisFrame(11) -- Floating Help Text | ||||
|     HideHudComponentThisFrame(12) -- more floating help text | ||||
|     HideHudComponentThisFrame(15) -- Subtitle Text | ||||
|     HideHudComponentThisFrame(18) -- Game Stream | ||||
| end | ||||
|  | ||||
| function SetupButtons(button) | ||||
|     local scaleform = RequestScaleformMovie("instructional_buttons") | ||||
|     while not HasScaleformMovieLoaded(scaleform) do | ||||
|         Wait(10) | ||||
|     end | ||||
|     PushScaleformMovieFunction(scaleform, "CLEAR_ALL") | ||||
|     PopScaleformMovieFunctionVoid() | ||||
|  | ||||
|     PushScaleformMovieFunction(scaleform, "SET_CLEAR_SPACE") | ||||
|     PushScaleformMovieFunctionParameterInt(200) | ||||
|     PopScaleformMovieFunctionVoid() | ||||
|  | ||||
|     for i, btn in pairs(button) do | ||||
|         PushScaleformMovieFunction(scaleform, "SET_DATA_SLOT") | ||||
|         PushScaleformMovieFunctionParameterInt(i - 1) | ||||
|         ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(0, btn.key, true)) | ||||
|         BeginTextCommandScaleformString("STRING") | ||||
|         AddTextComponentScaleform(Translate(btn.text)) | ||||
|         EndTextCommandScaleformString() | ||||
|         PopScaleformMovieFunctionVoid() | ||||
|     end | ||||
|  | ||||
|     PushScaleformMovieFunction(scaleform, "DRAW_INSTRUCTIONAL_BUTTONS") | ||||
|     PopScaleformMovieFunctionVoid() | ||||
|  | ||||
|     return scaleform | ||||
| end | ||||
|  | ||||
| function HandleZoomAndCheckRotation(cam, fov) | ||||
|     local zoomspeed = 10.0 -- camera zoom speed | ||||
|     local lPed = PlayerPedId() | ||||
|  | ||||
|     local fov_max = 70.0 | ||||
|     local fov_min = 10.0 -- max zoom level (smaller fov is more zoom) | ||||
|     local speed_lr = 8.0 -- speed by which the camera pans left-right | ||||
|     local speed_ud = 8.0 -- speed by which the camera pans up-down | ||||
|  | ||||
|     local zoomvalue = (1.0 / (fov_max - fov_min)) * (fov - fov_min) | ||||
|     local rightAxisX = GetDisabledControlNormal(0, 220) | ||||
|     local rightAxisY = GetDisabledControlNormal(0, 221) | ||||
|     local rotation = GetCamRot(cam, 2) | ||||
|  | ||||
|     if rightAxisX ~= 0.0 or rightAxisY ~= 0.0 then | ||||
|         local new_z = rotation.z + rightAxisX * -1.0 * (speed_ud) * (zoomvalue + 0.1) | ||||
|         local new_x = math.max(math.min(20.0, rotation.x + rightAxisY * -1.0 * (speed_lr) * (zoomvalue + 0.1)), -29.5) | ||||
|         SetCamRot(cam, new_x, 0.0, new_z, 2) | ||||
|     end | ||||
|  | ||||
|     if not (IsPedSittingInAnyVehicle(lPed)) then | ||||
|         if IsControlJustPressed(0, 241) then -- Scrollup | ||||
|             fov = math.max(fov - zoomspeed, fov_min) | ||||
|         end | ||||
|         if IsControlJustPressed(0, 242) then | ||||
|             fov = math.min(fov + zoomspeed, fov_max) -- ScrollDown | ||||
|         end | ||||
|         local current_fov = GetCamFov(cam) | ||||
|         if math.abs(fov - current_fov) < 0.1 then | ||||
|             fov = current_fov | ||||
|         end | ||||
|         SetCamFov(cam, current_fov + (fov - current_fov) * 0.05) | ||||
|     else | ||||
|         if IsControlJustPressed(0, 17) then -- Scrollup | ||||
|             fov = math.max(fov - zoomspeed, fov_min) | ||||
|         end | ||||
|         if IsControlJustPressed(0, 16) then | ||||
|             fov = math.min(fov + zoomspeed, fov_max) -- ScrollDown | ||||
|         end | ||||
|         local current_fov = GetCamFov(cam) | ||||
|         if math.abs(fov - current_fov) < 0.1 then -- the difference is too small, just set the value directly to avoid unneeded updates to FOV of order 10^-5 | ||||
|             fov = current_fov | ||||
|         end | ||||
|         SetCamFov(cam, current_fov + (fov - current_fov) * 0.05) -- Smoothing of camera zoom | ||||
|     end | ||||
|  | ||||
|     return fov | ||||
| end | ||||
|  | ||||
| ---------------------------------------------------------------------- | ||||
|  | ||||
| ShowPed = false | ||||
|  | ||||
| function ShowPedMenu(zoom) | ||||
|     if not Config.PreviewPed then return end | ||||
|  | ||||
|     if not ShowPed then | ||||
|         CreateThread(function() | ||||
|             local playerPed = PlayerPedId() | ||||
|             local coords = GetEntityCoords(playerPed) - vector3(0.0, 0.0, 10.0) | ||||
|             ClonedPed = CreatePed(26, GetEntityModel(playerPed), coords.x, coords.y, coords.z, 0, false, false) | ||||
|             ClonePedToTarget(playerPed, ClonedPed) | ||||
|  | ||||
|             SetEntityInvincible(ClonedPed, true) | ||||
|             SetEntityLocallyVisible(ClonedPed) | ||||
|             NetworkSetEntityInvisibleToNetwork(ClonedPed, true) | ||||
|             SetEntityCanBeDamaged(ClonedPed, false) | ||||
|             SetBlockingOfNonTemporaryEvents(ClonedPed, true) | ||||
|             SetEntityAlpha(ClonedPed, 254, false) | ||||
|             SetEntityCollision(ClonedPed, false, false) | ||||
|  | ||||
|             ShowPed = true | ||||
|  | ||||
|             local positionBuffer = {} | ||||
|             local bufferSize = 5 | ||||
|  | ||||
|             while ShowPed do | ||||
|                 local screencoordsX = zoom and 0.6 or 0.65135417461395 | ||||
|                 local screencoordsY = zoom and 1.9 or 0.77 | ||||
|  | ||||
|                 if Config.MenuPosition == "left" then | ||||
|                     screencoordsX = 1.0 - screencoordsX | ||||
|                 end | ||||
|  | ||||
|                 local world, normal = GetWorldCoordFromScreenCoord(screencoordsX, screencoordsY) | ||||
|                 local depth = zoom and 2.0 or 3.5 | ||||
|                 local target = world + normal * depth | ||||
|                 local camRot = GetGameplayCamRot(2) | ||||
|  | ||||
|                 table.insert(positionBuffer, target) | ||||
|                 if #positionBuffer > bufferSize then | ||||
|                     table.remove(positionBuffer, 1) | ||||
|                 end | ||||
|  | ||||
|                 local averagedTarget = vector3(0, 0, 0) | ||||
|                 for _, position in ipairs(positionBuffer) do | ||||
|                     averagedTarget = averagedTarget + position | ||||
|                 end | ||||
|                 averagedTarget = averagedTarget / #positionBuffer | ||||
|  | ||||
|                 SetEntityCoords(ClonedPed, averagedTarget.x, averagedTarget.y, averagedTarget.z, false, false, false, true) | ||||
|                 local heading_offset = Config.MenuPosition == "left" and 170.0 or 190.0 | ||||
|                 SetEntityHeading(ClonedPed, camRot.z + heading_offset) | ||||
|                 SetEntityRotation(ClonedPed, camRot.x * (-1), 0.0, camRot.z + 170.0, 2, false) | ||||
|  | ||||
|                 Wait(4) | ||||
|             end | ||||
|  | ||||
|             DeleteEntity(ClonedPed) | ||||
|             ClonedPed = nil | ||||
|         end) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function ClosePedMenu() | ||||
|     if not Config.PreviewPed then return end | ||||
|  | ||||
|     if ClonedPed then | ||||
|         ShowPed = false | ||||
|         ClearPedTaskPreview() | ||||
|         DeleteEntity(ClonedPed) | ||||
|     end | ||||
| end | ||||
|  | ||||
| function ClearPedTaskPreview() | ||||
|     if not Config.PreviewPed then return end | ||||
|  | ||||
|     if ClonedPed then | ||||
|         DestroyAllProps(true) | ||||
|         ClearPedTasksImmediately(ClonedPed) | ||||
|     end | ||||
| end | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Nordi98
						Nordi98