--[[ | 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/ --]] --luacheck: ignore 431 432 local PLUGIN = PLUGIN local color = Color(41, 243, 229, 255) function PLUGIN:DrawDividerLine(parent, w, h, x, y, dock, bBottomPanel) local marginLeft = (dock and bBottomPanel) and SScaleMin(5 / 3) or dock and SScaleMin(9 / 3) or 0 local marginTop = (dock and bBottomPanel) and SScaleMin((4 / 2) / 3) or dock and SScaleMin((8 / 2) / 3) or 0 local marginRight = dock and SScaleMin(5 / 3) or 0 local marginBottom = (dock and bBottomPanel) and SScaleMin((11 / 2) / 3) or dock and SScaleMin((18 / 2) / 3) or 0 local dividerLine = parent:Add("DShape") dividerLine:SetType( "Rect" ) dividerLine:SetSize(SScaleMin(w / 3), SScaleMin(h / 3)) dividerLine:SetPos(x, y) dividerLine:DockMargin(marginLeft, marginTop, marginRight, marginBottom) dividerLine:Dock(dock or NODOCK) dividerLine:SetColor(color) return dividerLine end function PLUGIN:CreateTitle(name, parent, text) name:SetSize(parent:GetWide(), SScaleMin(27 / 3)) name:Dock(TOP) name:DockMargin(0, 0, 0, SScaleMin(11 / 3)) name.Paint = nil local title = name:Add("DLabel") title:SetFont("TitlesFontNoClamp") title:SetTextColor(color) title:SetText(string.utf8upper(text)) title:SetTextInset(0, 0 - SScaleMin(5 / 3)) title:SizeToContents() PLUGIN:DrawDividerLine(name, SScaleMin(name:GetWide() * 3), 4, 0, name:GetTall() - SScaleMin(4 / 3)) end function PLUGIN:CreateTitleFrameRightTextButton(name, parent, width, text, dock) name:SetFont("MenuFontNoClamp") name:SetTextColor(color) name:SetText(string.utf8upper(text)) name:Dock(dock) name:DockMargin(0, 0, 0 - SScaleMin(3 / 3), SScaleMin(6 / 3)) name:SizeToContents() name.Paint = nil end function PLUGIN:CreateUpdates(parent, k, v, datemargin) parent:SetSize(parent:GetWide(), SScaleMin(48 / 3)) parent:Dock(TOP) parent.Paint = function(self, w, h) if k % 2 == 0 then surface.SetDrawColor(0, 0, 0, 75) surface.DrawRect(0, 0, w, h) else surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) end end local top = parent:Add("EditablePanel") top:SetSize(parent:GetWide(), parent:GetTall() * 0.5) top:Dock(TOP) top.Paint = nil local name = top:Add("DLabel") name:SetTextColor(Color(154, 169, 175, 255)) name:SetFont("MenuFontNoClamp") name:SetText(v.update_poster) name:Dock(LEFT) name:DockMargin(SScaleMin(20 / 3), SScaleMin(5 / 3), 0, 0) name:SizeToContents() local date = top:Add("DLabel") date:SetFont("MenuFontNoClamp") date:SetTextColor(Color(154, 169, 175, 255)) date:SetText(v.update_date) date:Dock(RIGHT) date:DockMargin(0, SScaleMin(5 / 3), SScaleMin( datemargin / 3), 0) date:SizeToContents() local bottom = parent:Add("EditablePanel") bottom:SetSize(parent:GetWide(), parent:GetTall() * 0.4) bottom:Dock(TOP) bottom.Paint = nil bottom:SetName( "bottom" ) local string = v.update_text local a = string.find(string, "[\n]") local excerpt = string.utf8sub(string, 1, a) local textExcerpt = bottom:Add("HTML") textExcerpt:SetSize(SScaleMin(440 / 3), SScaleMin(100 / 3)) textExcerpt:SetHTML("

"..excerpt.."

") textExcerpt:SetPos(SScaleMin(12 / 3), 0 - SScaleMin(10 / 3)) end function PLUGIN:CreateButton(name, text, disabled) name:SetSize(SScaleMin(480 / 3), SScaleMin(46 / 3)) name:SetContentAlignment(4) name:SetTextInset(SScaleMin(20 / 3), 0) name:Dock(TOP) name:SetFont("TitlesFontNoClamp") name:DockMargin(0, 0, 0, SScaleMin(9 / 3)) name:SetText(string.utf8upper(text)) name.Paint = function(self, w, h) surface.SetDrawColor(Color(255, 255, 255, 255)) surface.SetMaterial(ix.util.GetMaterial(disabled and "willardnetworks/datafile/buttonnoarrow-off.png" or "willardnetworks/datafile/button.png")) surface.DrawTexturedRect(0, 0, w, h) end end function PLUGIN:CreateEditingButton(name, text) name:SetSize(SScaleMin(560 / 3) / 5, SScaleMin(200 / 3) / 6) name:SetContentAlignment(5) name:Dock(LEFT) name:DockMargin(0, 0, SScaleMin(10 / 3), 0) name:SetFont("MenuFontBoldNoClamp") name:SetText(string.utf8upper(text)) name.Paint = function(self, w, h) surface.SetDrawColor(255, 255, 255, 255) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow.png")) surface.DrawTexturedRect(0, 0, w, h) end end local PANEL = {} function PANEL:Init() self:SetSize(ScrW(), ScrH()) self:MakePopup() self.Paint = nil Schema:AllowMessage(self) local mainFrame = self:Add("EditablePanel") mainFrame:SetSize(SScaleMin(645 / 3), SScaleMin(850 / 3)) mainFrame:Center() mainFrame.Paint = function(self, w, h) surface.SetDrawColor(Color(255, 255, 255, 255)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/mainframe.png")) surface.DrawTexturedRect(0, 0, w, h) end local close = self:Add("DButton") close:SetSize(SScaleMin(107 / 3), SScaleMin(105 / 3)) close:SetPos(ScrW() * 0.5 + mainFrame:GetWide() * 0.5 - close:GetWide() * 0.6, ScrH() * 0.5 - mainFrame:GetTall() * 0.5 - close:GetTall() * 0.4) close:SetText("") close.Paint = function(self, w, h) if close:IsHovered() then surface.SetDrawColor(Color(255, 255, 255, 50)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/gadgetlight.png")) surface.DrawTexturedRect(0, 0, w, h) end end close.DoClick = function() surface.PlaySound("willardnetworks/datapad/close.wav") self:Remove() end local subFrame = mainFrame:Add("EditablePanel") subFrame:SetSize(SScaleMin(560 / 3), SScaleMin(782 / 3)) subFrame:Center() subFrame.Paint = nil local titleFrame = subFrame:Add("EditablePanel") titleFrame:SetSize(subFrame:GetWide(), SScaleMin(50 / 3)) titleFrame:Dock(TOP) titleFrame.Paint = nil PLUGIN.mainTitle = titleFrame:Add("DLabel") PLUGIN.mainTitle:SetFont("DatapadTitle") PLUGIN.mainTitle:SetText(string.utf8upper("datapad")) PLUGIN.mainTitle:SetTextInset(SScaleMin(20 / 3), SScaleMin(4 / 3)) PLUGIN.mainTitle:SizeToContents() local contentFrame = subFrame:Add("EditablePanel") contentFrame:SetSize(subFrame:GetWide(), subFrame:GetTall() - titleFrame:GetTall()) contentFrame:Dock(TOP) contentFrame.Paint = nil local padding = SScaleMin(80 / 3) PLUGIN.contentSubframe = contentFrame:Add("EditablePanel") PLUGIN.contentSubframe:SetSize(contentFrame:GetWide() - padding, contentFrame:GetTall() - padding) PLUGIN.contentSubframe:Center() PLUGIN.contentSubframe.Paint = nil if (ix.config.Get("datafileNoConnection")) then PLUGIN.updates = vgui.Create("ixDatapadNoConnection", PLUGIN.contentSubframe) else PLUGIN.updates = vgui.Create("ixDatapadUpdates", PLUGIN.contentSubframe) end PLUGIN.functions = vgui.Create("ixDatapadFunctions", PLUGIN.contentSubframe) end vgui.Register("ixDatafilePDA", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), SScaleMin(230 / 3)) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "updates") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(300 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil local editUpdates = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(editUpdates, updatesTitleSubframe, 87, "edit updates", RIGHT) PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) local viewLogs = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(viewLogs, updatesTitleSubframe, 68, "view logs", RIGHT) local updatesContentFrame = self:Add("EditablePanel") updatesContentFrame:SetSize(self:GetWide(), SScaleMin(192 / 3)) updatesContentFrame:Dock(TOP) updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) updatesContentFrame.Paint = nil for k, v in SortedPairsByMemberValue(PLUGIN.updatelist, "update_id", true) do local updateFrame = updatesContentFrame:Add("EditablePanel") if (k == #PLUGIN.updatelist or k == #PLUGIN.updatelist - 1 or k == #PLUGIN.updatelist - 2 or k == #PLUGIN.updatelist - 3) then PLUGIN:CreateUpdates(updateFrame, k, v, 20) end end editUpdates.DoClick = function() local character = LocalPlayer():GetCharacter() local getFaction = character:GetFaction() local class = character:GetClass() if (class == CLASS_OW_SCANNER or getFaction == FACTION_OTA or getFaction == FACTION_MCP or getFaction == FACTION_ADMIN or class == CLASS_CP_RL or class == CLASS_CP_CPT or class == CLASS_CP_CMD) then surface.PlaySound("willardnetworks/datapad/navigate.wav") if IsValid(PLUGIN.searchProfiles) then PLUGIN.searchProfiles:SetVisible(false) end PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.editupdates = vgui.Create("ixDatapadEditUpdates", PLUGIN.contentSubframe) else LocalPlayer():NotifyLocalized("You do not have access to this function!") end end viewLogs.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") if IsValid(PLUGIN.searchProfiles) then PLUGIN.searchProfiles:SetVisible(false) end PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.viewLogs = vgui.Create("ixDatapadViewUpdates", PLUGIN.contentSubframe) end end vgui.Register("ixDatapadUpdates", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), SScaleMin(230 / 3)) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local noConnection = self:Add("DLabel") noConnection:SetHeight(SScaleMin(46 / 3)) noConnection:SetContentAlignment(4) noConnection:SetTextInset(SScaleMin(20 / 3), 0) noConnection:Dock(TOP) noConnection:SetFont("TitlesFontNoClamp") noConnection:DockMargin(0, 0, 0, SScaleMin(9 / 3)) noConnection:SetText(string.utf8upper("FAILED TO ESTABLISH SECURE OCIN UPLINK")) noConnection.Paint = function(self, w, h) surface.SetDrawColor(Color(255, 0, 0, 255)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow-off.png")) surface.DrawTexturedRect(0, 0, w, h) end local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "updates") local noConnection2 = self:Add("DLabel") noConnection2:SetHeight(SScaleMin(46 / 3)) noConnection2:SetContentAlignment(4) noConnection2:SetTextInset(SScaleMin(20 / 3), 0) noConnection2:Dock(TOP) noConnection2:SetFont("TitlesFontNoClamp") noConnection2:DockMargin(0, 0, 0, SScaleMin(9 / 3)) noConnection2:SetText(string.utf8upper("ERROR: NO CONNECTION")) noConnection2.Paint = function(self, w, h) surface.SetDrawColor(Color(255, 0, 0, 255)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow-off.png")) surface.DrawTexturedRect(0, 0, w, h) end end vgui.Register("ixDatapadNoConnection", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "edit updates") PLUGIN:DrawDividerLine(updatesTitleFrame, updatesTitleFrame:GetWide(), 4, 0, updatesTitleFrame:GetTall() - SScaleMin(4 / 3)) local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(300 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil local newUpdate = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(newUpdate, updatesTitleSubframe, 87, "new update", RIGHT) PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) local back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, updatesTitleSubframe, 68, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end newUpdate.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate2.wav") self:SetVisible(false) PLUGIN.newUpdate = vgui.Create("ixDatapadNewUpdate", PLUGIN.contentSubframe) end local updatesContentFrame = self:Add("EditablePanel") updatesContentFrame:SetSize(self:GetWide(), SScaleMin(48 / 3) * 10) updatesContentFrame:Dock(TOP) updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) updatesContentFrame.Paint = nil for k, v in SortedPairsByMemberValue(PLUGIN.updatelist, "update_id", true) do local updateFrame = updatesContentFrame:Add("EditablePanel") PLUGIN:CreateUpdates(updateFrame, k, v, 20) for _, v2 in ipairs( updateFrame:GetChildren() ) do if v2:GetName() == "bottom" then for _, v3 in ipairs( v2:GetChildren() ) do v3:SetWide(SScaleMin(340 / 3)) end local removeUpdate = v2:Add("DButton") removeUpdate:Dock(RIGHT) removeUpdate:DockMargin(0, 0, SScaleMin(19 / 3), SScaleMin(5 / 3)) removeUpdate:SetFont("MenuFontNoClamp") removeUpdate:SetTextColor(color) removeUpdate:SetText(string.utf8upper("remove")) removeUpdate:SizeToContents() removeUpdate.Paint = nil removeUpdate.DoClick = function() netstream.Start("RemoveUpdate", v.update_id) end PLUGIN:DrawDividerLine(v2, 2, 13, 0, SScaleMin( 4 / 3), RIGHT, true ) local editUpdate = v2:Add("DButton") editUpdate:Dock(RIGHT) editUpdate:DockMargin(0, 0, 0, SScaleMin(5 / 3)) editUpdate:SetFont("MenuFontNoClamp") editUpdate:SetTextColor(color) editUpdate:SetText(string.utf8upper("edit")) editUpdate:SizeToContents() editUpdate.Paint = nil editUpdate.DoClick = function() self:SetVisible(false) surface.PlaySound("willardnetworks/datapad/navigate2.wav") PLUGIN.editUpdate = vgui.Create("ixDatapadNewUpdate", PLUGIN.contentSubframe) PLUGIN.textEntry:SetValue(v.update_text) PLUGIN.addUpdate:SetText(string.utf8upper("edit update")) PLUGIN.addUpdate.DoClick = function() netstream.Start("EditUpdate", v.update_id, PLUGIN.textEntry:GetText()) end end end end end end vgui.Register("ixDatapadEditUpdates", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "add/edit updates") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(300 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil PLUGIN.addUpdate = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(PLUGIN.addUpdate, updatesTitleSubframe, 20, "add update", RIGHT) PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) local preview = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(preview, updatesTitleSubframe, 20, "preview", RIGHT) preview:DockMargin(0, 0, 0 - SScaleMin(3 / 3), SScaleMin(6 / 3)) preview.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate2.wav") if IsValid(PLUGIN.newUpdate) then if PLUGIN.newUpdate:IsVisible() then PLUGIN.newUpdate:Dock(NODOCK) PLUGIN.newUpdate:SetPos(0, SScaleMin(790 / 3)) end elseif IsValid(PLUGIN.editUpdate) then if PLUGIN.editUpdate:IsVisible() then PLUGIN.editUpdate:Dock(NODOCK) PLUGIN.editUpdate:SetPos(0, SScaleMin(790 / 3)) end end vgui.Create("ixDatapadNewUpdatePreview", PLUGIN.contentSubframe) end PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) local back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, updatesTitleSubframe, 68, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.editupdates:SetVisible(true) end local updatesContentFrame = self:Add("EditablePanel") updatesContentFrame:SetSize(self:GetWide(), self:GetTall() - SScaleMin(126 / 3)) updatesContentFrame:Dock(TOP) updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) updatesContentFrame.Paint = nil PLUGIN.textEntry = vgui.Create("DTextEntry", updatesContentFrame) PLUGIN.textEntry:SetSize(self:GetWide(), updatesContentFrame:GetTall()) PLUGIN.textEntry:SetMultiline(true) PLUGIN.textEntry:SetEnterAllowed(true) PLUGIN.textEntry:SetVerticalScrollbarEnabled( true ) PLUGIN.textEntry:RequestFocus() PLUGIN.textEntry:SetFont("MenuFontNoClamp") PLUGIN.textEntry:SetTextColor( color ) PLUGIN.textEntry:SetCursorColor( color ) PLUGIN.textEntry.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) self:DrawTextEntryText( self:GetTextColor(), self:GetHighlightColor(), self:GetCursorColor() ) end local textEntry = PLUGIN.textEntry PLUGIN.addUpdate.DoClick = function() if #PLUGIN.updatelist == 10 then LocalPlayer():NotifyLocalized("You need to delete an update before you can create a new one!") surface.PlaySound("willardnetworks/datapad/deny.wav") return false end netstream.Start("AddUpdate", textEntry:GetText()) end local updateHelpFrame = self:Add("EditablePanel") updateHelpFrame:SetSize(SScaleMin(560 / 3), SScaleMin(80 / 3)) updateHelpFrame:Dock(TOP) updateHelpFrame:DockMargin(0, SScaleMin(10 / 3), 0, 0) updateHelpFrame.Paint = function(self, w, h) surface.SetDrawColor(Color(0, 0, 0, 40)) surface.DrawRect(0, 0, w, h) end local topbuttons = updateHelpFrame:Add("DPanel") topbuttons:Dock(TOP) topbuttons:SetTall(SScaleMin(200 / 3) / 6) topbuttons.Paint = nil local unorderedlist = topbuttons:Add("DButton") PLUGIN:CreateEditingButton(unorderedlist, "unordered list") unorderedlist.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") textEntry:SetText(textEntry:GetValue().."") end unorderedlist:SetSize(SScaleMin(560 / 3) / 2.39, SScaleMin(200 / 3) / 6) local orderedlist = topbuttons:Add("DButton") PLUGIN:CreateEditingButton(orderedlist, "ordered list") orderedlist.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") textEntry:SetText(textEntry:GetValue().."
  1. Coffee
  2. Tea
  3. Milk
") end orderedlist:SetSize(SScaleMin(560 / 3) / 2.39, SScaleMin(200 / 3) / 6) local bottombuttons = updateHelpFrame:Add("DPanel") bottombuttons:Dock(TOP) bottombuttons:DockMargin(0, SScaleMin(10 / 3), 0, 0) bottombuttons:SetTall(SScaleMin(200 / 3) / 6) bottombuttons.Paint = nil local underline = bottombuttons:Add("DButton") PLUGIN:CreateEditingButton(underline, "underline") underline.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") textEntry:SetText(textEntry:GetValue().." texthere ") end local colortext = bottombuttons:Add("DButton") PLUGIN:CreateEditingButton(colortext, "color text") colortext.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") textEntry:SetText(textEntry:GetValue().."text here") end local bold = bottombuttons:Add("DButton") PLUGIN:CreateEditingButton(bold, "bold") bold.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") textEntry:SetText(textEntry:GetValue().." text here") end local italic = bottombuttons:Add("DButton") PLUGIN:CreateEditingButton(italic, "italic") italic.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") textEntry:SetText(textEntry:GetValue().."text here") end end vgui.Register("ixDatapadNewUpdate", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(SScaleMin(560 / 3), SScaleMin(782 / 3)) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "preview") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(50 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil local back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, updatesTitleSubframe, 87, "back", RIGHT) back.DoClick = function() self:SetVisible(false) surface.PlaySound("willardnetworks/datapad/back.wav") if IsValid(PLUGIN.newUpdate) then if PLUGIN.newUpdate:IsVisible() then PLUGIN.newUpdate:SetPos(0, 0) end elseif IsValid(PLUGIN.editUpdate) then if PLUGIN.editUpdate:IsVisible() then PLUGIN.editUpdate:SetPos(0, 0) end end end local updatesContentFrame = self:Add("EditablePanel") updatesContentFrame:SetSize(self:GetWide(), self:GetParent():GetTall()) updatesContentFrame:Dock(TOP) updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) updatesContentFrame.Paint = nil local updateFrame = updatesContentFrame:Add("HTML") updateFrame:SetSize(updatesContentFrame:GetWide(), self:GetParent():GetTall()) local string = "

