Files
wnsrc/lua/pac3/editor/client/show_outfit_on_use.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

197 lines
5.5 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 L = pace.LanguageString
local MAX_DIST = 270
local input_LookupBinding = input.LookupBinding
local string_upper = string.upper
local pac_onuse_only = CreateClientConVar("pac_onuse_only", "0", true, false, 'Enable "on +use only" mode. Within this mode, outfits are not being actually "loaded" until you hover over player and press your use button')
local pac_onuse_only_override = CreateClientConVar("pac_onuse_only_override", "0", true, false, "Ignore value of pac_onuse_only_force")
local pac_onuse_only_force = CreateConVar("pac_onuse_only_force", "0", FCVAR_REPLICATED, "Sets pac_onuse_only for clients")
function pac.IsPacOnUseOnly()
if pac_onuse_only_override:GetBool() then
return pac_onuse_only:GetBool()
end
return pac_onuse_only_force:GetBool() or pac_onuse_only:GetBool()
end
local pac_IsPacOnUseOnly = pac.IsPacOnUseOnly
hook.Add("PlayerBindPress", "pac_onuse_only", function(ply, bind, isPressed)
if bind ~= "use" and bind ~= "+use" then return end
if bind ~= "+use" and isPressed then return end
if not pac_IsPacOnUseOnly() then return end
local eyes, aim = ply:EyePos(), ply:GetAimVector()
local tr = util.TraceLine({
start = eyes,
endpos = eyes + aim * MAX_DIST,
filter = ply
})
-- if not tr.Hit or not tr.Entity:IsValid() or not tr.Entity:IsPlayer() then return end
if not tr.Hit or not tr.Entity:IsValid() then return end
local ply2 = tr.Entity
if not ply2.pac_onuse_only or not ply2.pac_onuse_only_check then return end
ply2.pac_onuse_only_check = false
pac.ToggleIgnoreEntity(ply2, false, "pac_onuse_only")
end)
do
local lastDisplayLabel = 0
surface.CreateFont("pac_onuse_only_hint", {
font = "Roboto",
size = ScreenScale(16),
weight = 600,
})
hook.Add("HUDPaint", "pac_onuse_only", function()
if not pac_IsPacOnUseOnly() then return end
local ply = pac.LocalPlayer
local eyes, aim = ply:EyePos(), ply:GetAimVector()
local tr = util.TraceLine({
start = eyes,
endpos = eyes + aim * MAX_DIST,
filter = ply
})
if tr.Hit and tr.Entity:IsValid() and tr.Entity.pac_onuse_only and tr.Entity.pac_onuse_only_check then
lastDisplayLabel = RealTime() + 1
end
if lastDisplayLabel < RealTime() then return end
local alpha = (lastDisplayLabel - RealTime()) / 2
local key = string_upper( input_LookupBinding( "use" ) or "use" )
local text = "Press " .. key .. " to reveal this persons PAC3 outfit"
draw.DrawText(L(text), "pac_onuse_only_hint", ScrW() / 2, ScrH() * 0.3, Color(255, 255, 255, alpha * 255), TEXT_ALIGN_CENTER)
end)
end
function pace.OnUseOnlyUpdates(cvar, ...)
hook.Call('pace_OnUseOnlyUpdates', nil, ...)
end
cvars.AddChangeCallback("pac_onuse_only", pace.OnUseOnlyUpdates, "PAC3")
concommand.Add("pac_onuse_reset", function()
for i, ent in ipairs(ents.GetAll()) do
if ent.pac_onuse_only then
ent.pac_onuse_only_check = true
if pac_IsPacOnUseOnly() then
pac.ToggleIgnoreEntity(ent, ent.pac_onuse_only_check, 'pac_onuse_only')
else
pac.ToggleIgnoreEntity(ent, false, 'pac_onuse_only')
end
end
end
end)
local transmissions = {}
timer.Create('pac3_transmissions_ttl', 1, 0, function()
local time = RealTime()
for transmissionID, data in pairs(transmissions) do
if data.activity + 10 < time then
transmissions[transmissionID] = nil
pac.Message('Marking transmission session with id ', transmissionID, ' as dead. Received ', #data.list, ' out from ', data.total, ' parts.')
end
end
end)
function pace.HandleOnUseReceivedData(data)
local validTransmission = isnumber(data.partID) and
isnumber(data.totalParts) and isnumber(data.transmissionID)
if not data.owner.pac_onuse_only then
data.owner.pac_onuse_only = true
-- if TRUE - hide outfit
data.owner.pac_onuse_only_check = true
if pac_IsPacOnUseOnly() then
pac.ToggleIgnoreEntity(data.owner, data.owner.pac_onuse_only_check, 'pac_onuse_only')
else
pac.ToggleIgnoreEntity(data.owner, false, 'pac_onuse_only')
end
end
-- behaviour of this (if one of entities on this hook becomes invalid)
-- is undefined if DLib is not installed, but anyway
hook.Add('pace_OnUseOnlyUpdates', data.owner, function()
if pac_IsPacOnUseOnly() then
pac.ToggleIgnoreEntity(data.owner, data.owner.pac_onuse_only_check, 'pac_onuse_only')
else
pac.ToggleIgnoreEntity(data.owner, false, 'pac_onuse_only')
end
end)
if not validTransmission then
local func = pace.HandleReceiveData(data)
local part_uid
if istable(data.part) and istable(data.part.self) then
part_uid = data.part.self.UniqueID
end
if isfunction(func) then
pac.EntityIgnoreBound(data.owner, func, part_uid)
end
return
end
local trData = transmissions[data.transmissionID]
if not trData then
trData = {
id = data.transmissionID,
total = data.totalParts,
list = {},
activity = RealTime()
}
transmissions[data.transmissionID] = trData
end
local transmissionID = data.transmissionID
data.transmissionID = nil
data.totalParts = nil
data.partID = nil
table.insert(trData.list, data)
trData.activity = RealTime()
if #trData.list == trData.total then
local funcs = {}
for i, part in ipairs(trData.list) do
local func = pace.HandleReceiveData(part)
if isfunction(func) then
table.insert(funcs, func)
end
end
for i, func in ipairs(funcs) do
pac.EntityIgnoreBound(data.owner, func)
end
transmissions[data.transmissionID or transmissionID] = nil
end
end