-- AD Cache -- Fælles korttids-cache for dyre opslag (markør -> station, salgssteder, identify, Wait-punkter, lagre). -- Holdende vogne genplanlægger hvert 5. s og slog de samme ting op igen og igen (markører x stationer x -- triggere) -> hak (in-game 26/9). Verden ændrer sig ikke så hurtigt. Uden spillets tid (tests) caches -- intet, så adfærden er som før. "Intet fundet" gemmes også. ADCache = {} ADCache.buckets = {} -- tændes af ADSmartPickup når hooksene er installeret (i spillet); tests kører uden cache ADCache.enabled = false local NOTHING = {} -- Til moduler der indlæses uden adCache (tests): kald fn direkte. function ADCacheGet(bucket, key, ttlMs, fn) if ADCache == nil or not ADCache.enabled then return fn() end return ADCache.get(bucket, key, ttlMs, fn) end local function now() local mission = g_currentMission if mission ~= nil and type(mission.time) == "number" then return mission.time end return nil end -- Resultatet af fn() for (bucket, key), genbrugt i ttlMs. function ADCache.get(bucket, key, ttlMs, fn) local time = now() if not ADCache.enabled or time == nil or key == nil then return fn() end local store = ADCache.buckets[bucket] if store == nil then store = {size = 0, entries = {}} ADCache.buckets[bucket] = store end local entry = store.entries[key] if entry ~= nil and time - entry.at < ttlMs then if entry.value == NOTHING then return nil end return entry.value end local value = fn() if entry == nil then store.size = store.size + 1 if store.size > 5000 then store.entries, store.size = {}, 1 end end -- spredt udløb (levetid +0-50 %): poster der blev lavet i samme kald, udløber ikke i samme frame -- (simulering 26/9: 600 markør-opslag udløb samtidig -> hak hvert 10. s) store.entries[key] = {value = value == nil and NOTHING or value, at = time + math.random() * ttlMs * 0.5} return value end function ADCache.clear(bucket) if bucket == nil then ADCache.buckets = {} else ADCache.buckets[bucket] = nil end end