"..PLUGIN.textEntry:GetText().."

" local html = string.Replace(string, "\n", "
") updateFrame:SetHTML(html) updateFrame.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) end end vgui.Register("ixDatapadNewUpdatePreview", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "view logs") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(50 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil local back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, updatesTitleSubframe, 87, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end local updatesContentFrame = self:Add("EditablePanel") updatesContentFrame:SetSize(self:GetWide(), SScaleMin(48 / 3) * 10) updatesContentFrame:Dock(TOP) updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) updatesContentFrame.Paint = nil for k, v in SortedPairsByMemberValue(PLUGIN.updatelist, "update_id", true) do local updateFrame = updatesContentFrame:Add("EditablePanel") PLUGIN:CreateUpdates(updateFrame, k, v, 20) for _, v2 in ipairs( updateFrame:GetChildren() ) do if v2:GetName() == "bottom" then for _, v3 in pairs(v2:GetChildren()) do v3:SetWide(SScaleMin(360 / 3)) end local viewLog = v2:Add("DButton") viewLog:SetTextColor(color) viewLog:SetFont("MenuFontNoClamp") viewLog:SetText(string.utf8upper("view log")) viewLog:Dock(RIGHT) viewLog:DockMargin(0, 0, SScaleMin(19 / 3), SScaleMin(5 / 3)) viewLog:SizeToContents() viewLog.Paint = nil viewLog.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate2.wav") PLUGIN.viewLogs:SetVisible(false) PLUGIN.viewLogID = v PLUGIN.viewLog = vgui.Create("ixDatapadViewUpdate", PLUGIN.contentSubframe) end end end end end vgui.Register("ixDatapadViewUpdates", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil ix.gui.datapadCrimes = self local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "crime reports") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(50 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil local paginationPanel = self:Add("Panel") paginationPanel:Dock(BOTTOM) paginationPanel:SetTall(SScaleMin(50 / 3)) self.decrementCrimes, self.incrementCrimes = paginationPanel:Add("DButton"), paginationPanel:Add("DButton") PLUGIN:CreateEditingButton(self.decrementCrimes, "previous page") PLUGIN:CreateEditingButton(self.incrementCrimes, "next page") self.decrementCrimes:Dock(LEFT) self.decrementCrimes:SetWide(self:GetWide() / 2) self.incrementCrimes:Dock(FILL) self.decrementCrimes:DockMargin(0, 0, SScaleMin(5 / 3), 0) self.incrementCrimes:DockMargin(SScaleMin(5 / 3), 0, 0, 0) self.curCollect = 0 self.nextClick = CurTime() self.decrementCrimes.DoClick = function() if self.nextClick > CurTime() then return end self.curCollect = math.max(self.curCollect - 5, 0) self:SendTypeOfContent() self.nextClick = CurTime() + 1 end self.incrementCrimes.DoClick = function() if self.nextClick > CurTime() then return end self.curCollect = self.curCollect + 5 self:SendTypeOfContent() self.nextClick = CurTime() + 1 end self.back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.back, updatesTitleSubframe, 87, "back", RIGHT) self.back:SizeToContents() self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) self.showAll = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.showAll, updatesTitleSubframe, 87, "new", RIGHT) self.showAll:SizeToContents() self.showAll.DoClick = function() self.curCollect = 0 surface.PlaySound("helix/ui/press.wav") netstream.Start("GetCrimeReports", false, false, self.curCollect) self.lastUsedTab = false end PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) self.showResolved = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.showResolved, updatesTitleSubframe, 87, "resolved", RIGHT) self.showResolved:SizeToContents() self.showResolved.DoClick = function() self.curCollect = 0 surface.PlaySound("helix/ui/press.wav") netstream.Start("GetCrimeReports", false, true, self.curCollect) self.lastUsedTab = "resolved" end PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) self.showArchived = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.showArchived, updatesTitleSubframe, 87, "archived", RIGHT) self.showArchived:SizeToContents() self.showArchived.DoClick = function() self.curCollect = 0 surface.PlaySound("helix/ui/press.wav") netstream.Start("GetCrimeReports", true, false, self.curCollect) self.lastUsedTab = "archived" end PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) self.clearArchieved = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.clearArchieved, updatesTitleSubframe, 127, "clear", RIGHT) self.clearArchieved:SizeToContents() self.clearArchieved.DoClick = function() if (!LocalPlayer():IsCombineRankAbove("i1")) then LocalPlayer():NotifyLocalized("Only combine with i1+ rank have access to this.") return false end surface.PlaySound("helix/ui/press.wav") Derma_Query( "Are you sure that you want to clear all archived crime reports?", "THESE CANNOT BE RESTORED", "Yes", function() surface.PlaySound("helix/ui/press.wav") netstream.Start("ClearArchivedCrimeReports") end, "No", function() surface.PlaySound("helix/ui/press.wav") end) end updatesTitleSubframe:SetWide(self.back:GetWide() + (SScaleMin(17 / 3) * 3) + self.showAll:GetWide() + self.showResolved:GetWide() + self.showArchived:GetWide() + self.clearArchieved:GetWide()) self.updatesContentFrame = self:Add("DScrollPanel") self.updatesContentFrame:SetSize(self:GetWide(), self:GetTall()) self.updatesContentFrame:Dock(FILL) self.updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) self.updatesContentFrame.Paint = nil self.updatesContentFrame.crimes = {} netstream.Start("GetCrimeReports", false, false, self.curCollect) self.lastUsedTab = false end function PANEL:SendTypeOfContent() if self.lastUsedTab == false then netstream.Start("GetCrimeReports", false, false, self.curCollect) elseif self.lastUsedTab == "resolved" then netstream.Start("GetCrimeReports", false, true, self.curCollect) else netstream.Start("GetCrimeReports", true, false, self.curCollect) end end function PANEL:CreateCrimes(tCrimes) if #tCrimes == 0 then self.curCollect = math.max(self.curCollect - 5, 0) return end self.updatesContentFrame:Clear() local counter = 0 for _, data in pairs(tCrimes) do counter = counter + 1 local crime = self.updatesContentFrame:Add("EditablePanel") PLUGIN:CreateRow(crime, "NAME | CID | EXTRACT", (istable(data["message_poster"]) and data["message_poster"].poster or data["message_poster"]).." | "..data["message_cid"].." | "..string.Left(data["message_text"], 15).."...", false, true) self:CreateBottomOrTopTextOrButton(crime:GetChildren()[1], "DATE: "..data["message_date"], true) if counter % 2 == 0 then crime.Paint = function(this, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) end else crime.Paint = function(this, w, h) surface.SetDrawColor(0, 0, 0, 75) surface.DrawRect(0, 0, w, h) end end if istable(data["message_poster"]) then if data["message_poster"].resolved then local resolveText = self:CreateBottomOrTopTextOrButton(crime:GetChildren()[1], "RESOLVED", true) resolveText:SetTextColor(Color(180, 255, 180, 255)) crime.Paint = function(this, w, h) surface.SetDrawColor(0, 255, 0, 5) surface.DrawRect(0, 0, w, h) end end end if istable(data["message_poster"]) then if data["message_poster"].archived then local delete = self:CreateBottomOrTopTextOrButton(crime:GetChildren()[2], "DELETE", false, true) delete.DoClick = function() surface.PlaySound("helix/ui/press.wav") crime:Remove() netstream.Start("DeleteCrimeReport", data["message_id"], true, self.lastUsedTab, self.curCollect) end end end local view = self:CreateBottomOrTopTextOrButton(crime:GetChildren()[2], "VIEW", false, true) view.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate2.wav") for _, v in pairs(self.updatesContentFrame.crimes) do if v == crime then continue end v:Remove() end crime:Clear() crime:SetTall(self.updatesContentFrame:GetTall()) crime.Paint = nil local resolveArchivePanel = crime:Add("Panel") resolveArchivePanel:Dock(TOP) resolveArchivePanel:SetTall(SScaleMin(46 / 3)) local resolved = resolveArchivePanel:Add("DButton") PLUGIN:CreateButton(resolved, istable(data["message_poster"]) and data["message_poster"].resolved and "mark as unresolved" or "mark as resolved") resolved:Dock(LEFT) resolved:SetWide(crime:GetWide() * 0.5 - SScaleMin(5 / 3)) local archive = resolveArchivePanel:Add("DButton") PLUGIN:CreateButton(archive, istable(data["message_poster"]) and data["message_poster"].archived and "unarchive" or "archive") archive:Dock(RIGHT) archive:SetWide(crime:GetWide() * 0.5 - SScaleMin(5 / 3)) resolved.Paint = function(this, w, h) surface.SetDrawColor(Color(255, 255, 255, 255)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow.png")) surface.DrawTexturedRect(0, 0, w, h) end archive.Paint = function(this, w, h) surface.SetDrawColor(Color(255, 255, 255, 255)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow.png")) surface.DrawTexturedRect(0, 0, w, h) end resolved.DoClick = function() surface.PlaySound("helix/ui/press.wav") netstream.Start("ResolveCrimeReport", data["message_id"], data["message_poster"], istable(data["message_poster"]) and data["message_poster"].resolved and true or false, self.lastUsedTab, self.curCollect) end archive.DoClick = function() surface.PlaySound("helix/ui/press.wav") netstream.Start("ArchiveCrimeReport", data["message_id"], data["message_poster"], istable(data["message_poster"]) and data["message_poster"].archived and true or false, self.lastUsedTab, self.curCollect) end local entry = crime:Add("DTextEntry") entry:Dock(FILL) entry:SetMultiline(true) entry:SetValue(data["message_text"] or "") entry:SetVerticalScrollbarEnabled( true ) entry:SetEnterAllowed(true) entry:SetEditable(false) entry:SetFont("MenuFontNoClamp") entry:SetTextColor( Color(41, 243, 229, 255) ) entry:SetCursorColor( Color(41, 243, 229, 255) ) entry.Paint = function(this, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() ) end self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") netstream.Start("GetCrimeReports") self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end end end self.updatesContentFrame.crimes[#self.updatesContentFrame.crimes + 1] = crime end end function PANEL:CreateBottomOrTopTextOrButton(parent, text, bTop, bButton) local labelText = parent:Add(bButton and "DButton" or "DLabel") labelText:SetTextColor(bTop and Color(154, 169, 175, 255) or color) labelText:SetFont("MenuFontNoClamp") labelText:SetText(text) labelText:Dock(RIGHT) labelText:DockMargin(0, 0, SScaleMin(20 / 3), 0) labelText:SizeToContents() labelText.Paint = nil return labelText end vgui.Register("ixDatapadViewCrimeReports", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil ix.gui.datapadPersonalNotes = self local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "view personal notes") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil self.back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.back, updatesTitleSubframe, 87, "back", RIGHT) self.back:SizeToContents() self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end PLUGIN:DrawDividerLine(updatesTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) self.save = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.save, updatesTitleSubframe, 87, "save", RIGHT) self.save:SizeToContents() updatesTitleSubframe:SetSize(self.back:GetWide() + self.save:GetWide() + SScaleMin(17 / 3), 0) self.notesContent = self:Add("DTextEntry") self.notesContent:SetSize(self:GetWide(), self:GetTall()) self.notesContent:Dock(FILL) self.notesContent:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) self.notesContent:SetMultiline(true) self.notesContent:SetVerticalScrollbarEnabled( true ) self.notesContent:SetEnterAllowed(true) self.notesContent:SetFont("MenuFontNoClamp") self.notesContent:SetTextColor( color ) self.notesContent:SetCursorColor( color ) self.notesContent.Paint = function(this, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() ) end self.save.DoClick = function() if (ix.config.Get("datafileNoConnection")) then LocalPlayer():Notify("Error: no connection. Notes were only saved locally.") surface.PlaySound("hl1/fvox/buzz.wav") end netstream.Start("SavePersonalNotesDatapad", self.notesContent:GetValue()) end netstream.Start("GetPersonalNotesDatapad") end function PANEL:CreatePersonalNotes(notes) self.notesContent:SetText(notes) end vgui.Register("ixDatapadViewPersonalNotes", PANEL, "EditablePanel") netstream.Hook("ReplyPersonalNotesDatapad", function(notes) if ix.gui.datapadPersonalNotes and IsValid(ix.gui.datapadPersonalNotes) then ix.gui.datapadPersonalNotes:CreatePersonalNotes(notes) end end) PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local updatesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(updatesTitleFrame, self, "view log") local updatesTitleSubframe = updatesTitleFrame:Add("EditablePanel") updatesTitleSubframe:SetSize(SScaleMin(50 / 3), 0) updatesTitleSubframe:Dock(RIGHT) updatesTitleSubframe.Paint = nil local back = updatesTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, updatesTitleSubframe, 87, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.viewLogs:SetVisible(true) end local updatesContentFrame = self:Add("EditablePanel") updatesContentFrame:SetSize(self:GetWide(), self:GetParent():GetTall()) updatesContentFrame:Dock(TOP) updatesContentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) updatesContentFrame.Paint = nil local updateFrame = updatesContentFrame:Add("EditablePanel") PLUGIN:CreateUpdates(updateFrame, 1, PLUGIN.viewLogID, 20) updateFrame:SetSize(updatesContentFrame:GetWide(), self:GetParent():GetTall()) for _, v in pairs(updateFrame:GetChildren()) do if v:GetName() == "bottom" then v:Dock(TOP) v:SetSize(self:GetParent():GetWide(), self:GetParent():GetTall() - SScaleMin(50 / 3)) for _, v2 in pairs(v:GetChildren()) do local string = "

