Files
wnsrc/gamemodes/ixhl2rp/plugins/combineutilities/pda/derma/cl_terminal.lua

1403 lines
45 KiB
Lua
Raw Normal View History

2024-08-05 18:40:29 +03:00
--[[
| 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")