mirror of
https://github.com/metrostroi-repo/MetrostroiAddon.git
synced 2026-05-02 00:42:29 +00:00
643 lines
21 KiB
Lua
643 lines
21 KiB
Lua
include("shared.lua")
|
|
local MaxHorisontal = 14
|
|
local frame = nil
|
|
local pFrame = nil
|
|
local wFrame = nil
|
|
local MaxWagons = 0
|
|
local MaxWagonsOnPlayer = 0
|
|
local Settings = {
|
|
Train = 1,
|
|
WagNum = 3,
|
|
AutoCouple = true,
|
|
}
|
|
ENT.Settings = Settings
|
|
|
|
if not file.Exists("metrostroi_train_spawner.txt","DATA") then
|
|
file.Write("metrostroi_train_spawner.txt","")
|
|
end
|
|
|
|
local function UpdateConCMD()
|
|
file.Write("metrostroi_train_spawner.txt",util.TableToJSON(Settings,true))
|
|
--[[
|
|
for k,v in pairs(Settings) do
|
|
RunConsoleCommand("train_spawner_"..k:lower(), v)
|
|
end]]
|
|
end
|
|
|
|
local function LoadConCMD()
|
|
Settings = util.JSONToTable(file.Read("metrostroi_train_spawner.txt","DATA")) or Settings
|
|
if not Settings[Settings.Train] then Settings[Settings.Train] = {} end
|
|
--PrintTable(Settings)
|
|
end
|
|
local Pos = 0
|
|
local VGUI = {}
|
|
local function CreateList(name,text,tbl,OnSelect,stbl)
|
|
tbl = tbl or {}
|
|
stbl = stbl or Settings[Settings.Train]
|
|
if type(tbl)=="function" then tbl = tbl() or {} end
|
|
local count = 0;for k,v in pairs(tbl) do count = count+1 end
|
|
if count<=1 then
|
|
stbl[name] = next(tbl)
|
|
return
|
|
end
|
|
local ListLabel = vgui.Create("DLabel", frame)
|
|
-- ListLabel:SetPos(5 + 300*math.floor(Pos/MaxHorisontal), 24+24*(Pos%MaxHorisontal))
|
|
ListLabel:SetPos(5 + 270*math.floor(Pos/MaxHorisontal),24+24*(Pos%MaxHorisontal))
|
|
ListLabel:SetSize(115,28)
|
|
ListLabel:SetText(text)
|
|
ListLabel:SetExpensiveShadow(1,Color(0,0,0,200))
|
|
|
|
local List = vgui.Create("DComboBox", frame)--
|
|
List:SetTooltip(text)
|
|
List.Call = OnSelect
|
|
List:SetPos(130 + 270*math.floor(Pos/MaxHorisontal),28+24*(Pos%MaxHorisontal))
|
|
-- List:SetPos(130 + 300*math.floor(Pos/MaxHorisontal), 28+24*(Pos%MaxHorisontal))
|
|
List:SetWide(120)
|
|
if #tbl == count then
|
|
for i=1,#tbl do
|
|
List:AddChoice(tbl[i], i, stbl[name] == i)
|
|
end
|
|
else
|
|
for k,v in pairs(tbl) do
|
|
if type(v) == "table" and v.name then k = v.name end
|
|
List:AddChoice(v, k, stbl[name] == k)
|
|
end
|
|
end
|
|
if not List:GetOptionData(1) then ListLabel:Remove() List:Remove() return end
|
|
if not List:GetSelectedID() then
|
|
local done
|
|
for i,v in pairs(List.Choices) do
|
|
if v:find("Random") then
|
|
List:ChooseOptionID(i)
|
|
stbl[name] = List:GetOptionData(i)
|
|
done = true
|
|
break
|
|
end
|
|
end
|
|
if not done then
|
|
List:ChooseOptionID(1)
|
|
stbl[name] = List:GetOptionData(1)
|
|
end
|
|
end
|
|
List.OnSelect = function(self,_, _, index)
|
|
for _,v in ipairs(VGUI) do v(nil,nil,true) end
|
|
stbl[name] = index
|
|
if OnSelect then OnSelect(List,VGUI) end
|
|
end
|
|
List.ID = table.insert(VGUI,function(val, disabled, reset)
|
|
if reset then
|
|
if List.Disable then List:SetDisabled(false) end
|
|
elseif val or disabled then
|
|
if val ~= nil then List:ChooseOptionID(val) end
|
|
List:SetDisabled(disabled)
|
|
List.Disable = disabled
|
|
else
|
|
ListLabel:Remove()
|
|
List:Remove()
|
|
end
|
|
--local on = Types[Settings.Train]:find(name) and tbl
|
|
--List:SetVisible(on)
|
|
--ListLabel:SetVisible(on)
|
|
--if on then
|
|
--end
|
|
end)
|
|
VGUI[name] = List
|
|
Pos = Pos + 1
|
|
--if Types[Settings.Train]:find(name) and #tbl > 0 then Pos = Pos + 1 end
|
|
end
|
|
|
|
local function CreateSlider(name,decimals,min,max,text,OnSelect,stbl)
|
|
stbl = stbl or Settings[Settings.Train]
|
|
local Slider = vgui.Create("DNumSlider", frame)
|
|
Slider.Call = OnSelect
|
|
--Slider:SetPos(5 + 300*math.floor(Pos/MaxHorisontal), 28+24*(Pos%MaxHorisontal)-7)
|
|
Slider:SetPos(5 + 270*math.floor(Pos/MaxHorisontal), 28+24*(Pos%MaxHorisontal)-7+4)
|
|
Slider:SetWide(290)
|
|
Slider:SetTall(28)
|
|
Slider:SetMinMax(min, max)
|
|
Slider:SetDecimals(decimals)
|
|
Slider:SetText(text..":")
|
|
--if stbl[name] > max then stbl[name] = max end FIXME
|
|
Slider:SetValue(stbl[name])
|
|
Slider:SetTooltip(text)
|
|
Slider.Label:SetExpensiveShadow(1,Color(0,0,0,200))
|
|
Slider.Label:SetSize(125,28)
|
|
Slider.TextArea:SetTextColor(Slider.Label:GetTextColor())
|
|
|
|
--local _old = Slider.ValueChanged
|
|
function Slider:Think(...)
|
|
if not self.Editing and self:IsEditing() then
|
|
self.Editing = true
|
|
elseif self.Editing and not self:IsEditing() then
|
|
self.Editing = false
|
|
local val = self:GetValue()
|
|
if OnSelect then val = OnSelect(Slider,VGUI) or val end
|
|
stbl[name] = math.Round(val,decimals)
|
|
Slider:SetValue(stbl[name])
|
|
end
|
|
end
|
|
Slider.ID = table.insert(VGUI,function(val, disabled, reset)
|
|
if reset then
|
|
if Slider.Disable then Slider:SetDisabled(false) Slider.Disable = nil end
|
|
return
|
|
end
|
|
if val or disabled then
|
|
if val ~= nil then Slider:SetValue(val) end
|
|
Slider:SetDisabled(disabled)
|
|
Slider.Disable = disabled
|
|
return
|
|
end
|
|
Slider:Remove()
|
|
--local on = Types[Settings.Train]:find(name)
|
|
--Slider:SetVisible(on)
|
|
--if on then
|
|
--end
|
|
end)
|
|
VGUI[name] = Slider
|
|
Pos = Pos + 1
|
|
--if Types[Settings.Train]:find(name) then Pos = Pos + 1 end
|
|
end
|
|
|
|
local function CreateCheckBox(name,text,OnSelect,stbl)
|
|
stbl = stbl or Settings[Settings.Train]
|
|
--if not Types[Settings.Train]:find(name) then return end
|
|
local CBLabel = vgui.Create("DLabel", frame)--
|
|
CBLabel:SetPos(5 + 270*math.floor(Pos/MaxHorisontal),27+24*(Pos%MaxHorisontal)-4)
|
|
--CBLabel:SetPos(5 + 300*math.floor(Pos/MaxHorisontal), 25+24*(Pos%MaxHorisontal))
|
|
CBLabel:SetText(text)
|
|
CBLabel:SetWide(125)
|
|
CBLabel:SetTall(28)
|
|
CBLabel:ApplySchemeSettings(true)
|
|
--CBLabel:SetAutoStretchVertical(true)
|
|
CBLabel:SetExpensiveShadow(1,Color(0,0,0,200))
|
|
local CB = vgui.Create("DCheckBox", frame)
|
|
CB:SetTooltip(text)
|
|
CB.Call = OnSelect
|
|
CB:SetPos(130 + 270*math.floor(Pos/MaxHorisontal),31+24*(Pos%MaxHorisontal))
|
|
--CB:SetPos(130 + 300*math.floor(Pos/MaxHorisontal), 28+24*(Pos%MaxHorisontal))
|
|
CB:SetValue(stbl[name])
|
|
CB.OnChange = function(self)
|
|
for _,v in ipairs(VGUI) do v(nil,nil,true) end
|
|
stbl[name] = CB:GetChecked()
|
|
if OnSelect then OnSelect(CB,VGUI) end
|
|
end
|
|
CB.ID = table.insert(VGUI,function(val, disabled, reset)
|
|
if reset then
|
|
if CB.Disable then CB:SetDisabled(false) CB.Disable = nil end
|
|
return
|
|
end
|
|
if val or disabled then
|
|
if val ~= nil then CB:SetValue(val) end
|
|
CB:SetDisabled(disabled)
|
|
CB.Disable = disabled
|
|
return
|
|
end
|
|
CBLabel:Remove()
|
|
CB:Remove()
|
|
--local on = Types[Settings.Train]:find(name)
|
|
--CBLabel:SetVisible(on)
|
|
--CB:SetVisible(on)
|
|
--if on then
|
|
--end
|
|
end)
|
|
VGUI[name] = CB
|
|
Pos = Pos + 1
|
|
--if Types[Settings.Train]:find(name) then Pos = Pos + 1 end
|
|
end
|
|
|
|
local function UpdateTrainList(fromPresets)
|
|
Pos = 2
|
|
for k,v in ipairs(VGUI) do
|
|
if k > 2 then
|
|
v()
|
|
VGUI[k] = nil
|
|
end
|
|
end
|
|
if not VGUI.Train:GetSelectedID() then
|
|
VGUI.Train:ChooseOptionID(1)
|
|
Settings.Train = VGUI.Train:GetOptionData(1)
|
|
end
|
|
if not Settings[Settings.Train] then Settings[Settings.Train] = {} end
|
|
for k,name in pairs(Metrostroi.TrainClasses) do
|
|
local ENT = scripted_ents.Get(name)
|
|
if not ENT.Spawner or ENT.ClassName ~= Settings.Train then continue end
|
|
for i, menu in ipairs(ENT.Spawner) do
|
|
if menu[3] == "List" then
|
|
if Settings[Settings.Train][menu[1]] == nil then
|
|
Settings[Settings.Train][menu[1]] = menu[5]
|
|
end
|
|
CreateList(menu[1],menu[2],menu[4],menu[7])
|
|
elseif menu[3] == "Boolean" then
|
|
if Settings[Settings.Train][menu[1]] == nil then
|
|
Settings[Settings.Train][menu[1]] = menu[4]
|
|
end
|
|
CreateCheckBox(menu[1],menu[2],menu[6])
|
|
elseif menu[3] == "Slider" then
|
|
if Settings[Settings.Train][menu[1]] == nil then
|
|
Settings[Settings.Train][menu[1]] = menu[7]
|
|
end
|
|
CreateSlider(menu[1],menu[4],menu[5],menu[6],tostring(menu[2]))
|
|
--"NM",1,0.1,9,"Train Line Pressure"
|
|
elseif type(menu[1]) == "number" then
|
|
Pos=Pos+menu[1]
|
|
elseif #menu==0 then
|
|
Pos=Pos+1
|
|
end
|
|
--Trains[k] = v.SubwayTrain.Name
|
|
end
|
|
end
|
|
--defaults
|
|
for k,v in pairs(VGUI) do
|
|
if k ~= "Train" and type(v) ~= "function" and v.Call then v:Call(VGUI) end
|
|
end
|
|
VGUI.WagNum:ValueChanged()
|
|
frame:SetSize(262 + 262*math.floor((Pos-1)/MaxHorisontal)+10, 58+24*math.min(MaxHorisontal,Pos))
|
|
frame:Center()
|
|
if VGUI.Close then VGUI.Close() end
|
|
if VGUI.spawn then VGUI.spawn() end
|
|
if VGUI.Presets then VGUI.Presets() end
|
|
if VGUI.Wagons then VGUI.Wagons() end
|
|
if VGUI.PFrame and fromPresets ~= true then VGUI.PFrame(true) end
|
|
if VGUI.WFrame then VGUI.WFrame() end
|
|
end
|
|
local function Draw()
|
|
local Trains = {}
|
|
for _,name in pairs(Metrostroi.TrainClasses) do
|
|
local ENT = scripted_ents.Get(name)
|
|
if not ENT.Spawner or not ENT.SubwayTrain then continue end
|
|
local ENTl = list.Get("SpawnableEntities")[name]
|
|
--Trains[ENT.ClassName] = ENT.SubwayTrain.Name.."("..ENT.SubwayTrain.Manufacturer..")"
|
|
Trains[ENT.ClassName] = ENTl and ENTl.PrintName or ENT.Spawner and ENT.Spawner.Name or ENT.SubwayTrain.Name.."("..ENT.SubwayTrain.Manufacturer..")"
|
|
end
|
|
CreateList("Train",Format("%s(%d/%d)\n%s:%d",Metrostroi.GetPhrase("Spawner.Trains1"),GetGlobalInt("metrostroi_train_count"),MaxWagons,Metrostroi.GetPhrase("Spawner.Trains2"),MaxWagonsOnPlayer),Trains,UpdateTrainList,Settings)
|
|
CreateSlider("WagNum",0,1, GetGlobalInt("metrostroi_maxwagons"),Metrostroi.GetPhrase("Spawner.WagNum"),function(slider)
|
|
local WagNumTable
|
|
for k,name in pairs(Metrostroi.TrainClasses) do
|
|
local ENT = scripted_ents.Get(name)
|
|
if not ENT.Spawner or ENT.ClassName ~= Settings.Train then continue end
|
|
WagNumTable = ENT.Spawner.WagNumTable
|
|
break
|
|
end
|
|
if WagNumTable then
|
|
local retval = WagNumTable[1]
|
|
for i=2,#WagNumTable do
|
|
if WagNumTable[i] <= math.Round(slider:GetValue(),0) then
|
|
retval = WagNumTable[i]
|
|
end
|
|
end
|
|
return retval
|
|
end
|
|
end,Settings)
|
|
--CreateCheckBox("AutoCouple",Metrostroi.GetPhrase("Spawner.AutoCouple"),nil,Settings)
|
|
|
|
UpdateTrainList()
|
|
end
|
|
|
|
local function savePresetData(trainArr,presetArr)
|
|
for k,v in pairs(trainArr) do
|
|
if k == "Presets" or k == "Specials" then continue end
|
|
presetArr[k] = v
|
|
end
|
|
end
|
|
|
|
local function getPresetName(name, presets, ignoreOwn)
|
|
local maxrep = tonumber(name:match("(.+)[%s*]%((%d+)%)$")) or 0
|
|
|
|
for i,v in ipairs(presets) do
|
|
local name2,nameid = v.PresetName:match("(.+)[%s*]%((%d+)%)$")
|
|
if (not ignoreOwn or i ~= presets.Selected) and (v.PresetName == name or name2 == name) then
|
|
maxrep = math.max(1,tonumber(nameid) or 1)
|
|
end
|
|
end
|
|
return maxrep > 0 and Format("%s (%d)",name:match("(.+)[%s*]%(%d+%)$") or name,maxrep+1) or name
|
|
end
|
|
|
|
local function createPresetsFrame()
|
|
if IsValid(pFrame) then return end
|
|
pFrame = vgui.Create("DFrame",frame)
|
|
pFrame:SetTitle(Metrostroi.GetPhrase("Spawner.PresetTitle"))
|
|
pFrame:SetDrawOnTop(false)
|
|
pFrame.btnMaxim:SetVisible(false)
|
|
pFrame.btnMinim:SetVisible(false)
|
|
--frame:SetSize(275, 34+24*17)
|
|
pFrame:SetDraggable(true)
|
|
pFrame:SetSizable(false)
|
|
pFrame:MakePopup()
|
|
pFrame:SetZPos(frame:GetZPos()+1)
|
|
pFrame:SetSize(262+10, 58+24*1)
|
|
--pFrame:Center()
|
|
pFrame.OnRemove = function()
|
|
if IsValid(WFrame) then
|
|
VGUI.WFrame()
|
|
end
|
|
end
|
|
|
|
--[[local ListLabel = vgui.Create("DLabel", frame)
|
|
-- ListLabel:SetPos(5 + 300*math.floor(Pos/MaxHorisontal), 24+24*(Pos%MaxHorisontal))
|
|
ListLabel:SetPos(5 + 270*math.floor(Pos/MaxHorisontal),24+24*(Pos%MaxHorisontal))
|
|
ListLabel:SetSize(115,28)
|
|
ListLabel:SetText(text)
|
|
ListLabel:SetExpensiveShadow(1,Color(0,0,0,200))]]
|
|
|
|
local Presets = vgui.Create("DComboBox", pFrame)--
|
|
Presets:SetPos(5,28)
|
|
-- Presets:SetPos(130 + 300*math.floor(Pos/MaxHorisontal), 28+24*(Pos%MaxHorisontal))
|
|
Presets:SetWide(272-8-72-5)
|
|
|
|
|
|
local PAdd = vgui.Create("DButton", pFrame)
|
|
PAdd:SetWide(24)
|
|
PAdd:SetPos(272-7-72, 28)
|
|
PAdd:SetTooltip(Metrostroi.GetPhrase("Spawner.Preset.NewTooltip"))
|
|
PAdd:SetImage("icon16/add.png")
|
|
local PUpdate = vgui.Create("DButton", pFrame)
|
|
PUpdate:SetWide(24)
|
|
PUpdate:SetPos(272-6-48, 28)
|
|
PUpdate:SetTooltip(Metrostroi.GetPhrase("Spawner.Preset.UpdateTooltip"))
|
|
PUpdate:SetText("")
|
|
PUpdate:SetImage("icon16/arrow_refresh.png")
|
|
local PRemove = vgui.Create("DButton", pFrame)
|
|
PRemove:SetWide(24)
|
|
PRemove:SetPos(272-5-24, 28)
|
|
PRemove:SetTooltip(Metrostroi.GetPhrase("Spawner.Preset.RemoveTooltip"))
|
|
PRemove:SetText("")
|
|
PRemove:SetImage("icon16/cross.png")
|
|
|
|
local PNameLabel = vgui.Create("DLabel", pFrame)
|
|
PNameLabel:SetPos(5,24+24*1+4)
|
|
PNameLabel:SetSize(115,28)
|
|
PNameLabel:SetText(Metrostroi.GetPhrase("Spawner.Presets.Name"))
|
|
PNameLabel:SetWide(100)
|
|
PNameLabel:SetExpensiveShadow(1,Color(0,0,0,200))
|
|
local PName = vgui.Create("DTextEntry", pFrame)
|
|
PName:SetPos(132,24+24*1+4)
|
|
PName:SetSize(135,20)
|
|
PName:SetText("")
|
|
PName:SetPlaceholderText(Metrostroi.GetPhrase("Spawner.Presets.NamePlaceholder"))
|
|
|
|
Presets.OnSelect = function(pnl,i, text)
|
|
if i == 1 then
|
|
PName:SetText("My preset name")
|
|
else
|
|
local presets = Settings[Settings.Train] and Settings[Settings.Train].Presets
|
|
|
|
if presets and pnl.selected ~= -1 then
|
|
if not presets.Selected or presets.Selected == 0 then
|
|
if not presets[0] then presets[0] = {} end
|
|
savePresetData(Settings[Settings.Train],presets[0])
|
|
end
|
|
presets.Selected = i-2
|
|
for k,v in pairs(presets[presets.Selected] or {}) do
|
|
if k == "PresetName" then continue end
|
|
Settings[Settings.Train][k] = v
|
|
end
|
|
UpdateTrainList(true)
|
|
end
|
|
if i == 2 then
|
|
PName:SetText("")
|
|
else
|
|
PName:SetText(text)
|
|
end
|
|
end
|
|
end
|
|
|
|
VGUI["PFrame"] = function(firstDraw)
|
|
if not IsValid(pFrame) then return end
|
|
local presets = Settings[Settings.Train] and Settings[Settings.Train].Presets
|
|
|
|
Presets:Clear()
|
|
Presets:AddChoice(Metrostroi.GetPhrase("Spawner.Preset.New"),-2,nil,"icon16/add.png")
|
|
Presets:AddChoice(Metrostroi.GetPhrase("Spawner.Preset.Unsaved"),-1,nil,"icon16/disk.png")
|
|
Presets:SetText(Metrostroi.GetPhrase("Spawner.Preset.NotSelected"))
|
|
PName:SetText("")
|
|
|
|
if firstDraw then Presets.selected = -1 end
|
|
if presets then
|
|
--presets.Selected = false
|
|
for i,v in ipairs(presets) do
|
|
Presets:AddChoice(v.PresetName or Format("N/A (%d)",i),i,not firstDraw and presets.Selected == i,nil and "icon16/add.png")
|
|
end
|
|
end
|
|
if Presets:GetSelectedID() == -1 then
|
|
Presets:ChooseOptionID(2)
|
|
if presets then presets.Selected = false end
|
|
end
|
|
|
|
if not pFrame.Moved then
|
|
local posX,posY = frame:GetPos()
|
|
pFrame:SetPos(posX+5,posY+30)
|
|
pFrame.Moved = true
|
|
end
|
|
end
|
|
|
|
PName.MainPaint = PName.Paint
|
|
PName.Paint = function(pnl, w, h)
|
|
pnl.MainPaint(pnl,w,h)
|
|
if pnl.Error then
|
|
surface.SetDrawColor(255,100,0,150)
|
|
surface.DrawRect(1,1,w-2,h-2)
|
|
end
|
|
end
|
|
PName.CheckEmpty = function(pnl)
|
|
pnl.Error = pnl:GetText():Trim() == ""
|
|
if pnl.Error == "" then
|
|
pnl:SetPlaceholderText(Metrostroi.GetPhrase("Spawner.Presets.NameError"))
|
|
else
|
|
pnl:SetPlaceholderText(Metrostroi.GetPhrase("Spawner.Presets.NamePlaceholder"))
|
|
end
|
|
pnl:SetUpdateOnType(pnl.Error)
|
|
return pnl.Error
|
|
end
|
|
PName.OnValueChange = PName.CheckEmpty
|
|
PAdd.DoClick = function()
|
|
if PName:CheckEmpty() or not Settings[Settings.Train] then return end
|
|
if not Settings[Settings.Train].Presets then Settings[Settings.Train].Presets = {} end
|
|
local presets = Settings[Settings.Train].Presets
|
|
|
|
presets.Selected = #presets+1
|
|
local settings = {
|
|
PresetName = getPresetName(PName:GetValue(),presets)
|
|
}
|
|
savePresetData(Settings[Settings.Train],settings)
|
|
table.insert(presets,settings)
|
|
|
|
VGUI.PFrame()
|
|
end
|
|
PUpdate.DoClick = function()
|
|
local presets = Settings[Settings.Train] and Settings[Settings.Train].Presets
|
|
if not presets or #presets == 0 or not presets.Selected or presets.Selected > #presets then return end
|
|
|
|
local settings = {
|
|
PresetName = getPresetName(PName:GetValue(),presets,true)
|
|
}
|
|
savePresetData(Settings[Settings.Train],settings)
|
|
presets[presets.Selected] = settings
|
|
|
|
VGUI.PFrame()
|
|
end
|
|
PRemove.DoClick = function()
|
|
local presets = Settings[Settings.Train] and Settings[Settings.Train].Presets
|
|
if not presets or #presets == 0 or not presets.Selected or presets.Selected > #presets then return end
|
|
table.remove(presets,presets.Selected)
|
|
presets.Selected = false
|
|
|
|
VGUI.PFrame(true)
|
|
end
|
|
pFrame.OrigThink = pFrame.Think
|
|
pFrame.Think = function(...)
|
|
pFrame.OrigThink(...)
|
|
if not pFrame:IsActive() and frame:IsActive() then pFrame:MakePopup() end
|
|
end
|
|
|
|
VGUI.PFrame(true)
|
|
end
|
|
local function createWagonsFrame()
|
|
if IsValid(wFrame) then return end
|
|
wFrame = vgui.Create("DFrame",frame)
|
|
wFrame:SetTitle(Metrostroi.GetPhrase("Spawner.WagonsTitle"))
|
|
wFrame:SetDrawOnTop(true)
|
|
wFrame:SetZPos(frame:GetZPos())
|
|
wFrame.btnMaxim:SetVisible(false)
|
|
wFrame.btnMinim:SetVisible(false)
|
|
--frame:SetSize(275, 34+24*17)
|
|
wFrame:SetDraggable(true)
|
|
wFrame:SetSizable(false)
|
|
wFrame:MakePopup()
|
|
wFrame:SetZPos(frame:GetZPos()+1)
|
|
wFrame:SetSize(262 + 262*math.floor((1-1)/MaxHorisontal)+10, 58+24*math.min(MaxHorisontal,1))
|
|
--wFrame:Center()
|
|
VGUI["WFrame"] = function()
|
|
if not IsValid(wFrame) then return end
|
|
local posX,posY = frame:GetPos()
|
|
wFrame:SetPos(posX+7,posY+32)
|
|
end
|
|
wFrame.OnRemove = function()
|
|
if IsValid(PFrame) then
|
|
VGUI.PFrame()
|
|
end
|
|
end
|
|
VGUI.WFrame()
|
|
end
|
|
local function createFrame()
|
|
MaxWagons = GetGlobalInt("metrostroi_maxtrains")*GetGlobalInt("metrostroi_maxwagons")
|
|
MaxWagonsOnPlayer = GetGlobalInt("metrostroi_maxtrains_onplayer")*GetGlobalInt("metrostroi_maxwagons")
|
|
--if GetConVarString("gmod_toolmode") == "train_spawner" then RunConsoleCommand("gmod_toolmode", "weld") end
|
|
if IsValid(frame) then return end
|
|
Pos = 0
|
|
VGUI = {}
|
|
frame = vgui.Create("DFrame")
|
|
frame:SetDeleteOnClose(true)
|
|
frame:SetTitle(Metrostroi.GetPhrase("Spawner.Title"))
|
|
frame.btnMaxim:SetVisible(false)
|
|
frame.btnMinim:SetVisible(false)
|
|
--frame:SetSize(275, 34+24*17)
|
|
frame:SetDraggable(false)
|
|
frame:SetSizable(false)
|
|
frame:MakePopup()
|
|
frame.OnRemove = function(panel)
|
|
if IsValid(pFrame) then pFrame:Remove() end
|
|
if IsValid(wFrame) then wFrame:Remove() end
|
|
UpdateConCMD()
|
|
end
|
|
|
|
--frame:SetSize(262 + 262*math.floor((Pos-1)/MaxHorisontal)+10, 58+24*math.min(MaxHorisontal,Pos))
|
|
--frame:Center()
|
|
local Close = vgui.Create("DButton", frame)
|
|
Close:SetWide(80)
|
|
Close:SetPos(5, frame:GetTall() - Close:GetTall() - 5)
|
|
Close:SetText(Metrostroi.GetPhrase("Spawner.Close"))
|
|
|
|
Close.DoClick = function()
|
|
frame:Close()
|
|
end
|
|
VGUI["Close"] = function()
|
|
if IsValid(Close) and IsValid(frame) then Close:SetPos(5, frame:GetTall() - Close:GetTall() - 5) end
|
|
end
|
|
|
|
local spawn = vgui.Create("DButton", frame)
|
|
spawn:SetWide(80)
|
|
spawn:SetPos(frame:GetWide() - Close:GetWide() - 5, frame:GetTall() - Close:GetTall() - 5)
|
|
spawn:SetText(Metrostroi.GetPhrase("Spawner.Spawn"))
|
|
VGUI["spawn"] = function()
|
|
if IsValid(spawn) and IsValid(frame) then spawn:SetPos(frame:GetWide() - Close:GetWide() - 5, frame:GetTall() - Close:GetTall() - 5) end
|
|
end
|
|
|
|
spawn.DoClick = function()
|
|
--[[
|
|
local Tool = GetConVarString("gmod_toolmode")
|
|
if Tool == "train_spawner" then Tool = "weld" end
|
|
RunConsoleCommand("train_spawner_oldT", Tool)
|
|
RunConsoleCommand("train_spawner_oldW", LocalPlayer():GetActiveWeapon():GetClass())
|
|
RunConsoleCommand("gmod_tool", "train_spawner")
|
|
]]
|
|
local tbl = {}
|
|
tbl = table.Copy(Settings[Settings.Train])
|
|
tbl.Train = Settings.Train
|
|
tbl.AutoCouple = Settings.AutoCouple
|
|
tbl.WagNum = Settings.WagNum or 1
|
|
net.Start("train_spawner_open")
|
|
net.WriteTable(tbl)
|
|
net.SendToServer()
|
|
local tool = LocalPlayer():GetTool("train_spawner")
|
|
tool.Settings = tbl
|
|
local ENT = scripted_ents.Get(tool.Settings.Train)
|
|
if ENT and ENT.Spawner then tool.Train = ENT end
|
|
frame:Close()
|
|
end
|
|
|
|
local Presets = vgui.Create("DButton", frame)
|
|
Presets:SetWide(24)
|
|
--Presets:SetPos(5, spawn:GetPos() + 5)
|
|
Presets:SetText("")
|
|
Presets:SetImage("icon16/book.png")
|
|
|
|
Presets.DoClick = function()
|
|
if IsValid(pFrame) then pFrame:Remove() else
|
|
createPresetsFrame()
|
|
pFrame.OnRemove = function() if IsValid(Presets) then Presets:SetImage("icon16/book.png") end end
|
|
end
|
|
Presets:SetImage(IsValid(pFrame) and "icon16/book_edit.png" or "icon16/book.png")
|
|
end
|
|
VGUI["Presets"] = function()
|
|
if not IsValid(Presets) or not IsValid(frame) then return end
|
|
local posX,posY,width = Close:GetBounds()
|
|
Presets:SetPos(posX + width + 5, posY)
|
|
end
|
|
|
|
local Wagons = vgui.Create("DButton", frame)
|
|
Wagons:SetWide(24)
|
|
--Wagons:SetPos(5, spawn:GetPos() + 5)
|
|
Wagons:SetText("")
|
|
Wagons:SetImage("icon16/table.png")
|
|
|
|
Wagons.DoClick = function()
|
|
if IsValid(wFrame) then wFrame:Remove() else
|
|
createWagonsFrame()
|
|
wFrame.OnRemove = function() Wagons:SetImage("icon16/table.png") end
|
|
end
|
|
Wagons:SetImage(IsValid(wFrame) and "icon16/table_edit.png" or "icon16/table.png")
|
|
end
|
|
VGUI["Wagons"] = function()
|
|
if not IsValid(Wagons) or not IsValid(frame) then return end
|
|
local posX,posY,width = Presets:GetBounds()
|
|
Wagons:SetPos(posX + width + 5, posY)
|
|
end
|
|
|
|
LoadConCMD()
|
|
Draw()
|
|
end
|
|
|
|
net.Receive("MetrostroiTrainSpawner",createFrame)
|
|
net.Receive("MetrostroiMaxWagons", function()
|
|
MaxWagons = GetGlobalInt("metrostroi_maxtrains")*GetGlobalInt("metrostroi_maxwagons")
|
|
MaxWagonsOnPlayer = GetGlobalInt("metrostroi_maxtrains_onplayer")*GetGlobalInt("metrostroi_maxwagons")
|
|
if trainTypeT and trainTypeT:IsValid() then
|
|
trainTypeT:SetText(Format("%s(%d/%d)\n%s:%d",Metrostroi.GetPhrase("Spawner.Trains1"),GetGlobalInt("metrostroi_train_count"),MaxWagons,Metrostroi.GetPhrase("Spawner.Trains2"),MaxWagonsOnPlayer))
|
|
end
|
|
end)
|
|
net.Receive("MetrostroiTrainCount", function()
|
|
if trainTypeT and trainTypeT:IsValid() then
|
|
trainTypeT:SetText(Format("%s(%d/%d)\n%s:%d",Metrostroi.GetPhrase("Spawner.Trains1"),GetGlobalInt("metrostroi_train_count"),MaxWagons,Metrostroi.GetPhrase("Spawner.Trains2"),MaxWagonsOnPlayer))
|
|
end
|
|
end)
|