Files
wnsrc/lua/autorun/pac_restart.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

278 lines
7.4 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
AddCSLuaFile()
if SERVER then
return
end
local sv_allowcslua = GetConVar('sv_allowcslua')
local prefer_local_version = CreateClientConVar("pac_restart_prefer_local_version", "0")
function _G.pac_ReloadParts()
local pacLocal = _G.pac
local _, dirs = file.Find("addons/*", "MOD")
for _, dir in ipairs(dirs) do
if file.Exists("addons/" .. dir .. "/lua/autorun/pac_editor_init.lua", "MOD") then
pacLocal.Message("found PAC3 in garrysmod/addons/" .. dir)
local old_include = _G.include
local function include(path, ...)
local new_path = path
if not file.Exists("addons/" .. dir .. "/lua/" .. path, "MOD") then
local src = debug.getinfo(2).source
local lua_dir = src:sub(2):match("(.+/)")
if lua_dir:StartWith("addons/" .. dir) then
lua_dir = lua_dir:match("addons/.-/lua/(.+)")
end
new_path = lua_dir .. path
end
if file.Exists("addons/" .. dir .. "/lua/" .. new_path, "MOD") then
local str = file.Read("addons/" .. dir .. "/lua/" .. new_path, "MOD")
if str then
local func = CompileString(str, "addons/" .. dir .. "/lua/" .. new_path)
if isfunction(func) then
local res = {pcall(func, ...)}
if res[1] then
return unpack(res, 2)
end
pacLocal.Message("pac_restart: pcall error: " .. res[2])
else
pacLocal.Message("pac_restart: compile string error: " .. func)
end
end
end
return old_include(path, ...)
end
_G.include = include
local ok, err = pcall(function()
pac.LoadParts()
end)
_G.include = old_include
break
end
end
end
function _G.pac_Restart()
PAC_MDL_SALT = PAC_MDL_SALT + 1
local editor_was_open
local prev_parts = {}
local pacLocal = _G.pac
local selected_part_uid
local model_browser_opened
if pace then
if pace.Editor and pace.Editor:IsValid() then
editor_was_open = true
if pace.current_part and pace.current_part:IsValid() then
selected_part_uid = pace.current_part:GetUniqueID()
end
for key, part in pairs(pac.GetLocalParts()) do
if not part:HasParent() and part:GetShowInEditor() then
local ok, err = pcall(function()
table.insert(prev_parts, part:ToTable())
end)
if not ok then print(err) end
end
end
end
if pace.model_browser and pace.model_browser:IsValid() and pace.model_browser:IsVisible() then
model_browser_opened = true
pace.model_browser:Remove()
end
end
if pac and pac.Disable then
pacLocal.Message("removing all traces of pac3 from lua")
pac.Disable()
pac.Panic()
if pace and pace.Editor then
editor_was_open = pace.Editor:IsValid()
pace.Panic()
end
for _, ent in pairs(ents.GetAll()) do
for k in pairs(ent:GetTable()) do
if k:sub(0, 4) == "pac_" then
ent[k] = nil
end
end
end
for hook_name, hooks in pairs(hook.GetTable()) do
for id, func in pairs(hooks) do
if isstring(id) and (id:StartWith("pace_") or id:StartWith("pac_") or id:StartWith("pac3_") or id:StartWith("pacx_")) then
hook.Remove(hook_name, id)
end
end
end
timer.Remove("pac_gc")
timer.Remove("pac_render_times")
timer.Remove("urlobj_download_queue")
_G.pac = nil
_G.pace = nil
_G.pacx = nil
collectgarbage()
end
_G.PAC_RESTART = true
if not prefer_local_version:GetBool() then
pacLocal.Message("pac_restart: not reloading from local version")
for _, path in ipairs((file.Find("autorun/pac*", "LUA"))) do
if path:EndsWith("_init.lua") and path ~= "pac_init.lua" then
include("autorun/" .. path)
end
end
elseif sv_allowcslua:GetBool() or LocalPlayer():IsSuperAdmin() then
local loadingHit = false
if sv_allowcslua:GetBool() then
pacLocal.Message("pac_restart: sv_allowcslua is on, looking for PAC3 addon..")
end
if LocalPlayer():IsSuperAdmin() then
pacLocal.Message("pac_restart: LocalPlayer() is superadmin, looking for PAC3 addon..")
end
local _, dirs = file.Find("addons/*", "MOD")
for _, dir in ipairs(dirs) do
if file.Exists("addons/" .. dir .. "/lua/autorun/pac_editor_init.lua", "MOD") then
pacLocal.Message("found PAC3 in garrysmod/addons/" .. dir)
local old_include = _G.include
local function include(path, ...)
local new_path = path
if not file.Exists("addons/" .. dir .. "/lua/" .. path, "MOD") then
local src = debug.getinfo(2).source
local lua_dir = src:sub(2):match("(.+/)")
if lua_dir:StartWith("addons/" .. dir) then
lua_dir = lua_dir:match("addons/.-/lua/(.+)")
end
new_path = lua_dir .. path
end
if file.Exists("addons/" .. dir .. "/lua/" .. new_path, "MOD") then
local str = file.Read("addons/" .. dir .. "/lua/" .. new_path, "MOD")
if str then
local func = CompileString(str, "addons/" .. dir .. "/lua/" .. new_path)
if isfunction(func) then
local res = {pcall(func, ...)}
if res[1] then
return unpack(res, 2)
end
pacLocal.Message("pac_restart: pcall error: " .. res[2])
else
pacLocal.Message("pac_restart: compile string error: " .. func)
end
end
end
pacLocal.Message("pac_restart: couldn't include " .. new_path .. " reverting to normal include")
return old_include(path, ...)
end
_G.include = include
for _, path in ipairs((file.Find("autorun/pac_*", "LUA"))) do
if path:EndsWith("_init.lua") and path ~= "pac_init.lua" then
pacLocal.Message("pac_restart: including autorun/" .. path .. "...")
local ok, err = pcall(function()
include("autorun/" .. path)
end)
if not ok then
pacLocal.Message("pac_restart: error when reloading pac " .. err)
end
end
end
_G.include = old_include
loadingHit = true
break
end
end
if not loadingHit then
pacLocal.Message("sv_allowcslua is not enabled or unable to find PAC3 in addons/, loading PAC3 again from server lua")
for _, path in ipairs((file.Find("autorun/pac*", "LUA"))) do
if path:EndsWith("_init.lua") and path ~= "pac_init.lua" then
include("autorun/" .. path)
end
end
end
end
_G.PAC_RESTART = nil
if editor_was_open then
pace.OpenEditor()
end
pac.Enable()
if prev_parts[1] then
pace.LoadPartsFromTable(prev_parts, true)
end
pacLocal.Message("pac_restart: done")
if selected_part_uid then
local part = pac.GetPartFromUniqueID(pac.Hash(pac.LocalPlayer), selected_part_uid)
if part and part:IsValid() then
pace.Call("PartSelected", part)
end
end
if model_browser_opened then
RunConsoleCommand("pac_asset_browser")
end
local msg = "*•.¸♥¸.•* IF YOU ARE USING PAC_RESTART TO FIX A BUG IT WOULD BE NICE IF YOU COULD ALSO REPORT THE BUG *•.¸♥¸.•*"
local words = msg:Split(" ")
for i2 = 1, 40 do
for i, word in ipairs(words) do
local f = i / #words
MsgC(HSVToColor(Lerp(f, 0, 360), 0.6, 1), word, " ")
end
MsgN("")
end
MsgC(Color(79,155,245), "https://github.com/CapsAdmin/pac3/issues", "\n")
MsgC(Color(79,155,245), "https://discord.com/invite/utpR3gJ", "\n")
MsgC(Color(79,155,245), "https://steamcommunity.com/sharedfiles/filedetails/?id=104691717", "\n")
MsgC(Color(79,155,245), "https://steamcommunity.com/id/eliashogstvedt", "\n")
end
concommand.Add("pac_restart", _G.pac_Restart)