This commit is contained in:
lifestorm
2024-08-04 23:12:27 +03:00
parent 0e770b2b49
commit ba1fc01b16
7084 changed files with 2173495 additions and 14 deletions

View File

@@ -0,0 +1,174 @@
--[[
| 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/
--]]
net.Receive("ix.terminal.CWUWorkshiftData", function(len, client)
local ent = net.ReadEntity()
local data = util.JSONToTable(net.ReadString())
local terminalPanel = ent.terminalPanel
if terminalPanel then
if !IsValid(terminalPanel.shiftPanel) then
terminalPanel:ProceedShiftBuilding(data)
else
terminalPanel:PopulateWorkshift(data)
end
end
end)
net.Receive("ix.terminal.CWUWorkshiftSound", function()
surface.PlaySound(ix.config.Get("broadcastSound", "ambience/3d-sounds/alarms/workshiftalarm.ogg"))
end)
net.Receive("ix.terminal.AuthError", function(len, client)
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:AuthError()
end
end)
net.Receive("ix.terminal.DiscAttach", function(len, client)
local ent = net.ReadEntity()
local disc = net.ReadString()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:SetDisc(disc)
terminalPanel:OnDiscAttach()
end
end)
net.Receive("ix.terminal.DiscDetach", function(len, client)
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:SetDisc(nil)
terminalPanel:OnDiscDetach()
end
end)
net.Receive("ix.terminal.Scan", function(len, client)
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:Encode()
end
end)
net.Receive("ix.terminal.UpdateCWUTerminals", function(len)
local cityTbl = util.JSONToTable(net.ReadString())
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:Populate(cityTbl)
end
end)
net.Receive("ix.terminal.RequestCities", function(len)
local cities = util.JSONToTable(net.ReadString())
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:CreateMarketPanel(cities)
end
end)
net.Receive("ix.terminal.RequestMainCityInfo", function(len)
local cityInfo = util.JSONToTable(net.ReadString())
local budgets = util.JSONToTable(net.ReadString())
local ent = net.ReadEntity()
local option = net.ReadString()
local terminalPanel = ent.terminalPanel
if terminalPanel then
if option == "status" then
terminalPanel:CreateStatusPanel(cityInfo, budgets)
elseif option == "cart" then
terminalPanel:BuildCart(terminalPanel.cartPanel, cityInfo)
end
end
end)
net.Receive("ix.terminal.GetCityStock", function(len)
local items = util.JSONToTable(net.ReadString())
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:CreateStock(items)
end
end)
net.Receive("ix.terminal.turnOn", function(len)
local ent = net.ReadEntity()
local client = net.ReadEntity()
local data = net.ReadString()
data = util.JSONToTable(data)
if IsValid(ent) then
ent:CreateStartScreen(client, data)
end
end)
net.Receive("ix.terminal.turnOff", function(len)
local ent = net.ReadEntity()
if IsValid(ent) then
ent:PurgeScreenPanels()
end
end)
net.Receive("ix.terminal.CWUCardInserted", function(len)
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:OnCWUCardInserted()
end
end)
net.Receive("ix.terminal.CWUCardRemoved", function(len)
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:OnCWUCardRemoved()
end
end)
net.Receive("ix.terminal.SendCIDInfo", function(len)
local genData = util.JSONToTable(net.ReadString())
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:OnCIDInserted(genData)
end
end)
net.Receive("ix.terminal.SendCIDRemoved", function(len)
local ent = net.ReadEntity()
local terminalPanel = ent.terminalPanel
if terminalPanel then
terminalPanel:OnCIDRemoved()
end
end)

View File

