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

352 lines
8.4 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. 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 = "Static Texts"
PLUGIN.author = "AleXXX_007"
PLUGIN.description = "Permet aux joueurs de placer des textes statiques sur la carte."
local texts = PLUGIN.texts or {}
PLUGIN.texts = texts
CAMI.RegisterPrivilege({
Name = "Helix - Increased Text Limit",
MinAccess = "admin"
})
ix.config.Add("staticTextLifeTime", 240, "Délai avant la suppression du texte statique (MINUTES)", nil, {
data = {min = 1, max = 10080},
category = "Autres"
})
ix.config.Add("staticTextIncreasedLimit", 5, "L'augmentation de la limite de texte statique.", nil, {
data = {min = 2, max = 50},
category = "Autres"
})
do
local COMMAND = {}
COMMAND.description = "Ajoutez du texte statique décrivant l'environnement."
COMMAND.arguments = ix.type.text
COMMAND.alias = {"StaticTextAdd", "SceneTextAdd"}
function COMMAND:OnRun(client, text)
local curTime = CurTime()
local currentMap = game.GetMap()
if (client.nextStaticText and client.nextStaticText >= curTime) then
client:NotifyLocalized("notNow")
return
end
if (text == "") then
return
end
local pos = client:GetPos()
local count = 0
for k, v in pairs(texts) do
if (v.map == currentMap and v.pos:DistToSqr(pos) < 50 * 50) then
client:Notify("Too close to other text!")
return
end
if (v.steamid == client:SteamID() and v.map == currentMap) then
count = count + 1
end
end
if (!CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands")) then
if (CAMI.PlayerHasAccess(client, "Helix - Increased Text Limit")) then
if (count >= ix.config.Get("staticTextIncreasedLimit")) then
client:Notify("Vous avez atteint la limite de texte statique, veuillez en supprimer au moins un avant d'en ajouter un nouveau.")
return
end
else
client:Notify("Vous avez déjà placé du texte statique, supprimez-le avant d'en ajouter un nouveau.")
return
end
end
local data = {
pos = pos + Vector(0, 0, 30),
text = text,
name = client:GetName(),
steamid = client:SteamID(),
time = os.date("%d/%m/%y %X", os.time()),
map = currentMap
}
PLUGIN:AddStaticText(data)
client.nextStaticText = curTime + 5
client:Notify("Static text added.")
ix.log.Add(client, "staticTextAdded", text)
end
ix.command.Add("SceneText", COMMAND)
end
do
local COMMAND = {}
COMMAND.description = "Ajouter un texte statique permanent décrivant l'environnement."
COMMAND.arguments = ix.type.text
COMMAND.alias = {"AdminStaticTextAdd", "AdminSceneTextAdd"}
COMMAND.adminOnly = true
function COMMAND:OnRun(client, text)
local curTime = CurTime()
if (client.nextStaticText and client.nextStaticText >= curTime) then
client:NotifyLocalized("notNow")
return
end
if (text == "") then
return
end
local pos = client:GetPos()
for k, v in pairs(texts) do
if (v.pos:DistToSqr(pos) < 50 * 50) then
client:Notify("Trop proche d'un autre texte !")
return
end
end
local data = {
pos = pos + Vector(0, 0, 30),
text = text,
name = client:GetName(),
steamid = client:SteamID(),
time = os.date("%d/%m/%y %X", os.time()),
permanent = true
}
PLUGIN:AddStaticText(data)
client.nextStaticText = curTime + 5
client:Notify("Texte statique ajouté.")
ix.log.Add(client, "staticTextAdded", text)
end
ix.command.Add("AdminSceneText", COMMAND)
end
do
local COMMAND = {}
COMMAND.description = "Remove static text."
COMMAND.alias = {"StaticTextRemove", "RemoveSceneText"}
function COMMAND:OnRun(client)
local trace = client:GetEyeTraceNoCursor()
if (trace.Hit) then
local pos = trace.HitPos
for k, v in pairs(texts) do
if (v.pos:DistToSqr(pos) < 50 * 50) then
if (v.steamid == client:SteamID() or CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands")) then
PLUGIN:RemoveStaticText(k)
client:Notify("Static text removed.")
ix.log.Add(client, "staticTextRemoved", v)
else
client:Notify("Vous n'êtes pas autorisé à supprimer ce texte.")
end
return
end
end
end
end
ix.command.Add("SceneTextRemove", COMMAND)
end
do
local COMMAND = {}
COMMAND.description = "Supprimez tout le texte statique que vous possédez."
COMMAND.alias = {"StaticTextRemoveAll", "RemoveSceneTextAll"}
function COMMAND:OnRun(client)
local steamID = client:SteamID()
local textCount = 0
for _, data in pairs(texts) do
if (data.steamid == steamID) then
textCount = textCount + 1
end
end
if (textCount > 0) then
for i = 1, textCount do -- This is kinda dumb but I couldn't be arsed to change how texts are stored; it's not like it's a huge performance hit.
for id, data in ipairs(texts) do
if (data.steamid == steamID) then
PLUGIN:RemoveStaticText(id)
ix.log.Add(client, "staticTextRemoved", data)
break
end
end
end
client:Notify("Vous avez supprimé " .. textCount .. " textes statiques.")
else
client:Notify("Vous ne possédez aucun texte statique !")
end
end
ix.command.Add("SceneTextRemoveAll", COMMAND)
end
if (CLIENT) then
local nextCheck = -1
local function CanSee(client, clientPos, data)
local curTime = CurTime()
if (nextCheck <= curTime or !data.visible) then
local trace = util.TraceLine({
start = clientPos,
endpos = data.pos,
mask = MASK_SOLID_BRUSHONLY
})
data.visible = !trace.hit
end
return data.visible
end
function PLUGIN:HUDPaint()
if (texts and !table.IsEmpty(texts)) then
local client = LocalPlayer()
local clientPos = client:EyePos()
local scrW = ScrW()
local cx, cy = scrW * 0.5, ScrH() * 0.5
local hasPermission = CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands")
for k, v in pairs(texts) do
if (clientPos:DistToSqr(v.pos) <= 300 * 300 and CanSee(client, clientPos, v)) then
local pos = v.pos:ToScreen()
local camMult = (1 - math.Distance(cx, cy, pos.x, pos.y) / scrW * 1.5)
local distanceMult = (1 - clientPos:Distance(v.pos) * 0.003) -- 0.003 == 1/300
local alpha = 255 * camMult * distanceMult
local col1, col2 = Color(255, 255, 255, alpha), Color(0, 0, 0, alpha)
local font = "ixGenericFont"
surface.SetFont(font)
local _, fullH = surface.GetTextSize(v.text)
local lines = ix.util.WrapText(v.text, scrW * 0.25, font)
if (input.IsKeyDown(KEY_LALT) and hasPermission) then
table.insert(lines, v.name.." ("..v.steamid..")")
table.insert(lines, v.time)
end
local offset = 4
local curY = pos.y - ((fullH + offset) * #lines) / 2
for k1, v1 in pairs(lines) do
local w, h = surface.GetTextSize(v1)
draw.SimpleTextOutlined(v1, font, pos.x - w / 2, curY, col1, nil, nil, 1, col2)
curY = curY + h + offset
end
end
end
end
end
netstream.Hook("ixStaticTextAdd", function(data)
table.insert(texts, data)
end)
netstream.Hook("ixStaticTextRemove", function(id)
table.remove(texts, id)
end)
netstream.Hook("ixStaticTextSet", function(data)
texts = data
end)
else
ix.log.AddType("staticTextAdded", function(client, text)
return string.format("%s has added static text: %s", client:GetName(), text)
end)
ix.log.AddType("staticTextRemoved", function(client, text)
return string.format("%s has removed static text: %s", client:GetName(), text)
end)
function PLUGIN:AddStaticText(data)
netstream.Start(nil, "ixStaticTextAdd", data)
local id = table.insert(texts, data)
if (data.permanent) then return end
timer.Create("ixStaticText"..id, data.timeLeft or ix.config.Get("staticTextLifeTime", 240) * 60, 1, function()
self:RemoveStaticText(id)
end)
end
function PLUGIN:RemoveStaticText(id)
table.remove(texts, id)
local timerId = "ixStaticText"..id
if (timer.Exists(timerId)) then
timer.Remove(timerId)
end
netstream.Start(nil, "ixStaticTextRemove", id)
end
function PLUGIN:PlayerInitialSpawn(client)
timer.Simple(2, function()
netstream.Start(client, "ixStaticTextSet", texts)
end)
end
function PLUGIN:SaveData()
for k, v in pairs(texts) do
local timerId = "ixStaticText"..k
if (timer.Exists(timerId)) then
v.timeLeft = timer.TimeLeft(timerId)
end
end
ix.data.Set("statictexts", texts)
end
function PLUGIN:LoadData()
local loaded = ix.data.Get("statictexts", {})
for k, v in pairs(loaded) do
self:AddStaticText(v)
end
end
end