Files
wnsrc/gamemodes/darkrp/plugins/textscreen.lua
lifestorm 94063e4369 Upload
2024-08-04 22:55:00 +03:00

302 lines
8.7 KiB
Lua

--[[
| This file was obtained through the combined efforts
| of Madbluntz & Plymouth Antiquarian Society.
|
| Credits: lifestorm, Gregory Wayne Rossel JR.,
| Maloy, DrPepper10 @ RIP, Atle!
|
| Visit for more: https://plymouth.thetwilightzone.ru/
--]]
local PLUGIN = PLUGIN
PLUGIN.name = "Text Screen"
PLUGIN.author = "M!NT"
PLUGIN.description = "A custom text screen that can be put on user's display."
PLUGIN.textLines = {}
PLUGIN.targetSoundFile = ""
PLUGIN.active = false
PLUGIN.fadeOut = false
PLUGIN.colorBWFadeInMultiple = 0.005
CAMI.RegisterPrivilege({
Name = "Helix - Manage Text Screen",
MinAccess = "admin"
})
ix.command.Add("EditTextScreen", {
description = "Edit the text screen.",
privilege = "Manage Text Screen",
OnRun = function(self, client)
if (SERVER) then netstream.Start(client, "EditTextScreen") end
end
})
ix.command.Add("EnterTextScreen", {
description = "Plays currently configured text screen to all players on the servers.",
privilege = "Manage Text Screen",
OnRun = function(self, client)
if (SERVER) then
for _, v in pairs(player.GetAll()) do
netstream.Start(v, "TextScreenShow")
end
end
end
})
ix.config.Add(
"Text Screen Fade In Time",
3,
"How long the text screen should fade in for in seconds",
nil,
{
data = {min = 1, max = 240},
category = "Text Screen"
}
)
ix.config.Add(
"Text Screen Fade Out Time",
3,
"How long the text screen should fade out for in seconds",
nil,
{
data = {min = 1, max = 240},
category = "Text Screen"
}
)
ix.config.Add(
"Text Screen Freeze Time",
3,
"How long the text screen should remain at full alpha in seconds",
nil,
{
data = {min = 1, max = 240},
category = "Text Screen"
}
)
ix.config.Add(
"Text Screen Text Font",
"DermaLarge",
"How long the text screen should remain at full alpha in seconds",
nil,
{category = "Text Screen"}
)
ix.config.Add(
"Text Screen Text Font Vertical Spacing",
40,
"How long the text screen should remain at full alpha in seconds",
nil,
{
data = {min = 10, max = 255},
category = "Text Screen"
}
)
ix.config.Add(
"Text Screen Fade In Alpha",
255,
"Maximum alpha (0-255) that the background can fade into",
nil,
{
data = {min = 0, max = 255},
category = "Text Screen"
}
)
ix.config.Add(
"Text Screen Fade In Text Line Offset",
1,
"Seconds of delay between lines of text fading in",
nil,
{
data = {min = 0.0, max = 9.9},
category = "Text Screen"
}
)
if (CLIENT) then
local colorBW = {
["$pp_colour_addr"] = 0,
["$pp_colour_addg"] = 0,
["$pp_colour_addb"] = 0,
["$pp_colour_brightness"] = 0,
["$pp_colour_contrast"] = 1,
["$pp_colour_colour"] = 1,
["$pp_colour_mulr"] = 0,
["$pp_colour_mulg"] = 0,
["$pp_colour_mulb"] = 0
}
local function multiplyBWShader(multiple)
colorBW["$pp_colour_colour"] = math.Clamp(colorBW["$pp_colour_colour"] + multiple, 0.1, 1.1)
end
netstream.Hook("EditTextScreen", function()
vgui.Create("ixTextScreenEditor")
end)
netstream.Hook("TextScreenShow", function()
vgui.Create("ixTextScreenShow")
PLUGIN.active = true
end)
net.Receive("UpdateTextScreenText", function(len, ply)
if (IsValid(ply) and ply:IsPlayer()) then
return
else
PLUGIN.textLines = ix.compnettable:Read()
PLUGIN.targetSoundFile = net.ReadString()
end
end)
local FadeInPanel = {}
function FadeInPanel:Init()
self:SetSize(ScrW(), ScrH())
self:SetDraggable(false)
self:ShowCloseButton(false)
self:SetAlpha(0)
self:SetTitle(" ")
self.Paint = function(this, w, h)
surface.SetDrawColor(0, 0, 0, ix.config.Get("Text Screen Fade In Alpha"))
surface.DrawRect(0, 0, w, h)
Derma_DrawBackgroundBlur(this, 1)
end
local height = (ScrH() / 2) - (#PLUGIN.textLines * ix.config.Get("Text Screen Text Font Vertical Spacing"))
local fadeInStep = 0
for k, str in pairs(PLUGIN.textLines) do
local line = self:Add("DLabel")
line:SetFont(ix.config.Get("Text Screen Text Font"))
line:SetColor(Color(255, 255, 255, 255))
line:SetText(tostring(str))
line:SizeToContents()
line:SetPos(0, height)
height = height + ix.config.Get("Text Screen Text Font Vertical Spacing")
fadeInStep = fadeInStep + ix.config.Get("Text Screen Fade In Text Line Offset")
line:CenterHorizontal()
line:SetAlpha(0)
line:AlphaTo(255, fadeInStep, fadeInStep, function() return end)
end
self:SetContentAlignment(5)
if (PLUGIN.targetSoundFile and PLUGIN.targetSoundFile != "") then
surface.PlaySound(PLUGIN.targetSoundFile)
end
PLUGIN.fadeOut = false
self:AlphaTo(255, ix.config.Get("Text Screen Fade In Time"), 0, function()
timer.Create("RemoveTextScreen", ix.config.Get("Text Screen Freeze Time"), 1, function()
PLUGIN.fadeOut = true
self:AlphaTo(0, ix.config.Get("Text Screen Fade Out Time"), 0, function()
self:Remove()
PLUGIN.active = false
end)
end)
end)
end
vgui.Register("ixTextScreenShow", FadeInPanel, "DFrame")
local EditPanel = {}
function EditPanel:Init()
self:SetSize(ScrW(), ScrH())
self.Paint = function(this, w, h)
surface.SetDrawColor(Color(63, 58, 115, 220))
surface.DrawRect(0, 0, w, h)
Derma_DrawBackgroundBlur(this, 1)
end
self.content = self:Add("EditablePanel")
self.content:SetSize(500, 650)
self.content:Center()
self.content:MakePopup()
self.content.Paint = function(this, w, h)
surface.SetDrawColor(0, 0, 0, 130)
surface.DrawRect(0, 0, w, h)
end
local textEntry = self.content:Add("DTextEntry")
textEntry:SetMultiline(true)
textEntry:SetSize(500, 400)
textEntry:Dock(TOP)
textEntry:DockMargin(10, 10, 10, 0)
textEntry:CenterHorizontal()
local currentValue = ""
for _, v in ipairs(PLUGIN.textLines) do
currentValue = currentValue.."\n"..v
end
textEntry:SetValue(currentValue)
local textEntrySoundFile = self.content:Add("DTextEntry")
textEntrySoundFile:SetMultiline(false)
textEntrySoundFile:SetSize(500, 75)
textEntrySoundFile:Dock(TOP)
textEntrySoundFile:DockMargin(10, 10, 10, 20)
textEntrySoundFile:CenterHorizontal()
textEntrySoundFile:SetValue(PLUGIN.targetSoundFile)
local saveOrReset = self.content:Add("Panel")
saveOrReset:Dock(BOTTOM)
saveOrReset:SetTall(75)
local save = saveOrReset:Add("DButton")
save:Dock(LEFT)
save:SetWide(self.content:GetWide() * 0.5)
save:SetText("SAVE")
save:SetFont("DermaLarge")
save.DoClick = function()
PLUGIN.textLines = {}
for line in textEntry:GetValue():gmatch('[^\n]+') do
PLUGIN.textLines[#PLUGIN.textLines + 1] = line
end
netstream.Start(
"TextScreenEditText",
PLUGIN.textLines,
textEntrySoundFile:GetValue()
)
end
local reset = saveOrReset:Add("DButton")
reset:Dock(FILL)
reset:SetText("RESET")
reset:SetFont("DermaLarge")
reset.DoClick = function()
PLUGIN.textLines = {}
textEntry:SetValue("")
netstream.Start("TextScreenEditText", {})
end
end
vgui.Register("ixTextScreenEditor", EditPanel, "DFrame")
function PLUGIN:RenderScreenspaceEffects()
if (PLUGIN.fadeOut == false and PLUGIN.active) then
multiplyBWShader(PLUGIN.colorBWFadeInMultiple * -1)
elseif (colorBW["$pp_colour_colour"] < 1) then
multiplyBWShader(PLUGIN.colorBWFadeInMultiple)
end
DrawColorModify(colorBW)
end
end
if (SERVER) then
util.AddNetworkString("UpdateTextScreenText")
netstream.Hook("TextScreenEditText", function(client, textLines, soundFile)
if !client:IsAdmin() then return end
PLUGIN.textLines = textLines
net.Start("UpdateTextScreenText")
ix.compnettable:Write(textLines)
net.WriteString(soundFile)
net.Broadcast()
client:NotifyLocalized("Updated event screen.")
end)
end