1
0
mirror of https://github.com/metrostroi-repo/MetrostroiAddon.git synced 2026-05-02 00:42:29 +00:00

release branch init

This commit is contained in:
g_brzhezinskiy
2021-01-02 15:32:05 +03:00
parent 1d05caf866
commit 09566ce158
398 changed files with 8389 additions and 77275 deletions

View File

@@ -26,120 +26,4 @@ if not math.InRange then
local hpw,hph = pw/2,ph/2
return (px-hpw < x and x < px+hpw) and (py-hph < y and y < py+hph)
end
end
function Metrostroi.SortInSpawner(ent,id,name)
if not ent.Spawner then return end
local spawnerLine
for _,var in ipairs(ent.Spawner) do
if var[1] == id and type(var[4]) == "table" then
spawnerLine = var
if not spawnerLine.original then
spawnerLine.original = table.Copy(var[4])
spawnerLine.custom = {}
end
break
end
end
if not spawnerLine then return end
local retID = table.KeyFromValue(spawnerLine[4],name)
if not retID then
table.insert(spawnerLine.custom,name)
table.sort(spawnerLine.custom)
spawnerLine[4] = {}
table.Add(spawnerLine[4],spawnerLine.original)
table.Add(spawnerLine[4],spawnerLine.custom)
retID = table.KeyFromValue(spawnerLine[4],name)
end
return retID,#spawnerLine[4]
end
--CHECK ME
Metrostroi.PatchedENTCache = Metrostroi.PatchedENTCache or {}
local MetrostroiENTCache = Metrostroi.PatchedENTCache
local function updateMeta()
local meta = table.Copy(FindMetaTable("Entity"))
function meta:__index( key )
--__index function patch, because builtin function have shit with :GetTable,
--which is slow, so i precache GetTable's result and use cached version of it
local val = meta[ key ]
if val ~= nil then return val end
if not MetrostroiENTCache[self] then return end --FIXME какова хуя сука, почему оно становится невалидным :AAAA:
val = MetrostroiENTCache[self][key]
if val ~= nil then return val end
if key == "Owner" then return meta.GetOwner(self) end
end
Metrostroi.PatchedMetatable = meta
end
hook.Add("OnGamemodeLoaded","MetrostroiOptimisationPatch",updateMeta)
updateMeta()
timer.Create("MetrostroiCacheWatchdog", 1, 0, function()
for ent in pairs(MetrostroiENTCache) do
if not IsValid(ent) then
MetrostroiENTCache[ent] = nil
print("Cleared cache",ent)
end
end
end)
function Metrostroi.OptimisationPatch(ent)
if true or ent then
--[[MetrostroiENTCache[ent] = ent:GetTable()
debug.setmetatable(ent,Metrostroi.PatchedMetatable)
print(tostring(ent).." patched...")]]
return
end
if not ENT then error("This function must be runned at the end of entity initialisation") end
if not ENT.Initialize then error("Can't get ENT.Initialize. Maybe you running function too early?") end
print(ENT.Folder.." added to patched entities...")
ENT.MetrostroiUnPatchedInitialize = ENT.Initialize
ENT.Initialize = function(self,...)
--[[local jitEnabled = jit.status()
print(jitEnabled and "JIT was enabled" or "JIT was disabled")
jit.on()
local x
local arr = self:GetTable()
for i=1,1000000 do
arr["i1"..i] = i*2
arr["i2"..i] = i*2
arr["i3"..i] = i*2
end
local time = SysTime()
for i=1,1000000 do
x = self["i3"..i]--*self["i3"..i]/self["i3"..i]^self["i3"..i]
end
local elapsed1 = SysTime()-time
print("Before patch:"..elapsed1)
local time = SysTime()
for i=1,1000000 do
x = arr["i2"..i]--*arr["i3"..i]/self["i3"..i]^self["i3"..i]
end
local elapsed3 = SysTime()-time
print("Direct access:"..elapsed3)
__MetrostroiENTCache[self] = self:GetTable()
debug.setmetatable(self,Metrostroi.PatchedMetatable)
local time = SysTime()
for i=1,1000000 do
x = self["i1"..i]--*self["i3"..i]/self["i3"..i]^self["i3"..i]
end
local elapsed2 = SysTime()-time
print("After patch:"..elapsed2)
print(Format("Patch is faster by %d%%\nPatch is faster than direct access by %d%%",elapsed1/elapsed2*100,elapsed3/elapsed2*100))
print("BASE",getmetatable(self))
jit.on()]]
MetrostroiENTCache[self] = self:GetTable()
debug.setmetatable(self,Metrostroi.PatchedMetatable)
return self:MetrostroiUnPatchedInitialize(...)
end
end