Files
wnsrc/gamemodes/helix/plugins/inventoryslots/sv_plugin.lua
lifestorm c6d9b6f580 Upload
2024-08-05 18:40:29 +03:00

278 lines
9.0 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 PLUGIN = PLUGIN
util.AddNetworkString("ixOnBagItemTransferred")
util.AddNetworkString("ixSlotsSyncPlayerToItem")
util.AddNetworkString("ixSyncBagSlots")
util.AddNetworkString("ixSwitchPlayerInv")
function PLUGIN:OpenInventory(client, target, bShouldNotLog)
if (!IsValid(client) or !IsValid(target)) then return end
if (!target:IsPlayer()) then return end
local character = target:GetCharacter()
if (!character) then return end
local equipInvID = character.GetEquipInventory and character:GetEquipInventory()
local equipInv = ix.item.inventories[equipInvID] or false
local localChar = client.GetCharacter and client:GetCharacter()
local localPlayer = localChar.GetPlayer and localChar:GetPlayer()
if (equipInv) then
local name = target:Name().."'s equip inventory"
ix.storage.Open(client, equipInv, {
entity = target,
name = name,
OnPlayerClose = function()
if (!bShouldNotLog) then
ix.log.Add(client, "bastionInvClose", name)
else
if (localChar) then
if equipInv.owner and equipInv.owner == localChar:GetID() then
if localPlayer and IsValid(localPlayer) then
equipInv:AddReceiver(localPlayer)
end
end
end
end
end
})
if (localChar) then
localChar:GetInventory():AddReceiver(client)
end
if (!bShouldNotLog) then
ix.log.Add(client, "bastionInvSearch", name)
end
end
end
function PLUGIN:CharacterReceiveEqInv(client, character)
local equipInvID = character:GetEquipInventory()
local equipInv = ix.item.inventories[equipInvID]
if !equipInv then return end
assert(IsValid(client) and client:IsPlayer(), "expected valid player")
assert(type(equipInv) == "table" and equipInv:IsInstanceOf(ix.meta.inventory), "expected valid inventory")
equipInv:AddReceiver(client)
equipInv:Sync(client)
end
function PLUGIN:CharacterLoaded(character)
local client = character:GetPlayer()
if (character:GetEquipInventory() == 0) then
ix.inventory.New(character:GetID(), "equipInventory", function(inventory)
inventory.vars.isEquipSlots = true
inventory.vars.equipSlots = self.slots
inventory:SetOwner(character:GetID())
character:SetEquipInventory(inventory:GetID())
self:CharacterReceiveEqInv(client, character)
end)
else
self:CharacterReceiveEqInv(client, character)
end
end
function PLUGIN:PlayerLoadedCharacter(client, character)
local equipInv = character.GetEquipInventory and character:GetEquipInventory()
local invItems = character:GetInventory():GetItems()
if !equipInv then return end
if !isnumber(equipInv) then return end
if equipInv <= 0 then return end
if (character:GetData("equipBgClothes")) then
character:SetData("equipBgClothes", nil)
for i = 1, 2 do
for _, itemTable in pairs(invItems) do
if !itemTable.outfitCategory then continue end
if itemTable.isBag then continue end
if itemTable.base == "base_maskcp" and i == 1 then continue end
if itemTable.base != "base_maskcp" and i == 2 then continue end
if ix.item.inventories[equipInv] then
local bSuccess, _ = itemTable:Transfer(equipInv, 1, self.slots[itemTable.outfitCategory])
if (bSuccess) then
itemTable.functions.Equip.OnRun(itemTable, client)
end
end
end
end
end
end
function PLUGIN:ShouldRestoreInventory(charID, invID, invType)
if invType != "equipInventory" then return end
if !invID then return end
invID = tonumber(invID)
ix.inventory.Restore(invID, self.slotsW, self.slotsH, function(inventory)
inventory.vars.isEquipSlots = true
inventory.vars.equipSlots = self.slots
inventory:SetOwner(charID)
end)
return false
end
function PLUGIN:SyncAlreadyEquipped(owner)
if !owner or owner and !IsValid(owner) then return end
local character = owner.GetCharacter and owner:GetCharacter()
if !character then return end
local inventory = character.GetInventory and character:GetInventory()
if !inventory then return end
for _, v in pairs (inventory:GetItems()) do
if v.outfitCategory and v:GetData("equip", false) then
local eqInv = v.invID and ix.item.inventories[v.invID]
if eqInv and eqInv.vars and eqInv.vars.isEquipSlots then
local itemFunctions = v.functions
if !itemFunctions or itemFunctions and !itemFunctions.Equip then return end
itemFunctions.Equip.OnRun(v, owner)
if v.postHooks.Equip then
v.postHooks.Equip(v, owner)
end
end
end
end
end
function PLUGIN:InventoryItemAdded(oldInv, inventory, newItem)
local owner = self:IsSameOwner(oldInv, inventory)
local oldInvOwner = oldInv and oldInv.GetOwner and oldInv:GetOwner()
local newInvOwner = inventory and inventory.GetOwner and inventory:GetOwner()
if !owner and !oldInvOwner and !newInvOwner then return end
if !inventory.vars then return end
if !inventory.vars.equipSlots then
if oldInv and oldInv.vars and oldInv.vars.equipSlots then
local itemFunctions = newItem.functions
if !itemFunctions or itemFunctions and !itemFunctions.EquipUn then return end
if !owner and IsValid(oldInvOwner) then owner = oldInvOwner end
if !owner then return end
if itemFunctions.EquipUn.OnCanRun and itemFunctions.EquipUn.OnCanRun(newItem, owner) then
itemFunctions.EquipUn.OnRun(newItem, owner)
if newItem.postHooks.EquipUn then
newItem.postHooks.EquipUn(newItem, owner)
end
if newItem.outfitCategory == "model" then
self:SyncAlreadyEquipped(owner)
end
if (inventory) then
inventory:Sync(owner)
end
net.Start("ixSyncBagSlots")
net.Send(owner)
end
end
return
end
if !owner and IsValid(newInvOwner) then owner = newInvOwner end
if !owner then return end
local itemFunctions = newItem.functions
if !itemFunctions or itemFunctions and !itemFunctions.Equip then return end
if itemFunctions.Equip.OnCanRun and itemFunctions.Equip.OnCanRun(newItem, owner) then
itemFunctions.Equip.OnRun(newItem, owner)
if oldInvOwner and IsValid(oldInvOwner) then
inventory:Sync(oldInvOwner)
end
if newItem.postHooks.Equip then
newItem.postHooks.Equip(newItem, owner)
end
net.Start("ixSyncBagSlots")
net.Send(owner)
end
net.Start("ixSlotsSyncPlayerToItem")
net.WriteUInt(newItem.id, 32)
net.Send(owner)
end
function PLUGIN:OnBagItemTransferred(item, curInv, inventory)
local owner = self:IsSameOwner(curInv, inventory)
if !owner then return end
net.Start("ixOnBagItemTransferred")
net.WriteUInt(tonumber(item.id), 32)
net.WriteUInt(tonumber(inventory.id), 32)
net.Send(owner)
net.Start("ixSyncBagSlots")
net.Send(owner)
end
function PLUGIN:OnStorageReceiverRemoved(client, inventory)
if !client or client and !IsValid(client) then return end
local switchingInv = client.switchingPlayerInv
if !switchingInv then return end
local owner = switchingInv and tonumber(switchingInv.owner)
if !owner then return end
local char = ix.char.loaded[owner]
if !char then return end
local faction = char.GetFaction and char:GetFaction()
if faction and self.noEquipFactions and self.noEquipFactions[char:GetFaction()] then
client:Notify("This character does not have equip slots!")
return false
end
local target = char.GetPlayer and char:GetPlayer()
if !target or target and !IsValid(target) then return end
if !switchingInv.eqSlots then
self:OpenInventory(client, target, true)
else
Schema:SearchPlayer(client, target)
end
client.switchingPlayerInv = nil
end
net.Receive("ixSwitchPlayerInv", function(length, client)
local inventory = client.ixOpenStorage
if !inventory then return end
local isEquipSlots = inventory.vars and inventory.vars.isEquipSlots or false
client.switchingPlayerInv = {eqSlots = isEquipSlots, owner = inventory.owner}
ix.storage.RemoveReceiver(client, inventory)
end)