Files
2026-08-05 01:29:39 +02:00

82 lines
2.6 KiB
Lua

local resourceName = GetCurrentResourceName()
local lastRestore = 0
local function restoreWorldStreaming(reason)
local ped = PlayerPedId()
if ped == 0 or not DoesEntityExist(ped) then return false end
-- A stale scripted focus/load-scene is one of the most common causes for
-- half-loaded streets after leaving an instanced interior.
NewLoadSceneStop()
ClearFocus()
ClearHdArea()
local coords = GetEntityCoords(ped)
RequestCollisionAtCoord(coords.x, coords.y, coords.z)
RequestAdditionalCollisionAtCoord(coords.x, coords.y, coords.z)
SetFocusEntity(ped)
local deadline = GetGameTimer() + 5000
while not HasCollisionLoadedAroundEntity(ped) and GetGameTimer() < deadline do
RequestCollisionAtCoord(coords.x, coords.y, coords.z)
RequestAdditionalCollisionAtCoord(coords.x, coords.y, coords.z)
Wait(0)
end
ClearFocus()
lastRestore = GetGameTimer()
if reason then
print(('[devx_ipl] Weltstreaming wiederhergestellt (%s).'):format(reason))
end
return HasCollisionLoadedAroundEntity(ped)
end
exports('RestoreWorldStreaming', restoreWorldStreaming)
RegisterNetEvent('devx_ipl:client:restoreWorld', function(reason)
CreateThread(function()
restoreWorldStreaming(reason or 'event')
end)
end)
RegisterCommand('fixworld', function()
CreateThread(function()
local ok = restoreWorldStreaming('command')
if GetResourceState('devx_core') == 'started' then
exports.devx_core:Notify(ok and 'Weltstreaming wurde neu aufgebaut.' or 'Kollision lädt noch. Bewege dich kurz oder verbinde dich neu.')
end
end)
end, false)
-- Do not globally request/remove apartment or mission IPLs here. Those IPLs
-- share hidden coordinates and were the source of overlapping geometry in the
-- earlier versions. Each feature now loads only what it needs, on demand.
CreateThread(function()
Wait(1500)
restoreWorldStreaming('resource-start')
print('[devx_ipl] DevX Streaming-Guard v0.4.3 aktiv. Keine globalen Apartment-/Warehouse-IPLs.')
end)
AddEventHandler('onClientResourceStart', function(resource)
if resource == resourceName and GetGameTimer() - lastRestore > 1000 then
CreateThread(function()
Wait(800)
restoreWorldStreaming('client-resource-start')
end)
end
end)
AddEventHandler('playerSpawned', function()
CreateThread(function()
Wait(1200)
restoreWorldStreaming('player-spawned')
end)
end)
AddEventHandler('devx_core:client:playerLoaded', function()
CreateThread(function()
Wait(800)
restoreWorldStreaming('character-loaded')
end)
end)