mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
Upload
This commit is contained in:
281
lua/arccw/shared/sh_loadatts.lua
Normal file
281
lua/arccw/shared/sh_loadatts.lua
Normal file
@@ -0,0 +1,281 @@
|
||||
--[[
|
||||
| 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/
|
||||
--]]
|
||||
|
||||
ArcCW = ArcCW or {}
|
||||
ArcCW.AttachmentTable = {}
|
||||
ArcCW.AttachmentIDTable = {}
|
||||
ArcCW.AttachmentSlotTable = {}
|
||||
ArcCW.AttachmentBlacklistTable = {}
|
||||
ArcCW.NumAttachments = 1
|
||||
ArcCW.GenerateAttEntities = true
|
||||
|
||||
ArcCW.AttachmentCachedLists = {}
|
||||
|
||||
local shortname = ""
|
||||
local genAttCvar = ArcCW.ConVars["reloadatts_registerentities"]
|
||||
|
||||
function ArcCW.LoadAttachmentType(att, name)
|
||||
if name == "" then return end
|
||||
name = name or shortname
|
||||
|
||||
if !att.Ignore or ArcCW.ConVars["reloadatts_showignored"]:GetBool() then
|
||||
ArcCW.AttachmentTable[name] = att
|
||||
ArcCW.AttachmentIDTable[ArcCW.NumAttachments] = name
|
||||
|
||||
att.Blacklisted = false
|
||||
att.ShortName = name
|
||||
|
||||
if !ArcCW.AttachmentSlotTable[att.Slot] then
|
||||
ArcCW.AttachmentSlotTable[att.Slot] = {}
|
||||
end
|
||||
table.insert(ArcCW.AttachmentSlotTable[att.Slot], ArcCW.NumAttachments)
|
||||
|
||||
att.ID = ArcCW.NumAttachments
|
||||
|
||||
if genAttCvar:GetBool() and !att.DoNotRegister and !att.InvAtt and !att.Free then
|
||||
local attent = {}
|
||||
attent.Base = "arccw_att_base"
|
||||
if CLIENT and att.Icon then
|
||||
attent.IconOverride = string.Replace( att.Icon:GetTexture( "$basetexture" ):GetName() .. ".png", "0001010", "" )
|
||||
end
|
||||
attent.PrintName = att.PrintName or name
|
||||
attent.Spawnable = att.Spawnable or true
|
||||
attent.AdminOnly = att.AdminOnly or false
|
||||
attent.Category = att.EntityCategory or "ArcCW - Attachments"
|
||||
attent.Model = att.DroppedModel or att.Model or "models/Items/BoxSRounds.mdl"
|
||||
attent.GiveAttachments = {
|
||||
[att.ShortName] = 1
|
||||
}
|
||||
|
||||
if att.EntityCategory and !list.HasEntry("ContentCategoryIcons", att.EntityCategory) then
|
||||
list.Set("ContentCategoryIcons", att.EntityCategory, "arccw/icon_16.png")
|
||||
end
|
||||
|
||||
scripted_ents.Register( attent, "acwatt_" .. name )
|
||||
end
|
||||
|
||||
ArcCW.NumAttachments = ArcCW.NumAttachments + 1
|
||||
|
||||
hook.Run("ArcCW_OnAttLoad", att)
|
||||
end
|
||||
end
|
||||
|
||||
local function VerifyBlacklist()
|
||||
for attName, v in pairs(ArcCW.AttachmentBlacklistTable) do
|
||||
if !ArcCW.AttachmentTable[attName] then
|
||||
ArcCW.AttachmentBlacklistTable[attName] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function ArcCW_SendBlacklist(ply)
|
||||
if SERVER then
|
||||
-- Only load if table is empty, bruh
|
||||
if table.IsEmpty(ArcCW.AttachmentBlacklistTable) then
|
||||
ArcCW.AttachmentBlacklistTable = util.JSONToTable(file.Read("arccw_blacklist.txt") or "") or {}
|
||||
local curcount = table.Count(ArcCW.AttachmentBlacklistTable)
|
||||
VerifyBlacklist()
|
||||
print("Loaded " .. curcount .. " active (" .. curcount .. " total) blacklisted ArcCW attachments.")
|
||||
end
|
||||
if ArcCW.AttachmentBlacklistTable and player.GetCount() > 0 then
|
||||
timer.Simple(0, function()
|
||||
net.Start("arccw_blacklist")
|
||||
net.WriteUInt(table.Count(ArcCW.AttachmentBlacklistTable), ArcCW.GetBitNecessity())
|
||||
for attName, bStatus in pairs(ArcCW.AttachmentBlacklistTable) do
|
||||
net.WriteUInt(ArcCW.AttachmentTable[attName].ID, ArcCW.GetBitNecessity())
|
||||
end
|
||||
if ply then net.Send(ply) else net.Broadcast() end
|
||||
end)
|
||||
end
|
||||
elseif CLIENT and ArcCW.AttachmentBlacklistTable == nil then
|
||||
-- Actively request the table, this happens on player load into server once
|
||||
net.Start("arccw_blacklist")
|
||||
net.WriteBool(true)
|
||||
net.SendToServer()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local attachments_path = "arccw/shared/attachments/"
|
||||
local bulk_path = "arccw/shared/attachments_bulk/"
|
||||
|
||||
local function ArcCW_LoadAtt(att_file)
|
||||
att = {} -- Do not bleed over attributes from previous attachments
|
||||
--shortname = string.sub(att_file, 1, -5)
|
||||
local s = string.Explode("/", att_file)
|
||||
shortname = string.sub(s[#s], 1, -5)
|
||||
|
||||
include(att_file)
|
||||
AddCSLuaFile(att_file)
|
||||
|
||||
ArcCW.LoadAttachmentType(att)
|
||||
|
||||
end
|
||||
|
||||
local function ArcCW_LoadFolder(folder)
|
||||
folder = folder and (attachments_path .. folder .. "/") or attachments_path
|
||||
for k, v in pairs(file.Find(folder .. "*", "LUA")) do
|
||||
local yaya, yoyo = pcall(function() ArcCW_LoadAtt(folder .. v) end)
|
||||
if !yaya then
|
||||
print( "!!!! Attachment " .. v .. " has errors!", yoyo )
|
||||
-- Create a stub attachment to prevent customization UI freaking out
|
||||
ArcCW.AttachmentTable[shortname] = {
|
||||
PrintName = shortname or "ERROR",
|
||||
Description = "This attachment failed to load!\nIts file path is: " .. v
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function ArcCW_LoadAtts()
|
||||
ArcCW.AttachmentTable = {}
|
||||
ArcCW.AttachmentIDTable = {}
|
||||
ArcCW.AttachmentSlotTable = {}
|
||||
ArcCW.NumAttachments = 1
|
||||
ArcCW.AttachmentBits = nil
|
||||
ArcCW.AttachmentCachedLists = {}
|
||||
|
||||
ArcCW_LoadFolder()
|
||||
local _, folders = file.Find(attachments_path .. "/*", "LUA")
|
||||
if folders then
|
||||
for _, folder in pairs(folders) do
|
||||
ArcCW_LoadFolder(folder)
|
||||
end
|
||||
end
|
||||
|
||||
local bulkfiles = file.Find(bulk_path .. "/*.lua", "LUA")
|
||||
for _, filename in pairs(bulkfiles) do
|
||||
if filename == "default.lua" then continue end
|
||||
local try = pcall(function()
|
||||
include(bulk_path .. filename)
|
||||
AddCSLuaFile(bulk_path .. filename)
|
||||
end)
|
||||
if !try then
|
||||
print("!!!! Bulk attachment file " .. filename .. " has errors!")
|
||||
end
|
||||
end
|
||||
|
||||
print("Loaded " .. tostring(ArcCW.NumAttachments) .. " ArcCW attachments.")
|
||||
|
||||
if !game.SinglePlayer() then
|
||||
ArcCW_SendBlacklist()
|
||||
else
|
||||
-- Simply read the file and do no networking, since both client/server has access to it
|
||||
ArcCW.AttachmentBlacklistTable = util.JSONToTable(file.Read("arccw_blacklist.txt") or "") or {}
|
||||
for i, v in pairs(ArcCW.AttachmentTable) do
|
||||
v.Blacklisted = ArcCW.AttachmentBlacklistTable[i]
|
||||
end
|
||||
print("Loaded blacklist with " .. table.Count(ArcCW.AttachmentBlacklistTable) .. " attachments.")
|
||||
end
|
||||
|
||||
hook.Run("ArcCW_PostLoadAtts")
|
||||
end
|
||||
|
||||
function ArcCW.GetBitNecessity()
|
||||
if !ArcCW.AttachmentBits then
|
||||
ArcCW.AttachmentBits = math.min(math.ceil(math.log(ArcCW.NumAttachments + 1, 2)), 32)
|
||||
end
|
||||
return ArcCW.AttachmentBits
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
concommand.Add("arccw_reloadatts", function()
|
||||
if !LocalPlayer():IsSuperAdmin() then return end
|
||||
|
||||
net.Start("arccw_reloadatts")
|
||||
net.SendToServer()
|
||||
end)
|
||||
|
||||
net.Receive("arccw_reloadatts", function(len, ply)
|
||||
ArcCW_LoadAtts()
|
||||
end)
|
||||
|
||||
spawnmenu.AddCreationTab( "#spawnmenu.category.entities", function()
|
||||
|
||||
local ctrl = vgui.Create( "SpawnmenuContentPanel" )
|
||||
ctrl:EnableSearch( "entities", "PopulateEntities" )
|
||||
ctrl:CallPopulateHook( "PopulateEntities" )
|
||||
|
||||
return ctrl
|
||||
|
||||
end, "icon16/bricks.png", 20 )
|
||||
|
||||
-- Client receives blacklist table from server and updates itself
|
||||
net.Receive("arccw_blacklist", function()
|
||||
ArcCW.AttachmentBlacklistTable = {}
|
||||
local amt = net.ReadUInt(ArcCW.GetBitNecessity())
|
||||
for i = 1, amt do
|
||||
local id = net.ReadUInt(ArcCW.GetBitNecessity())
|
||||
ArcCW.AttachmentBlacklistTable[ArcCW.AttachmentIDTable[id]] = true
|
||||
end
|
||||
for i, v in pairs(ArcCW.AttachmentTable) do
|
||||
v.Blacklisted = ArcCW.AttachmentBlacklistTable[i]
|
||||
end
|
||||
print("Received blacklist with " .. table.Count(ArcCW.AttachmentBlacklistTable) .. " attachments.")
|
||||
end)
|
||||
|
||||
-- Gets around Listen server spawn issues
|
||||
hook.Add( "InitPostEntity", "Ready", function()
|
||||
if !game.SinglePlayer() then
|
||||
net.Start("arccw_blacklist")
|
||||
net.WriteBool(true)
|
||||
net.SendToServer()
|
||||
end
|
||||
end )
|
||||
elseif SERVER then
|
||||
net.Receive("arccw_reloadatts", function(len, ply)
|
||||
if !ply:IsSuperAdmin() then return end
|
||||
|
||||
ArcCW_LoadAtts()
|
||||
|
||||
net.Start("arccw_reloadatts")
|
||||
net.Broadcast()
|
||||
end)
|
||||
|
||||
local antiSpam = {}
|
||||
net.Receive("arccw_blacklist", function(len, ply)
|
||||
|
||||
-- If this message is a request to get blacklist, send it and return
|
||||
local isRequest = net.ReadBool()
|
||||
if isRequest then
|
||||
if antiSpam[ply] and antiSpam[ply] > CurTime() then return end
|
||||
-- Debounce client request so they can't attempt to spam netmessages
|
||||
antiSpam[ply] = CurTime() + 10
|
||||
|
||||
ArcCW_SendBlacklist(ply)
|
||||
return
|
||||
elseif !isRequest and !ply:IsAdmin() then
|
||||
return
|
||||
end
|
||||
|
||||
-- Server receives admin's changes to blacklist table
|
||||
local amt = net.ReadUInt(ArcCW.GetBitNecessity())
|
||||
ArcCW.AttachmentBlacklistTable = {}
|
||||
for i = 1, amt do
|
||||
local id = net.ReadUInt(ArcCW.GetBitNecessity())
|
||||
local attName = ArcCW.AttachmentIDTable[id]
|
||||
if attName and ArcCW.AttachmentTable[attName] then
|
||||
ArcCW.AttachmentBlacklistTable[attName] = true
|
||||
end
|
||||
end
|
||||
for i, k in pairs(ArcCW.AttachmentTable) do
|
||||
k.Blacklisted = ArcCW.AttachmentBlacklistTable[i] or false
|
||||
end
|
||||
print("Received blacklist with " .. table.Count(ArcCW.AttachmentBlacklistTable) .. " attachments.")
|
||||
file.Write("arccw_blacklist.txt", util.TableToJSON(ArcCW.AttachmentBlacklistTable))
|
||||
ArcCW_SendBlacklist()
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("PostCleanupMap", "ArcCW_ReloadAttsDebug", function()
|
||||
if ArcCW.ConVars["reloadatts_mapcleanup"]:GetBool() then ArcCW_LoadAtts() end
|
||||
end)
|
||||
|
||||
ArcCW_LoadAtts()
|
||||
Reference in New Issue
Block a user