function PANEL:Init( ) acfmenupanel = self.Panel // height self:SetTall( surface.ScreenHeight() - 120 ) //Weapon Select self.WeaponSelect = vgui.Create( "DTree", self ) self.WeaponData = ACF.Weapons local Classes = list.Get("ACFClasses") self.Classes = {} for ID,Table in pairs(Classes) do self.Classes[ID] = {} for ClassID,Class in pairs(Table) do Class.id = ClassID table.insert(self.Classes[ID], Class) end table.sort(self.Classes[ID], function(a,b) return a.id < b.id end ) end local WeaponDisplay = list.Get("ACFEnts") self.WeaponDisplay = {} for ID,Table in pairs(WeaponDisplay) do self.WeaponDisplay[ID] = {} for EntID,Data in pairs(Table) do table.insert(self.WeaponDisplay[ID], Data) end if ID == "Guns" then table.sort(self.WeaponDisplay[ID], function(a,b) if a.gunclass == b.gunclass then return a.caliber < b.caliber else return a.gunclass < b.gunclass end end) else table.sort(self.WeaponDisplay[ID], function(a,b) return a.id < b.id end ) end end local HomeNode = self.WeaponSelect:AddNode( "ACF Home" ) HomeNode.mytable = {} HomeNode.mytable.guicreate = (function( Panel, Table ) ACFHomeGUICreate( Table ) end or nil) HomeNode.mytable.guiupdate = (function( Panel, Table ) ACFHomeGUIUpdate( Table ) end or nil) function HomeNode:DoClick() acfmenupanel:UpdateDisplay(self.mytable) end HomeNode.Icon:SetImage( "gui/silkicons/star" ) local RoundAttribs = list.Get("ACFRoundTypes") self.RoundAttribs = {} for ID,Table in pairs(RoundAttribs) do Table.id = ID table.insert(self.RoundAttribs, Table) end table.sort(self.RoundAttribs, function(a,b) return a.id < b.id end ) local Guns = self.WeaponSelect:AddNode( "Guns" ) for ClassID,Class in pairs(self.Classes["GunClass"]) do local SubNode = Guns:AddNode( Class.name or "No Name" ) for Type, Ent in pairs(self.WeaponDisplay["Guns"]) do if Ent.gunclass == Class.id then local EndNode = SubNode:AddNode( Ent.name or "No Name" ) EndNode.mytable = Ent function EndNode:DoClick() RunConsoleCommand( "acfmenu_type", self.mytable.type ) acfmenupanel:UpdateDisplay( self.mytable ) end EndNode.Icon:SetImage( "gui/silkicons/newspaper" ) end end end local Ammo = self.WeaponSelect:AddNode( "Ammo" ) for AmmoID,AmmoTable in pairs(self.RoundAttribs) do local EndNode = Ammo:AddNode( AmmoTable.name or "No Name" ) EndNode.mytable = AmmoTable function EndNode:DoClick() RunConsoleCommand( "acfmenu_type", self.mytable.type ) acfmenupanel:UpdateDisplay( self.mytable ) end EndNode.Icon:SetImage( "gui/silkicons/newspaper" ) end local Mobility = self.WeaponSelect:AddNode( "Mobility" ) local Engines = Mobility:AddNode( "Engines" ) local Gearboxes = Mobility:AddNode( "Gearboxes" ) local EngineSubcats = {} for _, MobilityTable in pairs(self.WeaponDisplay["Mobility"]) do NodeAdd = Mobility if( MobilityTable.ent == "acf_engine" ) then NodeAdd = Engines elseif ( MobilityTable.ent == "acf_gearbox" ) then NodeAdd = Gearboxes end --if((EngineSubcats["misce"] == nil) and (EngineSubcats["miscg"] == nil) ) then -- EngineSubcats["misce"] = Engines:AddNode( "Miscellaneous" ) -- EngineSubcats["miscg"] = Gearboxes:AddNode( "Miscellaneous" ) --end if(MobilityTable.category) then if(!EngineSubcats[MobilityTable.category]) then EngineSubcats[MobilityTable.category] = NodeAdd:AddNode( MobilityTable.category ) end end end for MobilityID,MobilityTable in pairs(self.WeaponDisplay["Mobility"]) do local NodeAdd = Mobility if MobilityTable.ent == "acf_engine" then NodeAdd = Engines if(MobilityTable.category) then NodeAdd = EngineSubcats[MobilityTable.category] --else -- NodeAdd = EngineSubcats["misce"] end elseif MobilityTable.ent == "acf_gearbox" then NodeAdd = Gearboxes if(MobilityTable.category) then NodeAdd = EngineSubcats[MobilityTable.category] --else -- NodeAdd = EngineSubcats["miscg"] end end local EndNode = NodeAdd:AddNode( MobilityTable.name or "No Name" ) EndNode.mytable = MobilityTable function EndNode:DoClick() RunConsoleCommand( "acfmenu_type", self.mytable.type ) acfmenupanel:UpdateDisplay( self.mytable ) end EndNode.Icon:SetImage( "gui/silkicons/wrench" ) end --######################################################################################################### --Creating New menu local Mobility2 = self.WeaponSelect:AddNode( "Custom ACF Mod" ) -->menu name --Creating SubCategories local EnginesMaker = Mobility2:AddNode( "Engines Maker Menu" ) local EnginesLittle = Mobility2:AddNode( "Customizable Little Engines" ) local EnginesFat = Mobility2:AddNode( "Customizable Fat Engines" ) local Engines2 = Mobility2:AddNode( "Engines" ) local CVT = Mobility2:AddNode( "CVT Gearbox" ) local Automatic = Mobility2:AddNode( "Automatic Gearbox" ) local Chips = Mobility2:AddNode( "Chips" ) local Vtec = Mobility2:AddNode( "Chips Vtec" ) local Nos = Mobility2:AddNode( "Nos Bottle" ) local Engine2Subcats = {} for _, Mobility2Table in pairs(self.WeaponDisplay["Mobility2"]) do NodeAdd = Mobility2 if ( Mobility2Table.ent == "acf_engine5" ) then NodeAdd = EnginesMaker elseif( Mobility2Table.ent == "acf_engine2" ) then NodeAdd = EnginesLittle elseif ( Mobility2Table.ent == "acf_engine4" ) then NodeAdd = EnginesFat elseif ( Mobility2Table.ent == "acf_engine3" ) then NodeAdd = Engines2 elseif ( Mobility2Table.ent == "acf_gearbox2" ) then NodeAdd = CVT elseif ( Mobility2Table.ent == "acf_gearbox3" ) then NodeAdd = Automatic elseif ( Mobility2Table.ent == "acf_chips" ) then NodeAdd = Chips elseif ( Mobility2Table.ent == "acf_vtec" ) then NodeAdd = Vtec elseif ( Mobility2Table.ent == "acf_nos" ) then NodeAdd = Nos end if(Mobility2Table.category) then if(!Engine2Subcats[Mobility2Table.category]) then Engine2Subcats[Mobility2Table.category] = NodeAdd:AddNode( Mobility2Table.category ) end end end for Mobility2ID,Mobility2Table in pairs(self.WeaponDisplay["Mobility2"]) do local NodeAdd = Mobility2 --######################################################### if Mobility2Table.ent == "acf_engine5" then NodeAdd = EnginesMaker if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_engine2" then NodeAdd = EnginesLittle if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_engine4" then NodeAdd = EnginesFat if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_engine3" then NodeAdd = Engines2 if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_gearbox2" then NodeAdd = CVT if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_gearbox3" then NodeAdd = Automatic if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_chips" then NodeAdd = Chips if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_vtec" then NodeAdd = Vtec if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end elseif Mobility2Table.ent == "acf_nos" then NodeAdd = Nos if(Mobility2Table.category) then NodeAdd = Engine2Subcats[Mobility2Table.category] end end local EndNode = NodeAdd:AddNode( Mobility2Table.name or "No Name" ) EndNode.mytable = Mobility2Table function EndNode:DoClick() RunConsoleCommand( "acfmenu_type", self.mytable.type ) acfmenupanel:UpdateDisplay( self.mytable ) end EndNode.Icon:SetImage( "gui/silkicons/wrench" ) end --######################################################################################################### --######################################################################################################### --######################################################################################################### /*local Missiles = self.WeaponSelect:AddNode( "Missiles" ) for MisID, MisTable in pairs(self.WeaponDisplay["Missiles"]) do local EndNode = Missiles:AddNode( MisTable.name or "No Name" ) EndNode.mytable = MisTable function EndNode:DoClick() RunConsoleCommand( "acfmenu_type", self.mytable.type ) acfmenupanel:UpdateDisplay( self.mytable ) end EndNode.Icon:SetImage( "gui/silkicons/newspaper") end*/ -- local Sensors = self.WeaponSelect:AddNode( "Sensors" ) -- for SensorsID,SensorsTable in pairs(self.WeaponDisplay["Sensors"]) do -- local EndNode = Sensors:AddNode( SensorsTable.name or "No Name" ) -- EndNode.mytable = SensorsTable -- function EndNode:DoClick() -- RunConsoleCommand( "acfmenu_type", self.mytable.type ) -- acfmenupanel:UpdateDisplay( self.mytable ) -- end -- EndNode.Icon:SetImage( "gui/silkicons/newspaper" ) -- end end /*------------------------------------ Think ------------------------------------*/ function PANEL:Think( ) end function PANEL:UpdateDisplay( Table ) RunConsoleCommand( "acfmenu_id", Table.id or 0 ) --If a previous display exists, erase it if ( acfmenupanel.CustomDisplay ) then acfmenupanel.CustomDisplay:Clear(true) acfmenupanel.CustomDisplay = nil acfmenupanel.CData = nil end --Create the space to display the custom data acfmenupanel.CustomDisplay = vgui.Create( "DPanelList", acfmenupanel ) acfmenupanel.CustomDisplay:SetSpacing( 5 ) acfmenupanel.CustomDisplay:EnableHorizontal( false ) acfmenupanel.CustomDisplay:EnableVerticalScrollbar( false ) acfmenupanel.CustomDisplay:SetSize( acfmenupanel:GetWide(), acfmenupanel:GetTall() ) if not acfmenupanel["CData"] then --Create a table for the display to store data acfmenupanel["CData"] = {} end acfmenupanel.CreateAttribs = Table.guicreate acfmenupanel.UpdateAttribs = Table.guiupdate acfmenupanel:CreateAttribs( Table ) acfmenupanel:PerformLayout() end function PANEL:CreateAttribs( Table ) --You overwrite this with your own function, defined in the ammo definition file, so each ammotype creates it's own menu end function PANEL:UpdateAttribs( Table ) --You overwrite this with your own function, defined in the ammo definition file, so each ammotype creates it's own menu end function PANEL:PerformLayout() --Starting positions local vspacing = 10 local ypos = 0 --Selection Tree panel acfmenupanel.WeaponSelect:SetPos( 0, ypos ) acfmenupanel.WeaponSelect:SetSize( acfmenupanel:GetWide(), 165 ) ypos = acfmenupanel.WeaponSelect.Y + acfmenupanel.WeaponSelect:GetTall() + vspacing if acfmenupanel.CustomDisplay then --Custom panel acfmenupanel.CustomDisplay:SetPos( 0, ypos ) acfmenupanel.CustomDisplay:SetSize( acfmenupanel:GetWide(), acfmenupanel:GetTall() - acfmenupanel.WeaponSelect:GetTall() - 10 ) ypos = acfmenupanel.CustomDisplay.Y + acfmenupanel.CustomDisplay:GetTall() + vspacing end end function ACFHomeGUICreate( Table ) if not acfmenupanel.CustomDisplay then return end --start version VersionText1 = vgui.Create( "DLabel" ) VersionText1:SetText("ACF Version") VersionText1:SetTextColor(Color(0,0,50,255)) VersionText1:SetFont( "DefaultBold" ) VersionText1:SizeToContents() acfmenupanel.CustomDisplay:AddItem( VersionText1 ) VersionT = vgui.Create( "DLabel" ) --versiontext = "Version\n\n".."SVN Version: "..ACF.CurrentVersion.."\nCurrent Version: "..ACF.Version VersionT:SetText("SVN Version: "..ACF.CurrentVersion.."\nCurrent Version: "..ACF.Version) VersionT:SetTextColor(Color(0,0,250,255)) VersionT:SetFont( "DefaultBold" ) VersionT:SizeToContents() acfmenupanel.CustomDisplay:AddItem( VersionT ) VersionText2 = vgui.Create( "DLabel" ) VersionText2:SetText("Custom Version") VersionText2:SetTextColor(Color(0,0,50,255)) VersionText2:SetFont( "DefaultBold" ) VersionText2:SizeToContents() acfmenupanel.CustomDisplay:AddItem( VersionText2 ) VersionT2 = vgui.Create( "DLabel" ) VersionT2:SetText("SVN Version: "..ACF.CurrentVersion2.."\nCurrent Version: "..ACF.Version2) VersionT2:SetTextColor(Color(0,0,250,255)) VersionT2:SetFont( "DefaultBold" ) VersionT2:SizeToContents() acfmenupanel.CustomDisplay:AddItem( VersionT2 ) acfmenupanel["CData"]["VersionText"] = vgui.Create( "DLabel" ) local color local versionstring if ACF.Version >= ACF.CurrentVersion then versionstring = "Up To Date" color = Color(0,225,0,255) else versionstring = "Out Of Date" color = Color(225,0,0,255) end acfmenupanel["CData"]["VersionText"]:SetText("\nACF Is "..versionstring.."!") acfmenupanel["CData"]["VersionText"]:SetColor(color) acfmenupanel["CData"]["VersionText"]:SetFont( "DefaultBold" ) acfmenupanel["CData"]["VersionText"]:SizeToContents() acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"]["VersionText"] ) VersionT3 = vgui.Create( "DLabel" ) local color2 local versionstring2 if ACF.Version2 >= ACF.CurrentVersion2 then versionstring2 = "Up To Date" color2 = Color(0,225,0,255) else versionstring2 = "Out Of Date" color2 = Color(225,0,0,255) end VersionT3:SetText("ACF Custom Is "..versionstring2.."!\n\n\n\n") VersionT3:SetColor(color2) VersionT3:SetFont( "DefaultBold" ) VersionT3:SizeToContents() acfmenupanel.CustomDisplay:AddItem( VersionT3 ) -- end version --acfmenupanel:CPanelText("Header", "Changelog") TextLog= vgui.Create( "DLabel" ) TextLog:SetText( "Changelog") TextLog:SetTextColor(Color(0,0,200,255)) TextLog:SetFont( "DefaultBold" ) acfmenupanel.CustomDisplay:AddItem( TextLog ) acfmenupanel["CData"]["Changelist"] = vgui.Create( "DTree" ) for Rev,Changes in pairs(acfmenupanel.Changelog) do local Node = acfmenupanel["CData"]["Changelist"]:AddNode( "Rev "..Rev ) Node.mytable = {} Node.mytable["rev"] = Rev function Node:DoClick() acfmenupanel:UpdateAttribs( Node.mytable ) end Node.Icon:SetImage( "gui/silkicons/newspaper" ) end acfmenupanel.CData.Changelist:SetSize( acfmenupanel.CustomDisplay:GetWide(), 60 ) acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"]["Changelist"] ) acfmenupanel.CustomDisplay:PerformLayout() acfmenupanel:UpdateAttribs( {rev = table.maxn(acfmenupanel.Changelog)} ) end function ACFHomeGUIUpdate( Table ) --acfmenupanel:CPanelText("Changelog", acfmenupanel.Changelog[Table["rev"]]) TextLog2 = vgui.Create( "DLabel" ) TextLog2:SetText( acfmenupanel.Changelog[Table["rev"]]) TextLog2:SetTextColor(Color(0,0,200,255)) TextLog2:SetFont( "DefaultBold" ) TextLog2:SizeToContents() acfmenupanel.CustomDisplay:AddItem( TextLog2 ) acfmenupanel.CustomDisplay:PerformLayout() end function ACFChangelogHTTPCallBack(contents , size) local Temp = string.Explode( "*", contents ) acfmenupanel.Changelog = {} for Key,String in pairs(Temp) do acfmenupanel.Changelog[tonumber(string.sub(String,2,3))] = string.Trim(string.sub(String, 5)) end table.SortByKey(acfmenupanel.Changelog,true) local Table = {} Table.guicreate = (function( Panel, Table ) ACFHomeGUICreate( Table ) end or nil) Table.guiupdate = (function( Panel, Table ) ACFHomeGUIUpdate( Table ) end or nil) acfmenupanel:UpdateDisplay( Table ) end http.Fetch("http://acf.googlecode.com/svn/trunk/changelog.txt", ACFChangelogHTTPCallBack, function() end) function PANEL:AmmoSelect( Blacklist ) if not acfmenupanel.CustomDisplay then return end if not Blacklist then Blacklist = {} end if not acfmenupanel.AmmoData then acfmenupanel.AmmoData = {} acfmenupanel.AmmoData["Id"] = "Ammo2x4x4" acfmenupanel.AmmoData["Type"] = "Ammo" acfmenupanel.AmmoData["Data"] = acfmenupanel.WeaponData["Guns"]["12.7mmMG"]["round"] end --Creating the ammo crate selection acfmenupanel.CData.CrateSelect = vgui.Create( "DComboBox", acfmenupanel.CustomDisplay ) --Every display and slider is placed in the Round table so it gets trashed when selecting a new round type acfmenupanel.CData.CrateSelect:SetSize(100, 30) for Key, Value in pairs( acfmenupanel.WeaponDisplay["Ammo"] ) do acfmenupanel.CData.CrateSelect:AddChoice( Value.id , Key ) end acfmenupanel.CData.CrateSelect.OnSelect = function( index , value , data ) RunConsoleCommand( "acfmenu_id", data ) end acfmenupanel.CData.CrateSelect:SetText(acfmenupanel.AmmoData["Id"]) RunConsoleCommand( "acfmenu_id", acfmenupanel.AmmoData["Id"] ) acfmenupanel.CustomDisplay:AddItem( acfmenupanel.CData.CrateSelect ) --Create the caliber selection display acfmenupanel.CData.CaliberSelect = vgui.Create( "DComboBox", acfmenupanel.CustomDisplay ) acfmenupanel.CData.CaliberSelect:SetSize(100, 30) for Key, Value in pairs( acfmenupanel.WeaponDisplay["Guns"] ) do if( !table.HasValue( Blacklist, Value.gunclass ) ) then acfmenupanel.CData.CaliberSelect:AddChoice( Value.id , Key ) end end acfmenupanel.CData.CaliberSelect.OnSelect = function( index , value , data ) acfmenupanel.AmmoData["Data"] = acfmenupanel.WeaponData["Guns"][data]["round"] self:UpdateAttribs() self:UpdateAttribs() --Note : this is intentional end acfmenupanel.CData.CaliberSelect:SetText(acfmenupanel.AmmoData["Data"]["id"]) acfmenupanel.CustomDisplay:AddItem( acfmenupanel.CData.CaliberSelect ) end function PANEL:AmmoSlider(Name, Value, Min, Max, Decimals, Title, Desc) --Variable name in the table, Value, Min value, Max Value, slider text title, slider decimeals, description text below slider if not acfmenupanel["CData"][Name] then acfmenupanel["CData"][Name] = vgui.Create( "DNumSlider", acfmenupanel.CustomDisplay ) acfmenupanel["CData"][Name]:SetText( Title ) acfmenupanel["CData"][Name]:SetMin( 0 ) acfmenupanel["CData"][Name]:SetMax( 1000 ) acfmenupanel["CData"][Name]:SetDecimals( Decimals ) if acfmenupanel.AmmoData[Name] then acfmenupanel["CData"][Name]:SetValue(acfmenupanel.AmmoData[Name]) end acfmenupanel["CData"][Name].OnValueChanged = function( slider, val ) if acfmenupanel.AmmoData[Name] != val then acfmenupanel.AmmoData[Name] = val self:UpdateAttribs( Name ) end end acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"][Name] ) end acfmenupanel["CData"][Name]:SetMin( Min ) acfmenupanel["CData"][Name]:SetMax( Max ) acfmenupanel["CData"][Name]:SetValue( Value ) if not acfmenupanel["CData"][Name.."_text"] and Desc then acfmenupanel["CData"][Name.."_text"] = vgui.Create( "DLabel" ) acfmenupanel["CData"][Name.."_text"]:SetText( Desc or "" ) acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"][Name.."_text"] ) end acfmenupanel["CData"][Name.."_text"]:SetText( Desc ) acfmenupanel["CData"][Name.."_text"]:SetSize( acfmenupanel.CustomDisplay:GetWide(), 10 ) acfmenupanel["CData"][Name.."_text"]:SizeToContentsX() end function PANEL:AmmoCheckbox(Name, Title, Desc) --Variable name in the table, slider text title, slider decimeals, description text below slider if not acfmenupanel["CData"][Name] then acfmenupanel["CData"][Name] = vgui.Create( "DCheckBoxLabel" ) acfmenupanel["CData"][Name]:SetText( Title or "" ) acfmenupanel["CData"][Name]:SizeToContents() if acfmenupanel.AmmoData[Name] != nil then acfmenupanel["CData"][Name]:SetChecked(acfmenupanel.AmmoData[Name]) else acfmenupanel.AmmoData[Name] = false end acfmenupanel["CData"][Name].OnChange = function( check, bval ) acfmenupanel.AmmoData[Name] = bval self:UpdateAttribs( {Name, bval} ) end acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"][Name] ) end acfmenupanel["CData"][Name]:SetText( Title ) if not acfmenupanel["CData"][Name.."_text"] and Desc then acfmenupanel["CData"][Name.."_text"] = vgui.Create( "DLabel" ) acfmenupanel["CData"][Name.."_text"]:SetText( Desc or "" ) acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"][Name.."_text"] ) end acfmenupanel["CData"][Name.."_text"]:SetText( Desc ) acfmenupanel["CData"][Name.."_text"]:SetSize( acfmenupanel.CustomDisplay:GetWide(), 10 ) acfmenupanel["CData"][Name.."_text"]:SizeToContentsX() end function PANEL:CPanelText(Name, Desc) if not acfmenupanel["CData"][Name.."_text"] then acfmenupanel["CData"][Name.."_text"] = vgui.Create( "DLabel" ) acfmenupanel["CData"][Name.."_text"]:SetText( Desc or "" ) acfmenupanel["CData"][Name.."_text"]:SetWrap(true) acfmenupanel["CData"][Name.."_text"]:SetAutoStretchVertical( true ) acfmenupanel.CustomDisplay:AddItem( acfmenupanel["CData"][Name.."_text"] ) end acfmenupanel["CData"][Name.."_text"]:SetText( Desc ) acfmenupanel["CData"][Name.."_text"]:SetSize( acfmenupanel.CustomDisplay:GetWide(), 10 ) acfmenupanel["CData"][Name.."_text"]:SizeToContentsY() end