Files
wnsrc/gamemodes/darkrp/plugins/textscreen.lua
lifestorm 6a58f406b1 Upload
2024-08-04 23:54:45 +03:00

302 lines
8.7 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
| 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("KAYDET")
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("SIFIRLA")
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("Etkinlik ekranı güncellendi.")
end)
end