mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
1403 lines
45 KiB
Lua
1403 lines
45 KiB
Lua
--[[
|
|
| This file was obtained through the combined efforts
|
|
| of Madbluntz & Plymouth Antiquarian Society.
|
|
|
|
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
|
| Maloy, DrPepper10 @ RIP, Atle!
|
|
|
|
|
| Visit for more: https://plymouth.thetwilightzone.ru/
|
|
--]]
|
|
|
|
local PANEL = {}
|
|
|
|
function PANEL:Init()
|
|
netstream.Start("SyncStoredNewspapers")
|
|
|
|
self:SetSize(ScrW(), ScrH())
|
|
self:SetAlpha(0)
|
|
self:AlphaTo(255, 0.5, 0)
|
|
self.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(0, 0, 0, 150))
|
|
surface.DrawRect(0, 0, w, h)
|
|
|
|
Derma_DrawBackgroundBlur( this, 1 )
|
|
end
|
|
|
|
ix.gui.terminalPanel = self
|
|
self.panel = self:Add("EditablePanel")
|
|
self.panel:SetSize(0, SScaleMin(2 / 3))
|
|
self.width, self.height = SScaleMin(700 / 3) + 3, SScaleMin(438 / 3) + 3
|
|
self.panel:SizeTo(self.width, SScaleMin(2 / 3), 0.5, 0) -- Line to width
|
|
timer.Simple(0.5, function()
|
|
self.panel:SizeTo(self.width, self.height, 0.5, 0) -- Line to height
|
|
end)
|
|
self.panel:SetPos(ScrW() * 0.5 - self.width * 0.5, ScrH() * 0.5 - self.height * 0.5)
|
|
|
|
self.panel:MakePopup()
|
|
self.panel.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(16, 16, 16, 220))
|
|
surface.DrawRect(0, 0, w, h)
|
|
|
|
surface.SetDrawColor(Color(150, 150, 150, 255))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
Schema:AllowMessage(self.panel)
|
|
|
|
local loadingVideoPanel = self.panel:Add("EditablePanel")
|
|
loadingVideoPanel:SetSize(self.width - 2, self.height - 2)
|
|
loadingVideoPanel:SetPos(1, 1)
|
|
|
|
-- Preload loading video
|
|
local loadingVideo = loadingVideoPanel:Add("DHTML")
|
|
loadingVideo:Dock(FILL)
|
|
loadingVideo:OpenURL("https://willard.network/hl2rp_imgs/fruityterminal/index.html") -- Loading video url
|
|
loadingVideo:SetVisible(false)
|
|
|
|
local cover = loadingVideoPanel:Add("EditablePanel")
|
|
cover:Dock(FILL)
|
|
|
|
local exit = cover:Add("DImageButton")
|
|
exit:SetSize(SScaleMin(20 / 3), SScaleMin(20 / 3))
|
|
exit:SetPos(SScaleMin(5 / 3), SScaleMin(5 / 3))
|
|
exit:SetImage("willardnetworks/tabmenu/navicons/exit-grey.png")
|
|
exit.DoClick = function()
|
|
netstream.Start("ClosePanelsTerminal", LocalPlayer().activeTerminal)
|
|
LocalPlayer().activeTerminal = nil
|
|
LocalPlayer().genericData = nil
|
|
LocalPlayer().activeCID = nil
|
|
LocalPlayer().messageList = nil
|
|
self:Remove()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
end
|
|
|
|
local cid = cover:Add("DLabel")
|
|
local cidText = LocalPlayer().activeCID or "00000"
|
|
cid:SetFont("MenuFontNoClamp")
|
|
cid:SetTextColor(Color(89, 115, 105, 255))
|
|
cid:SetText("##"..cidText)
|
|
cid:SizeToContents()
|
|
cid:SetAlpha(0)
|
|
cid:AlphaTo(255, 1, 2)
|
|
cid:SetPos(SScaleMin(44 / 3), SScaleMin(61 / 3))
|
|
|
|
self.activeCID = LocalPlayer().activeCID
|
|
|
|
self.fullSizeSeconds = 1
|
|
|
|
timer.Simple(self.fullSizeSeconds, function()
|
|
if loadingVideo then
|
|
loadingVideo:SetVisible(true)
|
|
end
|
|
|
|
if IsValid(self) then
|
|
self:CreateTerminalPanel()
|
|
end
|
|
end)
|
|
end
|
|
|
|
function PANEL:CreateTerminalPanel()
|
|
if self.mainPanel then
|
|
self.mainPanel:Remove()
|
|
end
|
|
|
|
self.mainPanel = self.panel:Add("EditablePanel")
|
|
self.mainPanel:Dock(FILL)
|
|
self.mainPanel:DockMargin(SScaleMin(132 / 3), SScaleMin(60 / 3), SScaleMin(124 / 3), 0)
|
|
self.mainPanel:SetAlpha(0)
|
|
self.mainPanel:AlphaTo(255, 1, 1)
|
|
|
|
self:CreateMainButtons()
|
|
end
|
|
|
|
local function CreateButton(parent, text)
|
|
parent:Dock(TOP)
|
|
parent:SetSize(SScaleMin(150 / 3), SScaleMin(50 / 3))
|
|
parent:SetText(string.utf8upper(text))
|
|
parent:SetFont("MenuFontNoClamp")
|
|
parent:SetContentAlignment(5)
|
|
parent:DockMargin(0, 0, 0, -1)
|
|
|
|
parent.Paint = function(self, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 255))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateMainButtons()
|
|
local genericData = LocalPlayer().genericData
|
|
LocalPlayer().genericData.socialCredits = !LocalPlayer().genericData.combine and math.Clamp(tonumber(LocalPlayer().genericData.socialCredits), 0, 200) or tonumber(LocalPlayer().genericData.socialCredits)
|
|
local name = self.mainPanel:Add("DLabel")
|
|
name:SetFont("EvenLargerTitlesFontNoClamp")
|
|
name:Dock(TOP)
|
|
name:SetText(genericData.name or "INVALID NAME")
|
|
name:SetContentAlignment(5)
|
|
name:SizeToContents()
|
|
name:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3))
|
|
|
|
local content = self.mainPanel:Add("EditablePanel")
|
|
content:Dock(FILL)
|
|
|
|
self.leftSide = content:Add("EditablePanel")
|
|
self.leftSide:Dock(LEFT)
|
|
self.leftSide:SetWide((self.width - SScaleMin(132 / 3) - SScaleMin(124 / 3)) * 0.5)
|
|
|
|
self.rightSide = content:Add("EditablePanel")
|
|
self.rightSide:Dock(FILL)
|
|
|
|
local viewGenericData = self.leftSide:Add("DButton")
|
|
CreateButton(viewGenericData, "generic data")
|
|
viewGenericData.DoClick = function()
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateGenericData()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
end
|
|
|
|
local communion = self.rightSide:Add("DButton")
|
|
CreateButton(communion, "communion")
|
|
local canClickCommunion = true
|
|
local clickCount = 0
|
|
communion.DoClick = function()
|
|
if canClickCommunion then
|
|
if LocalPlayer().genericData.socialCredits < ix.config.Get("communionSCRequirement", 150) and !LocalPlayer().genericData.bypassCommunion then
|
|
LocalPlayer().activeTerminal:EmitSound("buttons/combine_button_locked.wav")
|
|
canClickCommunion = false
|
|
clickCount = clickCount + 1
|
|
|
|
if clickCount >= 15 then
|
|
local genericName = genericData.name
|
|
local cid = LocalPlayer().activeCID or "00000"
|
|
netstream.Start("BreakAttemptSpottedTerminal", genericName, cid, LocalPlayer().activeTerminal)
|
|
end
|
|
|
|
timer.Simple(0.5, function()
|
|
canClickCommunion = true
|
|
end)
|
|
|
|
return
|
|
end
|
|
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateCommunion()
|
|
end
|
|
end
|
|
|
|
local credits = self.leftSide:Add("DButton")
|
|
CreateButton(credits, "credits")
|
|
credits.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateCredits()
|
|
end
|
|
|
|
local newspapers = self.rightSide:Add("DButton")
|
|
CreateButton(newspapers, "union newspapers")
|
|
newspapers.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateNewspapers()
|
|
end
|
|
|
|
local housing = self.leftSide:Add("DButton")
|
|
CreateButton(housing, "housing")
|
|
housing.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateHousing(false)
|
|
end
|
|
|
|
if LocalPlayer().genericData.shop then
|
|
local shop = self.rightSide:Add("DButton")
|
|
CreateButton(shop, "shop")
|
|
shop.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateHousing(true)
|
|
end
|
|
end
|
|
|
|
local reportCrime = vgui.Create("DButton", LocalPlayer().genericData.shop and self.leftSide or self.rightSide)
|
|
CreateButton(reportCrime, "report crime")
|
|
reportCrime.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateCrimeReport()
|
|
end
|
|
|
|
|
|
local sendLetter = vgui.Create("DButton", LocalPlayer().genericData.shop and self.rightSide or self.leftSide)
|
|
CreateButton(sendLetter, "send letter")
|
|
sendLetter.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateLetterSending()
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateCommunion()
|
|
local genericData = LocalPlayer().genericData
|
|
local send = self.mainPanel:Add("DButton")
|
|
CreateButton(send, "send message")
|
|
send.DoClick = function()
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
|
|
if (self.back) then
|
|
self.back.DoClick = function()
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateCommunion()
|
|
end
|
|
end
|
|
|
|
self.communionPanel = self.mainPanel:Add("EditablePanel")
|
|
self.communionPanel:MakePopup()
|
|
local x, y = self.panel:GetPos()
|
|
self.communionPanel:SetPos(x + SScaleMin(132 / 3), y + SScaleMin(23 / 3) + SScaleMin(60 / 3))
|
|
self.communionPanel:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(23 / 3))
|
|
|
|
local textEntry = self.communionPanel:Add("DTextEntry")
|
|
textEntry:Dock(TOP)
|
|
textEntry:SetTall(self.communionPanel:GetTall() - SScaleMin(23 / 3))
|
|
textEntry:SetMultiline( true )
|
|
textEntry:SetVerticalScrollbarEnabled( true )
|
|
textEntry:SetEnterAllowed( true )
|
|
textEntry:SetFont("MenuFontNoClamp")
|
|
textEntry:SetTextColor(Color(200, 200, 200, 255))
|
|
textEntry:SetCursorColor(Color(200, 200, 200, 255))
|
|
textEntry.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(0, 0, 0, 100))
|
|
surface.DrawRect(0, 0, w, h)
|
|
|
|
surface.SetDrawColor(Color(111, 111, 136, 255 / 100 * 30))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
|
|
this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() )
|
|
end
|
|
|
|
local sendCommunion = self.communionPanel:Add("DButton")
|
|
sendCommunion:Dock(FILL)
|
|
sendCommunion:SetText("SEND")
|
|
sendCommunion:SetFont("MenuFontNoClamp")
|
|
sendCommunion:SetContentAlignment(6)
|
|
sendCommunion:SetTextInset(SScaleMin(5 / 3), 0)
|
|
sendCommunion.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 150))
|
|
surface.DrawLine(0, 1, w, 1)
|
|
end
|
|
|
|
sendCommunion.DoClick = function()
|
|
if LocalPlayer().messageList then
|
|
if istable(LocalPlayer().messageList) then
|
|
local timestamp = os.date( "%d.%m.%Y" )
|
|
local newMessage = {
|
|
["message_cid"] = LocalPlayer().activeCID,
|
|
["message_date"] = timestamp,
|
|
["message_poster"] = genericData.name,
|
|
["message_text"] = textEntry:GetText()
|
|
}
|
|
|
|
table.insert(LocalPlayer().messageList, newMessage)
|
|
end
|
|
end
|
|
|
|
netstream.Start("AddCAMessage", genericData.name, LocalPlayer().activeCID, textEntry:GetText(), LocalPlayer().activeTerminal)
|
|
self.back.DoClick()
|
|
end
|
|
end
|
|
|
|
self.view = self.mainPanel:Add("DButton")
|
|
CreateButton(self.view, "view messages")
|
|
self.view.DoClick = function()
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
|
|
if (self.back) then
|
|
self.back.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateCommunion()
|
|
end
|
|
end
|
|
|
|
local messagePanel = self.mainPanel:Add("DScrollPanel")
|
|
messagePanel:Dock(TOP)
|
|
messagePanel:DockMargin(0, SScaleMin(2 / 3), 0, 0)
|
|
messagePanel:SetTall(SScaleMin(250 / 3) - SScaleMin(25 / 3))
|
|
|
|
if istable(LocalPlayer().messageList) then
|
|
for _, v in pairs(LocalPlayer().messageList) do
|
|
local message = messagePanel:Add("DButton")
|
|
CreateButton(message, v["message_date"].." | "..string.utf8sub(v["message_text"], 1, 20).."..")
|
|
if v["message_reply"] then
|
|
message:SetTextColor(Color(210, 255, 255, 255))
|
|
else
|
|
message:SetTextColor(Color(255, 205, 205, 255))
|
|
end
|
|
|
|
message:SetContentAlignment(4)
|
|
message:SetTextInset(SScaleMin(5 / 3), 0)
|
|
|
|
message.DoClick = function()
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
|
|
if (self.back) then
|
|
self.back.DoClick = function()
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateCommunion()
|
|
if (self.view) then
|
|
self.view.DoClick()
|
|
end
|
|
end
|
|
end
|
|
|
|
local textEntry = self.mainPanel:Add("DTextEntry")
|
|
textEntry:Dock(TOP)
|
|
textEntry:DockMargin(0, SScaleMin(2 / 3), 0, 0)
|
|
textEntry:SetTall(SScaleMin(250 / 3) - SScaleMin(25 / 3) - SScaleMin(23 / 3))
|
|
textEntry:SetTextColor(Color(200, 200, 200, 255))
|
|
textEntry:SetMultiline( true )
|
|
textEntry:SetFont("MenuFontNoClamp")
|
|
textEntry:SetVerticalScrollbarEnabled( true )
|
|
textEntry:SetCursorColor(Color(200, 200, 200, 255))
|
|
textEntry:SetValue(v["message_text"])
|
|
textEntry.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(0, 0, 0, 100))
|
|
surface.DrawRect(0, 0, w, h)
|
|
|
|
surface.SetDrawColor(Color(111, 111, 136, 255 / 100 * 30))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
|
|
this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() )
|
|
end
|
|
|
|
local viewReply = self.mainPanel:Add("DButton")
|
|
viewReply:Dock(TOP)
|
|
viewReply:SetTall(SScaleMin(23 / 3))
|
|
viewReply:SetText("VIEW REPLY")
|
|
viewReply:SetFont("MenuFontNoClamp")
|
|
viewReply:SetContentAlignment(6)
|
|
viewReply:SetTextInset(SScaleMin(5 / 3), 0)
|
|
|
|
viewReply.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 150))
|
|
surface.DrawLine(0, 1, w, 1)
|
|
end
|
|
|
|
viewReply.DoClick = function()
|
|
if !v["message_reply"] then
|
|
viewReply:SetText("NO REPLY")
|
|
return
|
|
end
|
|
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
|
|
viewReply.DoClick = function() end
|
|
viewReply:SetText("")
|
|
|
|
textEntry:SetValue(v["message_reply"])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function PANEL:Think()
|
|
if IsValid(self.communionPanel) then
|
|
self.communionPanel:MoveToFront()
|
|
end
|
|
|
|
if !self.scroller or !IsValid(self.scroller) then
|
|
if !timer.Exists("PlayRandomScrollingSounds") then return end
|
|
timer.Remove("PlayRandomScrollingSounds")
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateCredits()
|
|
local creditsPanel = self.mainPanel:Add("EditablePanel")
|
|
creditsPanel:SetPos(0, SScaleMin(23 / 3))
|
|
creditsPanel:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(23 / 3))
|
|
|
|
local credits = creditsPanel:Add("DLabel")
|
|
credits:SetFont("CharCreationBoldTitleNoClamp")
|
|
credits:SetText(LocalPlayer().idCardCredits.." Credits") -- Change this to credits when that is on the CID
|
|
credits:SetContentAlignment(5)
|
|
credits:SizeToContents()
|
|
credits:Center()
|
|
|
|
local send = creditsPanel:Add("DButton")
|
|
CreateButton(send, "send credits")
|
|
send:Dock(BOTTOM)
|
|
send.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateBackPanel()
|
|
self:CreateTransaction()
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateTransaction()
|
|
local cid, amount
|
|
|
|
local cidRow = self.mainPanel:Add("EditablePanel")
|
|
cidRow:Dock(TOP)
|
|
cidRow:SetTall(SScaleMin(38 / 3))
|
|
cidRow:DockMargin(0, SScaleMin(5 / 3), SScaleMin(5 / 3), SScaleMin(10 / 3))
|
|
cidRow.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 150))
|
|
surface.DrawLine(0, h - 1, w, h - 1)
|
|
end
|
|
|
|
local cidLabel = cidRow:Add("DLabel")
|
|
cidLabel:SetContentAlignment(5)
|
|
cidLabel:SetFont("MenuFontBoldNoClamp")
|
|
cidLabel:Dock(LEFT)
|
|
cidLabel:DockMargin(SScaleMin(5 / 3), 0, 0, 0)
|
|
cidLabel:SetText("CID: #")
|
|
cidLabel:SizeToContents()
|
|
|
|
local cidEnter = cidRow:Add("DButton")
|
|
CreateButton(cidEnter, "enter cid")
|
|
cidEnter:Dock(RIGHT)
|
|
cidEnter.DoClick = function()
|
|
Derma_StringRequest("Enter CID", "Enter receiving citizen's CID.", "", function(text)
|
|
cidLabel:SetText("CID: #"..text)
|
|
cidLabel:SizeToContents()
|
|
|
|
cid = text
|
|
|
|
if (cid and amount) then
|
|
self.send:SetDisabled(false)
|
|
end
|
|
end)
|
|
end
|
|
|
|
local amountRow = self.mainPanel:Add("EditablePanel")
|
|
amountRow:Dock(TOP)
|
|
amountRow:SetTall(SScaleMin(38 / 3))
|
|
amountRow:DockMargin(0, SScaleMin(5 / 3), SScaleMin(5 / 3), SScaleMin(10 / 3))
|
|
amountRow.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 150))
|
|
surface.DrawLine(0, h - 1, w, h - 1)
|
|
end
|
|
|
|
local amountLabel = amountRow:Add("DLabel")
|
|
amountLabel:SetContentAlignment(5)
|
|
amountLabel:SetFont("MenuFontBoldNoClamp")
|
|
amountLabel:Dock(LEFT)
|
|
amountLabel:DockMargin(SScaleMin(5 / 3), 0, 0, 0)
|
|
amountLabel:SetText("0 Credit(s)")
|
|
amountLabel:SizeToContents()
|
|
|
|
local amountEnter = amountRow:Add("DButton")
|
|
CreateButton(amountEnter, "enter amount")
|
|
amountEnter:Dock(RIGHT)
|
|
amountEnter.DoClick = function()
|
|
Derma_StringRequest("Enter amount", "Enter amount of credits to send.", "", function(text)
|
|
local enterAmount = tonumber(text)
|
|
|
|
if (enterAmount and enterAmount > 0) then
|
|
local money = LocalPlayer().idCardCredits
|
|
|
|
if (enterAmount > money) then
|
|
enterAmount = money
|
|
end
|
|
|
|
amountLabel:SetText(enterAmount.." Credit(s)")
|
|
amountLabel:SizeToContents()
|
|
amount = enterAmount
|
|
|
|
if (cid and amount) then
|
|
self.send:SetDisabled(false)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
self.send = self.mainPanel:Add("DButton")
|
|
CreateButton(self.send, "send")
|
|
self.send:Dock(TOP)
|
|
self.send.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateCredits()
|
|
|
|
netstream.Start("ixSendCredits", LocalPlayer().idCardId, cid, amount, LocalPlayer().activeCID)
|
|
end
|
|
|
|
self.send:SetDisabled(true)
|
|
end
|
|
|
|
function PANEL:CreateBackPanel()
|
|
self.back = self.mainPanel:Add("DButton")
|
|
self.back:SetContentAlignment(4)
|
|
self.back:SetFont("MenuFontNoClamp")
|
|
self.back:Dock(TOP)
|
|
self.back:SetTall(SScaleMin(20 / 3))
|
|
self.back:DockMargin(0, 0, 0, 0 - SScaleMin(2 / 3))
|
|
self.back:SetText("BACK")
|
|
self.back.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 150))
|
|
surface.DrawLine(0, h - 1, w, h - 1)
|
|
end
|
|
|
|
self.back:SetTextInset(SScaleMin( 5 / 3 ), 0)
|
|
self.back.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateMainButtons()
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateGenericData()
|
|
local genericData = LocalPlayer().genericData
|
|
local data = {
|
|
["Name"] = genericData.name,
|
|
["Social Credits"] = genericData.socialCredits,
|
|
["Genetic Desc"] = genericData.geneticDesc,
|
|
["Occupation"] = genericData.occupation,
|
|
["Status"] = genericData.designatedStatus,
|
|
--["Business Permit"] = genericData.permits
|
|
}
|
|
|
|
if (LocalPlayer():IsVortigaunt()) then
|
|
data["Social Credits"] = nil
|
|
|
|
if (genericData.cohesionPoints) then
|
|
data["Cohesion Points"] = !genericData.combine and math.Clamp(tonumber(genericData.cohesionPoints), 0, 200) or tonumber(genericData.cohesionPoints)
|
|
else
|
|
data["Cohesion Points"] = !genericData.combine and math.Clamp(tonumber(genericData.socialCredits), 0, 200) or tonumber(genericData.socialCredits)
|
|
end
|
|
else
|
|
data["Social Credits"] = !genericData.combine and math.Clamp(tonumber(genericData.socialCredits), 0, 200) or tonumber(genericData.socialCredits)
|
|
end
|
|
for title, text in SortedPairs(data) do
|
|
local row = self.mainPanel:Add("EditablePanel")
|
|
row:Dock(TOP)
|
|
row:SetTall(SScaleMin(38 / 3))
|
|
row.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 150))
|
|
surface.DrawLine(0, h - 1, w, h - 1)
|
|
end
|
|
|
|
local textRow = row:Add("DLabel")
|
|
textRow:SetContentAlignment(5)
|
|
textRow:SetFont("MenuFontNoClamp")
|
|
textRow:Dock(RIGHT)
|
|
textRow:DockMargin(0, 0, SScaleMin(5 / 3), 0)
|
|
if isbool(text) then
|
|
if text then
|
|
textRow:SetText("TRUE")
|
|
else
|
|
textRow:SetText("FALSE")
|
|
end
|
|
else
|
|
textRow:SetText(string.len(text) > 42 and string.Left(text, 42).."..." or text)
|
|
end
|
|
textRow:SizeToContents()
|
|
|
|
local titleRow = row:Add("DLabel")
|
|
titleRow:SetContentAlignment(5)
|
|
titleRow:SetFont("MenuFontBoldNoClamp")
|
|
titleRow:Dock(LEFT)
|
|
titleRow:DockMargin(SScaleMin(5 / 3), 0, 0, 0)
|
|
titleRow:SetText(title..":")
|
|
titleRow:SizeToContents()
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateNewspapers()
|
|
self.newspaperPanel = self.mainPanel:Add("DScrollPanel")
|
|
self.newspaperPanel:SetPos(0, SScaleMin(23 / 3))
|
|
self.newspaperPanel:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(23 / 3))
|
|
|
|
netstream.Start("ixWritingGetUnionNewspapers", true)
|
|
end
|
|
|
|
function PANEL:CreateStoredNewspapers(newspapers)
|
|
local padding = SScaleMin(20 / 3)
|
|
local canRead = LocalPlayer():GetCharacter():GetCanread()
|
|
for _, data1 in SortedPairs(newspapers, true) do
|
|
local data = util.JSONToTable(data1["unionnewspaper_data"])
|
|
local writingID = data.unionDatabase
|
|
local entryPanel = self.newspaperPanel:Add("EditablePanel")
|
|
entryPanel:Dock(TOP)
|
|
entryPanel:SetTall(SScaleMin(50 / 3))
|
|
entryPanel.Paint = function(_, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 255))
|
|
surface.DrawLine(0, h - 1, w, h - 1)
|
|
end
|
|
|
|
local top = entryPanel:Add("EditablePanel")
|
|
top:Dock(TOP)
|
|
top:SetTall(SScaleMin(50 / 3) / 2)
|
|
|
|
local title = top:Add("DLabel")
|
|
title:Dock(LEFT)
|
|
title:SetFont("MenuFontLargerBoldNoFix")
|
|
title:SetText(canRead and data.bigHeadline or Schema:ShuffleText(data.bigHeadline))
|
|
title:SetTextColor(color_white)
|
|
title:SizeToContents()
|
|
title:DockMargin(padding, SScaleMin(2 / 3), 0, 0)
|
|
|
|
local bottom = entryPanel:Add("EditablePanel")
|
|
bottom:Dock(FILL)
|
|
|
|
local subtitle = bottom:Add("DLabel")
|
|
subtitle:Dock(LEFT)
|
|
subtitle:SetFont("MenuFontLargerNoClamp")
|
|
subtitle:SetText(canRead and data.subHeadline or Schema:ShuffleText(data.subHeadline))
|
|
subtitle:SizeToContents()
|
|
subtitle:SetContentAlignment(4)
|
|
subtitle:DockMargin(padding, 0, 0, SScaleMin(7 / 3))
|
|
|
|
local viewNewspaper = bottom:Add("DButton")
|
|
viewNewspaper:Dock(RIGHT)
|
|
viewNewspaper:SetFont("MenuFontLargerNoClamp")
|
|
viewNewspaper:SetText("VIEW")
|
|
viewNewspaper:SizeToContents()
|
|
viewNewspaper:SetContentAlignment(6)
|
|
viewNewspaper:DockMargin(0, 0, padding, SScaleMin(7 / 3))
|
|
viewNewspaper.Paint = nil
|
|
viewNewspaper.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
netstream.Start("ixWritingGetUnionWritingData", writingID)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateHousing(bShop)
|
|
if self.housingPanel and IsValid(self.housingPanel) then
|
|
self.housingPanel:Remove()
|
|
end
|
|
|
|
self.housingPanel = self.mainPanel:Add("EditablePanel")
|
|
self.housingPanel:SetPos(0, SScaleMin(20 / 3))
|
|
self.housingPanel:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(20 / 3))
|
|
|
|
if !bShop then
|
|
if !LocalPlayer().genericData.housing then
|
|
self:CreateHousingRequestButtons()
|
|
return
|
|
end
|
|
end
|
|
|
|
netstream.Start("RequestAssignedApartmentInfo", LocalPlayer().activeCID, bShop)
|
|
end
|
|
|
|
function PANEL:RevertBackToHousing()
|
|
if (self.back) then
|
|
self.back.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:ClearHousing()
|
|
self:CreateHousingInfo(self.appTable, self.appID, self.bShop)
|
|
|
|
self.back.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateMainButtons()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateHousingInfo(appTable, appID, bShop)
|
|
self.appTable = appTable
|
|
self.appID = appID
|
|
self.bShop = bShop
|
|
local appName = self.housingPanel:Add("DLabel")
|
|
appName:Dock(TOP)
|
|
appName:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3))
|
|
if (appTable.name) then
|
|
local name = string.len(appTable.name) > 27 and (string.Left(appTable.name, 25).."...") or appTable.name
|
|
local appType = appTable.type and (" | "..string.upper(appTable.type)) or ""
|
|
appName:SetText(name..appType)
|
|
else
|
|
appName:SetText("UNNAMED")
|
|
end
|
|
appName:SetFont("TitlesFontNoClamp")
|
|
appName:SetContentAlignment(5)
|
|
appName:SizeToContents()
|
|
|
|
local infoTable = self.housingPanel:Add("EditablePanel")
|
|
infoTable:Dock(FILL)
|
|
infoTable.Paint = function(_, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 255))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
|
|
surface.DrawLine(self.housingPanel:GetWide() * 0.5 - 1, 0, self.housingPanel:GetWide() * 0.5 - 1, h)
|
|
end
|
|
|
|
local leftSide = infoTable:Add("EditablePanel")
|
|
leftSide:Dock(LEFT)
|
|
leftSide:SetWide(self.housingPanel:GetWide() * 0.5)
|
|
|
|
local housing = ix.plugin.list["housing"]
|
|
local remainingRent = (housing and housing:GetRemainingRent(appTable) or appTable.rent)
|
|
|
|
self:CreateHousingLeftSidePart(leftSide, "TOTAL RENT", tostring(appTable.rent) or "0")
|
|
self:CreateHousingLeftSidePart(leftSide, "INDIVIDUAL RENT", appTable.rent and table.Count(appTable.tenants) > 1 and tostring(math.ceil(appTable.rent / table.Count(appTable.tenants))) or tostring(appTable.rent))
|
|
self:CreateHousingLeftSidePart(leftSide, "RENT DUE", os.date("%d/%m/%Y", appTable.rentDue) or "N/A")
|
|
self:CreateHousingLeftSidePart(leftSide, "REMAINING RENT", remainingRent)
|
|
|
|
local rightSide = infoTable:Add("EditablePanel")
|
|
rightSide:Dock(FILL)
|
|
|
|
local rightSideButtonAmount = 3
|
|
local bHeight = (leftSide:GetChildren()[1]:GetTall() * #leftSide:GetChildren()) / rightSideButtonAmount
|
|
local tenants = rightSide:Add("DButton")
|
|
CreateButton(tenants, "TENANTS")
|
|
tenants:SetTall(bHeight)
|
|
tenants.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:ClearHousing()
|
|
self:RevertBackToHousing()
|
|
|
|
for itemCID, tTenant in pairs(self.appTable.tenants) do
|
|
local appPayments = self.appTable.payments[itemCID] or false
|
|
local tenantPanel = self:CreateHousingLeftSidePart(self.housingPanel, "CID: "..itemCID, " | Key ID: "..((!tTenant.key or tTenant.key == true) and "N/A" or tTenant.key), true)
|
|
local lastPayment = tenantPanel:Add("DLabel")
|
|
lastPayment:SetContentAlignment(6)
|
|
lastPayment:SetText("LAST PAYMENT: "..(appPayments and (appPayments.date and os.date( "%d/%m/%Y" , appPayments.date )) or "NEVER"))
|
|
lastPayment:SetFont("MenuFontBoldNoClamp")
|
|
lastPayment:SizeToContents()
|
|
lastPayment:Dock(RIGHT)
|
|
lastPayment:DockMargin(0, 0, SScaleMin(10 / 3), 0)
|
|
end
|
|
end
|
|
if appTable.tenants[LocalPlayer():GetCharacter():GetGenericdata().cid] then
|
|
local payments = rightSide:Add("DButton")
|
|
CreateButton(payments, "PAYMENTS")
|
|
payments:SetTall(bHeight)
|
|
payments.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:CreatePaymentPanel(appTable, appID)
|
|
end
|
|
end
|
|
if bShop then
|
|
local employees = rightSide:Add("DButton")
|
|
CreateButton(employees, "EMPLOYEES")
|
|
employees:SetTall(bHeight)
|
|
employees.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:CreateEmployeePanel(appTable, appID)
|
|
end
|
|
end
|
|
if !bShop then
|
|
local request = rightSide:Add("DButton")
|
|
CreateButton(request, "REQUEST NEW HOUSING")
|
|
request:SetTall(bHeight)
|
|
request.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:ClearHousing()
|
|
self:RevertBackToHousing()
|
|
self:CreateHousingRequestButtons()
|
|
end
|
|
end
|
|
end
|
|
local function CreateBottomOrTopTextOrButton(parent, text, bTop)
|
|
local labelText = parent:Add("DButton")
|
|
labelText:SetTextColor(Color(255, 255, 255, 255))
|
|
labelText:SetFont("MenuFontNoClamp")
|
|
labelText:SetText(text)
|
|
labelText:Dock(RIGHT)
|
|
labelText:DockMargin(0, 0, SScaleMin(10 / 3), 0)
|
|
labelText:SizeToContents()
|
|
labelText.Paint = nil
|
|
|
|
return labelText
|
|
end
|
|
local function CreateRow(parent, title, text, date, bSecondInRow, bUpdateable)
|
|
parent:SetSize(parent:GetParent():GetWide(), SScaleMin(64 / 3))
|
|
parent:Dock(TOP)
|
|
parent.Paint = function(this, w, h)
|
|
surface.SetDrawColor(150, 150, 150, 255)
|
|
surface.DrawOutlinedRect(0, 0, w, h,1)
|
|
end
|
|
|
|
local top = parent:Add("EditablePanel")
|
|
top:SetSize(parent:GetWide(), parent:GetTall() * 0.5)
|
|
top:Dock(TOP)
|
|
top.Paint = nil
|
|
|
|
local topTitle = top:Add("DLabel")
|
|
topTitle:SetTextColor(Color(255, 255, 255, 255))
|
|
topTitle:SetFont("MenuFontNoClamp")
|
|
topTitle:SetText(string.upper(title)..":")
|
|
topTitle:Dock(LEFT)
|
|
topTitle:DockMargin(SScaleMin(20 / 3), SScaleMin(5 / 3), 0, 0)
|
|
topTitle:SizeToContents()
|
|
|
|
parent.bottom = parent:Add("EditablePanel")
|
|
parent.bottom:SetSize(parent:GetWide(), parent:GetTall() * 0.45)
|
|
parent.bottom:Dock(TOP)
|
|
parent.bottom.Paint = nil
|
|
parent.bottom:SetName( "bottom" )
|
|
|
|
parent.bottom.titleText = parent.bottom:Add("DLabel")
|
|
parent.bottom.titleText:SetTextColor(Color(255, 255, 255, 255))
|
|
parent.bottom.titleText:SetFont("MenuFontNoClamp")
|
|
parent.bottom.titleText:SetText(text)
|
|
parent.bottom.titleText:Dock(LEFT)
|
|
parent.bottom.titleText:DockMargin(SScaleMin(20 / 3), 0, 0, 0)
|
|
parent.bottom.titleText:SizeToContents()
|
|
|
|
end
|
|
function PANEL:CreateEmployeePanel(appTable, appID)
|
|
self:ClearHousing()
|
|
self:RevertBackToHousing()
|
|
|
|
self.employeeList = self.housingPanel:Add("DScrollPanel")
|
|
self.employeeList:Dock(TOP)
|
|
self.employeeList:DockMargin(-1, 0, -1, 0)
|
|
self.employeeList:SetHeight(SScaleMin(140 / 3))
|
|
|
|
self.counter = 0
|
|
for cid, tEmployee in pairs(appTable.employees) do
|
|
print(cid)
|
|
PrintTable(tEmployee)
|
|
if istable(cid) then cid = tonumber(cid) end
|
|
self.counter = self.counter + 1
|
|
local cidLabelEmployee = self.employeeList:Add("EditablePanel")
|
|
CreateRow(cidLabelEmployee, "cid: | key id ", (!cid and "N/A" or cid).." | "..(tEmployee.key == true and "AWAITING KEY ID" or tEmployee.key or "N/A") , false)
|
|
local remove = CreateBottomOrTopTextOrButton(cidLabelEmployee.bottom, "REMOVE", false)
|
|
remove.DoClick = function()
|
|
if !cid or !appTable.tenants[LocalPlayer():GetCharacter():GetGenericdata().cid] then return LocalPlayer():NotifyLocalized("You can't do that.") end
|
|
cidLabelEmployee:Remove()
|
|
netstream.Start("RemoveEmployee", cid, appID)
|
|
surface.PlaySound("willardnetworks/datapad/navigate.wav")
|
|
end
|
|
end
|
|
|
|
local addEmployee = self.housingPanel:Add("DButton")
|
|
CreateButton(addEmployee, "Add an employee")
|
|
addEmployee:SetTall(SScaleMin(32 / 3))
|
|
addEmployee.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
if !appTable.tenants[LocalPlayer():GetCharacter():GetGenericdata().cid] then return LocalPlayer():NotifyLocalized("You can't do that.") end
|
|
Derma_StringRequest("Enter CID", "Enter the CID you want to add to the shop.", "", function(text)
|
|
surface.PlaySound("willardnetworks/datapad/navigate.wav")
|
|
netstream.Start("AddEmployee", appID, tonumber(text))
|
|
end)
|
|
end
|
|
addEmployee:Dock(BOTTOM)
|
|
end
|
|
function PANEL:CreatePaymentPanel(appTable, appID)
|
|
local housing = ix.plugin.list["housing"]
|
|
local remainingRent = (housing and housing:GetRemainingRent(appTable) or appTable.rent)
|
|
|
|
self:ClearHousing()
|
|
self:RevertBackToHousing()
|
|
|
|
local payFull = self.housingPanel:Add("DButton")
|
|
CreateButton(payFull, "PAY FULL RENT ( "..appTable.rent.." )")
|
|
if (remainingRent < tonumber(appTable.rent)) then
|
|
payFull:SetTextColor(Color(150, 150, 150, 255))
|
|
else
|
|
payFull.DoClick = function()
|
|
self:PayRent(tonumber(appTable.rent), appID)
|
|
end
|
|
end
|
|
|
|
local individualRent = (math.ceil(tonumber(appTable.rent) / table.Count(appTable.tenants)))
|
|
local payIndividual = self.housingPanel:Add("DButton")
|
|
CreateButton(payIndividual, "PAY INDIVIDUAL RENT ( "..individualRent.." )")
|
|
if (remainingRent < individualRent) then
|
|
payIndividual:SetTextColor(Color(150, 150, 150, 255))
|
|
else
|
|
payIndividual.DoClick = function()
|
|
self:PayRent(individualRent, appID)
|
|
end
|
|
end
|
|
|
|
local payRemaining = self.housingPanel:Add("DButton")
|
|
CreateButton(payRemaining, "PAY REMAINING RENT ( "..remainingRent.." )")
|
|
if (remainingRent <= 0) then
|
|
payRemaining:SetTextColor(Color(150, 150, 150, 255))
|
|
else
|
|
payRemaining.DoClick = function()
|
|
self:PayRent(remainingRent, appID)
|
|
end
|
|
end
|
|
|
|
local autoPay = self.housingPanel:Add("DButton")
|
|
CreateButton(autoPay, "AUTOMATIC RENT PAYMENT: "..(appTable.tenants[LocalPlayer().activeCID].autoPay and "ENABLED" or "DISABLED"))
|
|
autoPay.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
if !appTable.tenants[LocalPlayer().activeCID].autoPay then
|
|
autoPay:SetText("AUTOMATIC RENT PAYMENT: ENABLED")
|
|
appTable.tenants[LocalPlayer().activeCID].autoPay = true
|
|
else
|
|
autoPay:SetText("AUTOMATIC RENT PAYMENT: DISABLED")
|
|
appTable.tenants[LocalPlayer().activeCID].autoPay = false
|
|
end
|
|
|
|
netstream.Start("SetTenantAutoPayment", appID, LocalPlayer().activeCID, appTable.tenants[LocalPlayer().activeCID].autoPay)
|
|
end
|
|
|
|
for _, v in pairs(self.housingPanel:GetChildren()) do
|
|
v:SetTall(SScaleMin(40 / 3))
|
|
end
|
|
|
|
local paymentsMade = self.housingPanel:Add("DScrollPanel")
|
|
paymentsMade:Dock(FILL)
|
|
paymentsMade.Paint = function(_, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 255))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
for cid, tPayment in pairs(appTable.payments) do
|
|
local payPart = self:CreateHousingLeftSidePart(paymentsMade, "CID: "..cid, " | AMOUNT: "..tPayment.amount or "0", true, 30)
|
|
local paymentDate = payPart:Add("DLabel")
|
|
paymentDate:SetContentAlignment(6)
|
|
paymentDate:SetText("PAID: "..os.date( "%d/%m/%Y", tPayment.date) or os.time())
|
|
paymentDate:SetFont("MenuFontBoldNoClamp")
|
|
paymentDate:SizeToContents()
|
|
paymentDate:Dock(RIGHT)
|
|
paymentDate:DockMargin(0, 0, SScaleMin(10 / 3), 0)
|
|
end
|
|
end
|
|
|
|
function PANEL:PayRent(amount, appID)
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
local cid = self.activeCID
|
|
netstream.Start("PayRent", amount, appID, cid)
|
|
|
|
self:RevertBackToNormal()
|
|
end
|
|
|
|
function PANEL:RevertBackToNormal()
|
|
self.back.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateMainButtons()
|
|
end
|
|
end
|
|
|
|
function PANEL:PaymentSuccess(amount)
|
|
LocalPlayer().idCardCredits = LocalPlayer().idCardCredits - amount
|
|
end
|
|
|
|
function PANEL:CreateHousingLeftSidePart(parent, title, text, bNoColon, height)
|
|
local part = parent:Add("EditablePanel")
|
|
part:Dock(TOP)
|
|
part:SetTall(height and SScaleMin(height / 3) or SScaleMin(48 / 3))
|
|
part:DockMargin(0, -1, 0, 0)
|
|
part.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(150, 150, 150, 255))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
local titleHousing = part:Add("DLabel")
|
|
titleHousing:SetFont("MenuFontBoldNoClamp")
|
|
titleHousing:SetText(title..(!bNoColon and ": " or "")..text or "")
|
|
titleHousing:SizeToContents()
|
|
titleHousing:Center()
|
|
|
|
local _, y = titleHousing:GetPos()
|
|
titleHousing:SetPos(SScaleMin(10 / 3), y)
|
|
|
|
return part
|
|
end
|
|
|
|
function PANEL:ClearHousing()
|
|
for _, v in pairs(self.housingPanel:GetChildren()) do
|
|
v:Remove()
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateHousingRequestButtons()
|
|
self.requestButtons = {}
|
|
self:CreateHousingRequestButton()
|
|
|
|
if self:GetShowPButton() then
|
|
self:CreateHousingRequestButton(true)
|
|
end
|
|
end
|
|
|
|
function PANEL:GetShowPButton()
|
|
local housing = ix.plugin.list["housing"]
|
|
if !housing then return end
|
|
|
|
local loyaltyStatus = LocalPlayer().genericData.loyaltyStatus
|
|
local tier = tonumber(housing:GetNumbersFromText(loyaltyStatus))
|
|
local tierNeeded = tonumber(housing:GetNumbersFromText(ix.config.Get("priorityHousingTierNeeded", "TIER 4 (BLUE)")))
|
|
if ix.config.Get("priorityHousingTierNeeded", "TIER 4 (BLUE)") == "CCA MEMBER" then
|
|
tierNeeded = 7
|
|
end
|
|
|
|
if loyaltyStatus == "CCA MEMBER" then
|
|
return true
|
|
end
|
|
|
|
if (!tier or !isnumber(tier)) then
|
|
return false
|
|
end
|
|
|
|
if (isnumber(tier) and tier < tierNeeded) then
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function PANEL:CreateHousingRequestButton(bPriority)
|
|
local genericData = LocalPlayer().genericData
|
|
local request = self.housingPanel:Add("DButton")
|
|
CreateButton(request, genericData.housing and "request new"..((self:GetShowPButton() and bPriority) and " priority" or " normal").." housing (35 credits)" or "request"..((self:GetShowPButton() and bPriority) and " priority" or " normal").." housing (35 credits)")
|
|
request.DoClick = function()
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
if genericData.housing then
|
|
Derma_Query("Are you sure you want to request new housing?", ((self:GetShowPButton() and bPriority) and "Priority " or "Normal ").."Housing", "Yes", function()
|
|
self:SendHousingRequest(bPriority)
|
|
end, "No")
|
|
return
|
|
end
|
|
|
|
self:SendHousingRequest(bPriority)
|
|
end
|
|
|
|
self.requestButtons[#self.requestButtons + 1] = request
|
|
end
|
|
|
|
function PANEL:SendHousingRequest(bPriority)
|
|
for _, v in pairs(self.requestButtons) do
|
|
v:Remove()
|
|
end
|
|
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
netstream.Start("ixApartmentsRequest", LocalPlayer().activeCID, bPriority and "priority" or "normal")
|
|
end
|
|
|
|
function PANEL:CreateHousingFail(text)
|
|
local fail = self.housingPanel:Add("DLabel")
|
|
fail:SetText(text or "NO HOUSING FOUND")
|
|
fail:SetFont("TitlesFontNoClamp")
|
|
fail:SizeToContents()
|
|
fail:Center()
|
|
|
|
surface.PlaySound("HL1/fvox/buzz.wav")
|
|
end
|
|
|
|
function PANEL:CreateHousingScroller(foundApartment, appNames)
|
|
self.scroller = self.housingPanel:Add("EditablePanel")
|
|
local outliner = self.housingPanel:Add("EditablePanel")
|
|
outliner:SetSize(self.housingPanel:GetWide(), SScaleMin(50 / 3))
|
|
outliner:Center()
|
|
outliner:SetAlpha(0)
|
|
outliner:AlphaTo(255, 1, 0)
|
|
outliner.Paint = function(_, w, h)
|
|
surface.SetDrawColor(ColorAlpha(color_white, 100))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
end
|
|
|
|
local height = 0
|
|
local extraApps = 10
|
|
|
|
for _ = 1, extraApps do
|
|
for _, tApp in pairs(appNames) do
|
|
local appName = self.scroller:Add("DLabel")
|
|
appName:Dock(TOP)
|
|
appName:SetContentAlignment(5)
|
|
appName:SetText(string.upper(tApp.name) or "")
|
|
appName:SetFont("TitlesFontNoClamp")
|
|
appName:DockMargin(0, SScaleMin(10 / 3), 0, SScaleMin(10 / 3))
|
|
appName:SizeToContents()
|
|
|
|
height = height + appName:GetTall() + SScaleMin(20 / 3)
|
|
end
|
|
end
|
|
|
|
self.scroller:SetSize(self.housingPanel:GetWide(), height)
|
|
self.scroller:MoveTo(0, -height + (height / extraApps), 3, 0, 1, function()
|
|
self.scroller:AlphaTo(0, 1, 0, function()
|
|
self.scroller:Remove()
|
|
self:CreateFoundHousing(appNames, foundApartment, outliner)
|
|
end)
|
|
end)
|
|
|
|
local randomSounds = table.Random({
|
|
"ambient/machines/keyboard_fast1_1second.wav",
|
|
"ambient/machines/keyboard_fast2_1second.wav",
|
|
"ambient/machines/keyboard_fast3_1second.wav"
|
|
})
|
|
|
|
surface.PlaySound(randomSounds)
|
|
|
|
timer.Create("PlayRandomScrollingSounds", 1, 2, function()
|
|
surface.PlaySound(randomSounds)
|
|
end)
|
|
|
|
self:RevertBackToNormal()
|
|
end
|
|
|
|
function PANEL:CreateFoundHousing(appNames, foundApartment, outliner)
|
|
surface.PlaySound("ambient/machines/keyboard7_clicks_enter.wav")
|
|
|
|
local found = outliner:Add("DLabel")
|
|
found:SetText("APARTMENT ASSIGNED:")
|
|
found:SetFont("TitlesFontNoClamp")
|
|
found:SetContentAlignment(5)
|
|
found:SizeToContents()
|
|
found:Dock(TOP)
|
|
found:DockMargin(0, SScaleMin(10 / 3), 0, 0)
|
|
found:SetAlpha(0)
|
|
found:AlphaTo(255, 1, 0)
|
|
|
|
local found3 = outliner:Add("DLabel")
|
|
found3:SetText("KEY ASSIGNED TO PICKUP DISPENSER")
|
|
found3:SetFont("TitlesFontNoClamp")
|
|
found3:SetContentAlignment(5)
|
|
found3:SizeToContents()
|
|
found3:Dock(BOTTOM)
|
|
found3:DockMargin(0, 0, 0, SScaleMin(10 / 3))
|
|
found3:SetAlpha(0)
|
|
found3:AlphaTo(255, 1, 0)
|
|
|
|
local found2 = outliner:Add("DLabel")
|
|
found2:SetText((string.len(appNames[foundApartment].name) < 40 and string.upper(appNames[foundApartment].name) or string.Left(string.upper(appNames[foundApartment].name), 37).."...") or "")
|
|
found2:SetFont("TitlesFontNoClamp")
|
|
found2:SetContentAlignment(5)
|
|
found2:SizeToContents()
|
|
found2:Dock(BOTTOM)
|
|
found2:DockMargin(0, 0, 0, SScaleMin(10 / 3))
|
|
found2:SetAlpha(0)
|
|
found2:AlphaTo(255, 1, 0)
|
|
|
|
outliner:SetTall(found:GetTall() + found2:GetTall() + found3:GetTall() + SScaleMin(30 / 3))
|
|
outliner:Center()
|
|
|
|
LocalPlayer().genericData.housing = foundApartment
|
|
end
|
|
|
|
function PANEL:CreateCrimeReport()
|
|
if self.crimeReportPanel and IsValid(self.crimeReportPanel) then
|
|
self.crimeReportPanel:Remove()
|
|
end
|
|
|
|
self.crimeReportPanel = self.mainPanel:Add("EditablePanel")
|
|
self.crimeReportPanel:SetPos(0, SScaleMin(20 / 3))
|
|
self.crimeReportPanel:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(20 / 3))
|
|
|
|
local textEntry = self.crimeReportPanel:Add("DTextEntry")
|
|
textEntry:Dock(FILL)
|
|
textEntry:SetMultiline( true )
|
|
textEntry:SetVerticalScrollbarEnabled( true )
|
|
textEntry:SetEnterAllowed( true )
|
|
textEntry:SetFont("MenuFontNoClamp")
|
|
textEntry:SetTextColor(Color(200, 200, 200, 255))
|
|
textEntry:SetCursorColor(Color(200, 200, 200, 255))
|
|
textEntry:SetPlaceholderText("Who, what, when, where, how?")
|
|
textEntry:SetPlaceholderColor(Color(200, 200, 200, 255))
|
|
|
|
textEntry.Paint = function(this, w, h)
|
|
surface.SetDrawColor(Color(0, 0, 0, 100))
|
|
surface.DrawRect(0, 0, w, h)
|
|
|
|
surface.SetDrawColor(Color(111, 111, 136, 255 / 100 * 30))
|
|
surface.DrawOutlinedRect(0, 0, w, h)
|
|
|
|
if !this.shouldVoidPlaceholder then
|
|
if ( this.GetPlaceholderText and this.GetPlaceholderColor and this:GetPlaceholderText() and this:GetPlaceholderText():Trim() != "" and this:GetPlaceholderColor() and ( !this:GetText() or this:GetText() == "" ) ) then
|
|
|
|
local oldText = this:GetText()
|
|
|
|
local str = this:GetPlaceholderText()
|
|
if ( str:StartWith( "#" ) ) then str = str:utf8sub( 2 ) end
|
|
str = language.GetPhrase( str )
|
|
|
|
this:SetText( str )
|
|
this:DrawTextEntryText( this:GetPlaceholderColor(), this:GetHighlightColor(), this:GetCursorColor() )
|
|
this:SetText( oldText )
|
|
|
|
return
|
|
end
|
|
end
|
|
|
|
this:DrawTextEntryText( this:GetTextColor(), this:GetHighlightColor(), this:GetCursorColor() )
|
|
end
|
|
|
|
local submit = self.crimeReportPanel:Add("DButton")
|
|
CreateButton(submit, "submit")
|
|
submit:Dock(BOTTOM)
|
|
submit.DoClick = function()
|
|
netstream.Start("TerminalReportCrime", LocalPlayer().genericData.name, LocalPlayer().activeCID, textEntry:GetText(), LocalPlayer().activeTerminal)
|
|
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateMainButtons()
|
|
end
|
|
end
|
|
|
|
function PANEL:CreateLetterSending()
|
|
if self.letterSending and IsValid(self.letterSending) then
|
|
self.letterSending:Remove()
|
|
end
|
|
|
|
self.letterSending = self.mainPanel:Add("Panel")
|
|
self.letterSending:SetPos(0, SScaleMin(20 / 3))
|
|
self.letterSending:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(20 / 3))
|
|
self.letterSending:DockMargin(0, 0, 0, 0)
|
|
|
|
local character = LocalPlayer():GetCharacter()
|
|
if !character then return end
|
|
|
|
local inventory = character:GetInventory()
|
|
if !inventory then return end
|
|
|
|
local paperItems = inventory:GetItemsByUniqueID("paper")
|
|
if table.IsEmpty(paperItems) then
|
|
local noLetters = self.letterSending:Add("DLabel")
|
|
noLetters:SetFont("MenuFontNoClamp")
|
|
noLetters:SetText("NO LETTERS/PAPER IN YOUR POSSESSION")
|
|
noLetters:SizeToContents()
|
|
noLetters:SetPos(self.letterSending:GetWide() / 2 - noLetters:GetWide() / 2, self.letterSending:GetTall() / 2 - noLetters:GetTall() / 2)
|
|
return
|
|
end
|
|
|
|
local letterScroll = self.letterSending:Add("DScrollPanel")
|
|
letterScroll:SetSize(self.width - SScaleMin(256 / 3), SScaleMin(250 / 3) - SScaleMin(20 / 3))
|
|
self.letterButtons = {}
|
|
|
|
for _, v in pairs(paperItems) do
|
|
local paperItem = letterScroll:Add("DButton")
|
|
CreateButton(paperItem, v:GetName())
|
|
|
|
paperItem.DoClick = function()
|
|
Derma_StringRequest("Enter name or CID", "In order to send your letter, a CID or name is required.", "", function(text)
|
|
text = text:Trim()
|
|
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
netstream.Start("FindLetterRecepient", text, v:GetID())
|
|
|
|
for _, v2 in pairs(self.letterButtons) do
|
|
v2:SetVisible(false)
|
|
end
|
|
|
|
self.searchingRecepient = self.letterSending:Add("DLabel")
|
|
self.searchingRecepient:SetFont("MenuFontNoClamp")
|
|
self.searchingRecepient:SetText("Searching for recipient, please wait...")
|
|
self.searchingRecepient:SizeToContents()
|
|
self.searchingRecepient:SetPos(self.letterSending:GetWide() / 2 - self.searchingRecepient:GetWide() / 2, self.letterSending:GetTall() / 2 - self.searchingRecepient:GetTall() / 2)
|
|
end)
|
|
end
|
|
|
|
self.letterButtons[#self.letterButtons + 1] = paperItem
|
|
end
|
|
end
|
|
|
|
function PANEL:LetterRecepientFound(id, name, cid, itemID)
|
|
if !id or !name or !cid then return end
|
|
if self.searchingRecepient and IsValid(self.searchingRecepient) then
|
|
self.searchingRecepient:Remove()
|
|
end
|
|
|
|
Derma_Query("The recipient found is " .. name .. " and the CID belonging to this individual is #" .. cid .. ".", "Found Recipient",
|
|
"Proceed", function()
|
|
local fromCID = LocalPlayer().activeCID or "00000"
|
|
local genericData = LocalPlayer().genericData
|
|
local fromName = genericData.name or ""
|
|
|
|
netstream.Start("SendLetterToID", id, itemID, fromCID, fromName)
|
|
surface.PlaySound("helix/ui/press.wav")
|
|
self:RemoveButtons()
|
|
self:CreateMainButtons()
|
|
end, "Cancel", function()
|
|
for _, v2 in pairs(self.letterButtons) do
|
|
v2:SetVisible(true)
|
|
end
|
|
end)
|
|
end
|
|
|
|
netstream.Hook("AddEmployeeToList", function(appTable, cid, appID)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
if istable(cid) then cid = tonumber(cid) end
|
|
ix.gui.terminalPanel.counter = ix.gui.terminalPanel.counter + 1
|
|
local tEmployee = appTable.employees[cid]
|
|
local cidLabelEmployee = ix.gui.terminalPanel.employeeList:Add("EditablePanel")
|
|
CreateRow(cidLabelEmployee, "cid: | key id ", (!cid and "N/A" or cid).." | "..(tEmployee.key == true and "AWAITING KEY ID" or tEmployee.key or "N/A") , false)
|
|
local remove = CreateBottomOrTopTextOrButton(cidLabelEmployee.bottom, "REMOVE", false)
|
|
remove.DoClick = function()
|
|
if !cid or !appTable.tenants[LocalPlayer():GetCharacter():GetGenericdata().cid] then return LocalPlayer():NotifyLocalized("You can't do that.") end
|
|
cidLabelEmployee:Remove()
|
|
netstream.Start("RemoveEmployee", cid, appID)
|
|
surface.PlaySound("willardnetworks/datapad/navigate.wav")
|
|
end
|
|
end
|
|
end)
|
|
|
|
netstream.Hook("ReplyLetterRecepient", function(id, name, cid, itemID)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
if !ix.gui.terminalPanel.letterSending or ix.gui.terminalPanel.letterSending and !ix.gui.terminalPanel.letterSending:IsVisible() then return end
|
|
ix.gui.terminalPanel:LetterRecepientFound(id, name, cid, itemID)
|
|
end
|
|
end)
|
|
|
|
netstream.Hook("SendHousingErrorMessage", function(text)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
ix.gui.terminalPanel:ClearHousing()
|
|
ix.gui.terminalPanel:CreateHousingFail(text)
|
|
end
|
|
end)
|
|
|
|
netstream.Hook("ReplyApartmentInfo", function(appTable, appID, bShop)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
if !appTable or !appID then
|
|
ix.gui.terminalPanel:CreateHousingRequestButtons()
|
|
return
|
|
end
|
|
|
|
ix.gui.terminalPanel:CreateHousingInfo(appTable, appID, bShop)
|
|
end
|
|
end)
|
|
|
|
netstream.Hook("TerminalUpdateHousing", function(foundApartment, appNames, genericData)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
ix.gui.terminalPanel:CreateHousingScroller(foundApartment, appNames)
|
|
LocalPlayer().genericData = genericData
|
|
ix.gui.terminalPanel:PaymentSuccess(35)
|
|
end
|
|
end)
|
|
|
|
netstream.Hook("UpdateHousingPaymentPanel", function(appTable, appID, amount)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
ix.gui.terminalPanel.appTable = appTable
|
|
ix.gui.terminalPanel:CreatePaymentPanel(appTable, appID)
|
|
ix.gui.terminalPanel:PaymentSuccess(amount)
|
|
end
|
|
end)
|
|
|
|
netstream.Hook("TerminalUpdateCredits", function(amount)
|
|
if ix.gui.terminalPanel and IsValid(ix.gui.terminalPanel) then
|
|
ix.gui.terminalPanel:PaymentSuccess(amount)
|
|
ix.gui.terminalPanel:RemoveButtons()
|
|
ix.gui.terminalPanel:CreateCredits()
|
|
end
|
|
end)
|
|
|
|
function PANEL:RemoveButtons()
|
|
if (self.mainPanel) then
|
|
for _, v in pairs(self.mainPanel:GetChildren()) do
|
|
v:Remove()
|
|
end
|
|
end
|
|
end
|
|
|
|
vgui.Register("ixTerminal", PANEL, "EditablePanel")
|