@@ -0,0 +1,98 @@
--[[
| 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/
--]]
ix.factoryPanels = ix.factoryPanels or {}
ix.factoryPanels.list = ix.factoryPanels.list or {}
function ix.factoryPanels:CreatePanel(panel, ent)
local pnl = vgui.Create(panel)
pnl:SetTerminalEntity(ent)
ent.terminalPanel = pnl
ix.factoryPanels.list[#ix.factoryPanels.list + 1] = pnl
return pnl
end
function ix.factoryPanels:PurgeEntityPanels(ent)
for index, panel in pairs(self.list) do
if panel:GetTerminalEntity() == ent then
panel:Destroy()
table.remove(self.list, index)
end
end
end
-- fonts
surface.CreateFont( "WNTerminalSmallText", {
font = "Open Sans",
extended = true,
size = 32,
weight = 550,
scanlines = 2,
antialias = true,
outline = true
} )
surface.CreateFont( "WNTerminalMediumSmallerText", {
font = "Open Sans",
extended = true,
size = 38,
weight = 550,
scanlines = 2,
antialias = true,
outline = true
} )
surface.CreateFont( "WNTerminalMediumText", {
font = "Open Sans",
extended = true,
size = 48,
weight = 550,
scanlines = 2,
antialias = true,
outline = true
} )
surface.CreateFont( "WNTerminalLargeText", {
font = "Open Sans",
extended = true,
size = 96,
weight = 550,
scanlines = 2,
antialias = true,
outline = true
} )
surface.CreateFont( "WNTerminalMoreLargerText", {
font = "Open Sans",
extended = true,
size = 114,
weight = 550,
scanlines = 2,
antialias = true,
outline = true
} )
surface.CreateFont( "WNTerminalVeryLargeText", {
font = "Open Sans",
extended = true,
size = 600,
weight = 550,
scanlines = 2,
antialias = true,
outline = true
} )
surface.CreateFont("ButtonLabel", {
font = "Roboto",
size = 70,
antialias = true,
extended = true
})

View File

@@ -0,0 +1,377 @@
--[[
| 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/
--]]
-- one day i definitely should re-do the networking here..
util.AddNetworkString("ix.terminal.turnOn")
util.AddNetworkString("ix.terminal.turnOff")
util.AddNetworkString("ix.terminal.AuthError")
util.AddNetworkString("ix.terminal.CWUBroadcast")
util.AddNetworkString("ix.terminal.CWUWorkshiftBegin")
util.AddNetworkString("ix.terminal.CWUWorkshiftEnd")
util.AddNetworkString("ix.terminal.CWUWorkshiftPause")
util.AddNetworkString("ix.terminal.CWUWorkshiftRewardUpdate")
util.AddNetworkString("ix.terminal.CWUWorkshiftSound")
util.AddNetworkString("ix.terminal.CWUWorkshiftData")
util.AddNetworkString("ix.terminal.CWUCardInserted")
util.AddNetworkString("ix.terminal.CWUCardRemoved")
util.AddNetworkString("ix.terminal.SendCIDInfo")
util.AddNetworkString("ix.terminal.SendCIDRemoved")
util.AddNetworkString("ix.terminal.GetCityStock")
util.AddNetworkString("ix.terminal.RequestMainCityInfo")
util.AddNetworkString("ix.terminal.RequestCities")
util.AddNetworkString("ix.terminal.UpdateCWUTerminals")
util.AddNetworkString("ix.terminal.DiscAttach")
util.AddNetworkString("ix.terminal.DiscDetach")
util.AddNetworkString("ix.terminal.Scan")
util.AddNetworkString("ix.terminal.Fabricate")
util.AddNetworkString("ix.terminal.Recycle")
util.AddNetworkString("ix.terminal.Bioprocess")
util.AddNetworkString("ix.terminal.ToggleDepot")
local workshifts = ix.plugin.Get("combineutilities")
net.Receive("ix.terminal.CWUWorkshiftPause", function(_, client)
local ent = net.ReadEntity()
local wActive = GetNetVar("WorkshiftStarted", false)
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then return end
if (!ix.city:IsAuthorized(client, ent)) then return end
if (!wActive) then return end
local workshiftTerminals = ents.FindByClass("ix_workshiftterminal")
local pauseBool
if #workshiftTerminals > 0 then
for _, wTerminal in pairs(workshiftTerminals) do
if !wTerminal.workshiftStarted then continue end
workshifts:PauseWorkshift(wTerminal, client, !wTerminal.workshiftPaused)
if !pauseBool then
pauseBool = wTerminal.workshiftPaused
end
end
end
if isbool(pauseBool) then
client:NotifyLocalized("Registration pause is set to: " .. tostring(pauseBool))
ix.combineNotify:AddNotification(pauseBool and "NTC:// Work-Cycle registration paused by " .. client:GetCombineTag() or "NTC:// Work-Cycle registration resumed by " .. client:GetCombineTag(), nil, client)
end
end)
net.Receive("ix.terminal.CWUWorkshiftBegin", function(_, client)
local ent = net.ReadEntity()
local wActive = GetNetVar("WorkshiftStarted", false)
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then return end
if (!ix.city:IsAuthorized(client, ent)) then return end
if (wActive) then return end
local workshiftTerminals = ents.FindByClass("ix_workshiftterminal")
if #workshiftTerminals > 0 then
for _, wTerminal in pairs(workshiftTerminals) do
wTerminal:StartWorkshift(client)
end
else
return client:NotifyLocalized("There's no workshift terminals!")
end
ix.combineNotify:AddNotification("NTC:// Work-Cycle initiated by " .. client:GetCombineTag(), nil, client)
local idCard = ix.item.instances[ent:GetCID()]
workshifts:AddToWorkshift(client, idCard, ent.curGenData, workshiftTerminals[1])
workshifts:StartWorkshift()
client:NotifyLocalized("Workshift started!")
end)
net.Receive("ix.terminal.CWUWorkshiftEnd", function(_, client)
local ent = net.ReadEntity()
local wActive = GetNetVar("WorkshiftStarted", false)
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then return end
if (!ix.city:IsAuthorized(client, ent)) then return end
if (!wActive) then return end
local rewards = {}
local workshiftDataExtracted = false
local workshiftTerminals = ents.FindByClass("ix_workshiftterminal")
if #workshiftTerminals > 0 then
for _, wTerminal in pairs(workshiftTerminals) do
if !wTerminal.workshiftStarted then continue end
if wTerminal.workshiftStarted and !workshiftDataExtracted then
rewards = wTerminal.savedInfo
workshiftDataExtracted = true
end
wTerminal:StopWorkshift(client)
end
else
return client:NotifyLocalized("There's no workshift terminals!")
end
ix.combineNotify:AddNotification("NTC:// Work-Cycle terminated by " .. client:GetCombineTag(), nil, client)
workshifts:EndWorkshift(rewards, client)
client:NotifyLocalized("Workshift ended!")
end)
net.Receive("ix.terminal.CWUWorkshiftRewardUpdate", function(_, client)
local ent = net.ReadEntity()
local data = util.JSONToTable(net.ReadString())
local wActive = GetNetVar("WorkshiftStarted", false)
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then return end
if (!ix.city:IsAuthorized(client, ent)) then return end
if (!wActive) then return end
local workshiftTerminals = ents.FindByClass("ix_workshiftterminal")
if #workshiftTerminals > 0 then
for _, wTerminal in pairs(workshiftTerminals) do
if !wTerminal.workshiftStarted then continue end
workshifts:SaveWorkshift(data, wTerminal)
end
else
return client:NotifyLocalized("There's no workshift terminals!")
end
end)
net.Receive("ix.terminal.CWUWorkshiftData", function(_, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then return end
if (!ix.city:IsAuthorized(client, ent)) then return end
local wActive = GetNetVar("WorkshiftStarted", false)
local workshiftTerminals = ents.FindByClass("ix_workshiftterminal")
local dataToSend = {}
if wActive and #workshiftTerminals > 0 then
dataToSend["participants"] = {}
dataToSend["rewards"] = {}
for _, wTerminal in pairs(workshiftTerminals) do
if !wTerminal.workshiftStarted then continue end
if (wTerminal.participants and istable(wTerminal.participants) and !table.IsEmpty(wTerminal.participants)) then
for id, participant in pairs(wTerminal.participants) do
dataToSend["participants"][id] = participant
end
end
if (wTerminal.savedInfo and istable(wTerminal.savedInfo) and !table.IsEmpty(wTerminal.savedInfo)) then
for id, reward in pairs(wTerminal.savedInfo) do
dataToSend["rewards"][id] = reward
end
end
end
end
net.Start("ix.terminal.CWUWorkshiftData")
net.WriteEntity(ent)
net.WriteString(util.TableToJSON(dataToSend))
net.Send(client)
end)
net.Receive("ix.terminal.CWUBroadcast", function(_, client)
local ent = net.ReadEntity()
if (!ent or !ent:IsValid() or ent:GetClass() != "ix_cwuterminal") then return end
if ((ent.nextBroadcast or 0) >= CurTime()) then return end
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then return end
if (!ix.city:IsAuthorized(client, ent)) then return end
local broadcast = !ent:GetNetVar("broadcasting", false)
client:SetNetVar("broadcastAuth", broadcast and broadcast or nil)
ent:ToggleBroadcast()
end)
net.Receive("ix.terminal.Bioprocess", function(len, client)
local ent = net.ReadEntity()
local itemID = net.ReadString()
local isBulk = net.ReadBool()
local amount = net.ReadInt(5)
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local bioprocess = ent:SynthesizeFabrication(client, itemID, isBulk, amount)
if bioprocess then
client:NotifyLocalized(bioprocess)
end
end)
net.Receive("ix.terminal.ToggleDepot", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local depotToggle = ent:ToggleDepot()
if depotToggle then
client:NotifyLocalized(depotToggle)
end
end)
net.Receive("ix.terminal.Recycle", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local recycle = ent:Recycle(client)
if recycle then
client:NotifyLocalized(recycle)
end
end)
net.Receive("ix.terminal.Fabricate", function(len, client)
local ent = net.ReadEntity()
local isBulk = net.ReadBool()
local amount = net.ReadInt(5)
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local fabrication = ent:SynthesizeFabrication(client, ent:GetDiscItemID(), isBulk, amount)
if fabrication then
client:NotifyLocalized(fabrication)
end
end)
net.Receive("ix.terminal.Scan", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local scan = ent:Scan(client)
if scan then
client:NotifyLocalized(scan)
end
end)
net.Receive("ix.terminal.RequestCities", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local cities = {}
for cityID, city in pairs(ix.city.list) do
cities[cityID] = city
end
cities["1"] = table.Copy(ix.city.main)
cities = util.TableToJSON(cities)
net.Start("ix.terminal.RequestCities")
net.WriteString(cities)
net.WriteEntity(ent)
net.Send(client)
end)
net.Receive("ix.terminal.RequestMainCityInfo", function(len, client)
local ent = net.ReadEntity()
local option = net.ReadString()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local city = util.TableToJSON(ix.city:GetMainCity())
local budgets = util.TableToJSON(ix.factionBudget.list)
net.Start("ix.terminal.RequestMainCityInfo")
net.WriteString(city)
net.WriteString(budgets)
net.WriteEntity(ent)
net.WriteString(option)
net.Send(client)
end)
net.Receive("ix.terminal.GetCityStock", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local city = ix.city:GetMainCity()
local items = util.TableToJSON(city:GetItems())
net.Start("ix.terminal.GetCityStock")
net.WriteString(items)
net.WriteEntity(ent)
net.Send(client)
end)
net.Receive("ix.terminal.turnOn", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
local dataToSend = {}
if ent:GetClass() == "ix_cwuterminal" then
if ent.curGenData then
dataToSend[1] = ent.curGenData
end
if ent:GetCWUCard() and ent:GetCWUCard() != -1 then
dataToSend[2] = ent:GetCWUCard()
end
if ent:HasCWUCard() and ent:HasCID() or ent.curGenData and ent.curGenData.combine then
dataToSend[3] = !ent:IsFullyAuthed()
end
end
if ent.dItemID then
dataToSend = {ent.dItemID}
end
ent:SetUsedBy(client)
ent:CreateUserTimer()
net.Start("ix.terminal.turnOn")
net.WriteEntity(ent)
net.WriteEntity(client)
net.WriteString(util.TableToJSON(dataToSend))
net.Broadcast()
end)
net.Receive("ix.terminal.turnOff", function(len, client)
local ent = net.ReadEntity()
if (client:EyePos():DistToSqr(ent:GetPos()) > 62500) then
return
end
if (IsValid(ent:GetUsedBy()) and ent:GetUsedBy() != client) then
return client:NotifyLocalized("This terminal is being used by someone else.")
end
ent:SetUsedBy(ent)
if ent:GetClass() == "ix_cwuterminal" and ent:GetNetVar("broadcasting", false) then
if client:GetNetVar("broadcastAuth", false) then
client:SetNetVar("broadcastAuth", nil)
end
ent:ToggleBroadcast()
end
net.Start("ix.terminal.turnOff")
net.WriteEntity(ent)
net.Broadcast()
end)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,527 @@
--[[
| 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 screenMat = Material("vgui/terminal_yellow.png", "smooth")
local frameMat = Material("vgui/gradient-d", "smooth")
local cmbLabel = Material("willardnetworks/datafile/licensedisabled2.png", "smooth")
local cmbLogo = Material("vgui/icons/cmb_logo.png", "smooth")
local wnLogo = Material("vgui/icons/wi_logo.png", "smooth")
local defClr = Color(255, 223, 136)
local redClr = Color(200, 36, 36)
local greenClr = Color(36, 200, 61)
local backgroundColor = Color(9, 9, 9, 75)
local PANEL = {}
AccessorFunc(PANEL, "terminalEntity", "TerminalEntity")
AccessorFunc(PANEL, "usedBy", "UsedBy")
AccessorFunc(PANEL, "disc", "Disc")
local scrwSrn, scrhSrn = 1780, 870
local function CreateButton(name, text, path, font, alignment)
name:SetContentAlignment(alignment or 4)
name:SetTextInset(alignment and 0 or 10, 0)
name:SetFont(font or "WNTerminalMediumText")
name:SetText(string.utf8upper(text))
name.Paint = function(self, w, h)
surface.SetDrawColor(defClr)
surface.DrawRect(0, 0, w, h)
end
end
function PANEL:CreateDivider(parent, dock, bVertical)
local divider = parent:Add("Panel")
divider:Dock(dock)
divider:DockMargin(8, 8, 8, 8)
divider:SetHeight(10)
divider.bVertical = bVertical
divider.Paint = function(s, w, h)
surface.SetDrawColor(defClr)
if !bVertical then
surface.DrawLine(0, h * 0.5, w, h * 0.5)
else
surface.DrawLine(w * 0.5, 0, w * 0.5, h)
end
end
return divider
end
function PANEL:CreateAnimatedFrame(parent, dock, dockL, dockT, dockR, dockB, frameClr, callback)
local panel = parent:Add("Panel")
AccessorFunc(panel, "color", "Color")
panel:DockMargin(dockL, dockT, dockR, dockB)
panel:Dock(dock)
panel:InvalidateParent(true)
panel:SetColor(frameClr)
local wCoef = 0
local hCoef = 0
local anim = self:NewAnimation( 0.75, 0, -1)
anim.Think = function( s, pnl, fraction )
wCoef = fraction
end
local anim2 = self:NewAnimation( 0.8, 0.85, -1, function( s, pnl )
if callback then
callback()
end
end )
anim2.Think = function( s, pnl, fraction )
hCoef = fraction
end
panel.Paint = function(s, w, h)
w = w * wCoef
h = h * hCoef
local clr = s:GetColor()
clr.a = 100
surface.SetDrawColor(43, 42, 42, 200)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(clr)
surface.SetMaterial(frameMat)
surface.DrawTexturedRect(0, h * 0.95, w, h * 0.05)
surface.SetDrawColor(clr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
return panel
end
function PANEL:PurgeInnerContent()
for _, pnl in pairs(self.innerContent:GetChildren()) do
pnl:Remove()
end
end
function PANEL:CreateLock()
self.lockPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.lockPanel) then return end
self.lockPanel:ColorTo(redClr, 0.5)
self:GetTerminalEntity():EmitSound("buttons/button8.wav", 55, 100, 1, nil, 0, 11)
self.bottomWarning = self.lockPanel:Add("DLabel")
self.bottomWarning:SetFont("WNTerminalLargeText")
self.bottomWarning:SetText(string.utf8upper("ten terminal jest aktualnie używany"))
self.bottomWarning:SetTextColor(redClr)
self.bottomWarning:Dock(BOTTOM)
self.bottomWarning:DockMargin(0, 0, 0, 32)
self.bottomWarning:SetContentAlignment(5)
self.bottomWarning:SizeToContents()
self.bottomWarning:SetAlpha(0)
self.warningIcon = self.lockPanel:Add("DLabel")
self.warningIcon:SetFont("WNTerminalVeryLargeText")
self.warningIcon:SetTextColor(redClr)
self.warningIcon:SetText("!")
self.warningIcon:SetContentAlignment(5)
self.warningIcon:Center()
self.warningIcon:SetAlpha(0)
self.warningIcon:SizeToContents()
self.warningIcon.Paint = function(s, w, h)
surface.SetDrawColor(redClr)
surface.DrawCircle(26, 133, 75)
end
local alphishRedClr = redClr
alphishRedClr.a = 50
self.upperWarning = self.lockPanel:Add("DLabel")
self.upperWarning:Dock(TOP)
self.upperWarning:DockMargin(1, 64, 1, 0)
self.upperWarning:SetHeight(self:GetParent():GetTall() * 0.1)
self.upperWarning:SetContentAlignment(5)
self.upperWarning:SetFont("WNTerminalMediumText")
self.upperWarning:SetText(string.utf8upper("[PROSIMY O CIERPLIWOŚĆ // CZEKAJ NA SWOJĄ KOLEJ]"))
self.upperWarning:SetTextColor(defClr)
self.upperWarning.Paint = function(s, w, h)
surface.SetDrawColor(redClr)
surface.DrawRect(0, 0, w, h)
surface.SetMaterial(cmbLabel)
surface.SetDrawColor(alphishRedClr)
surface.DrawTexturedRect(0, 0, w, h)
end
self.upperWarning:SetAlpha(0)
for _, child in pairs(self.lockPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:InitializeBootupSequence()
self.wnLogo = self.innerContent:Add("Panel")
self.wnLogo:SetSize(500, 500)
self.wnLogo:CenterHorizontal(0.25)
self.wnLogo:CenterVertical(0.5)
self.wnLogo.Paint = function(s, w, h)
surface.SetMaterial(wnLogo)
surface.SetDrawColor(defClr)
surface.DrawTexturedRect(0, 0, w, h)
end
self.wnLogo:SetAlpha(0)
self.cmbLogo = self.innerContent:Add("Panel")
self.cmbLogo:SetSize(400, 500)
self.cmbLogo:CenterHorizontal(0.75)
self.cmbLogo:CenterVertical(0.5)
self.cmbLogo.Paint = function(s, w, h)
surface.SetMaterial(cmbLogo)
surface.SetDrawColor(defClr)
surface.DrawTexturedRect(0, 0, w, h)
end
self.cmbLogo:SetAlpha(0)
self.indicator = self.innerContent:Add("Panel")
self.indicator:SetWide(25)
self.indicator:SetHeight(self.innerContent:GetTall() - 2)
self.indicator:Center()
self.indicator:SetAlpha(0)
local defClrAlphish = defClr
defClrAlphish.a = 100
self.indicator.Paint = function(s, w, h)
surface.SetDrawColor(defClrAlphish)
surface.DrawRect(0, 0, w, h)
end
for _, child in pairs(self.innerContent:GetChildren()) do
child:AlphaTo(255, 0.25, 0, function()
self:GetTerminalEntity():EmitSound("wn_goi/terminal_turnon.mp3", 55, 100, 1, CHAN_VOICE, 0, 11)
end)
end
self.indicator:SizeTo(-1, 0, 1, 0.25, -1, function()
self.cmbLogo:MoveTo(self.innerContent:GetWide() / 2.72, self.cmbLogo:GetY(), 1)
self.cmbLogo:AlphaTo(0, 0.15, 0.5)
self.wnLogo:MoveTo(self.innerContent:GetWide() / 3, self.wnLogo:GetY(), 1, 0, -1, function()
self.wnLogo:AlphaTo(0, 0.25, 1.5, function()
for _, child in pairs(self.innerContent:GetChildren()) do
child:Remove()
end
self:Proceed()
end)
end)
end)
end
function PANEL:BuildEncodingPanel()
self.encodingPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.encodingPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/combine_button7.wav", 55, 100, 1, nil, 0, 11)
local upperLabel = self.encodingPanel:Add("DLabel")
upperLabel:SetFont("WNTerminalLargeText")
upperLabel:SetText(string.utf8upper("skanowanie i enkodowanie......"))
upperLabel:SetTextColor(defClr)
upperLabel:Dock(TOP)
upperLabel:DockMargin(0, 32, 0, 0)
upperLabel:SetContentAlignment(5)
upperLabel:SizeToContents()
upperLabel:SetAlpha(0)
local bottomLabel = self.encodingPanel:Add("DLabel")
bottomLabel:SetFont("WNTerminalMediumText")
bottomLabel:SetText(string.utf8upper("nie wkładaj rąk do komory terminala"))
bottomLabel:SetTextColor(defClr)
bottomLabel:Dock(BOTTOM)
bottomLabel:DockMargin(0, 0, 0, 32)
bottomLabel:SetContentAlignment(5)
bottomLabel:SizeToContents()
bottomLabel:SetAlpha(0)
self:CreateDivider(self.encodingPanel, TOP)
self:CreateDivider(self.encodingPanel, BOTTOM)
local barPanel = self.encodingPanel:Add("Panel")
barPanel:Dock(FILL)
barPanel:DockMargin(32, 32, 32, 32)
barPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
barPanel:SetAlpha(0)
local bar = barPanel:Add("Panel")
bar:Dock(FILL)
bar:DockMargin(16, 16, 16, 16)
bar.Paint = function(s, w, h)
surface.SetDrawColor(defClr)
surface.DrawRect(0, 0, w, h)
end
bar:SizeTo(0, -1, self:GetTerminalEntity().scanTimer - 2, 1, 1, function()
bar:SetAlpha(0)
self.encodingPanel:AlphaTo(0, 0.5, 0.5, function()
self:PurgeInnerContent()
self:Proceed()
end)
end)
for _, child in pairs(self.encodingPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:Encode()
self:PurgeInnerContent()
self:BuildEncodingPanel()
end
function PANEL:OnDiscAttach()
if self.discPanel then
self.discPanel:ColorTo(greenClr, 0.5, 0, function()
if (IsValid(self.bottomLabel) and IsValid(self.upperLabel)) then
self.bottomLabel:AlphaTo(0, 0.25)
self.upperLabel:AlphaTo(0, 0.25)
end
self:GetTerminalEntity():EmitSound("buttons/combine_button5.wav", 55, 100, 1, nil, 0, 11)
self.discPanel:AlphaTo(0, 0.5, 1, function()
self.discPanel:Remove()
self:ToInteraction()
end)
end)
end
end
function PANEL:OnDiscDetach()
self:SetDisc(nil)
self:PurgeInnerContent()
self:RequestDisc()
end
function PANEL:RequestDisc()
self.discPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.discPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/combine_button1.wav", 55, 100, 1, nil, 0, 11)
self.bottomLabel = self.discPanel:Add("DLabel")
self.bottomLabel:SetFont("WNTerminalLargeText")
self.bottomLabel:SetText(string.utf8upper("wymagany jest pusty dysk danych"))
self.bottomLabel:SetTextColor(defClr)
self.bottomLabel:Dock(BOTTOM)
self.bottomLabel:DockMargin(0, 0, 0, 32)
self.bottomLabel:SetContentAlignment(5)
self.bottomLabel:SizeToContents()
self.bottomLabel:SetAlpha(0)
local defClrAlphish = defClr
defClrAlphish.a = 100
self.upperLabel = self.discPanel:Add("DLabel")
self.upperLabel:Dock(TOP)
self.upperLabel:DockMargin(1, 64, 1, 0)
self.upperLabel:SetHeight(self:GetParent():GetTall() * 0.1)
self.upperLabel:SetContentAlignment(5)
self.upperLabel:SetFont("WNTerminalMediumText")
self.upperLabel:SetText(string.utf8upper("[WŁÓŻ PUSTY DYSK DANYCH, ABY KONTYNUOWAĆ // CENTRUM DANYCH ENKODOWANIA]"))
self.upperLabel:SetTextColor(defClr)
self.upperLabel.Paint = function(s, w, h)
surface.SetDrawColor(self.discPanel:GetColor())
surface.DrawRect(0, 0, w, h)
surface.SetMaterial(cmbLabel)
surface.SetDrawColor(self.discPanel:GetColor())
surface.DrawTexturedRect(0, 0, w, h)
end
self.upperLabel:SetAlpha(0)
self.cmbLogo = self.discPanel:Add("Panel")
self.cmbLogo:SetSize(400, 500)
self.cmbLogo:Center()
self.cmbLogo.Paint = function(s, w, h)
surface.SetMaterial(cmbLogo)
surface.SetDrawColor(self.discPanel:GetColor())
surface.DrawTexturedRect(0, 0, w, h)
end
self.cmbLogo:SetAlpha(0)
for _, child in pairs(self.discPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:Proceed()
if (!self:IsUsedByLocalPlayer()) then
self:CreateLock()
else
if (!self:GetDisc()) then
self:RequestDisc()
else
self:ToInteraction()
end
end
end
function PANEL:BuildInteraction(parent)
if self:GetDisc() != "" then
local errorLabel = parent:Add("DLabel")
errorLabel:Dock(FILL)
errorLabel:SetContentAlignment(5)
errorLabel:SetFont("WNTerminalMediumText")
errorLabel:SetText(string.utf8upper("włożony dysk ma już \n zakodowany przedmiot"))
errorLabel:SetTextColor(defClr)
return
end
local upperLabel = parent:Add("DLabel")
upperLabel:Dock(TOP)
upperLabel:DockMargin(0, 8, 0, 0)
upperLabel:SetContentAlignment(5)
upperLabel:SetFont("WNTerminalMediumText")
upperLabel:SetText(string.utf8upper("encoding process"))
upperLabel:SetTextColor(defClr)
self:CreateDivider(parent, TOP)
local bottomLabel = parent:Add("DLabel")
bottomLabel:Dock(BOTTOM)
bottomLabel:DockMargin(0, 0, 0, 16)
bottomLabel:SetContentAlignment(5)
bottomLabel:SetFont("WNTerminalMediumSmallerText")
bottomLabel:SetText(string.utf8upper("włóż pożądany przedmiot do terminala i potwierdź skanowanie"))
bottomLabel:SetTextColor(defClr)
self:CreateDivider(parent, BOTTOM)
local confirmPanel = parent:Add("Panel")
confirmPanel:Dock(FILL)
confirmPanel:DockMargin(256, 64, 256, 64)
confirmPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local confirmLabel = confirmPanel:Add("DLabel")
confirmLabel:Dock(TOP)
confirmLabel:DockMargin(0, 16, 0, 0)
confirmLabel:SetContentAlignment(5)
confirmLabel:SetFont("WNTerminalMediumSmallerText")
confirmLabel:SetText(string.utf8upper("kontynuować enkodowanie?"))
confirmLabel:SetTextColor(defClr)
confirmLabel:SizeToContents()
self:CreateDivider(confirmPanel, TOP)
local confirmButton = confirmPanel:Add("DButton")
CreateButton(confirmButton, "POTWIERDŹ SKANOWANIE", "buttonnoarrow.png", "WNTerminalMediumText", 5)
confirmButton:Dock(FILL)
confirmButton:DockMargin(8, 8, 8, 8)
confirmButton.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.Scan")
net.WriteEntity(self:GetTerminalEntity())
net.SendToServer()
end
end
function PANEL:ToInteraction()
self.interactionPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.interactionPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/combine_button1.wav", 55, 100, 1, nil, 0, 11)
self.interact = self.interactionPanel:Add("Panel")
self.interact:SetWide(self.interactionPanel:GetWide() * 0.6)
self.interact:SetTall(self.interactionPanel:GetTall() / 1.65)
self.interact:Center()
self.interact.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.interact:InvalidateParent(true)
self.interact:SetAlpha(0)
self:BuildInteraction(self.interact)
for _, child in pairs(self.interactionPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:OnDataDiscInsert(dData)
if self.discPanel then
self.bottomLabel:AlphaTo(0, 0.5)
self.upperLabel:AlphaTo(0, 0.5)
self.discPanel:ColorTo(greenClr, 0.5, 0, function()
self:GetTerminalEntity():EmitSound("buttons/combine_button5.wav", 55, 100, 1, nil, 0, 11)
self.discPanel:AlphaTo(0, 0.5, 1, function()
self.discPanel:Remove()
end)
end)
end
end
function PANEL:OnDiscRemoved()
self:PurgeInnerContent()
self:RequestDisc()
end
function PANEL:IsUsedByLocalPlayer()
return self:GetUsedBy() == LocalPlayer()
end
function PANEL:Init()
self:SetSize(scrwSrn, scrhSrn)
self:SetPos(0, 0)
self:SetAlpha(0)
self.innerContent = self:Add("Panel")
self.innerContent:Dock(FILL)
self.innerContent:DockMargin(118, 84, 118, 70)
self.innerContent:InvalidateParent(true)
self:SetPaintedManually( true )
self:AlphaTo(255, 0.5, 0, function()
self:InitializeBootupSequence()
end)
end
function PANEL:Destroy()
self:AlphaTo(0, 0.5, 0, function(animData, pnl)
self:GetTerminalEntity().terminalPanel = nil
pnl:Remove()
end)
end
function PANEL:Paint(w, h)
surface.SetDrawColor(255, 255, 255, 100)
surface.SetMaterial(screenMat)
surface.DrawTexturedRect(0, 0, w, h)
end
vgui.Register("ixDataEncoder", PANEL, "Panel")

View File

@@ -0,0 +1,862 @@
--[[
| 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 screenMat = Material("vgui/terminal_yellow.png", "smooth")
local frameMat = Material("vgui/gradient-d", "smooth")
local cmbLabel = Material("willardnetworks/datafile/licensedisabled2.png", "smooth")
local cmbLogo = Material("vgui/icons/cmb_logo.png", "smooth")
local wnLogo = Material("vgui/icons/wi_logo.png", "smooth")
local defClr = Color(255, 223, 136)
local redClr = Color(200, 36, 36)
local greenClr = Color(36, 200, 61)
local backgroundColor = Color(9, 9, 9, 75)
local PANEL = {}
AccessorFunc(PANEL, "terminalEntity", "TerminalEntity")
AccessorFunc(PANEL, "usedBy", "UsedBy")
AccessorFunc(PANEL, "disc", "Disc")
local scrwSrn, scrhSrn = 1300, 970
local function CreateButton(name, text, path, font, alignment)
name:SetContentAlignment(alignment or 4)
name:SetTextInset(alignment and 0 or 10, 0)
name:SetFont(font or "WNTerminalMediumText")
name:SetText(string.utf8upper(text))
name.Paint = function(self, w, h)
surface.SetDrawColor(defClr)
surface.DrawRect(0, 0, w, h)
end
end
function PANEL:CreateNextPrev(parent, buttonFont, buttonAlign, prevFunc, nextFunc, bHorizontal, manualWidth)
local nextButton = parent:Add("DButton")
CreateButton(nextButton, "następne", buttonFont, buttonAlign)
nextButton.DoClick = nextFunc
local prevButton = parent:Add("DButton")
CreateButton(prevButton, "poprzednie", buttonFont, buttonAlign)
prevButton.DoClick = prevFunc
if !bHorizontal then
nextButton:Dock(TOP)
nextButton:SetTall(parent:GetTall() / 2.1)
nextButton:DockMargin(2, 2, 2, 2)
prevButton:Dock(FILL)
prevButton:DockMargin(2, 2, 2, 2)
else
prevButton:Dock(LEFT)
prevButton:DockMargin(5, 5, 5, 5)
prevButton:SetWide(manualWidth or parent:GetWide() / 2)
nextButton:Dock(FILL)
nextButton:DockMargin(5, 5, 5, 5)
end
end
function PANEL:CreateDivider(parent, dock, bVertical)
local divider = parent:Add("Panel")
divider:Dock(dock)
divider:DockMargin(8, 8, 8, 8)
divider:SetHeight(10)
divider.bVertical = bVertical
divider.Paint = function(s, w, h)
surface.SetDrawColor(defClr)
if !bVertical then
surface.DrawLine(0, h * 0.5, w, h * 0.5)
else
surface.DrawLine(w * 0.5, 0, w * 0.5, h)
end
end
return divider
end
function PANEL:CreateAnimatedFrame(parent, dock, dockL, dockT, dockR, dockB, frameClr, callback)
local panel = parent:Add("Panel")
AccessorFunc(panel, "color", "Color")
panel:DockMargin(dockL, dockT, dockR, dockB)
panel:Dock(dock)
panel:InvalidateParent(true)
panel:SetColor(frameClr)
local wCoef = 0
local hCoef = 0
local anim = self:NewAnimation( 0.75, 0, -1)
anim.Think = function( s, pnl, fraction )
wCoef = fraction
end
local anim2 = self:NewAnimation( 0.8, 0.85, -1, function( s, pnl )
if callback then
callback()
end
end )
anim2.Think = function( s, pnl, fraction )
hCoef = fraction
end
panel.Paint = function(s, w, h)
w = w * wCoef
h = h * hCoef
local clr = s:GetColor()
clr.a = 100
surface.SetDrawColor(43, 42, 42, 200)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(clr)
surface.SetMaterial(frameMat)
surface.DrawTexturedRect(0, h * 0.95, w, h * 0.05)
surface.SetDrawColor(clr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
return panel
end
function PANEL:PurgeInnerContent()
for _, pnl in pairs(self.innerContent:GetChildren()) do
pnl:Remove()
end
end
function PANEL:CreateLock()
self.lockPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.lockPanel) then return end
self.lockPanel:ColorTo(redClr, 0.5)
self:GetTerminalEntity():EmitSound("buttons/button8.wav", 55, 100, 1, nil, 0, 11)
self.bottomWarning = self.lockPanel:Add("DLabel")
self.bottomWarning:SetFont("WNTerminalLargeText")
self.bottomWarning:SetText(string.utf8upper("ten terminal jest aktualnie używany"))
self.bottomWarning:SetTextColor(redClr)
self.bottomWarning:Dock(BOTTOM)
self.bottomWarning:DockMargin(0, 0, 0, 32)
self.bottomWarning:SetContentAlignment(5)
self.bottomWarning:SizeToContents()
self.bottomWarning:SetAlpha(0)
self.warningIcon = self.lockPanel:Add("DLabel")
self.warningIcon:SetFont("WNTerminalVeryLargeText")
self.warningIcon:SetTextColor(redClr)
self.warningIcon:SetText("!")
self.warningIcon:SetContentAlignment(5)
self.warningIcon:Center()
self.warningIcon:SetAlpha(0)
self.warningIcon:SizeToContents()
self.warningIcon.Paint = function(s, w, h)
surface.SetDrawColor(redClr)
surface.DrawCircle(26, 133, 75)
end
local alphishRedClr = redClr
alphishRedClr.a = 50
self.upperWarning = self.lockPanel:Add("DLabel")
self.upperWarning:Dock(TOP)
self.upperWarning:DockMargin(1, 64, 1, 0)
self.upperWarning:SetHeight(self:GetParent():GetTall() * 0.1)
self.upperWarning:SetContentAlignment(5)
self.upperWarning:SetFont("WNTerminalMediumText")
self.upperWarning:SetText(string.utf8upper("[PROSIMY O CIERPLIWOŚĆ // CZEKAJ NA SWOJĄ KOLEJ]"))
self.upperWarning:SetTextColor(defClr)
self.upperWarning.Paint = function(s, w, h)
surface.SetDrawColor(redClr)
surface.DrawRect(0, 0, w, h)
surface.SetMaterial(cmbLabel)
surface.SetDrawColor(alphishRedClr)
surface.DrawTexturedRect(0, 0, w, h)
end
self.upperWarning:SetAlpha(0)
for _, child in pairs(self.lockPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:InitializeBootupSequence()
self.wnLogo = self.innerContent:Add("Panel")
self.wnLogo:SetSize(500, 500)
self.wnLogo:CenterHorizontal(0.25)
self.wnLogo:CenterVertical(0.5)
self.wnLogo.Paint = function(s, w, h)
surface.SetMaterial(wnLogo)
surface.SetDrawColor(defClr)
surface.DrawTexturedRect(0, 0, w, h)
end
self.wnLogo:SetAlpha(0)
self.cmbLogo = self.innerContent:Add("Panel")
self.cmbLogo:SetSize(400, 500)
self.cmbLogo:CenterHorizontal(0.75)
self.cmbLogo:CenterVertical(0.5)
self.cmbLogo.Paint = function(s, w, h)
surface.SetMaterial(cmbLogo)
surface.SetDrawColor(defClr)
surface.DrawTexturedRect(0, 0, w, h)
end
self.cmbLogo:SetAlpha(0)
self.indicator = self.innerContent:Add("Panel")
self.indicator:SetWide(2)
self.indicator:SetHeight(self.innerContent:GetTall() - 2)
self.indicator:Center()
self.indicator:SetAlpha(0)
local defClrAlphish = defClr
defClrAlphish.a = 100
self.indicator.Paint = function(s, w, h)
surface.SetDrawColor(defClrAlphish)
surface.DrawRect(0, 0, w, h)
end
for _, child in pairs(self.innerContent:GetChildren()) do
child:AlphaTo(255, 0.25, 0, function()
self:GetTerminalEntity():EmitSound("wn_goi/terminal_turnon.mp3", 55, 100, 1, CHAN_VOICE, 0, 11)
end)
end
self.indicator:SizeTo(-1, 0, 1, 0.25, -1, function()
self.cmbLogo:MoveTo(self.innerContent:GetWide() / 2.72, self.cmbLogo:GetY(), 1)
self.cmbLogo:AlphaTo(0, 0.15, 0.5)
self.wnLogo:MoveTo(self.innerContent:GetWide() / 3.5, self.wnLogo:GetY(), 1, 0, -1, function()
self.wnLogo:AlphaTo(0, 0.25, 1.5, function()
for _, child in pairs(self.innerContent:GetChildren()) do
child:Remove()
end
self:Proceed()
end)
end)
end)
end
function PANEL:OnDiscDetach()
if (self.fabricatingPanel) then
self:PurgeInnerContent()
self:CreateFabricating()
end
end
function PANEL:OnDiscAttach()
if (self.fabricatingPanel) then
self:PurgeInnerContent()
self:CreateFabricating()
end
end
function PANEL:FillDiscInteraction(parent)
local itemID = self:GetDisc()
if !itemID then return end
local item = ix.item.list[itemID]
self.itemIcon = parent:Add("SpawnIcon")
self.itemIcon:SetSize(176, 176)
self.itemIcon:SetModel(item.model)
self.itemIcon:Center()
self.itemIcon.PaintOver = function(s, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local itemName = parent:Add("DLabel")
itemName:Dock(TOP)
itemName:DockMargin(0, 16, 0, 0)
itemName:SetContentAlignment(5)
itemName:SetFont("WNTerminalMediumText")
itemName:SetText(string.utf8upper("encoded item: " .. item.name))
itemName:SetTextColor(defClr)
itemName:SizeToContents()
self:CreateDivider(parent, TOP)
local fabricateButtonPanel = parent:Add("Panel")
fabricateButtonPanel:Dock(BOTTOM)
fabricateButtonPanel:SetTall(64)
fabricateButtonPanel:DockMargin(128, 0, 128, 16)
fabricateButtonPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local fabButton = fabricateButtonPanel:Add("DButton")
CreateButton(fabButton, "SYNTEZUJ", "buttonnoarrow.png", "WNTerminalMediumText", 5)
fabButton:Dock(FILL)
fabButton:DockMargin(8, 8, 450, 8)
fabButton.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button4.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.Fabricate")
net.WriteEntity(self:GetTerminalEntity())
net.WriteBool(false)
net.WriteInt(1, 5)
net.SendToServer()
end
local fabButtonMass = fabricateButtonPanel:Add("DButton")
CreateButton(fabButtonMass, "SYNTEZUJ MASOWO", "buttonnoarrow.png", "WNTerminalMediumText", 5)
fabButtonMass:Dock(FILL)
fabButtonMass:DockMargin(450, 8, 8, 8)
fabButtonMass.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button4.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.Fabricate")
net.WriteEntity(self:GetTerminalEntity())
net.WriteBool(true)
net.WriteInt(5, 5)
net.SendToServer()
end
local resinLabel = parent:Add("DLabel")
resinLabel:Dock(BOTTOM)
resinLabel:DockMargin(0, 0, 0, 8)
resinLabel:SetContentAlignment(5)
resinLabel:SetFont("WNTerminalMediumText")
resinLabel:SetText(string.utf8upper("wymagana ilość żywicy: " .. ix.fabrication:Get(itemID).mainMaterialCost))
resinLabel:SetTextColor(defClr)
resinLabel:SizeToContents()
end
function PANEL:CreateFabricating()
self:PurgeInnerContent()
self.fabricatingPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.fabricatingPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/button6.wav", 55, 100, 1, nil, 0, 11)
local returnButton = self.fabricatingPanel:Add("DButton")
CreateButton(returnButton, "POWRÓT", "buttonnoarrow.png", "WNTerminalLargeText", 5)
returnButton:Dock(TOP)
returnButton:SetTall(128)
returnButton:DockMargin(8, 8, 8, 8)
returnButton.DoClick = function(s)
if s.bClosing then return end
s.bClosing = true
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
self.fabricatingPanel:AlphaTo(0, 0.5, 0, function()
self:PurgeInnerContent()
self:CreateSelector()
end)
end
returnButton:SetAlpha(0)
if (!self:GetDisc() or self:GetDisc() == "") then
local errorLabel = self.fabricatingPanel:Add("DLabel")
errorLabel:SetContentAlignment(5)
errorLabel:SetFont("WNTerminalLargeText")
errorLabel:SetText(string.utf8upper("zakodowane dane\nwymagany dysk!"))
errorLabel:SetTextColor(defClr)
errorLabel:SetAlpha(0)
errorLabel:SizeToContents()
errorLabel:CenterHorizontal(0.525)
errorLabel:CenterVertical(0.5)
for _, child in pairs(self.fabricatingPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
return
end
local upperLabel = self.fabricatingPanel:Add("DLabel")
upperLabel:Dock(TOP)
upperLabel:SetContentAlignment(5)
upperLabel:SetFont("WNTerminalLargeText")
upperLabel:SetText(string.utf8upper("zakodowane informacje"))
upperLabel:SetTextColor(defClr)
upperLabel:SetAlpha(0)
upperLabel:SizeToContents()
local d = self:CreateDivider(self.fabricatingPanel, TOP)
d:SetAlpha(0)
self.eFab = self.fabricatingPanel:Add("Panel")
self.eFab:Dock(FILL)
self.eFab:DockMargin(16, 16, 16, 48)
self.eFab:InvalidateParent(true)
self.eFab.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.eFab:SetAlpha(0)
self:FillDiscInteraction(self.eFab)
for _, child in pairs(self.fabricatingPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:FillRecycleInteraction(parent)
local fcLabel = parent:Add("DLabel")
fcLabel:Dock(TOP)
fcLabel:DockMargin(0, 32, 0, 0)
fcLabel:SetContentAlignment(5)
fcLabel:SetFont("WNTerminalMediumText")
fcLabel:SetText(string.utf8upper("sterowanie fabrykatora"))
fcLabel:SetTextColor(defClr)
fcLabel:SizeToContents()
local wLabel = parent:Add("DLabel")
wLabel:Dock(TOP)
wLabel:DockMargin(0, 8, 0, 0)
wLabel:SetContentAlignment(5)
wLabel:SetFont("WNTerminalMediumText")
wLabel:SetText(string.utf8upper("[nie wkładaj rąk do komory fabrykatora]"))
wLabel:SetTextColor(defClr)
wLabel:SizeToContents()
local buttonsPanel = parent:Add("Panel")
buttonsPanel:Dock(FILL)
buttonsPanel:DockMargin(parent:GetWide() / 3, 8, parent:GetWide() / 3, 16)
buttonsPanel:InvalidateParent(true)
buttonsPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local toggleDepot = buttonsPanel:Add("DButton")
CreateButton(toggleDepot, "otwórz\n/\nzamknij", "buttonnoarrow.png", "WNTerminalMediumText", 5)
toggleDepot:Dock(LEFT)
toggleDepot:SetWide(buttonsPanel:GetWide() / 2.15)
toggleDepot:DockMargin(8, 8, 4, 8)
toggleDepot.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button4.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.ToggleDepot")
net.WriteEntity(self:GetTerminalEntity())
net.SendToServer()
end
local recycle = buttonsPanel:Add("DButton")
CreateButton(recycle, "recykluj", "buttonnoarrow.png", "WNTerminalMediumText", 5)
recycle:Dock(FILL)
recycle:DockMargin(4, 8, 8, 8)
recycle.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button4.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.Recycle")
net.WriteEntity(self:GetTerminalEntity())
net.SendToServer()
end
end
function PANEL:CreateRecycling()
self:PurgeInnerContent()
self.recyclingPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.recyclingPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/button6.wav", 55, 100, 1, nil, 0, 11)
local returnButton = self.recyclingPanel:Add("DButton")
CreateButton(returnButton, "POWRÓT", "buttonnoarrow.png", "WNTerminalLargeText", 5)
returnButton:Dock(TOP)
returnButton:SetTall(128)
returnButton:DockMargin(8, 8, 8, 8)
returnButton.DoClick = function(s)
if s.bClosing then return end
s.bClosing = true
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
self.recyclingPanel:AlphaTo(0, 0.5, 0, function()
self:PurgeInnerContent()
self:CreateSelector()
end)
end
returnButton:SetAlpha(0)
local upperLabel = self.recyclingPanel:Add("DLabel")
upperLabel:Dock(TOP)
upperLabel:SetContentAlignment(5)
upperLabel:SetFont("WNTerminalLargeText")
upperLabel:SetText(string.utf8upper("recykling"))
upperLabel:SetTextColor(defClr)
upperLabel:SetAlpha(0)
upperLabel:SizeToContents()
local d = self:CreateDivider(self.recyclingPanel, TOP)
d:SetAlpha(0)
self.recControl = self.recyclingPanel:Add("Panel")
self.recControl:Dock(FILL)
self.recControl:DockMargin(16, 16, 16, 48)
self.recControl:InvalidateParent(true)
self.recControl.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.recControl:SetAlpha(0)
self:FillRecycleInteraction(self.recControl)
for _, child in pairs(self.recyclingPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:CreateOptionButtons(parent)
local bClosing = false
local fabricate = parent:Add("DButton")
CreateButton(fabricate, "FABRYKUJ", "buttonnoarrow.png", "WNTerminalMediumText", 5)
fabricate:Dock(LEFT)
fabricate:DockMargin(8, 16, 4, 16)
fabricate:SetWide(parent:GetWide() / 3)
fabricate.DoClick = function(s)
if bClosing then return end
bClosing = true
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
self.selectorPanel:AlphaTo(0, 0.5, 0, function()
self:CreateFabricating()
end)
end
local recycle = parent:Add("DButton")
CreateButton(recycle, "RECYKLUJ", "buttonnoarrow.png", "WNTerminalMediumText", 5)
recycle:Dock(LEFT)
recycle:DockMargin(4, 32, 4, 32)
recycle:SetWide(parent:GetWide() / 3)
recycle.DoClick = function(s)
if bClosing then return end
bClosing = true
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
self.selectorPanel:AlphaTo(0, 0.5, 0, function()
self:CreateRecycling()
end)
end
local bioprocessing = parent:Add("DButton")
CreateButton(bioprocessing, "BIOPROCESUJ", "buttonnoarrow.png", "WNTerminalMediumText", 5)
bioprocessing:Dock(FILL)
bioprocessing:DockMargin(4, 16, 8, 16)
bioprocessing.DoClick = function(s)
if bClosing then return end
bClosing = true
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
self.selectorPanel:AlphaTo(0, 0.5, 0, function()
self:CreateBioprocess()
end)
end
end
function PANEL:FillBioPanel(parent)
local nextPrev = parent:Add("Panel")
nextPrev:Dock(TOP)
nextPrev:SetTall(80)
nextPrev:InvalidateParent(true)
nextPrev.Paint = function(s, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local incrementFunc = function(s)
self:GetTerminalEntity():EmitSound("willardnetworks/datapad/back.wav", 55, 100, 1, nil, 0, 11)
self.itemIcon:Increment()
end
local decrementFunc = function(s)
self:GetTerminalEntity():EmitSound("willardnetworks/datapad/back.wav", 55, 100, 1, nil, 0, 11)
self.itemIcon:Decrement()
end
self:CreateNextPrev(nextPrev, nil, nil, decrementFunc, incrementFunc, true)
local bioprocessButtonPanel = parent:Add("Panel")
bioprocessButtonPanel:Dock(BOTTOM)
bioprocessButtonPanel:SetTall(64)
bioprocessButtonPanel:DockMargin(128, 0, 128, 16)
bioprocessButtonPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local bioButton = bioprocessButtonPanel:Add("DButton")
CreateButton(bioButton, "SYNTEZUJ", "buttonnoarrow.png", "WNTerminalMediumText", 5)
bioButton:Dock(FILL)
bioButton:DockMargin(8, 8, 450, 8)
bioButton.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button4.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.Bioprocess")
net.WriteEntity(self:GetTerminalEntity())
net.WriteString(self.itemIcon.fabID)
net.WriteBool(false)
net.WriteInt(1, 5)
net.SendToServer()
end
local bioButtonMass = bioprocessButtonPanel:Add("DButton")
CreateButton(bioButtonMass, "SYNTEZUJ MASOWO", "buttonnoarrow.png", "WNTerminalMediumText", 5)
bioButtonMass:Dock(FILL)
bioButtonMass:DockMargin(450, 8, 8, 8)
bioButtonMass.DoClick = function(s)
self:GetTerminalEntity():EmitSound("buttons/button4.wav", 55, 100, 1, nil, 0, 11)
net.Start("ix.terminal.Bioprocess")
net.WriteEntity(self:GetTerminalEntity())
net.WriteString(self.itemIcon.fabID)
net.WriteBool(true)
net.WriteInt(5, 5)
net.SendToServer()
end
local itemInfo = parent:Add("Panel")
itemInfo:Dock(LEFT)
itemInfo:DockMargin(0, 0, 0, 0)
itemInfo:SetWide(400)
local itemName = itemInfo:Add("DLabel")
itemName:Dock(TOP)
itemName:DockMargin(16, 16, 0, 8)
itemName:SetContentAlignment(5)
itemName:SetFont("WNTerminalMediumText")
itemName:SetText("")
itemName:SetTextColor(defClr)
local itemMats = itemInfo:Add("DLabel")
itemMats:Dock(TOP)
itemMats:DockMargin(16, 16, 0, 8)
itemMats:SetContentAlignment(5)
itemMats:SetFont("WNTerminalMediumText")
itemMats:SetText("")
itemMats:SetTextColor(defClr)
local itemP = itemInfo:Add("DLabel")
itemP:Dock(TOP)
itemP:DockMargin(16, 16, 0, 8)
itemP:SetContentAlignment(5)
itemP:SetFont("WNTerminalMediumText")
itemP:SetText("")
itemP:SetTextColor(defClr)
self.itemIcon = parent:Add("SpawnIcon")
self.itemIcon:SetSize(176, 176)
self.itemIcon:SetModel("models/Gibs/HGIBS.mdl")
self.itemIcon:CenterHorizontal(0.5)
self.itemIcon:CenterVertical(0.55)
self.itemIcon.PaintOver = function(s, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.itemIcon.SetItem = function(s, fabPos)
s.fabID = self.biofabs[fabPos].id
s.fab = self.biofabs[fabPos].fab
s.fabPos = fabPos
s:OnItemChanged()
end
self.itemIcon.OnItemChanged = function(s)
local curItem = ix.item.list[s.fabID]
s:SetModel(curItem.model)
itemName:SetText(string.utf8upper(curItem.name))
itemMats:SetText(string.utf8upper("koszt biopiasty: " .. s.fab.mainMaterialCost))
itemP:SetText("[ " .. s.fabPos .. " / " .. #self.biofabs .. " ]")
end
self.itemIcon.Increment = function(s)
if self.biofabs[s.fabPos + 1] then
s:SetItem(s.fabPos + 1)
end
end
self.itemIcon.Decrement = function(s)
if self.biofabs[s.fabPos - 1] then
s:SetItem(s.fabPos - 1)
end
end
self.itemIcon:SetItem(1)
end
function PANEL:CreateBioprocess()
self:PurgeInnerContent()
self.bioprocessPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.bioprocessPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/button6.wav", 55, 100, 1, nil, 0, 11)
local returnButton = self.bioprocessPanel:Add("DButton")
CreateButton(returnButton, "POWRÓT", "buttonnoarrow.png", "WNTerminalLargeText", 5)
returnButton:Dock(TOP)
returnButton:SetTall(128)
returnButton:DockMargin(8, 8, 8, 8)
returnButton.DoClick = function(s)
if s.bClosing then return end
s.bClosing = true
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
self.bioprocessPanel:AlphaTo(0, 0.5, 0, function()
self:PurgeInnerContent()
self:CreateSelector()
end)
end
returnButton:SetAlpha(0)
local upperLabel = self.bioprocessPanel:Add("DLabel")
upperLabel:Dock(TOP)
upperLabel:SetContentAlignment(5)
upperLabel:SetFont("WNTerminalLargeText")
upperLabel:SetText(string.utf8upper("bioprocesowanie"))
upperLabel:SetTextColor(defClr)
upperLabel:SetAlpha(0)
upperLabel:SizeToContents()
local d = self:CreateDivider(self.bioprocessPanel, TOP)
d:SetAlpha(0)
self.bioPanel = self.bioprocessPanel:Add("Panel")
self.bioPanel:Dock(FILL)
self.bioPanel:DockMargin(16, 16, 16, 48)
self.bioPanel:InvalidateParent(true)
self.bioPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.bioPanel:SetAlpha(0)
self:FillBioPanel(self.bioPanel)
for _, child in pairs(self.bioprocessPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:CreateSelector()
self.selectorPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.selectorPanel) then return end
self:GetTerminalEntity():EmitSound("buttons/combine_button1.wav", 55, 100, 1, nil, 0, 11)
local upperLabel = self.selectorPanel:Add("DLabel")
upperLabel:Dock(TOP)
upperLabel:DockMargin(0, 36, 0, 6)
upperLabel:SetContentAlignment(5)
upperLabel:SetFont("WNTerminalLargeText")
upperLabel:SetText("REALIZACJA")
upperLabel:SetTextColor(defClr)
upperLabel:SetAlpha(0)
upperLabel:SizeToContents()
local d = self:CreateDivider(self.selectorPanel, TOP)
d:SetAlpha(0)
self.sButtonPanel = self.selectorPanel:Add("Panel")
self.sButtonPanel:Dock(FILL)
self.sButtonPanel:DockMargin(106, 36, 106, 112)
self.sButtonPanel:InvalidateParent(true)
self.sButtonPanel:SetAlpha(0)
self.sButtonPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self:CreateOptionButtons(self.sButtonPanel)
for _, child in pairs(self.selectorPanel:GetChildren()) do
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:Proceed()
if (!self:IsUsedByLocalPlayer()) then
self:CreateLock()
else
self:CreateSelector()
end
end
function PANEL:IsUsedByLocalPlayer()
return self:GetUsedBy() == LocalPlayer()
end
function PANEL:SortBiofabs()
self.biofabs = {}
for id, fab in pairs(ix.fabrication.list) do
if fab.category != "bio" then continue end
self.biofabs[#self.biofabs + 1] = {
id = id,
fab = fab,
fabPos = #self.biofabs + 1
}
end
end
function PANEL:Init()
self:SetSize(scrwSrn, scrhSrn)
self:SetPos(0, 0)
self:SetAlpha(0)
self.innerContent = self:Add("Panel")
self.innerContent:Dock(FILL)
self.innerContent:DockMargin(84, 94, 84, 78)
self.innerContent:InvalidateParent(true)
self:SetPaintedManually( true )
self:SortBiofabs()
self:AlphaTo(255, 0.5, 0, function()
self:InitializeBootupSequence()
end)
end
function PANEL:Destroy()
self:AlphaTo(0, 0.5, 0, function(animData, pnl)
self:GetTerminalEntity().terminalPanel = nil
pnl:Remove()
end)
end
function PANEL:Paint(w, h)
surface.SetDrawColor(255, 255, 255, 200)
surface.SetMaterial(screenMat)
surface.DrawTexturedRect(0, 0, w, h)
end
vgui.Register("ixFabricator", PANEL, "Panel")

View File

@@ -0,0 +1,374 @@
--[[
| 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 screenMat = Material("willardnetworks/datafile/workshifterminal.png", "smooth")
local frameMat = Material("vgui/gradient-d", "smooth")
local cmbLabel = Material("willardnetworks/datafile/licensedisabled2.png", "smooth")
local defClr = Color(16, 224, 207)
local redClr = Color(200, 36, 36)
local greenClr = Color(36, 200, 61)
local backgroundColor = Color(9, 9, 9, 75)
local PANEL = {}
AccessorFunc(PANEL, "terminalEntity", "TerminalEntity")
local scrwSrn, scrhSrn = 1600, 1400
PANEL.shopTerminal = true
local function CreateButton(name, text, path, font, alignment)
name:SetContentAlignment(alignment or 4)
name:SetTextInset(alignment and 0 or 10, 0)
name:SetFont(font or "WNTerminalMediumText")
name:SetText(string.utf8upper(text))
name.Paint = function(self, w, h)
surface.SetDrawColor(defClr)
surface.DrawRect(0, 0, w, h)
end
end
function PANEL:CreateDivider(parent, dock, bVertical)
local divider = parent:Add("Panel")
divider:Dock(dock)
divider:DockMargin(8, 8, 8, 8)
divider:SetHeight(10)
divider.bVertical = bVertical
divider.Paint = function(s, w, h)
surface.SetDrawColor(defClr)
if !bVertical then
surface.DrawLine(0, h * 0.5, w, h * 0.5)
else
surface.DrawLine(w * 0.5, 0, w * 0.5, h)
end
end
return divider
end
function PANEL:CreateAnimatedFrame(parent, dock, dockL, dockT, dockR, dockB, frameClr, callback)
local panel = parent:Add("Panel")
AccessorFunc(panel, "color", "Color")
panel:DockMargin(dockL, dockT, dockR, dockB)
panel:Dock(dock)
panel:InvalidateParent(true)
panel:SetColor(frameClr)
panel:SetAlpha(0)
panel:AlphaTo(255, 0.75, 0, function()
if callback then
callback()
end
end)
panel.Paint = function(s, w, h)
local clr = s:GetColor()
clr.a = 100
surface.SetDrawColor(43, 42, 42, 200)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(clr)
surface.SetMaterial(frameMat)
surface.DrawTexturedRect(0, h * 0.95, w, h * 0.05)
surface.SetDrawColor(clr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
return panel
end
function PANEL:CreateNextPrev(parent, buttonFont, buttonAlign, prevFunc, nextFunc, bHorizontal, manualWidth)
print(buttonFont)
local nextButton = parent:Add("DButton")
CreateButton(nextButton, "następne", nil, buttonFont, buttonAlign)
nextButton.DoClick = nextFunc
local prevButton = parent:Add("DButton")
CreateButton(prevButton, "poprzednie", nil, buttonFont, buttonAlign)
prevButton.DoClick = prevFunc
if !bHorizontal then
nextButton:Dock(TOP)
nextButton:SetTall(parent:GetTall() / 2.1)
nextButton:DockMargin(2, 2, 2, 2)
prevButton:Dock(FILL)
prevButton:DockMargin(2, 2, 2, 2)
else
prevButton:Dock(LEFT)
prevButton:DockMargin(5, 5, 5, 5)
prevButton:SetWide(manualWidth or parent:GetWide() / 2)
nextButton:Dock(FILL)
nextButton:DockMargin(5, 5, 5, 5)
end
end
function PANEL:Init()
self:SetSize(scrwSrn, scrhSrn)
self:SetPos(0, 0)
self.innerContent = self:Add("Panel")
self.innerContent:Dock(FILL)
self.innerContent:DockMargin(107, 134, 107, 114)
self.innerContent:InvalidateParent(true)
self:SetPaintedManually( true )
self.selectedPermits = 0
self.permits = {}
for k, permit in pairs(ix.permits.list) do
self.permits[#self.permits + 1] = {id = k, pInfo = permit, selected = false}
end
end
function PANEL:PurgeInnerContent()
for _, pnl in pairs(self.innerContent:GetChildren()) do
pnl:Remove()
end
end
function PANEL:CreatePermitSelector(parent)
local nextPrev = parent:Add("Panel")
nextPrev:Dock(TOP)
nextPrev:SetTall(parent:GetTall() / 2)
nextPrev:InvalidateParent(true)
nextPrev.Paint = function(s, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
local incrementFunc = function(s)
self:GetTerminalEntity():EmitSound("willardnetworks/datapad/back.wav", 55, 100, 1, nil, 0, 11)
if (self.curPermit) then
self.curPermit:Increment()
end
end
local decrementFunc = function(s)
self:GetTerminalEntity():EmitSound("willardnetworks/datapad/back.wav", 55, 100, 1, nil, 0, 11)
if (self.curPermit) then
self.curPermit:Decrement()
end
end
self:CreateNextPrev(nextPrev, "WNTerminalMediumText", 5, decrementFunc, incrementFunc, true)
self.curPermit = parent:Add("DLabel")
self.curPermit:Dock(FILL)
self.curPermit:DockMargin(6, 6, 6, 6)
self.curPermit:SetContentAlignment(5)
self.curPermit:SetFont("WNTerminalLargeText")
self.curPermit:SetText(string.utf8upper(self.permits[1].id))
self.curPermit:SizeToContents()
self.curPermit.pos = 1
self.curPermit:SetTextColor(self.permits[self.curPermit.pos].selected and greenClr or redClr)
self.curPermit.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.curPermit.Increment = function(s)
if self.permits[s.pos + 1] then
s.pos = s.pos + 1
s:Update()
end
end
self.curPermit.Decrement = function(s)
if self.permits[s.pos - 1] then
s.pos = s.pos - 1
s:Update()
end
end
self.curPermit.Update = function(s)
s:SetText(string.utf8upper(self.permits[s.pos].id))
s:SetTextColor(self.permits[s.pos].selected and greenClr or redClr)
if self.sPermits then
self.sPermits:SetText(string.utf8upper("wybrane zezwolenia: ").."["..self.selectedPermits.."/3]")
end
end
end
function PANEL:CanSelectPermit()
return self.selectedPermits < 3
end
function PANEL:BuildShopPanel(shop)
self:PurgeInnerContent()
self.shopPanel = self:CreateAnimatedFrame(self.innerContent, FILL, 0, 0, 0, 0,
defClr,
function()
if !IsValid(self.shopPanel) then return end
for _, child in pairs(self.shopPanel:GetChildren()) do
child:Remove()
end
local upperLabel = self.shopPanel:Add("DLabel")
upperLabel:Dock(TOP)
upperLabel:DockMargin(0, 32, 0, 0)
upperLabel:SetContentAlignment(5)
upperLabel:SetFont("WNTerminalMoreLargerText")
upperLabel:SetText(string.utf8upper("terminal sklepu"))
upperLabel:SetTextColor(defClr)
upperLabel:SizeToContents()
self:CreateDivider(self.shopPanel, TOP)
if shop.shopName and shop.cost and shop.scReq and shop.rent then
self.shopName = self.shopPanel:Add("DLabel")
self.shopName:Dock(TOP)
self.shopName:DockMargin(0, 8, 0, 0)
self.shopName:SetContentAlignment(5)
self.shopName:SetFont("WNTerminalLargeText")
self.shopName:SetText(string.utf8upper(shop.shopName))
self.shopName:SetTextColor(defClr)
self.shopName:SizeToContents()
self.shopInfo = self.shopPanel:Add("DLabel")
self.shopInfo:Dock(TOP)
self.shopInfo:DockMargin(0, 8, 0, 0)
self.shopInfo:SetContentAlignment(5)
self.shopInfo:SetFont("WNTerminalLargeText")
self.shopInfo:SetText(string.utf8upper("")..shop.scReq.." SK | "..shop.cost..string.utf8upper(" kredytów").." | " .. shop.rent .. string.utf8upper(" czynszu"))
self.shopInfo:SetTextColor(defClr)
self.shopInfo:SizeToContents()
self:CreateDivider(self.shopPanel, TOP)
local isPurchasable = self:GetTerminalEntity():GetNetVar("isPurchasable", false)
self.isPurchasable = self.shopPanel:Add("DLabel")
self.isPurchasable:Dock(TOP)
self.isPurchasable:DockMargin(0, 8, 0, 0)
self.isPurchasable:SetContentAlignment(5)
self.isPurchasable:SetFont("WNTerminalLargeText")
self.isPurchasable:SetText(isPurchasable and string.utf8upper("ten sklep można kupić") or string.utf8upper("tego sklepu nie można kupić"))
self.isPurchasable:SetTextColor(isPurchasable and greenClr or redClr)
self.isPurchasable:SizeToContents()
self:CreateDivider(self.shopPanel, TOP)
if isPurchasable then
local permitSelector = self.shopPanel:Add("Panel")
permitSelector:Dock(TOP)
permitSelector:DockMargin(16, 8, 16, 0)
permitSelector:SetTall(168)
permitSelector:InvalidateParent(true)
self:CreatePermitSelector(permitSelector)
self.selectPermit = self.shopPanel:Add("DButton")
CreateButton(self.selectPermit, "przełącz zezwolenie", nil, "WNTerminalMediumText", 5)
self.selectPermit:Dock(TOP)
self.selectPermit:DockMargin(32, 0, 32, 0)
self.selectPermit:SizeToContents()
self.selectPermit.DoClick = function()
if self.permits[self.curPermit.pos].selected then
self.selectedPermits = self.selectedPermits - 1
self.permits[self.curPermit.pos].selected = !self.permits[self.curPermit.pos].selected
self.curPermit:Update()
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
else
if self:CanSelectPermit() then
self.selectedPermits = self.selectedPermits + 1
self.permits[self.curPermit.pos].selected = !self.permits[self.curPermit.pos].selected
self.curPermit:Update()
self:GetTerminalEntity():EmitSound("buttons/button18.wav", 55, 100, 1, nil, 0, 11)
else
self:GetTerminalEntity():EmitSound("buttons/button8.wav", 55, 100, 1, nil, 0, 11)
end
end
end
self.sPermits = self.shopPanel:Add("DLabel")
self.sPermits:Dock(TOP)
self.sPermits:DockMargin(0, 8, 0, 0)
self.sPermits:SetContentAlignment(5)
self.sPermits:SetFont("WNTerminalMediumText")
self.sPermits:SetTextColor(defClr)
self.sPermits:SetText(string.utf8upper("wybranie zezwolenia: ").."["..self.selectedPermits.."/3]")
self.sPermits:SizeToContents()
local buttonPanel = self.shopPanel:Add("Panel")
buttonPanel:Dock(BOTTOM)
buttonPanel:DockMargin(12, 0, 12, 108)
buttonPanel:SetTall(108)
buttonPanel.Paint = function(s, w, h)
surface.SetDrawColor(backgroundColor)
surface.DrawRect(0, 0, w, h)
surface.SetDrawColor(defClr)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
self.purchaseButton = buttonPanel:Add("DButton")
CreateButton(self.purchaseButton, "kup sklep", nil, "WNTerminalLargeText", 5)
self.purchaseButton:Dock(FILL)
self.purchaseButton:DockMargin(8, 8, 8, 8)
self.purchaseButton.DoClick = function()
local permits = {}
for _, permit in pairs(self.permits) do
if permit.selected then
permits[permit.id] = true
end
end
netstream.Start("BuyShopViaTerminal", self:GetTerminalEntity(), permits)
end
end
end
for _, child in pairs(self.shopPanel:GetChildren()) do
child:SetAlpha(0)
child:AlphaTo(255, 0.95)
end
end)
end
function PANEL:Destroy()
self:AlphaTo(0, 0.5, 0, function(animData, pnl)
self:GetTerminalEntity().terminalPanel = nil
pnl:Remove()
end)
end
function PANEL:Paint(w, h)
surface.SetDrawColor(255, 255, 255, 245)
surface.SetMaterial(screenMat)
surface.DrawTexturedRect(0, 0, w, h)
end
vgui.Register("ixShopTerminal", PANEL, "Panel")
netstream.Hook("UpdateShopScreen", function()
local panelList = ix.factoryPanels.list
for i = 1, #ix.factoryPanels.list do
local panel = panelList[i]
if panel.shopTerminal then
local ent = panel:GetTerminalEntity()
panel:BuildShopPanel({
shopName = ent:GetShop(),
cost = ent:GetShopCost(),
scReq = ent:GetShopSocialCreditReq(),
rent = ent:GetNetVar("Rent", 0)
})
end
end
end)

View File

@@ -0,0 +1,49 @@
--[[
| 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/
--]]
-- some cool glowing code is taken from open-source LVS base originally used
-- for shield impacting
function EFFECT:Init( data )
self.ent = data:GetEntity()
self.lt = data:GetScale()
self.dt = CurTime() + self.lt
if IsValid( self.ent ) then
self.model = ClientsideModel( self.ent:GetModel(), RENDERMODE_TRANSCOLOR )
self.model:SetMaterial("models/alyx/emptool_glow")
self.model:SetColor( Color(255, 223, 136) )
self.model:SetParent( self.ent, 0 )
self.model:SetMoveType( MOVETYPE_NONE )
self.model:SetLocalPos( Vector( 0, 0, 0 ) )
self.model:SetLocalAngles( Angle( 0, 0, 0 ) )
self.model:AddEffects( EF_BONEMERGE )
end
end
function EFFECT:Think()
if not IsValid( self.ent ) and IsValid(self.model) then
self.model:Remove()
end
if self.dt < CurTime() then
if IsValid( self.model ) then
self.model:Remove()
end
return false
end
return true
end
function EFFECT:Render()
end

View File

@@ -0,0 +1,66 @@
--[[
| 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 smoke = {
"particle/smokesprites_0001",
"particle/smokesprites_0002",
"particle/smokesprites_0003",
"particle/smokesprites_0004",
"particle/smokesprites_0005",
"particle/smokesprites_0006",
"particle/smokesprites_0007",
"particle/smokesprites_0008",
"particle/smokesprites_0009",
"particle/smokesprites_0010",
"particle/smokesprites_0011",
"particle/smokesprites_0012",
"particle/smokesprites_0013",
"particle/smokesprites_0014",
"particle/smokesprites_0015",
"particle/smokesprites_0016"
}
function EFFECT:Init( data )
self.pos = data:GetOrigin()
local emitter = ParticleEmitter( self.pos, false )
for i = 1, 40 do
local Pos = Vector( math.Rand( -1, 1 ), math.Rand( -1, 1 ), 2)
local particle = emitter:Add( smoke[math.random(1, #smoke)], self.pos + Pos * 2 )
if ( particle ) then
particle:SetVelocity( Pos * 1.35 )
particle:SetLifeTime( 0 )
particle:SetDieTime( 3 )
particle:SetStartAlpha( 255 )
particle:SetEndAlpha( 0 )
particle:SetColor(255, 223, 136)
particle:SetRoll( math.Rand( -1, 1 ) )
local Size = math.random( 8, 10 )
particle:SetStartSize( Size )
particle:SetEndSize( Size )
particle:SetAirResistance( 50 )
particle:SetGravity( Vector( math.Rand( -1, 1 ) * 4, math.Rand( -1, 1 ) * 4, 0.5 ) )
end
end
emitter:Finish()
end
function EFFECT:Think()
return false
end
function EFFECT:Render()
end

View File

@@ -0,0 +1,44 @@
--[[
| 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/
--]]
include("shared.lua")
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
local glowMaterial = Material("sprites/glow04_noz")
function ENT:DrawTranslucent()
self:DrawModel()
local spritePos = self:GetPos() + self:GetUp() * 50.5 + self:GetRight() * 16.3 + self:GetForward() * 7.8
if (!self.hideSprite) then
render.SetMaterial(glowMaterial)
render.DrawSprite(spritePos, 2.5, 2.5, Color(255, 0, 0))
end
if (imgui.Entity3D2D(self, Vector(7.3, -18, 52.5), Angle(0, 90, 90), 0.01)) then -- I didn't wanna fuck with button positions
if (imgui.xButton(0, 0, 350, 350, 0, Color(255, 255, 255, 255), Color(255, 255, 255, 255), Color(255, 255, 255, 255))) then
if (LocalPlayer():EyePos():DistToSqr(spritePos) > 3000) then imgui.End3D2D() return end
self.hideSprite = true
net.Start("ixBatteryChargerUse")
net.WriteEntity(self)
net.SendToServer()
timer.Simple(0.1, function()
self.hideSprite = false
end)
end
imgui.End3D2D()
end
end

View File

@@ -0,0 +1,251 @@
--[[
| 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/
--]]
include("shared.lua")
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
util.AddNetworkString("ixBatteryChargerUse")
local PLUGIN = PLUGIN
function ENT:Initialize()
self:SetModel("models/willardnetworks/gearsofindustry/wn_machinery_01.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self:SetTrigger(true)
local physObj = self:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
end
function ENT:OnCharge(client)
if (client:EyePos():DistToSqr(self:GetPos()) > 10000) then return end
self:EmitSound("buttons/lightswitch2.wav", 75, 80)
if (!self.attachedBattery or !self.attachedBattery:IsValid() or self.charging) then return end
local selfPos, up, right, forward = self:GetPos(), self:GetUp(), self:GetRight(), self:GetForward()
local boxMin, boxMax = selfPos + up * 45 + right * 13 + forward * -7, selfPos + up * 55 + right * -10 + forward * 7
for _, entity in ipairs(ents.FindInBox(boxMin, boxMax)) do
if (entity:GetClass() != "ix_item") then continue end
self.attachedItem = entity
break
end
if (!self.attachedItem or !self.attachedItem:IsValid()) then return end
self.charging = true
self.attachedItem.inUse = true
self.attachedBattery.inUse = true
self:ResetSequence("Working")
local zap1 = ents.Create("point_tesla")
zap1:SetParent(self)
zap1:SetKeyValue("m_SoundName" ,"DoSpark")
zap1:SetKeyValue("texture" ,"sprites/physbeam.vmt")
zap1:SetKeyValue("m_Color" ,"255 255 164")
zap1:SetKeyValue("m_flRadius" , "1")
zap1:SetKeyValue("beamcount_min" ,"4")
zap1:SetKeyValue("beamcount_max", "6")
zap1:SetKeyValue("thick_min", ".5")
zap1:SetKeyValue("thick_max", "2")
zap1:SetKeyValue("lifetime_min" ,".1")
zap1:SetKeyValue("lifetime_max", ".5")
zap1:SetKeyValue("interval_min", "0.1")
zap1:SetKeyValue("interval_max" ,"1")
zap1:SetPos(self:GetPos() + self:GetUp() * 53 + self:GetRight() * 8)
zap1:Spawn()
zap1:Fire("DoSpark", "", 0.1)
zap1:Fire("DoSpark", "", 0.4)
zap1:Fire("DoSpark", "", 1.7)
zap1:Fire("DoSpark", "", 2.5)
zap1:Fire("DoSpark", "", 2.7)
zap1:Fire("kill", "", 3)
local zap2 = ents.Create("point_tesla")
zap2:SetParent(self)
zap2:SetKeyValue("m_SoundName" ,"DoSpark")
zap2:SetKeyValue("texture" ,"sprites/physbeam.vmt")
zap2:SetKeyValue("m_Color" ,"255 255 164")
zap2:SetKeyValue("m_flRadius" , "1")
zap2:SetKeyValue("beamcount_min" ,"4")
zap2:SetKeyValue("beamcount_max", "6")
zap2:SetKeyValue("thick_min", ".5")
zap2:SetKeyValue("thick_max", "2")
zap2:SetKeyValue("lifetime_min" ,".1")
zap2:SetKeyValue("lifetime_max", ".5")
zap2:SetKeyValue("interval_min", "0.1")
zap2:SetKeyValue("interval_max" ,"1")
zap2:SetPos(self:GetPos() + self:GetUp() * 53 + self:GetRight() * -4)
zap2:Spawn()
zap2:Fire("DoSpark", "", 0.1)
zap2:Fire("DoSpark", "", 0.4)
zap2:Fire("DoSpark", "", 1.7)
zap2:Fire("DoSpark", "", 2.5)
zap2:Fire("DoSpark", "", 2.7)
zap2:Fire("kill", "", 3)
local zap3 = ents.Create("point_tesla")
zap3:SetParent(self)
zap3:SetKeyValue("m_SoundName" ,"DoSpark")
zap3:SetKeyValue("texture" ,"sprites/physbeam.vmt")
zap3:SetKeyValue("m_Color" ,"255 255 164")
zap3:SetKeyValue("m_flRadius" , "0")
zap3:SetKeyValue("beamcount_min" ,"4")
zap3:SetKeyValue("beamcount_max", "6")
zap3:SetKeyValue("thick_min", ".5")
zap3:SetKeyValue("thick_max", "2")
zap3:SetKeyValue("lifetime_min" ,".1")
zap3:SetKeyValue("lifetime_max", ".5")
zap3:SetKeyValue("interval_min", "0.1")
zap3:SetKeyValue("interval_max" ,"1")
zap3:SetPos(self.attachedItem:GetPos())
zap3:Spawn()
zap3:Fire("DoSpark", "", 0.1)
zap3:Fire("DoSpark", "", 0.4)
zap3:Fire("DoSpark", "", 1.7)
zap3:Fire("DoSpark", "", 2.5)
zap3:Fire("DoSpark", "", 2.7)
zap3:Fire("kill", "", 3)
self:EmitSound("ambient/machines/combine_terminal_idle3.wav")
self:EmitSound("ambient/machines/combine_terminal_loop1.wav")
timer.Simple(1, function()
if (!self.attachedItem or !self.attachedItem:IsValid()) then
self:StopCharging()
return
end
local dissolver = ents.Create("env_entity_dissolver")
dissolver:SetKeyValue("dissolvetype", 4)
dissolver:SetKeyValue("magnitude", 0)
dissolver:SetPos(selfPos)
dissolver:Spawn()
self.attachedItem:SetName("ix_batterycharger_dissolve_target")
dissolver:Fire("Dissolve", self.attachedItem:GetName())
dissolver:Fire("Kill", "", 0)
timer.Simple(1.5, function()
local itemInstance = ix.item.instances[self.attachedBattery.ixItemID]
if (!self.attachedBattery or !self.attachedBattery:IsValid() or !itemInstance) then
self:StopCharging()
return
end
local charge = itemInstance:GetData("charge", 0) + 1
itemInstance:SetData("charge", charge)
self:EmitSound("items/suitchargeok1.wav")
self:StopSound("ambient/machines/combine_terminal_idle3.wav")
self:StopSound("ambient/machines/combine_terminal_loop1.wav")
if (charge <= 10) then
self:StopCharging()
else
self.attachedBattery.ixIsDestroying = true -- Setting this early to stop Helix from destroying the battery once it takes fire damage.
self.attachedBattery:Ignite(4, 0)
for i = 1, 15 do
timer.Simple(0.25 * i, function()
if (!self.attachedBattery or !self.attachedBattery:IsValid()) then
self.charging = false
self.attachedItem.inUse = false
self.attachedBattery.inUse = false
return
end
self.attachedBattery:SetNetVar("beeping", true)
self.attachedBattery:EmitSound("hl1/fvox/beep.wav")
if (i != 15) then
timer.Simple(0.125, function()
self.attachedBattery:SetNetVar("beeping", false)
end)
else
local batteryPos = self.attachedBattery:GetPos()
local effectData = EffectData()
effectData:SetStart(batteryPos)
effectData:SetOrigin(batteryPos)
util.Effect("cball_explode", effectData)
self.attachedBattery:EmitSound("npc/roller/mine/rmine_explode_shock1.wav")
self.attachedBattery:Remove()
self:StopCharging()
end
end)
end
end
end)
end)
end
function ENT:StopCharging(fake)
if (!fake) then
self.charging = false
end
self:StopSound("ambient/machines/combine_terminal_idle3.wav")
self:StopSound("ambient/machines/combine_terminal_loop1.wav")
if (IsValid(self.attachedItem)) then
self.attachedItem.inUse = false
end
if (IsValid(self.attachedBattery)) then
self.attachedBattery.inUse = false
end
end
function ENT:StartTouch(entity)
if (entity:GetClass() != "ix_item" or entity.attached) then return end
if (entity:GetItemID() != "combinebattery") then return end
if (self.attachedBattery and self.attachedBattery != NULL) then return end
local physObj = entity:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
entity:SetPos(self:GetPos() + self:GetUp() * 43.2 + self:GetRight() * -21.4 + self:GetForward() * 6.55)
entity:SetAngles(self:GetAngles())
entity:SetParent(self)
self.attachedBattery = entity
entity.attached = true
self:EmitSound("physics/metal/weapon_impact_soft" .. math.random(1, 3) .. ".wav")
end
net.Receive("ixBatteryChargerUse", function(_, client)
local entity = net.ReadEntity()
if (!entity or !entity:IsValid() or entity:GetClass() != "ix_batterycharger") then return end
entity:OnCharge(client)
end)

View File

@@ -0,0 +1,18 @@
--[[
| 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/
--]]
ENT.Type = "anim"
ENT.PrintName = "Battery Charger"
ENT.Category = "HL2 RP"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.PhysgunDisable = true
ENT.PhysgunAllowAdmin = true

View File

@@ -0,0 +1,130 @@
--[[
| 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/
--]]
include("shared.lua")
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
ENT.nextClickTime = 0
function ENT:TurnOn()
net.Start("ix.terminal.turnOn")
net.WriteEntity(self)
net.SendToServer()
end
function ENT:TurnOff()
net.Start("ix.terminal.turnOff")
net.WriteEntity(self)
net.SendToServer()
end
function ENT:CreateStartScreen(client, data)
local cwuMenu = ix.factoryPanels:CreatePanel("ixCWUTerminalMenu", self)
cwuMenu:SetUsedBy(client)
cwuMenu:SetUserGenData(istable(data) and !table.IsEmpty(data) and data[1] or nil)
cwuMenu.cidCardInserted = data[1] and true or nil
cwuMenu.cwuCardInserted = data[2] and true or nil
cwuMenu.authError = data[3]
self:EmitSound("buttons/button1.wav")
end
function ENT:PurgeScreenPanels(muteSound)
ix.factoryPanels:PurgeEntityPanels(self)
if (!muteSound) then
self:EmitSound("buttons/button5.wav")
end
end
function ENT:OnRemove()
self:PurgeScreenPanels(true)
self:StopSound("wn_goi/terminal_turnon.mp3")
end
ENT.vguiLocalizedTransform = {
vec = Vector(4.53, -8.15, 44.03),
ang = Angle(0, 90, 55),
res = 0.01
}
function ENT:DrawTranslucent()
self:DrawModel()
-- main panel
vgui.Start3D2D( self:LocalToWorld(self.vguiLocalizedTransform.vec), self:LocalToWorldAngles(self.vguiLocalizedTransform.ang), self.vguiLocalizedTransform.res )
if self.terminalPanel then
self.terminalPanel:Paint3D2D()
end
vgui.End3D2D()
-- buttons
if (imgui.Entity3D2D(self, Vector(7.19, 10.16, 41.73), Angle(0, 90, 55), 0.01)) then
if (imgui.xButton(22, -315, 100, 210, 5, Color(255, 44, 44, 0), Color(255, 44, 44, 255), Color(255, 44, 44, 10))) then
if (!self.terminalPanel and self.nextClickTime < CurTime()) then
self:TurnOn()
self.nextClickTime = CurTime() + 1.5
elseif (self.terminalPanel and self.nextClickTime < CurTime()) then
self:TurnOff()
self.nextClickTime = CurTime() + 1.5
end
end
draw.SimpleText("MAJĄTEK MIASTA", "ButtonLabel", 470, 30, Color(0, 0, 0, 225), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if (imgui.xButton(0, 5, 150, 50, 5, Color(255, 255, 255, 0), Color(255, 255, 255, 255), Color(255, 255, 255, 10)) and self.terminalPanel and self.nextClickTime < CurTime()) then
if self.terminalPanel then
self.terminalPanel:CreateOption(string.utf8upper("city stock"))
end
self.nextClickTime = CurTime() + 1.5
end
draw.SimpleText("RYNEK", "ButtonLabel", 470, 155, Color(0, 0, 0, 225), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if (imgui.xButton(0, 130, 150, 50, 5, Color(255, 255, 255, 0), Color(255, 255, 255, 255), Color(255, 255, 255, 10)) and self.nextClickTime < CurTime()) then
if self.terminalPanel then
self.terminalPanel:CreateOption(string.utf8upper("market"))
end
self.nextClickTime = CurTime() + 1.5
end
draw.SimpleText("KOSZYK", "ButtonLabel", 470, 280, Color(0, 0, 0, 225), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if (imgui.xButton(0, 254, 150, 50, 5, Color(255, 255, 255, 0), Color(255, 255, 255, 255), Color(255, 255, 255, 10)) and self.nextClickTime < CurTime()) then
if self.terminalPanel then
self.terminalPanel:CreateOption(string.utf8upper("cart"))
end
self.nextClickTime = CurTime() + 1.5
end
draw.SimpleText("STATUS", "ButtonLabel", 470, 405, Color(0, 0, 0, 225), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if (imgui.xButton(0, 378, 150, 50, 5, Color(255, 255, 255, 0), Color(255, 255, 255, 255), Color(255, 255, 255, 10)) and self.nextClickTime < CurTime()) then
if self.terminalPanel then
self.terminalPanel:CreateOption(string.utf8upper("status"))
end
self.nextClickTime = CurTime() + 1.5
end
draw.SimpleText("CYKL", "ButtonLabel", 470, 530, Color(0, 0, 0, 225), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if (imgui.xButton(0, 503, 150, 50, 5, Color(255, 255, 255, 0), Color(255, 255, 255, 255), Color(255, 255, 255, 10)) and self.nextClickTime < CurTime()) then
if self.terminalPanel then
self.terminalPanel:CreateOption(string.utf8upper("shift"))
end
self.nextClickTime = CurTime() + 1.5
end
--[[draw.SimpleText("CALL-IN", "ButtonLabel", 470, 653, Color(0, 0, 0, 225), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
if (imgui.xButton(0, 628, 150, 50, 5, Color(255, 255, 255, 0), Color(255, 255, 255, 255), Color(255, 255, 255, 10)) and self.nextClickTime < CurTime()) then
self.nextClickTime = CurTime() + 1.5
end--]]
imgui.End3D2D()
end
end

View File

@@ -0,0 +1,263 @@
--[[
| 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/
--]]
include("shared.lua")
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
ENT.localizedCIDTransform = {
vec = Vector(4.281931, -13.669882, 44.2),
ang = Angle(31, -178.43, 180)
}
ENT.localizedCWUCardTransform = {
vec = Vector(11.407880, -13.500206, 33.918171),
ang = Angle(-0.828, 0.935, 0.204)
}
function ENT:CreateUserTimer()
timer.Create("ixCWUTerminal" .. self:GetCreationID(), 5, 0, function()
if !IsValid(self) then return end
local user = self:GetUsedBy()
if user == self then
if self:GetNetVar("broadcasting", false) then
self:ToggleBroadcast()
end
return timer.Remove("ixCWUTerminal" .. self:GetCreationID())
end
if (!IsValid(user) or !user:IsPlayer() or user:EyePos():DistToSqr(self:GetPos()) > 62500 or user:IsAFK()) then
if self:GetNetVar("broadcasting", false) then
self:ToggleBroadcast()
end
if (IsValid(user)) then
if user:GetNetVar("broadcastAuth", false) then
user:SetNetVar("broadcastAuth", nil)
end
end
self:SetUsedBy(self)
net.Start("ix.terminal.turnOff")
net.WriteEntity(self)
net.Broadcast()
timer.Remove("ixCWUTerminal" .. self:GetCreationID())
end
end)
end
function ENT:ToggleBroadcast()
local user = self:GetUsedBy()
local broadcast = !self:GetNetVar("broadcasting", false)
self:SetNetVar("broadcasting", broadcast)
net.Start("ix.terminal.CWUWorkshiftSound")
net.Broadcast()
self.nextBroadcast = CurTime() + 5
if user and user:IsPlayer() then
ix.chat.Send(user, "event", broadcast and "The city's speakers come to life with the signature announcement sound." or "The city's speakers turn off after playing the final distinct announcement sound.", false, nil)
end
end
function ENT:Initialize()
self:SetModel("models/willardnetworks/gearsofindustry/wn_machinery_04.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self:SetCID(-1)
self:SetCWUCard(-1)
local physObj = self:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
end
function ENT:SendCharGenData(id)
-- insert gendata later
local genData
local isCCA = false
if ix.char.loaded[id] then
genData = ix.char.loaded[id]:GetGenericdata()
isCCA = ix.char.loaded[id]:GetFaction() == FACTION_ADMIN
self:ConfirmCID(genData, isCCA)
else
local charQuery = mysql:Select("ix_characters")
charQuery:Where("id", tostring(charID))
charQuery:Callback(function(cResult)
if (!istable(cResult) or #cResult == 0) then
return
end
isCCA = ix.faction.GetIndex(cResult[1].faction) == FACTION_ADMIN
local query = mysql:Select("ix_characters_data")
query:Where("key", "genericdata")
query:Where("id", tostring(charID))
query:Select("data")
query:Callback(function(result)
if (!istable(result) or #result == 0) then
return
end
genData = util.JSONToTable(result[1]["data"])
self:ConfirmCID(genData, isCCA)
end)
query:Execute()
end)
charQuery:Execute()
end
end
function ENT:ConfirmCID(genData, isCCA)
self.curGenData = genData
self.curGenData.isCCA = isCCA
local client = self:GetUsedBy()
if client and client:IsPlayer() then
net.Start("ix.terminal.SendCIDInfo")
net.WriteString(util.TableToJSON(genData))
net.WriteEntity(self)
net.Send(client)
end
end
function ENT:IsFullyAuthed()
if (self:HasCID()) then
if self.curGenData and self.curGenData.combine or self.curGenData and self.curGenData.isCCA then
return true
end
end
if (!self:HasCWUCard() or !self:HasCID()) then
return false
end
if ix.item.instances[self:GetCWUCard()]:GetData("cardID") != self:GetCID() then
return false
end
return true
end
function ENT:HasCID()
return self:GetCID() != -1
end
function ENT:OnCIDInsert()
local cid
local client = self:GetUsedBy()
if self:HasCWUCard() then
if !self:IsFullyAuthed() then
ix.combineNotify:AddImportantNotification("WRN:// Unauthorized access to CWU terminal", nil, "unknown", self:GetPos())
if (client and client:IsPlayer()) then
net.Start("ix.terminal.AuthError")
net.WriteEntity(self)
net.Send(client)
end
return
else
cid = ix.item.instances[self:GetCID()]
self:SendCharGenData(cid:GetData("owner"))
end
else
cid = ix.item.instances[self:GetCID()]
self:SendCharGenData(cid:GetData("owner"))
end
end
function ENT:OnCIDDetach()
self.curGenData = nil
local client = self:GetUsedBy()
if (client and client:IsPlayer()) then
net.Start("ix.terminal.SendCIDRemoved")
net.WriteEntity(self)
net.Send(client)
end
end
function ENT:HasCWUCard()
return self:GetCWUCard() != -1
end
function ENT:OnCWUCardInsert()
local client = self:GetUsedBy()
if self:HasCID() then
if !self:IsFullyAuthed() then
ix.combineNotify:AddImportantNotification("WRN:// Unauthorized access to CWU terminal", nil, "unknown", self:GetPos())
if (client and client:IsPlayer()) then
net.Start("ix.terminal.AuthError")
net.WriteEntity(self)
net.Send(client)
end
return
else
if (client and client:IsPlayer()) then
net.Start("ix.terminal.CWUCardInserted")
net.WriteEntity(self)
net.Send(client)
end
end
else
if (client and client:IsPlayer()) then
net.Start("ix.terminal.CWUCardInserted")
net.WriteEntity(self)
net.Send(client)
end
end
end
function ENT:OnCWUCardDetach()
local client = self:GetUsedBy()
if (client and client:IsPlayer()) then
net.Start("ix.terminal.CWUCardRemoved")
net.WriteEntity(self)
net.Send(client)
end
end
function ENT:StartTouch(entity)
if (entity:GetClass() != "ix_item" or entity.attached) then return end
if (entity:GetItemID() != "id_card" and entity:GetItemID() != "cwu_card") then return end
if (self.attachedCID and self.attachedCID != NULL and self.attachedCWUCard and self.attachedCWUCard != NULL) then return end
local physObj = entity:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
if entity:GetItemID() == "id_card" then
self:CIDInsert(entity)
elseif entity:GetItemID() == "cwu_card" then
self:CWUInsert(entity)
end
self:EmitSound("physics/metal/weapon_impact_soft" .. math.random(1, 3) .. ".wav")
end
function ENT:OnRemove()
timer.Remove("ixCWUTerminal" .. self:GetCreationID())
end

View File

@@ -0,0 +1,48 @@
--[[
| 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/
--]]
ENT.Type = "anim"
ENT.PrintName = "CWU Terminal"
ENT.Category = "HL2 RP"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.PhysgunDisable = true
ENT.PhysgunAllowAdmin = true
function ENT:SetupDataTables()
self:NetworkVar("Entity", 0, "UsedBy")
self:NetworkVar("Int", 1, "CID")
self:NetworkVar("Int", 2, "CWUCard")
end
function ENT:CIDInsert(entity)
entity:SetPos(self:LocalToWorld(self.localizedCIDTransform.vec))
entity:SetAngles(self:LocalToWorldAngles(self.localizedCIDTransform.ang))
entity:SetParent(self)
self.attachedCID = entity
entity.attached = self
self:SetCID(entity.ixItemID)
self:OnCIDInsert()
end
function ENT:CWUInsert(entity)
entity:SetPos(self:LocalToWorld(self.localizedCWUCardTransform.vec))
entity:SetAngles(self:LocalToWorldAngles(self.localizedCWUCardTransform.ang))
entity:SetParent(self)
self.attachedCWUCard = entity
entity.attached = self
self:SetCWUCard(entity.ixItemID)
self:OnCWUCardInsert()
end

View File

@@ -0,0 +1,99 @@
--[[
| 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/
--]]
include("shared.lua")
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
ENT.nextClickTime = 0
function ENT:TurnOn()
net.Start("ix.terminal.turnOn")
net.WriteEntity(self)
net.SendToServer()
end
function ENT:TurnOff()
net.Start("ix.terminal.turnOff")
net.WriteEntity(self)
net.SendToServer()
end
function ENT:CreateStartScreen(client, data)
local encoderMenu = ix.factoryPanels:CreatePanel("ixDataEncoder", self)
encoderMenu:SetUsedBy(client)
encoderMenu:SetDisc(data[1] or false)
self:EmitSound("buttons/button1.wav")
end
function ENT:PurgeScreenPanels(muteSound)
ix.factoryPanels:PurgeEntityPanels(self)
if (!muteSound) then
self:EmitSound("buttons/button5.wav")
end
end
function ENT:OnRemove()
self:PurgeScreenPanels(true)
self:StopSound("wn_goi/terminal_turnon.mp3")
end
ENT.vguiLocalizedTransform = {
vec = Vector(6, -8.9, 65.710434),
ang = Angle(0, 90, 90),
res = 0.01
}
function ENT:DrawTranslucent()
self:DrawModel()
vgui.Start3D2D( self:LocalToWorld(self.vguiLocalizedTransform.vec), self:LocalToWorldAngles(self.vguiLocalizedTransform.ang), self.vguiLocalizedTransform.res )
if self.terminalPanel then
self.terminalPanel:Paint3D2D()
end
vgui.End3D2D()
if (imgui.Entity3D2D(self, Vector(5.502635, -6.055101, 55.513432), Angle(90, 0, 0), 0.01)) then
if (imgui.xButton(-75, -150, 100, 300, 5, Color(255, 44, 44, 0), Color(255, 44, 44, 75), Color(255, 44, 44, 10))) then
if (!self.terminalPanel and self.nextClickTime < CurTime()) then
self:TurnOn()
self.nextClickTime = CurTime() + 1.5
elseif (self.terminalPanel and self.nextClickTime < CurTime()) then
self:TurnOff()
self.nextClickTime = CurTime() + 1.5
end
end
imgui.End3D2D()
end
if (!self:GetNetVar("scanning") or !IsEntity(self:GetNetVar("scanning")) or !IsValid(self:GetNetVar("scanning"))) then return end
local topPos = self:LocalToWorld(Vector(0.139367, -0.340202, 47.403870))
if (!LocalPlayer():IsLineOfSightClear(topPos)) then return end
local trace = {}
trace.mask = CONTENTS_SOLID + CONTENTS_MOVEABLE + CONTENTS_OPAQUE + CONTENTS_DEBRIS + CONTENTS_HITBOX + CONTENTS_MONSTER
trace.start = LocalPlayer():EyePos()
trace.endpos = topPos
trace.filter = {LocalPlayer()}
trace = util.TraceLine(trace)
if (trace.Fraction < 0.75) then return end
local right = self:GetRight() * math.sin(CurTime()) * 2
for i = 1, 4 do
render.DrawLine(self:LocalToWorld(self.linePoses[i]), self:GetNetVar("scanning"):LocalToWorld(self:GetNetVar("scanning"):OBBCenter()) + right * (i / 2), Color(255, math.random(50, 255), 0, math.random(100)))
end
end

View File

@@ -0,0 +1,238 @@
--[[
| 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/
--]]
include("shared.lua")
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
ENT.scanBox = {
mins = Vector(-8.344721, -7.158762, 39.878693),
maxs = Vector(2.849499, 6.975823, 49.807785)
}
ENT.nextScan = 0
ENT.batteryChargeReq = 1
function ENT:CreateUserTimer()
timer.Create("ixDiscScanner" .. self:GetCreationID(), 5, 0, function()
if !IsValid(self) then return end
local user = self:GetUsedBy()
if user == self then return timer.Remove("ixDiscScanner" .. self:GetCreationID()) end
if (!IsValid(user) or !user:IsPlayer() or user:EyePos():DistToSqr(self:GetPos()) > 62500 or user:IsAFK()) then
self:SetUsedBy(self)
net.Start("ix.terminal.turnOff")
net.WriteEntity(self)
net.Broadcast()
timer.Remove("ixDiscScanner" .. self:GetCreationID())
end
end)
end
function ENT:OnRemove()
timer.Remove("ixDiscScanner" .. self:GetCreationID())
end
function ENT:HasBattery()
return IsValid(self.attachedBattery)
end
function ENT:BatteryHasCharge(charge)
return self.attachedBattery:GetData("charge", 0) >= charge
end
function ENT:TakeBatteryCharge(charge)
ix.item.instances[self.attachedBattery.ixItemID]:SetData("charge", self.attachedBattery:GetData("charge") - charge)
end
function ENT:Initialize()
self:SetModel("models/willardnetworks/gearsofindustry/wn_machinery_02.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self:SetTrigger(true)
local physObj = self:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
end
function ENT:SearchForItem()
local mins = self:LocalToWorld(self.scanBox.mins)
local maxs = self:LocalToWorld(self.scanBox.maxs)
for _, item in pairs(ents.FindInBox(mins, maxs)) do
if item:GetClass() != "ix_item" then continue end
return item
end
end
function ENT:Scan(client)
if self.bScanning then return end
local item = self:SearchForItem()
if item then
if !ix.fabrication:GetTech(item:GetItemID()) and !ix.fabrication:GetAdvancedTech(item:GetItemID()) then
return "This item cannot be encoded into data disc."
end
if self.attachedDisc:GetData("item", "") != "" then
return "This disc already have data on it."
end
if !self:HasBattery() then return "Data-disc encoder requires combine battery in order to function!" end
if !self:BatteryHasCharge(self.batteryChargeReq) then return "Battery don't have enough charge." end
self:TakeBatteryCharge(self.batteryChargeReq)
item:GetPhysicsObject():EnableMotion(false)
local ef = EffectData()
ef:SetEntity(item)
ef:SetScale(self.scanTimer)
util.Effect("scanGlow", ef)
self:SetNetVar("scanning", item)
self.bScanning = true
if client and client:IsPlayer() then
net.Start("ix.terminal.Scan")
net.WriteEntity(self)
net.Send(client)
end
item.inUse = true
self.attachedDisc.inUse = true
self:EmitSound("wn_goi/disc_encode_start.wav", 55, 100, 1, nil, 0, 11)
timer.Simple(SoundDuration("wn_goi/disc_encode_start.wav"), function()
self:EmitSound("wn_goi/disc_encode_loop.wav", 55, 100, 1, nil, 0, 11)
end)
timer.Simple(self.scanTimer, function()
if (item and IsValid(item)) then
item.inUse = nil
item:GetPhysicsObject():EnableMotion(true)
end
if (self.attachedDisc and IsValid(self.attachedDisc)) then
self.attachedDisc.inUse = nil
end
if !IsValid(self) or !IsValid(item) or !IsValid(self.attachedDisc) then
if IsValid(self) then
self:StopSound("wn_goi/disc_encode_loop.wav")
end
return "Error!"
end
self.bScanning = false
self:SetNetVar("scanning", nil)
self:StopSound("wn_goi/disc_encode_loop.wav")
self:EmitSound("wn_goi/disc_encode_stop.wav", 55, 100, 1, nil, 0, 11)
ix.item.instances[self.attachedDisc.ixItemID]:SetData("item", item:GetItemID())
self:SetDiscItemID(self.attachedDisc:GetData("item", ""))
ef = EffectData()
ef:SetOrigin(self:LocalToWorld(Vector(4.453487, 0.434061, 39.031250)))
util.Effect("scanVaporize", ef)
item:Remove()
self:EmitSound("ambience/3d-sounds/steam/steam07.wav")
if client and client:IsPlayer() then
net.Start("ix.terminal.DiscAttach")
net.WriteEntity(self)
net.WriteString(self:GetDiscItemID() or "")
net.Send(client)
end
end)
else
return "There's no items in terminal depot."
end
end
function ENT:SetDiscItemID(itemID)
self.dItemID = itemID
end
function ENT:GetDiscItemID()
return self.dItemID or ""
end
function ENT:OnDiscAttach(disc)
self:SetDiscItemID(disc:GetData("item", ""))
self:SetNetVar("attachedDisc", disc)
local client = self:GetUsedBy()
if client and client:IsPlayer() then
net.Start("ix.terminal.DiscAttach")
net.WriteEntity(self)
net.WriteString(self:GetDiscItemID() or "")
net.Send(client)
end
end
function ENT:OnDiscDetach(disc)
self:SetDiscItemID(nil)
self:SetNetVar("attachedDisc", nil)
local client = self:GetUsedBy()
if client and client:IsPlayer() then
net.Start("ix.terminal.DiscDetach")
net.WriteEntity(self)
net.Send(client)
end
end
function ENT:StartTouch(entity)
if (entity:GetClass() != "ix_item" or entity.attached) then return end
local attachmentPos = self:GetPos()
local attachmentAngle = self:GetAngles()
if (entity:GetItemID() == "combinebattery") then
if (self.attachedBattery and self.attachedBattery != NULL) then return end
attachmentPos = self:LocalToWorld(Vector(-3.006432, -14.451619, 10.576401))
attachmentAngle = self:LocalToWorldAngles(Angle(-0.281, -89.269, 89.798))
self.attachedBattery = entity
elseif (entity:GetItemID() == "datadisc") then
if (self.attachedDisc and self.attachedDisc != NULL) then return end
attachmentPos = self:GetPos() + self:GetUp() * 55.4 + self:GetRight() * -4.5 + self:GetForward() * 5
self.attachedDisc = entity
self:OnDiscAttach(entity)
else return end
local physObj = entity:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
entity:SetPos(attachmentPos)
entity:SetAngles(attachmentAngle)
entity:SetParent(self)
entity.attached = self
self:EmitSound("physics/metal/weapon_impact_soft" .. math.random(1, 3) .. ".wav")
end

View File

@@ -0,0 +1,29 @@
--[[
| 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/
--]]
ENT.Type = "anim"
ENT.PrintName = "Data-Disc Scanner"
ENT.Category = "HL2 RP"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.PhysgunDisable = true
ENT.PhysgunAllowAdmin = true
ENT.scanTimer = 5
ENT.linePoses = {
Vector(-0.591944, 2.154315, 50),
Vector(0.672625, -0.008970, 50),
Vector(-0.630802, -2.203331, 50),
Vector(-1.493779, -0.068308, 50)
}
function ENT:SetupDataTables()
self:NetworkVar("Entity", 0, "UsedBy")
end

View File

@@ -0,0 +1,75 @@
--[[
| 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/
--]]
include("shared.lua")
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
ENT.nextClickTime = 0
function ENT:TurnOn()
net.Start("ix.terminal.turnOn")
net.WriteEntity(self)
net.SendToServer()
end
function ENT:TurnOff()
net.Start("ix.terminal.turnOff")
net.WriteEntity(self)
net.SendToServer()
end
function ENT:CreateStartScreen(client, data)
local fabricatorMenu = ix.factoryPanels:CreatePanel("ixFabricator", self)
fabricatorMenu:SetUsedBy(client)
fabricatorMenu:SetDisc(data[1] or "")
self:EmitSound("buttons/button1.wav")
end
function ENT:PurgeScreenPanels(muteSound)
ix.factoryPanels:PurgeEntityPanels(self)
if (!muteSound) then
self:EmitSound("buttons/button5.wav")
end
end
function ENT:OnRemove()
self:PurgeScreenPanels(true)
self:StopSound("wn_goi/terminal_turnon.mp3")
end
ENT.vguiLocalizedTransform = {
vec = Vector(16, -40.15, 43.25),
ang = Angle(0, 65, 55),
res = 0.01
}
function ENT:DrawTranslucent()
self:DrawModel()
vgui.Start3D2D( self:LocalToWorld(self.vguiLocalizedTransform.vec), self:LocalToWorldAngles(self.vguiLocalizedTransform.ang), self.vguiLocalizedTransform.res )
if self.terminalPanel then
self.terminalPanel:Paint3D2D()
end
vgui.End3D2D()
if (imgui.Entity3D2D(self, Vector(17.592129, -44.555752, 40.282715), Angle(0, 65, 55), 0.01)) then
if (imgui.xButton(-165, 10, 285, 135, 5, Color(255, 44, 44, 0), Color(255, 44, 44, 255), Color(255, 44, 44, 10))) then
if (!self.terminalPanel and self.nextClickTime < CurTime()) then
self:TurnOn()
self.nextClickTime = CurTime() + 1.5
elseif (self.terminalPanel and self.nextClickTime < CurTime()) then
self:TurnOff()
self.nextClickTime = CurTime() + 1.5
end
end
imgui.End3D2D()
end
end

View File

@@ -0,0 +1,429 @@
--[[
| 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/
--]]
include("shared.lua")
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
ENT.nextInteraction = 0
ENT.interactionCooldown = 0.25
ENT.batteryChargeReq = 1
function ENT:CreateUserTimer()
timer.Create("ixFabricator" .. self:GetCreationID(), 5, 0, function()
if !IsValid(self) then return end
local user = self:GetUsedBy()
if user == self then return timer.Remove("ixFabricator" .. self:GetCreationID()) end
if (!IsValid(user) or !user:IsPlayer() or user:EyePos():DistToSqr(self:GetPos()) > 62500 or user:IsAFK()) then
self:SetUsedBy(self)
net.Start("ix.terminal.turnOff")
net.WriteEntity(self)
net.Broadcast()
timer.Remove("ixFabricator" .. self:GetCreationID())
end
end)
end
function ENT:OnRemove()
timer.Remove("ixFabricator" .. self:GetCreationID())
end
function ENT:Initialize()
self:SetModel("models/willardnetworks/gearsofindustry/wn_machinery_03.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self:SetTrigger(true)
local physObj = self:GetPhysicsObject()
self.opened = false
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
end
function ENT:HasBattery()
return IsValid(self.attachedBattery)
end
function ENT:BatteryHasCharge(charge)
return self.attachedBattery:GetData("charge", 0) >= charge
end
function ENT:TakeBatteryCharge(charge)
ix.item.instances[self.attachedBattery.ixItemID]:SetData("charge", self.attachedBattery:GetData("charge") - charge)
end
function ENT:SetDiscItemID(itemID)
self.dItemID = itemID
end
function ENT:GetDiscItemID()
return self.dItemID or ""
end
function ENT:OnDiscAttach(disc)
local client = self:GetUsedBy()
if !ix.fabrication:Get(disc:GetData("item", "")) then
if client and client:IsPlayer() then
client:NotifyLocalized("Data disc is corrupted.")
end
return
end
self:SetDiscItemID(disc:GetData("item", ""))
self:SetNetVar("attachedDisc", disc)
if client and client:IsPlayer() then
net.Start("ix.terminal.DiscAttach")
net.WriteEntity(self)
net.WriteString(self:GetDiscItemID() or "")
net.Send(client)
end
end
function ENT:OnDiscDetach(disc)
self:SetDiscItemID("")
self:SetNetVar("attachedDisc", nil)
local client = self:GetUsedBy()
if client and client:IsPlayer() then
net.Start("ix.terminal.DiscDetach")
net.WriteEntity(self)
net.Send(client)
end
end
ENT.dispenseBox = {
mins = Vector(5.035011, 4.218863, 45.633255),
maxs = Vector(17.356579, -23.244238, 33.593277)
}
function ENT:SearchForItem()
local mins = self:LocalToWorld(self.dispenseBox.mins)
local maxs = self:LocalToWorld(self.dispenseBox.maxs)
for _, item in pairs(ents.FindInBox(mins, maxs)) do
if item:GetClass() != "ix_item" then continue end
if self.attachedDisc and item == self.attachedDisc then continue end
return item
end
end
ENT.nextDepotToggle = 0
function ENT:OpenDepot()
self:ResetSequence("Open")
self.opened = true
end
function ENT:CloseDepot()
self:ResetSequence("Close")
self.opened = false
end
function ENT:ToggleDepot()
if self.bSynthesizing then return "Fabricator is active: you can't do anything else with it yet." end
if self.nextDepotToggle > CurTime() then return "You have to wait a bit before using this again." end
if self.opened then self:CloseDepot() else self:OpenDepot() end
self.nextDepotToggle = CurTime() + 2.5
end
function ENT:Recycle(client)
if self.bSynthesizing then return "Fabricator is active: you can't do anything else with it yet." end
if self.nextInteraction > CurTime() then return "You have to wait a bit until next interaction." end
self.nextInteraction = CurTime() + self.interactionCooldown
if !IsValid(client) or !client:IsPlayer() then return "Invalid client." end
if !self:HasBattery() then return "Fabricator requires combine battery in order to function!" end
if !self:BatteryHasCharge(self.batteryChargeReq) then return "Battery don't have enough charge." end
self:TakeBatteryCharge(self.batteryChargeReq)
local recycledItem
local item = self:SearchForItem()
if !item then
return "There's no item in fabricator depot."
end
local itemID = item:GetItemID()
for _, material in pairs(ix.fabrication.MAIN_MATS) do
if material == itemID then
return "You can't recycle this!"
end
end
local bClosedDepot = true
if self.opened then
self:CloseDepot()
bClosedDepot = false
end
self.bSynthesizing = true
timer.Simple(bClosedDepot and 0.1 or 2.5, function()
if (!IsValid(self)) then return end
if (!IsValid(item)) then
self.bSynthesizing = false
return self:OpenDepot()
end
self:EmitSound("ambience/3d-sounds/electronics/hipowerup_01.wav")
recycledItem = item.ixItemID
item:Remove()
timer.Simple(6.6, function()
if (!IsValid(self)) then return end
for _, pipe in pairs(self.smallSteamPipes) do
ParticleEffect("steamjet", self:LocalToWorld(pipe.vec), self:LocalToWorldAngles(pipe.ang), self)
end
self:EmitSound("ambience/3d-sounds/electronics/openingpowerup_13.wav")
self:DispenseRecycledMaterials(recycledItem)
end)
end)
end
function ENT:DispenseRecycledMaterials(item)
item = ix.item.instances[item]
if !item then
self.bSynthesizing = false
return self:OpenDepot()
end
local itemToDispense
local matAmount = item.category != "Ammunition" and item:GetData("stack", 1) or 1
if item.category == "Food" or item.category == "Ingredient" then
itemToDispense = ix.fabrication.MAIN_MATS["bio"]
else
itemToDispense = ix.fabrication.MAIN_MATS["tech"]
end
local fabrication = ix.fabrication:Get(item.uniqueID)
if fabrication then
itemToDispense = ix.fabrication.MAIN_MATS[fabrication:GetCategory()]
if item.category == "Ammunition" then
matAmount = fabrication:GetMainMaterialCost()
else
matAmount = fabrication:GetMainMaterialCost() * item:GetData("stack", 1)
end
end
if matAmount > 1 then
self:MultipleDispense(itemToDispense, matAmount)
else
self:Dispense(itemToDispense)
end
end
function ENT:MultipleDispense(item, amount)
self.mDispensing = {item = item, amount = amount}
self:Dispense(item)
end
function ENT:Dispense(item)
ix.item.Spawn(item, self:GetPos(), function(_, ent)
ent:SetPos(self:GetAttachment(1).Pos)
self.dispensedObject = ent
ent.dispenser = self
ent:GetPhysicsObject():EnableMotion(false)
end, self:GetAngles())
self:OpenDepot()
end
function ENT:OnDispensedItemTaken()
if self.mDispensing then
if self.mDispensing.amount > 1 then
self:CloseDepot()
end
self.mDispensing.amount = self.mDispensing.amount - 1
timer.Simple(2, function()
if (!IsValid(self)) then return end
if (!self.mDispensing) then return end
self:Dispense(self.mDispensing.item)
end)
if self.mDispensing.amount > 0 then
return
else
self.mDispensing = nil
end
end
self.bSynthesizing = false
if self.opened and self.mDispensing and self.mDispensing.amount > 0 then
self:CloseDepot()
end
end
function ENT:SynthesizeFabrication(client, fabrication, isBulk, amount)
if self.bSynthesizing then return "Fabricator is active: you can't do anything else with it yet." end
if self.nextInteraction > CurTime() then return "You have to wait a bit until next interaction." end
self.nextInteraction = CurTime() + self.interactionCooldown
if !IsValid(client) or !client:IsPlayer() then return "Invalid client." end
fabrication = ix.fabrication:Get(fabrication)
if !fabrication then return "Selected fabrication is invalid." end
if !self:HasBattery() then return "Fabricator requires combine battery in order to function!" end
if !self:BatteryHasCharge(self.batteryChargeReq) then return "Battery don't have enough charge." end
local character = client:GetCharacter()
local inventory = character:GetInventory()
local resourceItemID = ix.fabrication.MAIN_MATS[fabrication:GetCategory()]
local resourceItem = ix.item.list[resourceItemID]
local hasItem = inventory:GetItemsByUniqueID(resourceItemID)
local isStackable = resourceItem.maxStackSize != nil
local resourcesToTake = fabrication:GetMainMaterialCost()
if (isBulk) then
resourcesToTake = resourcesToTake * amount
end
if !hasItem or !istable(hasItem) or table.IsEmpty(hasItem) then
return "Unable to find required materials in your inventory."
end
local totalItemCount = 0
if isStackable then
for _, rItem in pairs(hasItem) do
totalItemCount = totalItemCount + rItem:GetStackSize()
end
if totalItemCount >= resourcesToTake then
for _, rItem in pairs(hasItem) do
if resourcesToTake <= 0 then
break
end
local actualStackSize = rItem:GetStackSize()
rItem:RemoveStack(resourcesToTake)
resourcesToTake = resourcesToTake - actualStackSize
end
else
return "You don't have enough resources for this fabrication."
end
else
totalItemCount = totalItemCount + #hasItem
if totalItemCount >= resourcesToTake then
for _, rItem in pairs(hasItem) do
if resourcesToTake <= 0 then break end
rItem:Remove()
resourcesToTake = resourcesToTake - 1
end
else
return "You don't have enough resources for this fabrication."
end
end
if self.opened then
self:CloseDepot()
end
self.bSynthesizing = true
self:TakeBatteryCharge(self.batteryChargeReq)
self:EmitSound("ambience/3d-sounds/electronics/hipowerup_01.wav")
-- i frickin' love timer simple pyramids
timer.Simple(6.6, function()
if (!IsValid(self)) then return end
self:EmitSound("ambience/3d-sounds/steam/steam2.wav")
ParticleEffect("steam_jet_50", self:LocalToWorld(self.bigSteamJet.vec), self:LocalToWorldAngles(self.bigSteamJet.ang), self)
timer.Simple(2.9, function()
if (!IsValid(self)) then return end
self:StopParticles()
self:EmitSound("ambience/3d-sounds/nexus/printer_verb.ogg")
timer.Simple(11.2, function()
if (!IsValid(self)) then return end
self:EmitSound("ambience/3d-sounds/steam/steam01.wav")
for _, pipe in pairs(self.smallSteamPipes) do
ParticleEffect("steamjet", self:LocalToWorld(pipe.vec), self:LocalToWorldAngles(pipe.ang), self)
end
timer.Simple(1.8, function()
if (!IsValid(self)) then return end
if (isBulk) then
self:MultipleDispense(fabrication:GetID(), amount)
else
self:Dispense(fabrication:GetID())
end
end)
end)
end)
end)
end
function ENT:Think()
self:NextThink( CurTime() )
return true
end
function ENT:StartTouch(entity)
if (entity:GetClass() != "ix_item" or entity.attached) then return end
local attachmentPos = self:GetPos()
local attachmentAngle = self:GetAngles()
if (entity:GetItemID() == "combinebattery") then
if (self.attachedBattery and self.attachedBattery != NULL) then return end
attachmentPos = self:LocalToWorld(Vector(17.081011, -3.726678, 25.982630))
attachmentAngle = self:LocalToWorldAngles(Angle(8.451, 7.097, 98.399))
self.attachedBattery = entity
elseif (entity:GetItemID() == "datadisc") then
if (self.attachedDisc and self.attachedDisc != NULL) then return end
attachmentPos = self:LocalToWorld(Vector(21.495632, -24.401604, 37.726032))
attachmentAngle = self:LocalToWorldAngles(Angle(0.693, 2.259, 88.879))
self.attachedDisc = entity
self:OnDiscAttach(entity)
else return end
local physObj = entity:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
entity:SetPos(attachmentPos)
entity:SetAngles(attachmentAngle)
entity:SetParent(self)
entity.attached = self
self:EmitSound("physics/metal/weapon_impact_soft" .. math.random(1, 3) .. ".wav")
end

View File

@@ -0,0 +1,34 @@
--[[
| 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/
--]]
ENT.Type = "anim"
ENT.PrintName = "Fabricator"
ENT.Category = "HL2 RP"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.PhysgunDisable = true
ENT.PhysgunAllowAdmin = true
ENT.AutomaticFrameAdvance = true
ENT.bigSteamJet = {
vec = Vector(1.659318, 56.163685, 33.053894),
ang = Angle(0, 90, 0)
}
ENT.smallSteamPipes = {
{vec = Vector(20.475733, 34.197407, 12.701706), ang = Angle(-60, -75, 0)},
{vec = Vector(20.420990, 28.903364, 12.851990), ang = Angle(-60, -75, 0)},
{vec = Vector(20.008125, -16.373440, 23.055595), ang = Angle(-90, -90, 0)}
}
ENT.dispensePos = Vector(12.057754, -13.228306, 39.473038)
function ENT:SetupDataTables()
self:NetworkVar("Entity", 0, "UsedBy")
end

View File

@@ -0,0 +1,53 @@
--[[
| 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/
--]]
include("shared.lua")
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
function ENT:CreateStartScreen()
local shopMenu = ix.factoryPanels:CreatePanel("ixShopTerminal", self)
shopMenu:BuildShopPanel({
shopName = self:GetShop(),
cost = self:GetShopCost(),
scReq = self:GetShopSocialCreditReq(),
rent = self:GetNetVar("Rent", 0)
})
end
function ENT:PurgeScreenPanels(muteSound)
ix.factoryPanels:PurgeEntityPanels(self)
end
function ENT:OnRemove()
self:PurgeScreenPanels(true)
end
ENT.vguiLocalizedTransform = {
vec = Vector(13, -6.7, 20),
ang = Angle(0, 90, 90),
res = 0.01
}
function ENT:DrawTranslucent()
self:DrawModel()
vgui.Start3D2D( self:LocalToWorld(self.vguiLocalizedTransform.vec), self:LocalToWorldAngles(self.vguiLocalizedTransform.ang), self.vguiLocalizedTransform.res )
if self.terminalPanel then
self.terminalPanel:Paint3D2D()
end
vgui.End3D2D()
end
function ENT:Initialize()
self:CreateStartScreen()
end

View File

@@ -0,0 +1,110 @@
--[[
| 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/
--]]
include("shared.lua")
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
function ENT:Initialize()
self:SetModel("models/props_combine/combine_smallmonitor001.mdl")
self:PhysicsInit(SOLID_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
self:SetTrigger(true)
local physObj = self:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
self:SetNetVar("isPurchasable", self:IsPurchasable())
end
function ENT:SetShop(shop)
local housing = ix.plugin.Get("housing")
local foundShop = false
for k, apartment in pairs(housing.apartments) do
if apartment.name == shop and apartment.type == "shop" then
self:SetNetVar("shop", shop)
self:SetNetVar("shopID", i)
foundShop = true
end
end
if !foundShop then
return "No shops found"
end
self:UpdateScreen()
end
function ENT:GetShopID()
local shop = self:GetShop()
local housing = ix.plugin.Get("housing")
for k, fShop in pairs(housing.apartments) do
if fShop.name == shop and fShop.type == "shop" then
return k
end
end
return false
end
function ENT:SetShopCost(cost)
if !self:GetShop() then return "You must link this terminal with shop first!" end
self:SetNetVar("cost", cost)
self:UpdateScreen()
end
function ENT:SetShopSocialCreditReq(sc)
if !self:GetShop() then return "You must link this terminal with shop first!" end
self:SetNetVar("sc", sc)
self:UpdateScreen()
end
function ENT:UpdateRent()
local shop = self:GetShop()
if !shop then return false end
local housing = ix.plugin.Get("housing")
local foundShop = false
for k, fShop in pairs(housing.apartments) do
if fShop.name == shop and fShop.type == "shop" then
foundShop = fShop
end
end
if !foundShop then
return false
end
self:SetNetVar("Rent", foundShop.rent)
end
function ENT:UpdateScreen()
self:SetNetVar("isPurchasable", self:IsPurchasable())
self:UpdateRent()
for _, client in ipairs(player.GetAll()) do
netstream.Start(client, "UpdateShopScreen")
end
end
function ENT:StartTouch(entity)
end

View File

@@ -0,0 +1,53 @@
--[[
| 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/
--]]
ENT.Type = "anim"
ENT.PrintName = "Shop Terminal"
ENT.Category = "HL2 RP"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.PhysgunDisable = true
ENT.PhysgunAllowAdmin = true
function ENT:GetShop()
return self:GetNetVar("shop", false)
end
function ENT:GetShopCost()
return self:GetNetVar("cost", false)
end
function ENT:GetShopSocialCreditReq()
return self:GetNetVar("sc", false)
end
function ENT:IsPurchasable()
local shop = self:GetShop()
if !shop then return false end
local housing = ix.plugin.Get("housing")
local foundShop = false
for _, fShop in pairs(housing.apartments) do
if fShop.name == shop and fShop.type == "shop" then
foundShop = fShop
end
end
if !foundShop then
return false
end
if foundShop.tenants and table.IsEmpty(foundShop.tenants) then
return true
end
return false
end

View File

@@ -0,0 +1,36 @@
--[[
| 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/
--]]
ITEM.base = "base_stackable"
ITEM.maxStackSize = 16
ITEM.name = "Biopasta"
ITEM.description = "Biały słoik wypełniony dziwnym materiałem."
ITEM.category = "Ingredient"
ITEM.model = "models/props_lab/jar01b.mdl"
ITEM.width = 1
ITEM.height = 1
ITEM.iconCam = {
pos = Vector(6.22, -199.61, 10.73),
ang = Angle(3.12, 91.84, 0),
fov = 3.64
}
ITEM.holdData = {
vectorOffset = {
right = -1.5,
up = 0,
forward = 0
},
angleOffset = {
right = 0,
up = 0,
forward = 0
},
}

View File

@@ -0,0 +1,92 @@
--[[
| 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 PLUGIN = PLUGIN
ITEM.name = "Akumulator Kombinatu"
ITEM.model = "models/willardnetworks/gearsofindustry/wn_battery.mdl"
ITEM.category = "Combine"
ITEM.description = "Niewielki Akumulator Kombinatu wielokrotnego ładowania. Posiada z tyłu port ładowania i kilka portów wyświetlających poziom naładowania."
ITEM.iconCam = {
pos = Vector(199.98, 5.3, 7.35),
ang = Angle(0.66, -178.43, 0),
fov = 3.08
}
function ITEM:OnInstanced(invID, x, y, item)
self:SetData("charge", 0)
end
ITEM.functions.SetFullCharge = { -- sorry, for name order.
name = "Ustaw pełne naładowanie",
tip = "repairTip",
icon = "icon16/wrench.png",
OnRun = function(item)
item:SetData("charge", 10)
return false
end,
OnCanRun = function(item)
local client = item.player
return IsValid(client) and client:IsAdmin()
end
}
-- Setting damageInfo manually because we're doing some weirdness with the item destruction.
function ITEM:OnEntityTakeDamage(entity, damageInfo)
entity.ixDamageInfo = {damageInfo:GetAttacker(), damage, damageInfo:GetInflictor()}
end
if (SERVER) then return end
function ITEM:PopulateTooltip(tooltip)
local charge = self:GetData("charge", 0)
local color = PLUGIN.chargeIndicatorColors[charge] or Color(255, 0, 0)
local name = tooltip:GetRow("name")
name:SetBackgroundColor(color)
local chargePnl = tooltip:AddRow("charge")
chargePnl:SetBackgroundColor(color)
chargePnl:SetText("Ładunek: " .. (charge * 10) .. "%")
chargePnl:SizeToContents()
end
function ITEM:DrawEntity(entity)
if (entity.colorSetup) then return end
entity.GetBatteryColor = function()
local color = entity:GetNetVar("beeping", false) and Color(255, 0, 0) or PLUGIN.chargeIndicatorColors[entity:GetData("charge", 0)] or Color(0, 255, 255)
return Vector(color.r / 255, color.g / 255, color.b / 255)
end
entity.colorSetup = true
end
function ITEM:OnInventoryDraw(entity)
entity.GetBatteryColor = function()
local color = PLUGIN.chargeIndicatorColors[self:GetData("charge", 0)] or Color(255, 0, 0)
return Vector(color.r / 255, color.g / 255, color.b / 255)
end
end
matproxy.Add({
name = "BatteryColor",
init = function(self, mat, values)
self.ResultTo = values.resultvar
end,
bind = function(self, mat, ent)
if (ent.GetBatteryColor) then
mat:SetVector(self.ResultTo, ent:GetBatteryColor())
end
end
})

View File

@@ -0,0 +1,28 @@
--[[
| 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/
--]]
ITEM.name = "Dysk Danych"
ITEM.model = "models/willardnetworks/gearsofindustry/wn_data_card.mdl"
ITEM.category = "Combine"
ITEM.description = "Mały, stosunkowo cienki metalowy dysk używany do przechowywania danych."
function ITEM:GetSkin()
return self:GetData("item") and 0 or 1
end
function ITEM:PopulateTooltip(tooltip)
local item = self:GetData("item")
local itemPnl = tooltip:AddRow("item")
itemPnl:SetBackgroundColor(derma.GetColor(item and "Info" or "Error", tooltip))
itemPnl:SetText(item and ix.item.list[item] and "Zakodowany Przedmiot: " .. ix.item.list[item].name or "Brak zakodowanych danych na Dysku")
itemPnl:SizeToContents()
end

View File

@@ -0,0 +1,94 @@
--[[
| 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/
--]]
ITEM.name = "Item Label"
ITEM.model = "models/props_lab/box01a.mdl"
ITEM.description = "A label that can be applied on any item to change its name & description."
function ITEM:GetName()
local name = self:GetData("labelInfoName")
return self.name .. (name and (" \"" .. name .. "\"") or "")
end
function ITEM:GetDescription()
local description = self:GetData("labelInfoDesc")
return self.description .. (description and (" Jest napisane: \"" .. description .. "\"") or "")
end
ITEM.functions.editAName = { -- Sorry, I wanted it at the top
name = "Edit Name",
icon = "icon16/tag_blue_edit.png",
OnRun = function(item, data)
local client = item.player
client:RequestString("Edit Label Name", "Enter the name that this label should have:", function(name)
item:SetData("labelInfoName", name)
client:Notify("You have changed this label's name.")
end, "")
return false
end
}
ITEM.functions.editDesc = {
name = "Edit Description",
icon = "icon16/tag_blue_edit.png",
OnRun = function(item, data)
local client = item.player
client:RequestString("Edit Label Description", "Enter the description that this label should have:", function(description)
item:SetData("labelInfoDesc", description)
client:Notify("You have changed this label's name.")
end, "")
return false
end
}
ITEM.functions.combined = {
OnRun = function(item, data)
local targetItem = ix.item.instances[data[1]]
if (!targetItem) then return false end
if (targetItem.functions.combine) then
client:Notify("You cannot apply a label to this item!")
return false
end
local client = item.player
if (targetItem.uniqueID == "itemlabel") then
client:Notify("You cannot apply a label onto another label!")
return false
end
local name = item:GetData("labelInfoName", false)
local description = item:GetData("labelInfoDesc", false)
if (!name and !description) then
client:Notify("The label is blank!")
return false
end
targetItem:SetData("labelName", name)
targetItem:SetData("labelDescription", description)
client:Notify("You apply the label to the " .. targetItem.name .. ".")
end,
OnCanRun = function(item, data)
return true
end
}

View File

@@ -0,0 +1,101 @@
--[[
| 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 ix = ix
ix.fabrication = ix.fabrication or {}
ix.fabrication.list = ix.fabrication.list or {}
ix.fabrication.EXISTING_CATS = {
["advancedtech"] = true,
["tech"] = true,
["bio"] = true
}
ix.fabrication.MAIN_MATS = {
["advancedtech"] = "comp_condensed_resin",
["tech"] = "comp_resin",
["bio"] = "biopaste"
}
function ix.fabrication:Register(id, category, mainMaterialCost)
local fabrication = setmetatable({
id = id,
category = "",
mainMaterialCost = 1
}, ix.meta.fabrication)
local cat = fabrication:SetCategory(category)
local material = fabrication:SetMainMaterialCost(mainMaterialCost)
if !cat or !material then
fabrication = nil
return
end
ix.fabrication.list[id] = fabrication
return fabrication
end
function ix.fabrication:Get(id)
return ix.fabrication.list[id]
end
function ix.fabrication:GetAll()
return ix.fabrication.list
end
function ix.fabrication:GetAllAdvancedTech()
local t = {}
for id, fab in pairs(ix.fabrication.list) do
if fab.category != "advancedtech" then continue end
t[id] = fab
end
return t
end
function ix.fabrication:GetAllTech()
local t = {}
for id, fab in pairs(ix.fabrication.list) do
if fab.category != "tech" then continue end
t[id] = fab
end
return t
end
function ix.fabrication:GetAllBio()
local t = {}
for id, fab in pairs(ix.fabrication.list) do
if fab.category != "bio" then continue end
t[id] = fab
end
return t
end
function ix.fabrication:GetAdvancedTech(id)
local fabrication = ix.fabrication.list[id]
if fabrication and fabrication.category == "advancedtech" then
return fabrication
end
end
function ix.fabrication:GetTech(id)
local fabrication = ix.fabrication.list[id]
if fabrication and fabrication.category == "tech" then
return fabrication
end
end
function ix.fabrication:GetBio(id)
local fabrication = ix.fabrication.list[id]
if fabrication and fabrication.category == "bio" then
return fabrication
end
end

View File

@@ -0,0 +1,55 @@
--[[
| 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 FABRICATION = ix.meta.fabrication or {}
FABRICATION.__index = FABRICATION
FABRICATION.id = ""
FABRICATION.category = ""
FABRICATION.mainMaterialCost = 1
function FABRICATION:__tostring()
return "FABRICATION: " .. self.id
end
function FABRICATION:__eq(other)
return self:GetID() == other:GetID()
end
function FABRICATION:SetCategory(category)
if !category or !ix.fabrication.EXISTING_CATS[category] then
return false
end
self.category = category
return true
end
function FABRICATION:GetCategory()
return self.category
end
function FABRICATION:SetMainMaterialCost(mainMaterialCost)
if !mainMaterialCost or !isnumber(mainMaterialCost) then
return false
end
self.mainMaterialCost = mainMaterialCost
return true
end
function FABRICATION:GetMainMaterialCost()
return self.mainMaterialCost
end
function FABRICATION:GetID()
return self.id
end
ix.meta.fabrication = FABRICATION

View File

@@ -0,0 +1,423 @@
--[[
| 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/
--]]
/*
Resin Costs:
Bio = 6 Credits
Tech = 12 Credits (Price is designed to help CWU afford Product)
AdvancedTech = 120 Credits
*/
-- Food --
ix.fabrication:Register("proc_nutrient_bar", "bio", 1)
ix.fabrication:Register("proc_paste", "bio", 1)
ix.fabrication:Register("metropolicesupplements", "bio", 3)
ix.fabrication:Register("artificial_cheesepaste", "bio", 1)
ix.fabrication:Register("artificial_cheese", "bio", 1)
ix.fabrication:Register("artificial_meatpaste", "bio", 2)
ix.fabrication:Register("artificial_stew", "bio", 4)
ix.fabrication:Register("artificial_stirfry", "bio", 6)
ix.fabrication:Register("artificial_skewer", "bio", 1)
ix.fabrication:Register("artificial_meat", "bio", 2)
ix.fabrication:Register("baking_bread_slice", "bio", 1)
ix.fabrication:Register("baking_treat", "bio", 1)
ix.fabrication:Register("baking_doughnut", "bio", 1)
ix.fabrication:Register("baking_bread_half", "bio", 2)
ix.fabrication:Register("baking_bread", "bio", 3)
ix.fabrication:Register("pickled_egg", "bio", 1)
ix.fabrication:Register("pickled_leech", "bio", 1)
ix.fabrication:Register("pickled_vegetables", "bio", 2)
ix.fabrication:Register("food_crackers", "bio", 1)
ix.fabrication:Register("food_crisps", "bio", 1)
ix.fabrication:Register("food_peanuts", "bio", 1)
ix.fabrication:Register("leech_skewer", "bio", 1)
ix.fabrication:Register("comfort_toast", "bio", 1)
ix.fabrication:Register("comfort_pancake", "bio", 2)
ix.fabrication:Register("luxury_choc", "bio", 3)
-- Drinks --
ix.fabrication:Register("drink_breen_water", "bio", 1)
ix.fabrication:Register("drink_premium_water", "bio", 1)
ix.fabrication:Register("drink_sparkling_water", "bio", 1)
ix.fabrication:Register("drink_proc_beer", "bio", 1)
ix.fabrication:Register("drink_proc_bourbon", "bio", 1)
ix.fabrication:Register("drink_proc_fruit_juice", "bio", 1)
ix.fabrication:Register("drink_proc_lemonade", "bio", 1)
ix.fabrication:Register("drink_proc_vodka", "bio", 1)
ix.fabrication:Register("drink_proc_whiskey", "bio", 1)
ix.fabrication:Register("drink_banksoda_grey", "bio", 2)
ix.fabrication:Register("drink_beer", "bio", 3)
ix.fabrication:Register("drink_boboriginal", "bio", 2)
ix.fabrication:Register("drink_milk", "bio", 1)
ix.fabrication:Register("nutrientdrink", "bio", 2)
ix.fabrication:Register("drink_wi_coffee", "bio", 2)
-- Fabricator Only --
ix.fabrication:Register("fab_beef", "bio", 2)
ix.fabrication:Register("fab_butter", "bio", 1)
ix.fabrication:Register("fab_cheese", "bio", 1)
ix.fabrication:Register("fab_dish", "bio", 3)
ix.fabrication:Register("fab_fish", "bio", 3)
ix.fabrication:Register("fab_meatpaste", "bio", 2)
ix.fabrication:Register("fab_noddles", "bio", 1)
ix.fabrication:Register("fab_sandwich", "bio", 1)
ix.fabrication:Register("combinebattery", "tech", 10)
-- Audiobook Languages --
ix.fabrication:Register("languagebox_albanian", "tech", 5)
ix.fabrication:Register("languagebox_arabic", "tech", 5)
ix.fabrication:Register("languagebox_bengali", "tech", 5)
ix.fabrication:Register("languagebox_bosnian", "tech", 5)
ix.fabrication:Register("languagebox_bulgarian", "tech", 5)
ix.fabrication:Register("languagebox_chinese", "tech", 5)
ix.fabrication:Register("languagebox_croatian", "tech", 5)
ix.fabrication:Register("languagebox_czech", "tech", 5)
ix.fabrication:Register("languagebox_danish", "tech", 5)
ix.fabrication:Register("languagebox_dutch", "tech", 5)
ix.fabrication:Register("languagebox_finnish", "tech", 5)
ix.fabrication:Register("languagebox_flipino", "tech", 5)
ix.fabrication:Register("languagebox_french", "tech", 5)
ix.fabrication:Register("languagebox_gaeilge", "tech", 5)
ix.fabrication:Register("languagebox_gaelic", "tech", 5)
ix.fabrication:Register("languagebox_german", "tech", 5)
ix.fabrication:Register("languagebox_greek", "tech", 5)
ix.fabrication:Register("languagebox_hebrew", "tech", 5)
ix.fabrication:Register("languagebox_hindi", "tech", 5)
ix.fabrication:Register("languagebox_hungarian", "tech", 5)
ix.fabrication:Register("languagebox_indonesian", "tech", 5)
ix.fabrication:Register("languagebox_italian", "tech", 5)
ix.fabrication:Register("languagebox_japanese", "tech", 5)
ix.fabrication:Register("languagebox_korean", "tech", 5)
ix.fabrication:Register("languagebox_polish", "tech", 5)
ix.fabrication:Register("languagebox_portuguese", "tech", 5)
ix.fabrication:Register("languagebox_romanian", "tech", 5)
ix.fabrication:Register("languagebox_russian", "tech", 5)
ix.fabrication:Register("languagebox_serbian", "tech", 5)
ix.fabrication:Register("languagebox_spanish", "tech", 5)
ix.fabrication:Register("languagebox_swahili", "tech", 5)
ix.fabrication:Register("languagebox_swedish", "tech", 5)
ix.fabrication:Register("languagebox_turkish", "tech", 5)
-- Clothing --
ix.fabrication:Register("head_blue_beanie", "tech", 1)
ix.fabrication:Register("beanie_brown", "tech", 1)
ix.fabrication:Register("beanie_red", "tech", 1)
ix.fabrication:Register("beanie_grey", "tech", 1)
ix.fabrication:Register("head_green_beanie", "tech", 1)
ix.fabrication:Register("head_visor_cap", "tech", 1)
ix.fabrication:Register("head_military_cap", "tech", 1)
ix.fabrication:Register("head_chef_hat", "tech", 1)
ix.fabrication:Register("head_flat_cap", "tech", 1)
ix.fabrication:Register("head_boonie_hat", "tech", 1)
ix.fabrication:Register("face_bandana", "tech", 1)
ix.fabrication:Register("head_gasmask", "tech", 2)
ix.fabrication:Register("face_mask", "tech", 1)
ix.fabrication:Register("hardhat_blue", "tech", 1)
ix.fabrication:Register("head_hardhat", "tech", 1)
ix.fabrication:Register("hardhat_green", "tech", 1)
ix.fabrication:Register("hardhat_grey", "tech", 1)
ix.fabrication:Register("hardhat_white", "tech", 1)
ix.fabrication:Register("worker_blue", "tech", 2)
ix.fabrication:Register("worker_dark", "tech", 2)
ix.fabrication:Register("worker_green", "tech", 2)
ix.fabrication:Register("worker_grey", "tech", 2)
ix.fabrication:Register("worker_orange", "tech", 2)
ix.fabrication:Register("torso_red_worker_jacket", "tech", 2)
ix.fabrication:Register("torso_yellow_worker_jacket", "tech", 2)
ix.fabrication:Register("worker_uniform", "tech", 3)
ix.fabrication:Register("worker_uniform2", "tech", 3)
ix.fabrication:Register("white_hazmat_uniform", "tech", 3)
ix.fabrication:Register("orange_hazmat_uniform", "tech", 3)
ix.fabrication:Register("yellow_hazmat_uniform", "tech", 3)
ix.fabrication:Register("vortigaunt_head_hardhat", "tech", 2)
ix.fabrication:Register("vortigaunt_torso_cwu", "tech", 2)
ix.fabrication:Register("buttoned_black", "tech", 1)
ix.fabrication:Register("buttoned_beige", "tech", 1)
ix.fabrication:Register("buttoned_blue", "tech", 1)
ix.fabrication:Register("jumpsuit_black", "tech", 1)
ix.fabrication:Register("jumpsuit_blue", "tech", 1)
ix.fabrication:Register("medic_blue", "tech", 2)
ix.fabrication:Register("medic_green", "tech", 2)
ix.fabrication:Register("torso_medic_shirt", "tech", 2)
ix.fabrication:Register("medic_red", "tech", 2)
ix.fabrication:Register("buttoned_white", "tech", 1)
ix.fabrication:Register("jumpsuit_red", "tech", 1)
ix.fabrication:Register("buttoned_red", "tech", 1)
ix.fabrication:Register("jumpsuit_orange", "tech", 1)
ix.fabrication:Register("hands_medical_gloves", "tech", 1)
ix.fabrication:Register("buttoned_lightblue", "tech", 1)
ix.fabrication:Register("jumpsuit_grey", "tech", 1)
ix.fabrication:Register("buttoned_green", "tech", 1)
ix.fabrication:Register("hands_gloves", "tech", 1)
ix.fabrication:Register("hands_tipless_gloves", "tech", 1)
ix.fabrication:Register("jumpsuit", "tech", 1)
ix.fabrication:Register("buttoned_brown", "tech", 1)
ix.fabrication:Register("jumpsuit_brown", "tech", 1)
ix.fabrication:Register("torso_blue_rebel_uniform", "advancedtech", 1)
ix.fabrication:Register("torso_green_rebel_uniform", "advancedtech", 1)
ix.fabrication:Register("torso_medical_rebel_uniform", "advancedtech", 1)
ix.fabrication:Register("legs_blue_padded_pants", "tech", 2)
ix.fabrication:Register("legs_black_padded_pants", "tech", 2)
ix.fabrication:Register("legs_green_padded_pants", "tech", 2)
ix.fabrication:Register("torso_brown_trench", "advancedtech", 1)
ix.fabrication:Register("legs_civilian_beige", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_black", "tech", 1)
ix.fabrication:Register("legs_civilian_black", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_blue", "tech", 1)
ix.fabrication:Register("legs_blue_pants", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_brown", "tech", 1)
ix.fabrication:Register("legs_civilian_brown", "tech", 1)
ix.fabrication:Register("legs_green_pants", "tech", 1)
ix.fabrication:Register("legs_grey_pants", "tech", 1)
ix.fabrication:Register("legs_civilian_darkred", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_green", "tech", 1)
ix.fabrication:Register("legs_civilian_green", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_grey", "tech", 1)
ix.fabrication:Register("legs_light_grey_pants", "tech", 1)
ix.fabrication:Register("legs_jumpsuit", "tech", 1)
ix.fabrication:Register("legs_civilian_lightblue", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_orange", "tech", 1)
ix.fabrication:Register("legs_civilian_purple", "tech", 1)
ix.fabrication:Register("legs_jumpsuit_red", "tech", 1)
ix.fabrication:Register("legs_civilian_red", "tech", 1)
ix.fabrication:Register("legs_civilian_teal", "tech", 1)
ix.fabrication:Register("legs_civilian_yellow", "tech", 1)
ix.fabrication:Register("shoes_black_shoes", "tech", 1)
ix.fabrication:Register("shoes_leather_brown", "tech", 1)
ix.fabrication:Register("shoes_brown_shoes", "tech", 1)
ix.fabrication:Register("shoes_blue_shoes", "tech", 1)
ix.fabrication:Register("shoes_red", "tech", 1)
ix.fabrication:Register("shoes_leather_dark", "tech", 1)
ix.fabrication:Register("shoes_grey", "tech", 1)
ix.fabrication:Register("shoes_rain_boots", "tech", 1)
ix.fabrication:Register("torso_labcoat", "tech", 3)
ix.fabrication:Register("torso_black_coat", "tech", 1)
ix.fabrication:Register("denim_black", "tech", 1)
ix.fabrication:Register("khaki_black", "tech", 1)
ix.fabrication:Register("weather_black", "tech", 1)
ix.fabrication:Register("worn_black", "tech", 1)
ix.fabrication:Register("zipper_black", "tech", 1)
ix.fabrication:Register("denim_blue", "tech", 1)
ix.fabrication:Register("khaki_blue", "tech", 1)
ix.fabrication:Register("overcoat_blue", "tech", 1)
ix.fabrication:Register("plaid_blue", "tech", 1)
ix.fabrication:Register("raincoat_blue", "tech", 1)
ix.fabrication:Register("weather_blue", "tech", 1)
ix.fabrication:Register("wool_blue", "tech", 1)
ix.fabrication:Register("worn_blue", "tech", 1)
ix.fabrication:Register("zipper_blue", "tech", 1)
ix.fabrication:Register("torso_khaki_jacket", "tech", 1)
ix.fabrication:Register("overcoat_brown", "tech", 1)
ix.fabrication:Register("plaid_brown", "tech", 1)
ix.fabrication:Register("raincoat_brown", "tech", 1)
ix.fabrication:Register("weather_brown", "tech", 1)
ix.fabrication:Register("wool_brown", "tech", 1)
ix.fabrication:Register("weather_burgundy", "tech", 1)
ix.fabrication:Register("wool_burgundy", "tech", 1)
ix.fabrication:Register("casual_blue", "tech", 1)
ix.fabrication:Register("casual_bluered", "tech", 1)
ix.fabrication:Register("casual_brown", "tech", 1)
ix.fabrication:Register("casual_darkblue", "tech", 1)
ix.fabrication:Register("casual_darkred", "tech", 1)
ix.fabrication:Register("casual_green", "tech", 1)
ix.fabrication:Register("torso_black_jacket", "tech", 1)
ix.fabrication:Register("casual_greygreen", "tech", 1)
ix.fabrication:Register("casual_orange", "tech", 1)
ix.fabrication:Register("casual_purple", "tech", 1)
ix.fabrication:Register("casual_red", "tech", 1)
ix.fabrication:Register("weather_darkblue", "tech", 1)
ix.fabrication:Register("plaid_darkbrown", "tech", 1)
ix.fabrication:Register("raincoat_darkgreen", "tech", 1)
ix.fabrication:Register("plaid_darkgrey", "tech", 1)
ix.fabrication:Register("overcoat_dark", "tech", 1)
ix.fabrication:Register("plaid_dark", "tech", 1)
ix.fabrication:Register("raincoat_dark", "tech", 1)
ix.fabrication:Register("weather_fuscous", "tech", 1)
ix.fabrication:Register("denim_green", "tech", 1)
ix.fabrication:Register("jumpsuit_green", "tech", 1)
ix.fabrication:Register("khaki_green", "tech", 1)
ix.fabrication:Register("torso_green_jacket", "tech", 1)
ix.fabrication:Register("plaid_green", "tech", 1)
ix.fabrication:Register("raincoat_green", "tech", 1)
ix.fabrication:Register("weather_green", "tech", 1)
ix.fabrication:Register("torso_green_coat", "tech", 1)
ix.fabrication:Register("worn_green", "tech", 1)
ix.fabrication:Register("zipper_green", "tech", 1)
ix.fabrication:Register("torso_blue_shirt", "tech", 1)
ix.fabrication:Register("khaki_grey", "tech", 1)
ix.fabrication:Register("overcoat_grey", "tech", 1)
ix.fabrication:Register("torso_blue_jacket", "tech", 1)
ix.fabrication:Register("torso_black_stylilanguagejacket", "tech", 1)
ix.fabrication:Register("wool_green", "tech", 1)
ix.fabrication:Register("worn_grey", "tech", 1)
ix.fabrication:Register("wool_gunmetal", "tech", 1)
ix.fabrication:Register("khaki_hurricane", "tech", 1)
ix.fabrication:Register("zipper_kombu", "tech", 1)
ix.fabrication:Register("weather_lavender", "tech", 1)
ix.fabrication:Register("torso_leather_jacket", "tech", 1)
ix.fabrication:Register("plaid_lightbrown", "tech", 1)
ix.fabrication:Register("plaid_lightgrey", "tech", 1)
ix.fabrication:Register("torso_plaid_jacket", "tech", 1)
ix.fabrication:Register("khaki_matterhorn", "tech", 1)
ix.fabrication:Register("overcoat_murky", "tech", 1)
ix.fabrication:Register("raincoat_murky", "tech", 1)
ix.fabrication:Register("weather_murky", "tech", 1)
ix.fabrication:Register("zipper_oldburgundy", "tech", 1)
ix.fabrication:Register("wool_onyx", "tech", 1)
ix.fabrication:Register("weather_nickel", "tech", 1)
ix.fabrication:Register("khaki_orange", "tech", 1)
ix.fabrication:Register("overcoat_orange", "tech", 1)
ix.fabrication:Register("raincoat_orange", "tech", 1)
ix.fabrication:Register("weather_orange", "tech", 1)
ix.fabrication:Register("wool_orange", "tech", 1)
ix.fabrication:Register("zipper_orange", "tech", 1)
ix.fabrication:Register("khaki_purple", "tech", 1)
ix.fabrication:Register("overcoat_purple", "tech", 1)
ix.fabrication:Register("plaid_purple", "tech", 1)
ix.fabrication:Register("raincoat_purple", "tech", 1)
ix.fabrication:Register("weather_purple", "tech", 1)
ix.fabrication:Register("wool_purple", "tech", 1)
ix.fabrication:Register("zipper_purple", "tech", 1)
ix.fabrication:Register("denim_red", "tech", 1)
ix.fabrication:Register("khaki_red", "tech", 1)
ix.fabrication:Register("overcoat_red", "tech", 1)
ix.fabrication:Register("plaid_red", "tech", 1)
ix.fabrication:Register("raincoat_red", "tech", 1)
ix.fabrication:Register("torso_red_jacket", "tech", 1)
ix.fabrication:Register("torso_winter_jacket", "tech", 1)
ix.fabrication:Register("wool_red", "tech", 1)
ix.fabrication:Register("worn_red", "tech", 1)
ix.fabrication:Register("zipper_red", "tech", 1)
ix.fabrication:Register("overcoat_shady", "tech", 1)
ix.fabrication:Register("khaki_shuttle", "tech", 1)
ix.fabrication:Register("torso_sporty_jacket", "tech", 1)
ix.fabrication:Register("zipper_taupe", "tech", 1)
ix.fabrication:Register("overcoat_teal", "tech", 1)
ix.fabrication:Register("weather_teal", "tech", 1)
ix.fabrication:Register("weather_white", "tech", 1)
ix.fabrication:Register("raincoat_yellow", "tech", 1)
ix.fabrication:Register("weather_yellow", "tech", 1)
ix.fabrication:Register("torso_grey_jacket", "tech", 1)
ix.fabrication:Register("shoes_heels", "advancedtech", 4) -- It's well known that heels & dress shoes are actually bulletproof which is why they cost 500cr each...
ix.fabrication:Register("shoes_dress_shoes", "advancedtech", 4)
ix.fabrication:Register("vortigaunt_head_fedora", "tech", 3)
ix.fabrication:Register("vortigaunt_bandana", "tech", 1)
ix.fabrication:Register("vortigaunt_head_chefhat", "tech", 2)
ix.fabrication:Register("vortigaunt_head_hardhat", "tech", 2)
ix.fabrication:Register("vortigaunt_head_flatcap", "tech", 2)
ix.fabrication:Register("vortigaunt_head_boonie", "tech", 2)
ix.fabrication:Register("vortigaunt_torso_hoodie", "tech", 2)
ix.fabrication:Register("vortigaunt_torso_sweater", "tech", 2)
ix.fabrication:Register("vortigaunt_torso_light", "tech", 2)
ix.fabrication:Register("vortigaunt_torso_light2", "tech", 2)
ix.fabrication:Register("vortigaunt_bandages", "tech", 2)
ix.fabrication:Register("vortigaunt_belt", "tech", 2)
-- Ingredients --
ix.fabrication:Register("ing_herbs", "bio", 1)
ix.fabrication:Register("ing_margarine", "bio", 1)
ix.fabrication:Register("ing_noodles", "bio", 1)
ix.fabrication:Register("ing_spices", "bio", 1)
ix.fabrication:Register("ing_protein", "bio", 1)
ix.fabrication:Register("ing_sweet", "bio", 1)
ix.fabrication:Register("ing_salt", "bio", 1)
ix.fabrication:Register("ing_vegetable_pack", "bio", 1)
ix.fabrication:Register("ing_coffee_powder", "bio", 1)
-- Materials / Crafting --
ix.fabrication:Register("comp_scrap", "tech", 1)
ix.fabrication:Register("comp_cloth", "tech", 1)
ix.fabrication:Register("comp_plastic", "tech", 1)
ix.fabrication:Register("comp_screws", "tech", 1)
ix.fabrication:Register("comp_electronics", "tech", 1)
ix.fabrication:Register("comp_adhesive", "tech", 2)
ix.fabrication:Register("comp_charcoal", "tech", 2)
ix.fabrication:Register("comp_wood", "tech", 1)
ix.fabrication:Register("crafting_water", "bio", 1)
ix.fabrication:Register("drug_artificialfun", "bio", 2)
ix.fabrication:Register("comp_condensed_resin", "tech", 10)
ix.fabrication:Register("ing_flour", "bio", 1)
ix.fabrication:Register("ing_vinegar", "bio", 1)
-- Medical --
ix.fabrication:Register("comp_syringe", "tech", 1)
ix.fabrication:Register("comp_alcohol", "bio", 1)
ix.fabrication:Register("comp_chemicals", "bio", 2)
ix.fabrication:Register("bandage", "bio", 1)
ix.fabrication:Register("drink_saline", "bio", 2)
-- Tools --
ix.fabrication:Register("tool_scissors", "tech", 1)
ix.fabrication:Register("tool_spoon", "tech", 1)
ix.fabrication:Register("tool_wrench", "tech", 1)
ix.fabrication:Register("tool_toolkit", "tech", 4)
ix.fabrication:Register("buildingmaterials", "advancedtech", 1)
ix.fabrication:Register("tool_fryingpan", "tech", 1)
ix.fabrication:Register("tool_kettle", "tech", 1)
ix.fabrication:Register("tool_cookingpot", "tech", 1)
ix.fabrication:Register("tool_knife", "tech", 1)
ix.fabrication:Register("flashlight", "tech", 1)
ix.fabrication:Register("cont_lock_t1", "tech", 2)
ix.fabrication:Register("highquality_filter", "advancedtech", 1)
ix.fabrication:Register("tool_coffeemachine", "tech", 4)
ix.fabrication:Register("zippolighter", "tech", 2)
-- Melee Weapons --
ix.fabrication:Register("leadpipe", "tech", 2)
ix.fabrication:Register("clawhammer", "tech", 3)
ix.fabrication:Register("cleaver", "tech", 3)
ix.fabrication:Register("fireaxe", "advancedtech", 1)
ix.fabrication:Register("crowbar", "advancedtech", 1)
ix.fabrication:Register("fubar", "advancedtech", 2)
ix.fabrication:Register("hatchet", "tech", 4)
ix.fabrication:Register("kitknife", "tech", 1)
ix.fabrication:Register("machete", "tech", 3)
ix.fabrication:Register("pickaxe", "advancedtech", 1)
ix.fabrication:Register("sledgehammer", "advancedtech", 1)
ix.fabrication:Register("spade", "tech", 4)
ix.fabrication:Register("wrench", "tech", 3)
ix.fabrication:Register("riotshield", "advancedtech", 2)
-- Combine --
ix.fabrication:Register("tool_repair", "advancedtech", 2)
ix.fabrication:Register("rappel_gear", "advancedtech", 2)
ix.fabrication:Register("vortigaunt_slave_collar", "advancedtech", 1)
ix.fabrication:Register("vortigaunt_slave_hooks", "advancedtech", 1)
ix.fabrication:Register("vortigaunt_slave_shackles", "advancedtech", 1)
ix.fabrication:Register("combinelock", "advancedtech", 1)
ix.fabrication:Register("cwulock", "advancedtech", 1)
ix.fabrication:Register("cmrulock", "advancedtech", 1)
ix.fabrication:Register("doblock", "advancedtech", 1)
ix.fabrication:Register("moelock", "advancedtech", 1)
-- Electronic --
ix.fabrication:Register("grouplock", "advancedtech", 1)
ix.fabrication:Register("infestation_detector", "tech", 2)
ix.fabrication:Register("floppydisk", "advancedtech", 1)
ix.fabrication:Register("handheld_radio", "advancedtech", 1)
ix.fabrication:Register("musicradio_cmb", "advancedtech", 2)
-- Gear --
ix.fabrication:Register("smallbag", "advancedtech", 1)
ix.fabrication:Register("largebag", "advancedtech", 2)
ix.fabrication:Register("bullet_pouch", "advancedtech", 1)
ix.fabrication:Register("mag_pouch", "advancedtech", 1)
ix.fabrication:Register("medical_pouch", "advancedtech", 1)
ix.fabrication:Register("pos_terminal", "tech", 4)
-- Misc --
ix.fabrication:Register("paper", "bio", 1)
ix.fabrication:Register("black_ink", "bio", 2)
ix.fabrication:Register("notepad", "bio", 2)
ix.fabrication:Register("book", "bio", 3)
ix.fabrication:Register("lighter", "bio", 2)
ix.fabrication:Register("suitcase", "tech", 2)
ix.fabrication:Register("pin", "tech", 1)
ix.fabrication:Register("makeshift_filter", "advancedtech", 1)

View File

@@ -0,0 +1,107 @@
--[[
| 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/
--]]
PLUGIN.name = "Willard Factory"
PLUGIN.author = "Aspect™"
PLUGIN.description = "Adds various features and machinery used in workshifts."
PLUGIN.chargeIndicatorColors = {
[0] = Color(255, 0, 0),
[1] = Color(255, 150, 0),
[2] = Color(255, 0, 255),
[3] = Color(150, 0, 255),
[4] = Color(255, 255, 0),
[5] = Color(150, 255, 0),
[6] = Color(0, 255, 0),
[7] = Color(0, 0, 255),
[8] = Color(0, 100, 255),
[9] = Color(0, 255, 150),
[10] = Color(0, 255, 255)
}
ix.command.Add("LinkShopTerminal", {
description = "Link shop terminal to an actual shop.",
arguments = {
ix.type.text,
},
adminOnly = true,
OnRun = function(self, client, shop)
local tr = client:GetEyeTrace()
local terminal = tr.Entity
if !IsValid(terminal) or terminal:GetClass() != "ix_shopterminal" then
return client:NotifyLocalized("You must look on a shop terminal!")
end
local successCheck = terminal:SetShop(shop)
if successCheck then
client:NotifyLocalized(successCheck)
else
client:NotifyLocalized("Success!")
end
end
})
ix.command.Add("SetShopTerminalSC", {
description = "Manage shop terminal's social credits requirement.",
arguments = {
ix.type.number,
},
adminOnly = true,
OnRun = function(self, client, sc)
local tr = client:GetEyeTrace()
local terminal = tr.Entity
if !IsValid(terminal) or terminal:GetClass() != "ix_shopterminal" then
return client:NotifyLocalized("You must look on a shop terminal!")
end
local successCheck = terminal:SetShopSocialCreditReq(sc)
if successCheck then
client:NotifyLocalized(successCheck)
else
client:NotifyLocalized("Success!")
end
end
})
ix.command.Add("SetShopTerminalCost", {
description = "Manage shop terminal's first pay cost.",
arguments = {
ix.type.number,
},
adminOnly = true,
OnRun = function(self, client, cost)
local tr = client:GetEyeTrace()
local terminal = tr.Entity
if !IsValid(terminal) or terminal:GetClass() != "ix_shopterminal" then
return client:NotifyLocalized("You must look on a shop terminal!")
end
local successCheck = terminal:SetShopCost(cost)
if successCheck then
client:NotifyLocalized(successCheck)
else
client:NotifyLocalized("Success!")
end
end
})
ix.util.Include("sv_hooks.lua")
ix.util.Include("sv_plugin.lua")
ix.util.IncludeDir(PLUGIN.folder .. "/3d2d", true)
ix.util.IncludeDir(PLUGIN.folder .. "/meta", true)
ix.util.Include("sh_fabrication_list.lua")
ix.config.Add("broadcastSound", "ambience/3d-sounds/alarms/workshiftalarm.ogg", "The sound that should play when someone broadcasts via CWU terminal.", nil, {
category = "City Fund"
})

View File

@@ -0,0 +1,31 @@
--[[
| 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/
--]]
function PLUGIN:CanPlayerTakeItem(client, item)
if (!item.inUse) then return end
client:Notify("Nie można zabrać przedmiotu używanego przez maszynę!")
return false
end
function PLUGIN:PostPlayerSay(client, chatType, message)
if (chatType != "ic") then return end
if (message == "" or message == " ") then return end
local terminal = client:GetEyeTraceNoCursor().Entity
if (!terminal or client:EyePos():DistToSqr(terminal:GetPos()) > 10000) then return end
--if (!terminal:GetNetVar("authenticated")) then return end
if (!terminal:GetNetVar("broadcasting")) then return end
--ix.chat.Send(nil, "broadcast", message, false, nil, {speakerName = "Broadcast System"})
ix.chat.Send(client, "broadcast", message, false, nil, {speakerName = "Rozgłośnia"})
end

View File

@@ -0,0 +1,68 @@
--[[
| 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/
--]]
util.AddNetworkString("ixBatteryChargerUse")
function PLUGIN:EntityRemoved(ent)
if (ent:GetClass() == "ix_item") then
if (ent:GetItemID() == "id_card" and ent.attached and IsValid(ent.attached)) then
ent.attached:OnCIDDetach()
ent.attached:SetCID(-1)
elseif (ent:GetItemID() == "datadisc" and ent.attached and IsValid(ent.attached)) then
ent.attached:OnDiscDetach()
elseif (ent:GetItemID() == "cwu_card" and ent.attached and IsValid(ent.attached)) then
ent.attached:OnCWUCardDetach()
ent.attached:SetCWUCard(-1)
end
if ent.dispenser and IsValid(ent.dispenser) then
ent.dispenser.dispensedObject = nil
ent.dispenser:OnDispensedItemTaken()
end
end
end
ix.saveEnts:RegisterEntity("ix_shopterminal", true, true, true, {
OnSave = function(entity, data) --OnSave
data.shop = entity:GetShop()
data.cost = entity:GetShopCost()
data.scReq = entity:GetShopSocialCreditReq()
end,
OnRestore = function(entity, data) --OnRestore
timer.Simple( 60, function() -- For some reason, I think when the entity initializes it resets these values. So I did this timer in my branch to fix it - it's not a permanent solution but it works for now.
entity:SetShop(data.shop)
entity:SetShopCost(data.cost)
entity:SetShopSocialCreditReq(data.scReq)
end )
end,
})
ix.saveEnts:RegisterEntity("ix_cwuterminal", true, true, true, {
OnSave = function(entity, data) --OnSave
return {pos = data.pos, angles = data.angles, motion = false}
end,
})
ix.saveEnts:RegisterEntity("ix_discscanner", true, true, true, {
OnSave = function(entity, data) --OnSave
return {pos = data.pos, angles = data.angles, motion = false}
end,
})
ix.saveEnts:RegisterEntity("ix_fabricator", true, true, true, {
OnSave = function(entity, data) --OnSave
return {pos = data.pos, angles = data.angles, motion = false}
end,
})
ix.saveEnts:RegisterEntity("ix_batterycharger", true, true, true, {
OnSave = function(entity, data) --OnSave
return {pos = data.pos, angles = data.angles, motion = false}
end,
})