mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
453 lines
18 KiB
Lua
453 lines
18 KiB
Lua
--[[-------------------------------------------------------------------------
|
|
Addons checker for metrostroi addon
|
|
---------------------------------------------------------------------------]]
|
|
CreateClientConVar("metrostroi_addons_check_skip_error",0,true)
|
|
CreateClientConVar("metrostroi_addons_check_ignore",0,true)
|
|
|
|
if SERVER then return end
|
|
local RequiredAddons = {
|
|
{
|
|
--main
|
|
wsid = 261801217,
|
|
additional = {
|
|
"models/metrostroi/passengers/f1.mdl",
|
|
"models/metrostroi/passengers/f4.mdl",
|
|
"models/metrostroi/passengers/m3.mdl",
|
|
"models/metrostroi/signals/light_path.mdl",
|
|
"models/metrostroi/tracks/dead_end.mdl",
|
|
"models/metrostroi/tatra_t3/tatra_t3.mdl",
|
|
"models/metrostroi/tracks/u002.mdl",
|
|
"models/metrostroi/tracks/tunnel512_double_end.mdl",
|
|
"models/z-o-m-b-i-e/metro_2033/electro/m33_transformator_01_1.mdl",
|
|
"materials/metrostroi/metro_contactrail_001.vmt",
|
|
"maps/gm_metrostroi_b46_lite.bsp",
|
|
"resource/fonts/iee1.ttf"
|
|
}
|
|
},
|
|
{
|
|
--part1
|
|
wsid = 1095094174,
|
|
additional = {
|
|
"materials/models/metrostroi_train/81-717/703windows.vmt",
|
|
"materials/models/metrostroi_train/81-717/717_breakers_s.vtf",
|
|
"materials/models/metrostroi_train/81-717/717_classic2_n.vtf",
|
|
"materials/models/metrostroi_train/81-717/cabine_1006.vtf",
|
|
"materials/models/metrostroi_train/81-717/pa_markers.vmt",
|
|
"materials/models/metrostroi_train/81-717/buttons/lamps_spb_panel.vmt",
|
|
"materials/models/metrostroi_train/81-717/pult/pult_panel_spb_blue_n.vtf",
|
|
"materials/models/metrostroi_train/81-717/screens/pa/question.vtf",
|
|
"materials/models/metrostroi_train/81-717/segments_spb/m2.vtf",
|
|
}
|
|
},
|
|
{
|
|
--part2
|
|
wsid = 1095098251,
|
|
additional = {
|
|
"materials/metrostroi_skins/81-720_schemes/b50_1.vtf",
|
|
"materials/models/metrostroi_train/81-722/apparats2.vtf",
|
|
"materials/models/metrostroi_train/81-722/cabin_n.vmt",
|
|
"materials/models/metrostroi_train/81-722/scepka.vtf",
|
|
"materials/models/metrostroi_train/81-722/screens/failures.vtf",
|
|
"models/metrostroi_train/81-717/pult/ars_mvm_old.mdl",
|
|
"models/metrostroi_train/81-720/81-720.phy",
|
|
"models/metrostroi_train/81-720/route/route1.dx90.vtx",
|
|
"models/metrostroi_train/81-722/81-722_kran.mdl",
|
|
"models/metrostroi_train/81-722/digits/digit.mdl",
|
|
|
|
}
|
|
},
|
|
{
|
|
--part3
|
|
wsid = 1095100683,
|
|
additional = {
|
|
"materials/models/metrostroi_train/81_718/1002.vmt",
|
|
"materials/models/metrostroi_train/81_718/marshrut_body_n.vtf",
|
|
"materials/models/metrostroi_train/81-710/508t_blue.vmt",
|
|
"materials/models/metrostroi_train/81-710/710_echs.vtf",
|
|
"materials/models/metrostroi_train/equipment/rri_n.vtf",
|
|
"materials/models/metrostroi_train/equipment/tab_e0.vtf",
|
|
"materials/models/metrostroi_train/reversor/revers_gold.vmt",
|
|
"models/metrostroi_train/81-710/81-508t.phy",
|
|
"models/metrostroi_train/81-718/81-718_int.mdl",
|
|
"models/metrostroi_train/81-718/labels/destination.dx80.vtx",
|
|
"models/metrostroi_train/equipment/arrow_bc_old.dx90.vtx",
|
|
"models/metrostroi_train/equipment/button_ezh_6.vvd",
|
|
"models/metrostroi_train/reversor/reversor_collection_box2_cover.mdl"
|
|
}
|
|
},
|
|
{
|
|
--part4
|
|
wsid = 1095105863,
|
|
additional = {
|
|
"materials/models/metrostroi_train/cabin717_030.vtf",
|
|
"materials/models/metrostroi_train/switches/vud.vtf",
|
|
"materials/models/metrostroi_train/common/lamps/svetodiod.vmt",
|
|
"materials/models/metrostroi_train/bogey/couple_s.vtf",
|
|
"materials/models/metrostroi_train/81-707/pipes_n.vtf",
|
|
"materials/models/metrostroi_train/81-703/int1.vmt",
|
|
"models/metrostroi_train/81-703/81-703.phy",
|
|
"models/metrostroi_train/81-707/ezh_lamp_0.mdl",
|
|
"models/metrostroi_train/bogey/disconnect_valve_blue.dx90.vtx",
|
|
"models/metrostroi_train/common/routes/ezh/route_holder.dx80.vtx",
|
|
}
|
|
},
|
|
{
|
|
--part5
|
|
wsid = 1095109617,
|
|
additional = {
|
|
"materials/models/metrostroi/re_sign/re_sign_light_off.vmt",
|
|
"materials/models/metrostroi_schemes/map_2.vtf",
|
|
"materials/models/metrostroi_train/81/18_det.vmt",
|
|
"materials/models/metrostroi_train/81-502/labels/label_1.vtf",
|
|
"materials/models/metrostroi_train/81-508/81-509_line4.vmt",
|
|
"materials/models/metrostroi_train/81-702/body_n.vtf",
|
|
"materials/models/metrostroi_train/81-720/labels/label_empty.vmt",
|
|
"models/metrostroi_train/81/button_light.mdl",
|
|
"models/metrostroi_train/81-502/81-502.phy",
|
|
"models/metrostroi_train/81-502/indicators/ars_0.dx80.vtx",
|
|
"models/metrostroi_train/81-508/81-508_underwagon.dx90.vtx",
|
|
"models/metrostroi_train/81-702/81-702_red_light.vvd",
|
|
}
|
|
},
|
|
{
|
|
--part 6
|
|
wsid = 1095111608,
|
|
additional = {
|
|
"materials/metrostroi_arm/2-switch_half.vtf",
|
|
"materials/cyber_metrostroi/pc_arm/screen_arm.vmt",
|
|
"models/cyber_metrostroi/pc_arm/pc_body.mdl",
|
|
"models/metrostroi/re_sign/signal_outdoor_35.sw.vtx",
|
|
"sound/udochka_connect.wav",
|
|
"sound/subway_trains/718/tisu.wav",
|
|
"sound/subway_trains/722/kuau/x_xp2.mp3",
|
|
"sound/subway_trains/bogey/brake_squeal2.mp3",
|
|
"sound/subway_trains/common/junk/junk_enginestart_speed3.mp3",
|
|
"sound/subway_trains/717/bpsn/bpsn_old.wav",
|
|
"sound/subway_trains/502/ring_ksaup.wav",
|
|
|
|
}
|
|
},
|
|
--[[ {
|
|
--Scripts
|
|
wsid = 1095130789,
|
|
additional = {
|
|
"lua/autorun/metrostroi.lua",
|
|
"lua/entities/gmod_mus_clock_analog/init.lua",
|
|
"lua/entities/gmod_subway_81-717_mvm/init.lua",
|
|
"lua/entities/gmod_track_signal/shared.lua",
|
|
"lua/metrostroi/skins/default.lua",
|
|
"lua/metrostroi/systems/sys_81_720_electric.lua",
|
|
"lua/metrostroi/systems/sys_als_ars.lua",
|
|
"lua/metrostroi/sv_railnetwork.lua",
|
|
"lua/metrostroi/sv_turbostroi.lua",
|
|
"lua/metrostroi_data/languages/en_base.lua",
|
|
"lua/ulx/modules/sh/metrostroi.lua",
|
|
"lua/weapons/gmod_tool/stools/switch.lua"
|
|
|
|
}
|
|
},--]]
|
|
{
|
|
--Github check
|
|
name = "Metrostroi Github",
|
|
additional = {
|
|
"lua/entities/gmod_subway_rusich/cl_init.lua",
|
|
"lua/entities/gmod_subway_ema/init.lua",
|
|
"lua/entities/gmod_subway_ema508t/shared.lua",
|
|
"lua/entities/gmod_subway_em508/cl_init.lua",
|
|
"lua/entities/gmod_subway_em508_int/init.lua",
|
|
"lua/metrostroi/systems/sys_81_704_panel.lua",
|
|
"lua/metrostroi/systems/sys_81_717lvz_panel.lua",
|
|
"lua/metrostroi/systems/sys_noars.lua",
|
|
"sound/subway_announcer_riu/arr_108.mp3",
|
|
"sound/subway_announcer_pnm/00_06.mp3",
|
|
},
|
|
reason="Workshop.ErrorGithub",
|
|
single = true,
|
|
},
|
|
{
|
|
--Legacy version
|
|
wsid = 1098448386,
|
|
additional = {
|
|
"lua/entities/gmod_subway_81-717/cl_init.lua",
|
|
"lua/entities/gmod_subway_81-717/init.lua",
|
|
"lua/entities/gmod_subway_81-714/shared.lua",
|
|
"lua/entities/gmod_subway_81-714/cl_init.lua",
|
|
"sound/subway_announcer/02_02.mp3",
|
|
},
|
|
reason="Workshop.ErrorLegacy",
|
|
single = true,
|
|
},
|
|
{
|
|
--Old content
|
|
additional = {
|
|
"materials/models/metrostroi_train/81-702/apparats.vmt",
|
|
"materials/models/metrostroi_train/81-702/apparats_n.vtf",
|
|
"materials/models/metrostroi_train/81-702/body.vtf",
|
|
"models/metrostroi_train/81-717/81-717.mdl",
|
|
},
|
|
reason="Workshop.ErrorOld",
|
|
},
|
|
{
|
|
--Some effects enhancers
|
|
wsid = 259517980,
|
|
reason="Workshop.ErrorEnhancers",
|
|
},
|
|
{
|
|
--Some effects enhancers
|
|
wsid = 111396485,
|
|
reason="Workshop.ErrorEnhancers",
|
|
},
|
|
{
|
|
--Driveable trams
|
|
wsid = 707998439,
|
|
reason="Workshop.Error1",
|
|
single = true,
|
|
},
|
|
{
|
|
--Train bogey entity
|
|
wsid = 1434772621,
|
|
reason="Workshop.Error1",
|
|
single = true,
|
|
},
|
|
{
|
|
--Gm_mus_orange_c_long
|
|
wsid = 793374567,
|
|
reason="Workshop.Error1",
|
|
single = true,
|
|
},
|
|
}
|
|
|
|
|
|
local function drawText(panel,text,color,font)
|
|
local addonWarn = vgui.Create("DLabel",panel)
|
|
addonWarn:Dock( TOP )
|
|
addonWarn:SetFont(font or "DermaDefault")
|
|
addonWarn:SetTextColor(color or Color(0,0,0))
|
|
addonWarn:SetText(text or "N\\A")
|
|
addonWarn:DockMargin( 0, -4, 0, -4)
|
|
addonWarn:DockPadding( 0, -4, 0, -4)
|
|
end
|
|
function vgui.MetrostroiDrawCutText(panel,text,color,font)
|
|
if text:find("\n") then
|
|
for k,v in pairs(string.Explode("\n",text)) do
|
|
vgui.MetrostroiDrawCutText(panel,v,color,font)
|
|
end
|
|
return
|
|
end
|
|
|
|
surface.SetFont(font or "DermaDefault")
|
|
local doneText,width = "",0
|
|
for i,v in pairs(string.Explode(" ",text)) do
|
|
local phraseWidth = surface.GetTextSize(v)
|
|
if width + phraseWidth < 390 then
|
|
doneText = doneText.." "..v
|
|
width=width+phraseWidth
|
|
elseif width ~= 0 then
|
|
drawText(panel,doneText,color,font)
|
|
doneText = v
|
|
width=phraseWidth
|
|
else
|
|
doneText = v
|
|
width = phraseWidth
|
|
break
|
|
end
|
|
end
|
|
if #doneText > 0 and width > 390 then
|
|
local fr = 1
|
|
for ls=1,#doneText do
|
|
local phraseWidth = surface.GetTextSize(doneText:sub(fr,ls))
|
|
if phraseWidth > 390 then
|
|
drawText(panel,doneText:sub(fr,ls-1),color,font)
|
|
doneText = doneText:sub(ls,-1)
|
|
end
|
|
end
|
|
end
|
|
if #doneText > 0 then
|
|
drawText(panel,doneText,color,font)
|
|
end
|
|
end
|
|
local WaitAddons = 0
|
|
local function showAddons(ply)
|
|
for _,v in ipairs(RequiredAddons) do
|
|
v.error = nil; v.message = nil
|
|
--Check some files in addon, if we install to addons folder
|
|
local installed = -1
|
|
if v.additional and #v.additional > 0 then
|
|
installed=0
|
|
for _,path in ipairs(v.additional) do
|
|
if not file.Exists( path, "GAME") then --[[ print(v.name,path)--]] break end
|
|
installed = installed+1
|
|
end
|
|
end
|
|
|
|
if installed~=-1 then
|
|
if installed<#v.additional and not v.reason and (v.downloaded and v.mounted or not v.filename) then
|
|
v.error = true
|
|
if v.filename then
|
|
v.message = "Workshop.FilesMissing"
|
|
else
|
|
v.message = "Workshop.FilesMissingLocaly"
|
|
end
|
|
elseif installed>=#v.additional and not v.mounted then
|
|
v.error = v.reason~=nil
|
|
v.message = v.reason or "Workshop.InstalledLocaly"
|
|
end
|
|
end
|
|
if not v.message and v.wsid then
|
|
if v.reason then
|
|
v.error = v.downloaded and v.mounted
|
|
v.message = v.error and v.reason or "Workshop.NotInstalled"
|
|
else
|
|
v.error = not v.downloaded or not v.mounted
|
|
v.message = not v.downloaded and "Workshop.NotInstalledE" or not v.mounted and "Workshop.Disabled" or "Workshop.Installed"
|
|
end
|
|
elseif v.reason and not v.message then
|
|
v.error = false
|
|
v.message = "Workshop.NotInstalled"
|
|
end
|
|
if v.message then
|
|
v.message = Metrostroi.GetPhrase(v.message)
|
|
else
|
|
v.message = Metrostroi.GetPhrase("N\\A")
|
|
end
|
|
if GetConVarNumber("metrostroi_addons_check_ignore") > 0 and (v.error or not v.message) then
|
|
RunConsoleCommand("metrostroi_addons_check_ignore",0)
|
|
end
|
|
end
|
|
if GetConVarNumber("metrostroi_addons_check_ignore") > 0 and not ply or WaitAddons > 0 then return end
|
|
|
|
if IsValid(MetrostroiWorkshopVGUI) then MetrostroiWorkshopVGUI:Close() end
|
|
local badCount = 0
|
|
for i,a in ipairs(RequiredAddons) do if a.error or a.message == "N\\A" then badCount = badCount + 1 end end
|
|
local frame = vgui.Create("DFrame")
|
|
MetrostroiWorkshopVGUI = frame
|
|
frame:SetDeleteOnClose(true)
|
|
frame:SetTitle(Metrostroi.GetPhrase("Workshop.Title"))
|
|
frame:SetSize(0, 0)
|
|
frame:SetDraggable(true)
|
|
frame:SetSizable(false)
|
|
frame:MakePopup()
|
|
--text:SetText(Metrostroi.GetPhrase("Workshop.Warn"))
|
|
|
|
local scrollPanel = vgui.Create( "DScrollPanel", frame )
|
|
--scrollPanel:SetMinimumSize(nil,450)
|
|
for i,a in ipairs(RequiredAddons) do
|
|
if badCount ~= 0 and not showall and GetConVarNumber("metrostroi_addons_check_skip_error") > 0 and not a.error and a.message ~= "N\\A" or not a.error and a.reason then continue end
|
|
|
|
--local a = v[1]
|
|
local addon = vgui.Create("DPanel")
|
|
addon:Dock( TOP )
|
|
addon:DockMargin( 5, 0, 5, 5 )
|
|
addon:DockPadding( 5, 5, 5, 5 )
|
|
|
|
if a.notlocaly and a.message ~= "N\\A" then
|
|
local openLink = vgui.Create("DButton",addon)
|
|
openLink:Dock(RIGHT)
|
|
openLink:SetText(Metrostroi.GetPhrase("Workshop.Open"))
|
|
openLink:DockPadding( 5, 5, 5, 5 )
|
|
openLink:SizeToContents()
|
|
openLink:SetContentAlignment(5)
|
|
openLink.id = a.wsid
|
|
function openLink:DoClick()
|
|
steamworks.ViewFile(self.id)
|
|
end
|
|
end
|
|
|
|
|
|
--vgui.MetrostroiDrawCutText(addon,Metrostroi.GetPhrase("Workshop.Warning"),false,"DermaDefaultBold")
|
|
vgui.MetrostroiDrawCutText(addon,a.name or "N\\A",false,"DermaDefaultBold")
|
|
vgui.MetrostroiDrawCutText(addon,Format(a.message,a.filename),a.message == "N\\A" and Color(175,150,0) or a.error and Color(150,0,0) or Color(0,150,0),"DermaDefaultBold")
|
|
if a.error and not scrollPanel.ScrollTo then scrollPanel.ScrollTo = addon end
|
|
|
|
--[[ Metrostroi.GetPhrase("Workshop.Warning").."\n"
|
|
..a.name.."\n"
|
|
..a.badreason.."\n"--]]
|
|
--addonWarn:SetFont("DermaDefaultBold")
|
|
--addonWarn:SetAutoStretchVertical(true)
|
|
--[[ local addonName = vgui.Create("DLabel",addon)
|
|
addonName:SetWrap(true)
|
|
addonName:SetTextColor(Color(0,0,0))
|
|
addonName:SetTextInset( 0, 0 )
|
|
addonName:SetText(a.name)
|
|
addonName:SetFont("DermaDefaultBold")
|
|
addonName:SetContentAlignment(5)
|
|
addonName:SetAutoStretchVertical(true)
|
|
addonName:Dock( TOP )
|
|
addonName:StretchToParent()
|
|
--addonName:SizeToChildren(true,true)
|
|
local addonErr = vgui.Create("DLabel",addon)
|
|
addonErr:SetWrap(true)
|
|
addonErr:SetTextColor(Color(255,0,0))
|
|
addonErr:SetTextInset( 0, 0 )
|
|
addonErr:SetText(a.badreason)
|
|
addonErr:SetFont("DermaDefaultBold")
|
|
addonErr:SetContentAlignment(5)
|
|
addonErr:SetAutoStretchVertical(true)
|
|
addonErr:Dock( TOP )
|
|
addonErr:StretchToParent()--]]
|
|
--addonErr:SizeToChildren(true,true)
|
|
|
|
addon:InvalidateLayout( true )
|
|
addon:SizeToChildren(true,true )
|
|
scrollPanel:AddItem(addon)
|
|
end
|
|
scrollPanel:Dock( FILL )
|
|
scrollPanel:InvalidateLayout( true )
|
|
scrollPanel:SizeToChildren(false,true)
|
|
local spPefromLayout = scrollPanel.PerformLayout
|
|
function scrollPanel:PerformLayout()
|
|
spPefromLayout(self)
|
|
if not self.First then self.First = true return end
|
|
local x,y = scrollPanel:ChildrenSize()
|
|
if self.Centered then return end
|
|
self.Centered = true
|
|
frame:SetSize(512,math.min(350,y)+35)
|
|
frame:Center()
|
|
if self.ScrollTo then self:ScrollToChild(self.ScrollTo) end
|
|
end
|
|
--frame:InvalidateLayout( true )
|
|
--frame:SizeToChildren(false,true )
|
|
if badCount == 0 then
|
|
RunConsoleCommand("metrostroi_addons_check_ignore",1)
|
|
end
|
|
end
|
|
|
|
local function checkAddons(ply)
|
|
if not Metrostroi then return end
|
|
for kr,v in ipairs(RequiredAddons) do
|
|
if v.single and not game.SinglePlayer() then continue end
|
|
v.filename = nil; v.downloaded = nil; v.downloaded = nil; v.mounted = nil; v.error = nil; v.message = nil
|
|
--find our addon installed from workshop
|
|
local founded = false
|
|
for ka,a in pairs(engine.GetAddons()) do
|
|
if v.wsid and tonumber(a.wsid) == v.wsid then
|
|
v.name = a.title
|
|
v.filename = a.file
|
|
v.downloaded = a.downloaded
|
|
v.mounted = a.mounted
|
|
founded = true
|
|
v.notlocaly = true
|
|
end
|
|
end
|
|
if not founded and v.wsid then
|
|
WaitAddons = WaitAddons+1
|
|
steamworks.FileInfo(v.wsid, function(a)
|
|
v.name = a.title
|
|
v.downloaded = a.installed
|
|
v.mounted = a.disabled
|
|
v.notlocaly = true
|
|
WaitAddons = WaitAddons-1
|
|
if WaitAddons<=0 then
|
|
showAddons(ply)
|
|
return
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
showAddons(ply)
|
|
end
|
|
checkAddons()
|
|
hook.Add("MetrostroiLoaded","AddonsChecked",checkAddons)
|
|
concommand.Add("metrostroi_addons_check",checkAddons,nil,"Run addons check")
|
|
|