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

362 lines
7.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/
--]]
-- luacheck: globals pac pace
-- This Library is just for PAC3 Integration.
-- You must install PAC3 to make this library work.
PLUGIN.name = "PAC3 Integration"
PLUGIN.author = "Black Tea"
PLUGIN.description = "PAC3 integration for item parts."
if (!pace) then return end
ix.pac = ix.pac or {}
ix.pac.list = ix.pac.list or {}
CAMI.RegisterPrivilege({
Name = "Helix - Manage PAC",
MinAccess = "superadmin"
})
-- this stores pac3 part information to plugin's table'
function ix.pac.RegisterPart(id, outfit)
ix.pac.list[id] = outfit
end
-- Fixing the PAC3's default stuffs to fit on Helix.
if (CLIENT) then
-- Disable the "in editor" HUD element.
hook.Add("InitializedPlugins", "PAC3Fixer", function()
hook.Remove("HUDPaint", "pac_in_editor")
end)
-- Remove PAC3 LoadParts
function pace.LoadParts(name, clear, override_part) end
-- Prohibits players from deleting their own PAC3 outfit.
concommand.Add("pac_clear_parts", function()
RunConsoleCommand("pac_restart")
end)
-- you need the proper permission to open the editor
function PLUGIN:PrePACEditorOpen()
if (!CAMI.PlayerHasAccess(LocalPlayer(), "Helix - Manage PAC", nil)) then
return false
end
end
end
function PLUGIN:pac_CanWearParts(client)
if (!CAMI.PlayerHasAccess(client, "Helix - Manage PAC", nil)) then
return false
end
end
local meta = FindMetaTable("Player")
-- Get Player's PAC3 Parts.
function meta:GetParts()
if (!pac) then return end
return self:GetNetVar("parts", {})
end
if (SERVER) then
util.AddNetworkString("ixPartWear")
util.AddNetworkString("ixPartRemove")
util.AddNetworkString("ixPartReset")
function meta:AddPart(uniqueID, item)
if (!pac) then return end
local curParts = self:GetParts()
-- wear the parts.
net.Start("ixPartWear")
net.WriteEntity(self)
net.WriteString(uniqueID)
net.Broadcast()
curParts[uniqueID] = true
self:SetNetVar("parts", curParts)
end
function meta:RemovePart(uniqueID)
if (!pac) then return end
local curParts = self:GetParts()
-- remove the parts.
net.Start("ixPartRemove")
net.WriteEntity(self)
net.WriteString(uniqueID)
net.Broadcast()
curParts[uniqueID] = nil
self:SetNetVar("parts", curParts)
end
function meta:ResetParts()
if (!pac) then return end
net.Start("ixPartReset")
net.WriteEntity(self)
net.WriteTable(self:GetParts())
net.Broadcast()
self:SetNetVar("parts", {})
end
function PLUGIN:PlayerLoadedCharacter(client, curChar, prevChar)
-- Reset the characters parts.
local curParts = client:GetParts()
if (curParts) then
client:ResetParts()
end
-- After resetting all PAC3 outfits, wear all equipped PAC3 outfits.
if (curChar) then
local inv = curChar:GetInventory()
for _, v in pairs(inv:GetItems()) do
if (v:GetData("equip") == true and v.pacData) then
client:AddPart(v.uniqueID, v)
end
end
end
end
function PLUGIN:PlayerSwitchWeapon(client, oldWeapon, newWeapon)
local oldItem = IsValid(oldWeapon) and oldWeapon.ixItem
local newItem = IsValid(newWeapon) and newWeapon.ixItem
if (oldItem and oldItem.isWeapon and oldItem:GetData("equip") and oldItem.pacData) then
oldItem:WearPAC(client)
end
if (newItem and newItem.isWeapon and newItem.pacData) then
newItem:RemovePAC(client)
end
end
-- Hides PAC parts when a player enters observer.
function PLUGIN:OnPlayerObserve(client, state)
local curParts = client:GetParts()
-- Remove all the parts
if (curParts) then
client:ResetParts()
end
-- If exiting of observer, re-add all parts.
if (!state) then
local character = client:GetCharacter()
local inventory = character:GetInventory()
for _, v in pairs(inventory:GetItems()) do
if (v:GetData("equip") == true and v.pacData) then
client:AddPart(v.uniqueID, v)
end
end
end
end
else
local function AttachPart(client, uniqueID)
local itemTable = ix.item.list[uniqueID]
local pacData = ix.pac.list[uniqueID]
if (pacData) then
if (itemTable and itemTable.pacAdjust) then
pacData = table.Copy(pacData)
pacData = itemTable:pacAdjust(pacData, client)
end
if (isfunction(client.AttachPACPart)) then
client:AttachPACPart(pacData)
else
pac.SetupENT(client)
timer.Simple(0.1, function()
if (IsValid(client) and isfunction(client.AttachPACPart)) then
client:AttachPACPart(pacData)
end
end)
end
end
end
local function RemovePart(client, uniqueID)
local pacData = ix.pac.list[uniqueID]
if (pacData) then
if (isfunction(client.RemovePACPart)) then
client:RemovePACPart(pacData)
else
pac.SetupENT(client)
end
end
end
hook.Add("Think", "ix_pacupdate", function()
if (!pac) then
hook.Remove("Think", "ix_pacupdate")
return
end
if (IsValid(pac.LocalPlayer)) then
for _, v in ipairs(player.GetAll()) do
local character = v:GetCharacter()
if (character) then
local parts = v:GetParts()
for k2, _ in pairs(parts) do
AttachPart(v, k2)
end
end
end
hook.Remove("Think", "ix_pacupdate")
end
end)
net.Receive("ixPartWear", function(length)
if (!pac) then return end
local wearer = net.ReadEntity()
local uid = net.ReadString()
if (!wearer.pac_owner) then
pac.SetupENT(wearer)
end
AttachPart(wearer, uid)
end)
net.Receive("ixPartRemove", function(length)
if (!pac) then return end
local wearer = net.ReadEntity()
local uid = net.ReadString()
if (!wearer.pac_owner) then
pac.SetupENT(wearer)
end
RemovePart(wearer, uid)
end)
net.Receive("ixPartReset", function(length)
if (!pac) then return end
local wearer = net.ReadEntity()
local uidList = net.ReadTable()
if (!wearer.pac_owner) then
pac.SetupENT(wearer)
end
for k, _ in pairs(uidList) do
RemovePart(wearer, k)
end
end)
function PLUGIN:DrawPlayerRagdoll(entity)
local ply = entity.objCache
if (IsValid(ply)) then
if (!entity.overridePAC3) then
if ply.pac_parts then
for _, part in pairs(ply.pac_parts) do
if part.last_owner and part.last_owner:IsValid() then
hook.Run("OnPAC3PartTransferred", part)
part:SetOwner(entity)
part.last_owner = entity
end
end
end
ply.pac_playerspawn = pac.RealTime -- used for events
entity.overridePAC3 = true
end
end
end
function PLUGIN:OnEntityCreated(entity)
local class = entity:GetClass()
-- For safe progress, I skip one frame.
timer.Simple(0.01, function()
if (class == "prop_ragdoll") then
if (entity:GetNetVar("player")) then
entity.RenderOverride = function()
entity.objCache = entity:GetNetVar("player")
entity:DrawModel()
hook.Run("DrawPlayerRagdoll", entity)
end
end
end
if (class:find("HL2MPRagdoll")) then
for _, v in ipairs(player.GetAll()) do
if (v:GetRagdollEntity() == entity) then
entity.objCache = v
end
end
entity.RenderOverride = function()
entity:DrawModel()
hook.Run("DrawPlayerRagdoll", entity)
end
end
end)
end
function PLUGIN:DrawCharacterOverview()
if (!pac) then
return
end
if (LocalPlayer().pac_outfits) then
pac.RenderOverride(LocalPlayer(), "opaque")
pac.RenderOverride(LocalPlayer(), "translucent", true)
end
end
function PLUGIN:DrawHelixModelView(panel, ent)
if (!pac) then
return
end
if (LocalPlayer():GetCharacter()) then
pac.RenderOverride(ent, "opaque")
pac.RenderOverride(ent, "translucent", true)
end
end
end
function PLUGIN:InitializedPlugins()
local items = ix.item.list
for _, v in pairs(items) do
if (v.pacData) then
ix.pac.list[v.uniqueID] = v.pacData
end
end
end