mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-16 21:33:46 +03:00
362 lines
7.7 KiB
Lua
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
|