"..PLUGIN.viewLogID.update_text.."

" local html = string.Replace(string, "\n", "
") v2:SetHTML(html) v2:SetSize(self:GetParent():GetWide() - SScaleMin(16 / 3), self:GetParent():GetTall() - SScaleMin(20 / 3)) end end end end vgui.Register("ixDatapadViewUpdate", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetWide(self:GetParent():GetWide()) self:Dock(FILL) self.Paint = nil local function errorNoConnection() LocalPlayer():NotifyLocalized("Error: no connection!") surface.PlaySound("hl1/fvox/buzz.wav") end local titleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(titleFrame, self, "functions") local functionsTitleSubframe = titleFrame:Add("EditablePanel") functionsTitleSubframe:Dock(RIGHT) functionsTitleSubframe.Paint = nil local crimeReports = functionsTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(crimeReports, functionsTitleSubframe, false, "crime reports", RIGHT) PLUGIN:DrawDividerLine(functionsTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) local personalNotes = functionsTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(personalNotes, functionsTitleSubframe, false, "personal notes", RIGHT) functionsTitleSubframe:SetWide(crimeReports:GetWide() + personalNotes:GetWide() + SScaleMin(17 / 3)) crimeReports.DoClick = function() if (ix.config.Get("datafileNoConnection")) then errorNoConnection() return end surface.PlaySound("willardnetworks/datapad/navigate.wav") if IsValid(PLUGIN.searchProfiles) then PLUGIN.searchProfiles:SetVisible(false) end PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.viewCrimeReports = vgui.Create("ixDatapadViewCrimeReports", PLUGIN.contentSubframe) end personalNotes.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") if IsValid(PLUGIN.searchProfiles) then PLUGIN.searchProfiles:SetVisible(false) end PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.viewPersonalNutes = vgui.Create("ixDatapadViewPersonalNotes", PLUGIN.contentSubframe) end local searchProfiles = self:Add("DButton") PLUGIN:CreateButton(searchProfiles, "search citizen data profiles") searchProfiles:DockMargin(0, 0 - SScaleMin(2 / 3), 0, SScaleMin(9 / 3)) searchProfiles.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") PLUGIN.functions:SetVisible(false) PLUGIN.searchProfiles = vgui.Create("ixDatapadSearchProfiles", PLUGIN.contentSubframe) end local viewMyData = self:Add("DButton") PLUGIN:CreateButton(viewMyData, "view my data profile", ix.config.Get("datafileNoConnection")) viewMyData.DoClick = function() if (ix.config.Get("datafileNoConnection")) then errorNoConnection() return end surface.PlaySound("willardnetworks/datapad/navigate.wav") PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) netstream.Start("OpenDatafile", nil, true) end local protectionTeams = self:Add("DButton") PLUGIN:CreateButton(protectionTeams, "protection teams", ix.config.Get("datafileNoConnection")) protectionTeams.DoClick = function() if (ix.config.Get("datafileNoConnection")) then errorNoConnection() return end surface.PlaySound("willardnetworks/datapad/navigate.wav") PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.clProtectionTeams = vgui.Create("ixDatapadProtectionTeams", PLUGIN.contentSubframe) end local characterFaction = LocalPlayer():GetCharacter():GetFaction() local activePermits = self:Add("DButton") PLUGIN:CreateButton(activePermits, "active permits", ix.config.Get("datafileNoConnection")) activePermits.DoClick = function() if (ix.config.Get("datafileNoConnection")) then errorNoConnection() return end if (characterFaction != FACTION_WORKERS and characterFaction != FACTION_ADMIN and characterFaction != FACTION_SERVERADMIN and characterFaction != FACTION_OVERWATCH and !LocalPlayer():IsCombineRankAbove("i1")) then LocalPlayer():NotifyLocalized("Only CWU, CA and i1+ have access to this.") return false end surface.PlaySound("willardnetworks/datapad/navigate.wav") PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.activePermits = vgui.Create("ixDatapadActivePermits", PLUGIN.contentSubframe) end local activeWages = self:Add("DButton") PLUGIN:CreateButton(activeWages, "active wages/loyalists", ix.config.Get("datafileNoConnection")) activeWages.DoClick = function() if (ix.config.Get("datafileNoConnection")) then errorNoConnection() return end if (characterFaction != FACTION_WORKERS and characterFaction != FACTION_ADMIN and characterFaction != FACTION_SERVERADMIN and characterFaction != FACTION_OVERWATCH and !LocalPlayer():IsCombineRankAbove("i1")) then LocalPlayer():NotifyLocalized("Only CWU, CA and i1+ have access to this.") return false end surface.PlaySound("willardnetworks/datapad/navigate.wav") PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.activeWages = vgui.Create("ixDatapadActiveWages", PLUGIN.contentSubframe) end local apartments = self:Add("DButton") PLUGIN:CreateButton(apartments, "housing/shops", ix.config.Get("datafileNoConnection")) apartments.DoClick = function() if (ix.config.Get("datafileNoConnection")) then errorNoConnection() return end surface.PlaySound("willardnetworks/datapad/navigate.wav") PLUGIN.updates:SetVisible(false) PLUGIN.functions:SetVisible(false) PLUGIN.apartments = vgui.Create("ixDatapadApartments", PLUGIN.contentSubframe) end end vgui.Register("ixDatapadFunctions", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() if (IsValid(ix.gui.protectionTeams)) then ix.gui.protectionTeams:Remove() end ix.gui.protectionTeams = self self.teams = {} self.teamSubpanels = {} self:SetSize(self:GetParent():GetSize()) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local teamsTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(teamsTitleFrame, self, "protection teams") local teamsTitleSubframe = teamsTitleFrame:Add("EditablePanel") teamsTitleSubframe:SetSize(SScaleMin(108 / 3), 0) teamsTitleSubframe:Dock(RIGHT) teamsTitleSubframe.Paint = nil local back = teamsTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, teamsTitleSubframe, 87, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end self.teamsPanel = self:Add("ixHelpMenuCategories") self.teamsPanel:Dock(LEFT) self.teamsPanel.Paint = nil self.teamsPanel:DockPadding(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), SScaleMin(10 / 3)) self.teamsPanel.Paint = function(_, w, h) surface.SetDrawColor(Color(150, 150, 150, 20)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/tabmenu/crafting/box_pattern.png")) surface.DrawTexturedRect(0, 0, w, h) end local divider = self:Add("DShape") divider:SetType( "Rect" ) divider:SetWide( 1 ) divider:Dock(LEFT) divider:SetColor(color) divider:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3)) self.membersPanel = self:Add("Panel") self.membersPanel:Dock(FILL) self.membersPanel:DockPadding(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), SScaleMin(10 / 3)) local title = self.teamsPanel:Add("DLabel") title:SetFont("TitlesFontNoClamp") title:SetText(string.utf8upper("Teams")) title:SetContentAlignment(5) title:SizeToContents() title:SetTextColor(color) title:DockMargin(0, 0, 0, SScaleMin(10 / 3)) title:Dock(TOP) local title2 = self.membersPanel:Add("DLabel") title2:SetFont("TitlesFontNoClamp") title2:SetText(string.utf8upper("Team Members")) title2:SetContentAlignment(5) title2:SizeToContents() title2:SetTextColor(color) title2:DockMargin(0, 0, 0, SScaleMin(10 / 3)) title2:Dock(TOP) self.memberScroll = self.membersPanel:Add("DScrollPanel") self.memberScroll:Dock(FILL) self.teamScroll = self.teamsPanel:Add("DScrollPanel") self.teamScroll:Dock(FILL) self:CreateButtons() end function PANEL:CreateButtons() if !self then self = ix.gui.protectionTeams end local teams = {} if (PLUGIN.teams and !table.IsEmpty(PLUGIN.teams)) then for k, v in pairs(PLUGIN.teams) do teams[k] = function(container) local memberList = {} for k2, v2 in pairs(v["members"]) do if (!IsValid(v2)) then table.remove(v["members"], k2) continue end if (v2:GetNetVar("ProtectionTeamOwner")) then memberList[#memberList + 1] = { client = v2, owner = 1 } else memberList[#memberList + 1] = { client = v2, owner = 99 } end end for _, v2 in SortedPairsByMemberValue(memberList, "owner", false) do local member = self.memberScroll:Add("ixMenuButton") member:SetFont("MenuFontBoldNoClamp") member:SetText(v2.client:Name() or "Unknown") member:SizeToContents() member:Dock(TOP) member.Paint = function(this, width, height) derma.SkinFunc("DrawImportantBackground", 0, 0, width, height, ColorAlpha(this.backgroundColor, this.currentBackgroundAlpha)) end member.DoRightClick = function(this) if ((!LocalPlayer():IsDispatch()) and (!LocalPlayer():GetNetVar("ProtectionTeamOwner") or LocalPlayer():GetNetVar("ProtectionTeam") != k)) then return end local interactMenu = DermaMenu(this) local member1 = interactMenu:AddOption(v2.client:Name()) member1:SetContentAlignment(5) member1.Paint = function(_, width, height) end local spacer = interactMenu:AddSpacer() spacer.Paint = function(_, width, height) surface.SetDrawColor( Color( 255, 255, 255, 100 ) ) surface.DrawRect( 0, 0, width, height ) end interactMenu:AddOption(L("TeamTransferOwner"), function() ix.command.Send("PTLead", v2.client:Name()) end):SetIcon( "icon16/award_star_gold_1.png" ) interactMenu:AddOption(L("TeamKickMember"), function() ix.command.Send("PTKick", v2.client:Name()) end):SetIcon( "icon16/cross.png" ) interactMenu:Open() this.Menu = interactMenu for _, v3 in pairs(interactMenu:GetChildren()[1]:GetChildren()) do if v3:GetClassName() == "Label" then v3:SetFont("MenuFontNoClamp") end end end if (v2.client:GetNetVar("ProtectionTeamOwner")) then member.backgroundColor = Color(50,150,100) end end end end end for k, v in pairs(teams) do self:AddTeam(k) self.teams[k] = v end self.createButton = self.teamsPanel:Add("ixMenuButton") self.createButton:SetText("tabCreateTeam") self.createButton:SizeToContents() self.createButton:SetZPos(-99) self.createButton:Dock(BOTTOM) self.createButton.DoClick = function() ix.command.Send("PTCreate") end self.teamsPanel:SetWide(self:GetWide() * 0.5) if (LocalPlayer():GetNetVar("ProtectionTeam")) then if (IsValid(self.createButton)) then self.createButton:Remove() end self.leaveButton = self.membersPanel:Add("ixMenuButton") self.leaveButton:SetText("tabLeaveTeam") self.leaveButton:SizeToContents() self.leaveButton:Dock(BOTTOM) self.leaveButton.DoClick = function() ix.command.Send("PTLeave") end end if (self.teams[ix.gui.lastTeamMenuTab] or LocalPlayer():GetNetVar("ProtectionTeam")) then local lastTab = self.teams[ix.gui.lastTeamMenuTab] and ix.gui.lastTeamMenuTab or LocalPlayer():GetNetVar("ProtectionTeam") self:OnCategorySelected(lastTab) end end function PANEL:AddTeam(name) local button = self.teamScroll:Add("ixMenuButton") button:SetText(L("TeamName", name)) button:SetBackgroundColor(ix.config.Get("color")) button.backgroundAlpha = 255 button:SizeToContents() button:Dock(TOP) button.DoClick = function(this) self:OnCategorySelected(name) PLUGIN:UpdateTeamMenu() end button.DoRightClick = function(this) if ((LocalPlayer():GetNetVar("ProtectionTeam") != name or !LocalPlayer():GetNetVar("ProtectionTeamOwner")) and !LocalPlayer():IsDispatch()) then return end local reassignMenu = DermaMenu(this) reassignMenu:AddOption(L("TeamReassign"), function() Derma_StringRequest(L("cmdPTReassign"), L("cmdReassignPTDesc"), name, function(text) ix.command.Send("PTReassign", text, name) end) end) reassignMenu:Open() this.Menu = reassignMenu end local panel = self.teamScroll:Add("DScrollPanel") panel:SetVisible(false) panel:Dock(FILL) -- reverts functionality back to a standard panel in the case that a category will manage its own scrolling panel.DisableScrolling = function() panel:GetCanvas():SetVisible(false) panel:GetVBar():SetVisible(false) panel.OnChildAdded = function() end end button.Paint = function(this, width, height) local alpha = panel:IsVisible() and this.backgroundAlpha or this.currentBackgroundAlpha surface.SetDrawColor(ColorAlpha(ix.config.Get("color"), alpha)) surface.DrawRect(0, 0, width, height) end self.teamSubpanels[name] = panel return button end function PANEL:OnCategorySelected(name) local panel = self.teamSubpanels[name] if (!IsValid(panel)) then return end if (!panel.bPopulated) then self.teams[name](panel) panel.bPopulated = true end if (IsValid(self.activeTeam)) then self.activeTeam:SetVisible(false) end panel:SetVisible(true) self.activeTeam = panel ix.gui.lastTeamMenuTab = name self:OnTeamSelected(name) end function PANEL:OnTeamSelected(index) if (LocalPlayer():GetNetVar("ProtectionTeam") != index and !LocalPlayer():GetNetVar("ProtectionTeam")) then if (IsValid(self.joinButton)) then self.joinButton:Remove() end self.joinButton = self.membersPanel:Add("ixMenuButton") self.joinButton:SetText("tabJoinTeam") self.joinButton:SizeToContents() self.joinButton:Dock(BOTTOM) self.joinButton.DoClick = function(this) ix.command.Send("PTJoin", index) end end end vgui.Register("ixDatapadProtectionTeams", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() self:SetSize(self:GetParent():GetWide(), SScaleMin(247 / 3)) self:Dock(TOP) self:DockMargin(0, 0, 0, SScaleMin(32 / 3)) self.Paint = nil local searchProfilesTitleFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(searchProfilesTitleFrame, self, "search profiles") local searchTitleSubframe = searchProfilesTitleFrame:Add("EditablePanel") searchTitleSubframe:SetSize(SScaleMin(300 / 3), 0) searchTitleSubframe:Dock(RIGHT) searchTitleSubframe.Paint = nil self.search = searchTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.search, searchTitleSubframe, 87, "search", RIGHT) self.topDivider = PLUGIN:DrawDividerLine(searchTitleSubframe, 2, 13, 0, SScaleMin( 4 / 3), RIGHT ) self.back = searchTitleSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.back, searchTitleSubframe, 87, "back", RIGHT) self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.functions:SetVisible(true) end local noConnection2 = self:Add("DLabel") self.noConnection2 = noConnection2 noConnection2:SetHeight(SScaleMin(46 / 3)) noConnection2:SetContentAlignment(4) noConnection2:SetTextInset(SScaleMin(20 / 3), 0) noConnection2:Dock(TOP) noConnection2:SetFont("TitlesFontNoClamp") noConnection2:DockMargin(0, 0, 0, SScaleMin(9 / 3)) noConnection2:SetText(string.utf8upper("ERROR: NO CONNECTION")) noConnection2.Paint = function(self, w, h) surface.SetDrawColor(Color(255, 0, 0, 255)) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/buttonnoarrow-off.png")) surface.DrawTexturedRect(0, 0, w, h) end noConnection2:SetVisible(false) local contentFrame = self:Add("EditablePanel") contentFrame:SetSize(self:GetWide(), self:GetParent():GetTall()) contentFrame:Dock(TOP) contentFrame:DockMargin(0, 0 - SScaleMin(2 / 3), 0, 0) contentFrame.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) end local nameText = contentFrame:Add("DLabel") nameText:SetFont("MenuFontNoClamp") nameText:SetTextColor(color) nameText:SetText(string.utf8upper("Name or CID:")) nameText:Dock(TOP) nameText:SetZPos(1) nameText:DockMargin(SScaleMin(20 / 3), SScaleMin(20 / 3), SScaleMin(20 / 3), SScaleMin(20 / 3)) self.name = contentFrame:Add("DTextEntry") self.name:Dock(TOP) self.name:DockMargin(SScaleMin(20 / 3), 0, SScaleMin(20 / 3), SScaleMin(10 / 3)) self.name:SetMultiline(false) self.name:RequestFocus() self.name:SetEnterAllowed(true) self.name:SetFont("MenuFontNoClamp") self.name:SetTall(SScaleMin(20 / 3)) self.name:SetVerticalScrollbarEnabled( false ) self.name:SetTextColor( color ) self.name:SetZPos(2) self.name:SetCursorColor( color ) self.name.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) self:DrawTextEntryText( self:GetTextColor(), self:GetHighlightColor(), self:GetCursorColor() ) end self.name.OnEnter = function() if (ix.config.Get("datafileNoConnection")) then LocalPlayer():NotifyLocalized("Error: no connection!") surface.PlaySound("hl1/fvox/buzz.wav") noConnection2:SetVisible(true) return end surface.PlaySound("willardnetworks/datapad/navigate2.wav") netstream.Start("OpenDatafile", self.name:GetText(), false) end self.search.DoClick = function() if (ix.config.Get("datafileNoConnection")) then LocalPlayer():NotifyLocalized("Error: no connection!") surface.PlaySound("hl1/fvox/buzz.wav") noConnection2:SetVisible(true) return end surface.PlaySound("willardnetworks/datapad/navigate2.wav") netstream.Start("OpenDatafile", self.name:GetText(), false) end PLUGIN.searchEntry = self.name PLUGIN.searchButton = self.search end vgui.Register("ixDatapadSearchProfiles", PANEL, "EditablePanel") PANEL = {} function PANEL:Init() ix.gui.activePermitsDatapad = self self:Dock(FILL) self.Paint = nil local activePermitsFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(activePermitsFrame, self, "active permits") local activePermitsSubframe = activePermitsFrame:Add("EditablePanel") activePermitsSubframe:SetSize(SScaleMin(108 / 3), 0) activePermitsSubframe:Dock(RIGHT) activePermitsSubframe.Paint = nil local back = activePermitsSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, activePermitsSubframe, 87, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end self.content = self:Add("DScrollPanel") self.content:Dock(FILL) self:GetUpdates() end function PANEL:CreateActivePermits(activePermitsList) for _, v in pairs(activePermitsList) do local dropdown = self.content:Add("DCollapsibleCategory") dropdown:SetLabel("") dropdown:SetExpanded( false ) dropdown:Dock(TOP) dropdown:GetChildren()[1]:SetHeight(SScaleMin(30 / 3)) dropdown.Paint = function(this, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) if dropdown:GetExpanded() then surface.SetDrawColor(color_white) surface.SetMaterial( ix.util.GetMaterial("willardnetworks/tabmenu/crafting/minus.png")) surface.DrawTexturedRect(SScaleMin(480 / 3) - SScaleMin(15 / 3) - (self.content:GetVBar():IsVisible() and SScaleMin(10 / 3) * 2 or SScaleMin(10 / 3)), SScaleMin(30 / 3) * 0.5 - SScaleMin(15 / 3) * 0.5, SScaleMin(15 / 3), SScaleMin(15 / 3)) else surface.SetDrawColor(color_white) surface.SetMaterial( ix.util.GetMaterial("willardnetworks/tabmenu/crafting/plus.png")) surface.DrawTexturedRect(SScaleMin(480 / 3) - SScaleMin(15 / 3) - (self.content:GetVBar():IsVisible() and SScaleMin(10 / 3) * 2 or SScaleMin(10 / 3)), SScaleMin(30 / 3) * 0.5 - SScaleMin(15 / 3) * 0.5, SScaleMin(15 / 3), SScaleMin(15 / 3)) end end local coverPanel = vgui.Create("DShape", dropdown) coverPanel:SetSize(SScaleMin(480 / 3), SScaleMin(30 / 3)) coverPanel:SetColor(Color(100, 100, 100, 10)) coverPanel:SetType("Rect") local categoryTitle = vgui.Create("DLabel", dropdown) categoryTitle:SetText(v.name.. " | #"..v.cid) categoryTitle:SetFont("MenuFontLargerBoldNoFix") categoryTitle:SetColor(color) categoryTitle:SizeToContents() categoryTitle:SetPos(SScaleMin(10 / 3), (SScaleMin(30 / 3) * 0.5) - (categoryTitle:GetTall() * 0.5)) local categoryList = vgui.Create("Panel", dropdown) categoryList:Dock(FILL) dropdown:SetContents(categoryList) categoryList.Paint = function(self, w, h) surface.SetDrawColor(color) surface.DrawLine(0, 0, w, 0) end for k2, v2 in pairs(v.permits) do if !isbool(v2) and v2 <= os.time() then continue end local permitPanel = categoryList:Add("Panel") permitPanel:Dock(TOP) permitPanel:SetTall(SScaleMin(30 / 3)) categoryList:DockMargin(0, 0, 0, 0 - SScaleMin(30 / 3)) local permitName = permitPanel:Add("DLabel") permitName:Dock(LEFT) permitName:SetText(Schema:FirstToUpper(k2)) permitName:SetFont("MenuFontBoldNoClamp") permitName:SetColor(color) permitName:SizeToContents() permitName:DockMargin(SScaleMin(10 / 3), 0, 0, 0) local disable = permitPanel:Add("DButton") disable:Dock(RIGHT) disable:SetWide(SScaleMin(100 / 3)) disable:SetText("DISABLE") disable:SetFont("MenuFontBoldNoClamp") disable.Paint = function(self, w, h) surface.SetDrawColor(color_white) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/licensedisabled2.png")) surface.DrawTexturedRect(0, 0, w, h) end disable.DoClick = function() permitPanel:Remove() local genericdata = v genericdata.permits[k2] = nil netstream.Start("RemovePermitDatapad", genericdata, "permit") surface.PlaySound("willardnetworks/datapad/navigate.wav") if #categoryList:GetChildren() == 1 then dropdown:Remove() end end local endDate = permitPanel:Add("DLabel") endDate:Dock(RIGHT) if isbool(v2) then endDate:SetText("END DATE: UNLIMITED") else endDate:SetText("END DATE: "..os.date( "%d/%m/%Y" , v2 )) end endDate:SetFont("MenuFontBoldNoClamp") endDate:SetColor(Color(51, 243, 36, 255)) endDate:SizeToContents() endDate:DockMargin(0, 0, SScaleMin(10 / 3), 0) end end end function PANEL:GetUpdates() netstream.Start("GetActivePermitsDatapad") end vgui.Register("ixDatapadActivePermits", PANEL, "EditablePanel") netstream.Hook("CreateActivePermitsDatapad", function(permits) if !IsValid(ix.gui.activePermitsDatapad) then return end ix.gui.activePermitsDatapad:CreateActivePermits(permits) end) netstream.Hook("CreateActiveShopPermitsDatapad", function(permits) if !IsValid(ix.gui.shopPermits) then return end ix.gui.shopPermits:CreateActivePermits(permits) end) PANEL = {} function PANEL:Init() ix.gui.activeWagesDatapad = self self:Dock(FILL) self.Paint = nil local activeWagesFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(activeWagesFrame, self, "active wages") local activeWagesSubframe = activeWagesFrame:Add("EditablePanel") activeWagesSubframe:SetSize(SScaleMin(108 / 3), 0) activeWagesSubframe:Dock(RIGHT) activeWagesSubframe.Paint = nil self.decrementWages, self.incrementWages = activeWagesFrame:Add("DButton"), activeWagesFrame:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.incrementWages, activeWagesSubframe, 87, "next page", RIGHT) self.incrementWages:SetZPos(1) PLUGIN:CreateTitleFrameRightTextButton(self.decrementWages, activeWagesSubframe, 87, "previous page", RIGHT) self.decrementWages:SetZPos(2) self.incrementWages:DockMargin(SScaleMin(20 / 3), 0, 0 - SScaleMin(3 / 3), SScaleMin(6 / 3)) self.curCollect = 0 self.nextClick = CurTime() self.decrementWages.DoClick = function() if self.nextClick > CurTime() then return end self.wagesContent:Clear() self.loyalistsContent:Clear() self.curCollect = math.max(self.curCollect - 5, 0) self:GetUpdates(self.curCollect) self.nextClick = CurTime() + 1 end self.incrementWages.DoClick = function() if self.nextClick > CurTime() then return end self.wagesContent:Clear() self.loyalistsContent:Clear() self.curCollect = self.curCollect + 5 self:GetUpdates(self.curCollect) self.nextClick = CurTime() + 1 end local back = activeWagesSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(back, activeWagesSubframe, 87, "back", RIGHT) back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end self.wagesContent = self:Add("DScrollPanel") self.wagesContent:Dock(TOP) self.wagesContent:SetTall(self:GetParent():GetTall() * 0.5 - activeWagesFrame:GetTall()) self.wagesContent:DockMargin(0, 0, 0, SScaleMin(10 / 3)) local activeLoyalistsFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(activeLoyalistsFrame, self, "loyalists") local activeLoyalistsSubframe = activeLoyalistsFrame:Add("EditablePanel") activeLoyalistsSubframe:SetSize(SScaleMin(108 / 3), 0) activeLoyalistsSubframe:Dock(RIGHT) activeLoyalistsSubframe.Paint = nil self.loyalistsContent = self:Add("DScrollPanel") self.loyalistsContent:Dock(FILL) self.decrementLoyalists, self.incrementLoyalists = activeLoyalistsFrame:Add("DButton"), activeLoyalistsFrame:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.incrementLoyalists, activeLoyalistsSubframe, 87, "next page", RIGHT) self.incrementLoyalists:SetZPos(1) PLUGIN:CreateTitleFrameRightTextButton(self.decrementLoyalists, activeLoyalistsSubframe, 87, "previous page", RIGHT) self.decrementLoyalists:SetZPos(2) self.incrementLoyalists:DockMargin(SScaleMin(20 / 3), 0, 0 - SScaleMin(3 / 3), SScaleMin(6 / 3)) self.decrementLoyalists.DoClick = self.decrementWages.DoClick self.incrementLoyalists.DoClick = self.incrementWages.DoClick self:GetUpdates(self.curCollect) end function PANEL:GetUpdates(curCollect) netstream.Start("GetActiveWagesDatapad", curCollect) end function PANEL:CreateActiveWages(wages, loyalists) self:CreateActivePanels(wages, self.wagesContent) self:CreateActivePanels(loyalists, self.loyalistsContent) end function PANEL:CreateActivePanels(table, parent) local counter = 0 for _, data in SortedPairsByMemberValue(table, "socialCredits", true) do data.socialCredits = !data.combine and math.Clamp(tonumber(data.socialCredits), 0, 200) or tonumber(data.socialCredits) counter = counter + 1 local wagesPanel = parent:Add("Panel") wagesPanel:Dock(TOP) wagesPanel:SetTall(SScaleMin(30 / 3)) if counter % 2 == 0 then wagesPanel.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) end else wagesPanel.Paint = function(self, w, h) surface.SetDrawColor(0, 0, 0, 75) surface.DrawRect(0, 0, w, h) end end local wagesContent = "WAGES: "..data.wages local loyalistContent = "SC: "..data.socialCredits.." | "..data.loyaltyStatus local wagesName = wagesPanel:Add("DLabel") wagesName:Dock(LEFT) wagesName:SetText(data.name.." | #"..data.cid.." | "..(parent == self.wagesContent and wagesContent or loyalistContent)) wagesName:SetFont("MenuFontBoldNoClamp") wagesName:SetColor(color) wagesName:SizeToContents() wagesName:DockMargin(SScaleMin(10 / 3), 0, 0, 0) if parent == self.loyalistsContent and data.loyaltyStatus == "NONE" then continue end local disable = wagesPanel:Add("DButton") disable:Dock(RIGHT) disable:SetWide(SScaleMin(135 / 3)) disable:SetText(parent == self.wagesContent and "REMOVE WAGE" or "REMOVE STATUS") disable:SetFont("MenuFontBoldNoClamp") disable.Paint = function(self, w, h) surface.SetDrawColor(color_white) surface.SetMaterial(ix.util.GetMaterial("willardnetworks/datafile/licensedisabled2.png")) surface.DrawTexturedRect(0, 0, w, h) end disable.DoClick = function() local genericdata = data if parent == self.loyalistsContent then if genericdata.loyaltyStatus != "NONE" and genericdata.socialCredits < 200 then wagesPanel:Remove() end if genericdata.loyaltyStatus != "NONE" and genericdata.socialCredits >= 200 then disable:Remove() end end if parent == self.wagesContent then genericdata.wages = 0 else genericdata.loyaltyStatus = "NONE" end if wagesName and IsValid(wagesName) and parent == self.loyalistsContent then wagesName:SetText(data.name.." | #"..data.cid.." | SC: "..data.socialCredits.." | "..data.loyaltyStatus) end netstream.Start("RemovePermitDatapad", genericdata, parent == self.wagesContent) if self.wagesContent and IsValid(self.wagesContent) then self.wagesContent:Clear() end if self.loyalistsContent and IsValid(self.loyalistsContent) then self.loyalistsContent:Clear() end self:GetUpdates(self.curCollect) surface.PlaySound("willardnetworks/datapad/navigate.wav") end end end vgui.Register("ixDatapadActiveWages", PANEL, "EditablePanel") net.Receive("CreateActiveWagesDatapad", function() local wages = net.ReadTable() local loyalists = net.ReadTable() if !ix.gui.activeWagesDatapad then return end if !IsValid(ix.gui.activeWagesDatapad) then return end ix.gui.activeWagesDatapad:CreateActiveWages(wages, loyalists) end) PANEL = {} function PANEL:Init() ix.gui.apartments = self self:Dock(FILL) self.Paint = nil self.apartmentsFrame = self:Add("EditablePanel") PLUGIN:CreateTitle(self.apartmentsFrame, self, "apartments") local apartmentsSubframe = self.apartmentsFrame:Add("EditablePanel") apartmentsSubframe:SetSize(SScaleMin(108 / 3), 0) apartmentsSubframe:Dock(FILL) apartmentsSubframe.Paint = nil self.back = apartmentsSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.back, apartmentsSubframe, 87, "back", RIGHT) self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end self.back:SetZPos(1) self.content = self:Add("DScrollPanel") self.content:Dock(FILL) self.apartmentButtons = {} self.decrementApartments, self.incrementApartments = apartmentsSubframe:Add("DButton"), apartmentsSubframe:Add("DButton") PLUGIN:CreateTitleFrameRightTextButton(self.incrementApartments, apartmentsSubframe, 87, "next page", RIGHT) self.incrementApartments:SetZPos(2) PLUGIN:CreateTitleFrameRightTextButton(self.decrementApartments, apartmentsSubframe, 87, "previous page", RIGHT) self.decrementApartments:SetZPos(3) self.incrementApartments:DockMargin(SScaleMin(20 / 3), 0, 0 - SScaleMin(3 / 3) + SScaleMin(20 / 3), SScaleMin(6 / 3)) self.curCollect = 5 self.nextClick = CurTime() self.decrementApartments.DoClick = function() if self.nextClick > CurTime() then return end self.curCollect = math.max(self.curCollect - 5, 5) self:GetApartments(self.curCollect) self.nextClick = CurTime() + 1 end self.incrementApartments.DoClick = function() if self.nextClick > CurTime() then return end self.curCollect = self.curCollect + 5 self:GetApartments(self.curCollect) self.nextClick = CurTime() + 1 end self:GetApartments(self.curCollect) end function PANEL:RevertBackToNormal() self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:SetVisible(false) PLUGIN.updates:SetVisible(true) PLUGIN.functions:SetVisible(true) end self.apartmentsFrame:GetChildren()[1]:SetText("APARTMENTS") self.apartmentsFrame:GetChildren()[1]:SizeToContents() end function PANEL:GetApartments() netstream.Start("RequestApartmentNamesDatapad", self.curCollect) end function PANEL:CreateDividerPart(parent, text, bDockRight, bShouldRightSpace) local panel = parent:Add("Panel") panel:Dock(bDockRight and RIGHT or LEFT) panel.Think = function() panel:DockMargin(0, 0, bShouldRightSpace and ((self.viewWidth or 0) + SScaleMin(20 / 3)) or 0, 0) end panel.Paint = function(_, w, h) surface.SetDrawColor(color) surface.DrawLine(w - 1, SScaleMin(5 / 3), w - 1, h - SScaleMin(5 / 3)) end local label = panel:Add("DLabel") label:SetText(text and string.upper(text) or "") label:SetFont("MenuFontBoldNoClamp") label:SetContentAlignment(5) label:SizeToContents() label:Dock(FILL) panel:SetSize(label:GetWide() + SScaleMin(20 / 3), parent:GetTall()) return panel end function PANEL:ClearContent() self.content:Clear() if IsValid(self.content2) and IsValid(self.shopsFrame) then self.shopsFrame:Remove() self.content2:Remove() end end function PANEL:CreateApartments(apartments, callback, bShops) local dividerPanel = vgui.Create("Panel", !bShops and self.content or (IsValid(self.content2) and self.content2 or self.content)) dividerPanel:Dock(TOP) dividerPanel:SetTall(SScaleMin(30 / 3)) dividerPanel.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 150) surface.DrawRect(0, 0, w, h) end local name = self:CreateDividerPart(dividerPanel, "name") local tenantAmount = self:CreateDividerPart(dividerPanel, "tenants", true, true) local rentDue = self:CreateDividerPart(dividerPanel, "rent due", true) local rent = self:CreateDividerPart(dividerPanel, "rent", true) local osDateWidth = 0 local counter = 0 for appID, tApartment in SortedPairsByMemberValue(apartments, "name") do counter = counter + 1 local apartmentsPanel = vgui.Create("EditablePanel", !bShops and self.content or (IsValid(self.content2) and self.content2 or self.content)) apartmentsPanel:Dock(TOP) apartmentsPanel:SetTall(SScaleMin(30 / 3)) if counter % 2 == 0 then apartmentsPanel.Paint = function(self, w, h) surface.SetDrawColor(40, 88, 115, 75) surface.DrawRect(0, 0, w, h) end else apartmentsPanel.Paint = function(self, w, h) surface.SetDrawColor(0, 0, 0, 75) surface.DrawRect(0, 0, w, h) end end local view = apartmentsPanel:Add("DButton") view:Dock(RIGHT) view:SetText("VIEW") view:SetFont("MenuFontBoldNoClamp") view:SizeToContents() view:DockMargin(SScaleMin(10 / 3), 0, SScaleMin(10 / 3), 0) view.Paint = nil view.DoClick = function() surface.PlaySound("willardnetworks/datapad/navigate.wav") self:ViewSingleApartment(appID, tApartment, apartments) if self.decrementApartments and IsValid(self.decrementApartments) then self.decrementApartments:SetVisible(false) end if self.incrementApartments and IsValid(self.incrementApartments) then self.incrementApartments:SetVisible(false) end end local actualName = self:CreateDividerPart(apartmentsPanel, string.len(tApartment.name) < 18 and tApartment.name or string.Left(tApartment.name, 18).."...") actualName:Dock(FILL) local actualTenantAmount = self:CreateDividerPart(apartmentsPanel, table.Count(tApartment.tenants), true) actualTenantAmount:SetWide(tenantAmount:GetWide()) actualTenantAmount:GetChildren()[1]:Center() local actualRentDue = self:CreateDividerPart(apartmentsPanel, os.date("%d/%m/%Y", tApartment.rentDue), true) osDateWidth = actualRentDue:GetWide() local actualRent = self:CreateDividerPart(apartmentsPanel, tApartment.rent, true) actualRent:SetWide(rent:GetWide()) actualRent:GetChildren()[1]:Center() self.viewWidth = view:GetWide() self.apartmentButtons[appID] = view end rentDue:SetWide(osDateWidth) name:GetChildren()[1]:Center() name:Dock(FILL) if (callback) then callback(!bShops and self.content or (IsValid(self.content2) and self.content2 or self.content), PLUGIN) end end function PANEL:ViewSingleApartment(appID, tApartment, apartments) self:ClearContent() if IsValid(self.apartmentsFrame) then self.apartmentsFrame:GetChildren()[1]:SetText(string.upper((string.len(tApartment.name) > 30 and string.Left(tApartment.name, 27).."..." or tApartment.name).." | "..(tApartment.type or ""))) self.apartmentsFrame:GetChildren()[1]:SizeToContents() end self.content:Dock(FILL) self.content:DockMargin(0, 0, 0, 0) if IsValid(self.back) then self.back.DoClick = function() surface.PlaySound("willardnetworks/datapad/back.wav") self:GetApartments(self.curCollect) self:RevertBackToNormal() if self.incrementApartments and IsValid(self.incrementApartments) then self.incrementApartments:SetVisible(true) end if self.decrementApartments and IsValid(self.decrementApartments) then self.decrementApartments:SetVisible(true) end end end local rent = self.content:Add("EditablePanel") PLUGIN:CreateRow(rent, "rent", tApartment.rent, false, true) local edit = self:CreateBottomOrTopTextOrButton(rent.bottom, "EDIT", false, true) edit.DoClick = function() Derma_StringRequest("Change Rent", "Changes the required rent of the apartment.", tApartment.rent, function(text) netstream.Start("ApartmentUpdateRent", appID, tonumber(text)) surface.PlaySound("willardnetworks/datapad/navigate.wav") end) surface.PlaySound("willardnetworks/datapad/navigate.wav") end local individualRent = self.content:Add("EditablePanel") PLUGIN:CreateRow(individualRent, "individual rent", table.Count(tApartment.tenants) == 0 and "0" or (math.ceil(tApartment.rent / table.Count(tApartment.tenants)))) local housing = ix.plugin.list["housing"] if housing and housing.GetRemainingRent then local rentRemaining = self.content:Add("EditablePanel") PLUGIN:CreateRow(rentRemaining, "rent remaining", housing:GetRemainingRent(tApartment), false, true) end local rentDue = self.content:Add("EditablePanel") PLUGIN:CreateRow(rentDue, "rent due", os.date("%H:%M:%S - %d/%m/%Y", tApartment.rentDue), false, IsValid(housing) and true or false) local extendRent = self:CreateBottomOrTopTextOrButton(rentDue.bottom, "EXTEND", false, true) extendRent.DoClick = function() Derma_StringRequest("Extend rent due date", "By how many days?.", 0, function(text) netstream.Start("ApartmentExtendRentDueDateByDays", appID, tonumber(text)) surface.PlaySound("willardnetworks/datapad/navigate.wav") end) surface.PlaySound("willardnetworks/datapad/navigate.wav") end local tenantsTitle = self.content:Add("EditablePanel") PLUGIN:CreateTitle(tenantsTitle, self.content, "tenants".." | ".."ASSIGN DISABLED: "..((tApartment.noAssign == true and "TRUE" or "FALSE") or "")) tenantsTitle:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3)) local addTenant = self:CreateBottomOrTopTextOrButton(tenantsTitle, "ADD TENANT", false, true) addTenant:DockMargin(0, 0, -SScaleMin(3 / 3), SScaleMin(10 / 3)) addTenant.DoClick = function() Derma_StringRequest("Enter CID", "Enter the CID you want to add to the apartment.", "", function(text) surface.PlaySound("willardnetworks/datapad/navigate.wav") netstream.Start("AddTenant", appID, tonumber(text)) end) surface.PlaySound("willardnetworks/datapad/navigate.wav") end local tenantsFrame = self.content:Add("DScrollPanel") tenantsFrame:Dock(TOP) tenantsFrame:SetTall(rentDue:GetTall() * 3) local counter = 0 for cid, tTenant in pairs(tApartment.tenants) do if istable(cid) then cid = tonumber(cid) end counter = counter + 1 local cidLabel = tenantsFrame:Add("EditablePanel") PLUGIN:CreateRow(cidLabel, "cid | key id | autopay", (!cid and "N/A" or cid).." | "..(tTenant.key == true and "AWAITING KEY ID" or tTenant.key or "N/A").." | "..((tTenant.autoPay and tTenant.autoPay == true and "TRUE" or "FALSE") or ""), false, counter % 2 == 0 and true or false) local remove = self:CreateBottomOrTopTextOrButton(cidLabel.bottom, "REMOVE", false, true) remove.DoClick = function() if !cid then return end cidLabel:Remove() netstream.Start("RemoveTenant", cid, appID) surface.PlaySound("willardnetworks/datapad/navigate.wav") end if !cid then return end if (tTenant.key != true) then local renewKey = self:CreateBottomOrTopTextOrButton(cidLabel.bottom, "RENEW KEY |", false, true) renewKey:DockMargin(0, 0, 0, 0) renewKey.DoClick = function() netstream.Start("RenewKey", cid, appID) surface.PlaySound("willardnetworks/datapad/navigate.wav") end end end if tApartment.type == "shop" then local employeesTitle = self.content:Add("EditablePanel") PLUGIN:CreateTitle(employeesTitle, self.content, "employees") employeesTitle:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3)) local addEmployee = self:CreateBottomOrTopTextOrButton(employeesTitle, "ADD EMPLOYEE", false, true) addEmployee:DockMargin(0, 0, -SScaleMin(3 / 3), SScaleMin(10 / 3)) addEmployee.DoClick = function() Derma_StringRequest("Enter CID", "Enter the CID you want to add to the apartment.", "", function(text) surface.PlaySound("willardnetworks/datapad/navigate.wav") netstream.Start("AddEmployee", appID, tonumber(text)) end) surface.PlaySound("willardnetworks/datapad/navigate.wav") end local employeeFrame = self.content:Add("DScrollPanel") employeeFrame:Dock(TOP) employeeFrame:SetTall(rentDue:GetTall() * 3) local eCounter = 0 for cid, tEmployee in pairs(tApartment.employees) do if istable(cid) then cid = tonumber(cid) end eCounter = eCounter + 1 local cidLabel = employeeFrame:Add("EditablePanel") PLUGIN:CreateRow(cidLabel, "cid | key id ", (!cid and "N/A" or cid).." | "..(tEmployee.key == true and "AWAITING KEY ID" or tEmployee.key or "N/A") , false, eCounter % 2 == 0 and true or false) local remove = self:CreateBottomOrTopTextOrButton(cidLabel.bottom, "REMOVE", false, true) remove.DoClick = function() if !cid then return end cidLabel:Remove() netstream.Start("RemoveEmployee", cid, appID) surface.PlaySound("willardnetworks/datapad/navigate.wav") end if !cid then return end if (tEmployee.key != true) then local renewKey = self:CreateBottomOrTopTextOrButton(cidLabel.bottom, "RENEW KEY |", false, true) renewKey:DockMargin(0, 0, 0, 0) renewKey.DoClick = function() netstream.Start("RenewKey", cid, appID, true) surface.PlaySound("willardnetworks/datapad/navigate.wav") end end end end local paymentsTitle = self.content:Add("EditablePanel") PLUGIN:CreateTitle(paymentsTitle, self.content, "payments") paymentsTitle:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3)) local paymentsFrame = self.content:Add("DScrollPanel") paymentsFrame:Dock(TOP) paymentsFrame:SetTall(SScaleMin(160 / 3)) eCounter = 0 for cid, tPayment in pairs(tApartment.payments) do eCounter = eCounter + 1 local cidLabelPayment = paymentsFrame:Add("EditablePanel") PLUGIN:CreateRow(cidLabelPayment, "cid | amount", cid.." | "..tPayment.amount, false, eCounter % 2 == 0 and true or false) self:CreateBottomOrTopTextOrButton(cidLabelPayment:GetChildren()[1], "DATE:", true) self:CreateBottomOrTopTextOrButton(cidLabelPayment.bottom, os.date( "%d/%m/%Y", tPayment.date), false) end if tApartment.type == "shop" then local permitsTitle = self.content:Add("EditablePanel") PLUGIN:CreateTitle(permitsTitle, self.content, "active permits") permitsTitle:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3)) local activeShopPermitsFrame = self.content:Add("EditablePanel") ix.gui.shopPermits = activeShopPermitsFrame activeShopPermitsFrame.GetUpdates = function() netstream.Start("GetActiveShopPermitsDatapad", appID) end activeShopPermitsFrame.CreateActivePermits = function(s, permitData) for k2, v2 in pairs(permitData) do if !isbool(v2) then continue end local permitPanel = self.content:Add("Panel") permitPanel:Dock(TOP) permitPanel:SetTall(SScaleMin(30 / 3)) local permitName = permitPanel:Add("DLabel") permitName:Dock(LEFT) permitName:SetText(Schema:FirstToUpper(k2)) permitName:SetFont("MenuFontBoldNoClamp") permitName:SetColor(color) permitName:SizeToContents() permitName:DockMargin(SScaleMin(10 / 3), 0, 0, 0) local toggleButton = permitPanel:Add("DButton") toggleButton:Dock(RIGHT) toggleButton:SetWide(SScaleMin(100 / 3)) toggleButton:SetText(string.upper(tostring(v2))) toggleButton:SetFont("MenuFontBoldNoClamp") toggleButton.material = (v2 and "willardnetworks/datafile/licenseenabled.png") or (!v2 and "willardnetworks/datafile/licensedisabled2.png") toggleButton.Paint = function(s, w, h) surface.SetDrawColor(color_white) surface.SetMaterial(ix.util.GetMaterial(s.material)) surface.DrawTexturedRect(0, 0, w, h) end toggleButton.DoClick = function(this) local bPermit = permitData[k2] if !bPermit then bPermit = true this.material = "willardnetworks/datafile/licenseenabled.png" else bPermit = false this.material = "willardnetworks/datafile/licensedisabled2.png" end permitData[k2] = bPermit this:SetText(string.upper(tostring(bPermit))) netstream.Start("ToggleShopPermitDatapad", k2, bPermit, appID) surface.PlaySound("willardnetworks/datapad/navigate.wav") end end end activeShopPermitsFrame:GetUpdates() end end function PANEL:CreateBottomOrTopTextOrButton(parent, text, bTop, bButton) local labelText = parent:Add(bButton and "DButton" or "DLabel") labelText:SetTextColor(bTop and Color(154, 169, 175, 255) or color) labelText:SetFont("MenuFontNoClamp") labelText:SetText(text) labelText:Dock(RIGHT) labelText:DockMargin(0, 0, SScaleMin(20 / 3), 0) labelText:SizeToContents() labelText.Paint = nil return labelText end vgui.Register("ixDatapadApartments", PANEL, "EditablePanel")