mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
220 lines
6.6 KiB
Lua
220 lines
6.6 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 ix = ix
|
|
local IsValid = IsValid
|
|
local pairs = pairs
|
|
local isfunction = isfunction
|
|
local table = table
|
|
local ents = ents
|
|
local hook = hook
|
|
local ipairs = ipairs
|
|
|
|
|
|
local PLUGIN = PLUGIN
|
|
|
|
ix.log.AddType("droppedItems", function(client, text)
|
|
return text
|
|
end)
|
|
|
|
function PLUGIN:TransferItem(client, itemTable, curInv, inventory)
|
|
itemTable.player = client
|
|
if (itemTable:GetData("equip") == true and itemTable.functions.EquipUn) then
|
|
itemTable.functions.EquipUn.OnRun(itemTable)
|
|
end
|
|
|
|
if (itemTable.OnTransferred) then
|
|
itemTable:OnTransferred(curInv, inventory)
|
|
end
|
|
|
|
if (itemTable.OnDrop) then
|
|
itemTable:OnDrop()
|
|
end
|
|
|
|
local x, y = itemTable.gridX, itemTable.gridY
|
|
local w, h = itemTable.width, itemTable.height
|
|
|
|
if (!x or !y or !inventory:CanItemFit(x, y, w, h)) then
|
|
x, y = inventory:FindEmptySlot(w, h)
|
|
end
|
|
|
|
itemTable.authorized = true
|
|
itemTable:Transfer(inventory:GetID(), x, y)
|
|
|
|
local entity = itemTable:GetEntity()
|
|
|
|
if (IsValid(entity)) then
|
|
itemTable:GetEntity():Remove()
|
|
end
|
|
|
|
itemTable.player = nil
|
|
itemTable.authorized = nil
|
|
end
|
|
|
|
function PLUGIN:ShouldCharacterDropItems(client)
|
|
if (!ix.config.Get("dropItems")) then
|
|
return false
|
|
end
|
|
|
|
local character = client:GetCharacter()
|
|
|
|
if (character) then
|
|
local faction = character:GetFaction()
|
|
|
|
if (faction) then
|
|
local factionTable = ix.faction.Get(faction)
|
|
|
|
if (factionTable.saveItemsAfterDeath) then
|
|
return false
|
|
end
|
|
end
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function PLUGIN:PlayerDeath(client, inflictor, attacker)
|
|
if (hook.Run("ShouldCharacterDropItems", client) != false) then
|
|
local clientInv = client:GetCharacter():GetInventory()
|
|
local droppedItems = {}
|
|
local items = {}
|
|
|
|
for _, v in pairs(clientInv:GetItems()) do
|
|
if (v.isBag) then continue end
|
|
|
|
if (v.OnDeathDrop) then
|
|
v:OnDeathDrop(client, items, droppedItems)
|
|
elseif ((isfunction(v.KeepOnDeath) and v:KeepOnDeath(client) or v.KeepOnDeath) != true) then
|
|
table.insert(items, v)
|
|
table.insert(droppedItems, v:GetID())
|
|
if (v.OnDoDeathDrop) then
|
|
v:OnDoDeathDrop(client, items, droppedItems)
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
if (!table.IsEmpty(items)) then
|
|
local container = ents.Create("ix_drop")
|
|
container:SetPos(client:GetPos())
|
|
container:SetModel(ix.config.Get("dropContainerModel", "models/props_c17/BriefCase001a.mdl"))
|
|
container:Spawn()
|
|
|
|
hook.Run("PreDropCharacterInventory", client, items, container)
|
|
|
|
ix.inventory.New(0, "droppedItems", function(inventory)
|
|
inventory.vars.isBag = false
|
|
inventory.vars.isDrop = true
|
|
|
|
function inventory.OnAuthorizeTransfer(_, _, _, itemTable)
|
|
if (itemTable.authorized) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
if (IsValid(container)) then
|
|
container:SetInventory(inventory)
|
|
inventory.vars.entity = container
|
|
|
|
for _, v in pairs(items) do
|
|
self:TransferItem(client, v, clientInv, inventory)
|
|
end
|
|
|
|
ix.saveEnts:SaveEntity(container)
|
|
hook.Run("PostDropCharacterInventory", client, items, container, inventory)
|
|
else
|
|
ix.item.inventories[inventory.id] = nil
|
|
|
|
local query = mysql:Delete("ix_items")
|
|
query:Where("inventory_id", inventory.id)
|
|
query:Execute()
|
|
|
|
query = mysql:Delete("ix_inventories")
|
|
query:Where("inventory_id", inventory.id)
|
|
query:Execute()
|
|
end
|
|
end)
|
|
|
|
client:GetCharacter():SetRefundItems(droppedItems)
|
|
|
|
local logString = client:Name().." has dropped:"
|
|
for _, v in ipairs(items) do
|
|
if (!v.maxStackSize or v.maxStackSize == 1) then
|
|
logString = logString.." "..v:GetName().." (#"..v:GetID()..");"
|
|
else
|
|
logString = logString.." "..v:GetStackSize().."x "..v:GetName().." (#"..v:GetID()..");"
|
|
end
|
|
end
|
|
ix.log.Add(client, "droppedItems", logString)
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:PostDropCharacterInventory(client, items, container, inventory)
|
|
for k, v in pairs(inventory:GetItems()) do
|
|
if (v.replaceOnDeath) then
|
|
local newItem = v.replaceOnDeath
|
|
v:Remove()
|
|
|
|
if (ix.item.list[v.replaceOnDeath]) then
|
|
inventory:Add(newItem)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:RegisterSaveEnts()
|
|
ix.saveEnts:RegisterEntity("ix_drop", true, true, true, {
|
|
OnSave = function(entity, data) --OnSave
|
|
local inventory = entity:GetInventory()
|
|
data.invID = inventory:GetID()
|
|
data.model = entity:GetModel()
|
|
data.name = entity.name
|
|
data.password = entity.password
|
|
data.money = entity:GetMoney()
|
|
end,
|
|
OnRestore = function(entity, data) --OnRestore
|
|
entity:SetModel(data.model)
|
|
entity:SetSolid(SOLID_VPHYSICS)
|
|
entity:PhysicsInit(SOLID_VPHYSICS)
|
|
|
|
if (data.password) then
|
|
entity.password = data.password
|
|
entity:SetLocked(true)
|
|
entity.Sessions = {}
|
|
end
|
|
|
|
if (data.name) then
|
|
entity.name = data.name
|
|
entity:SetDisplayName(data.name)
|
|
end
|
|
|
|
if (data.money) then
|
|
entity:SetMoney(data.money)
|
|
end
|
|
|
|
ix.inventory.Restore(data.invID, ix.config.Get("inventoryWidth"), ix.config.Get("inventoryHeight"), function(inventory)
|
|
inventory.vars.isBag = false
|
|
inventory.vars.isDrop = true
|
|
|
|
if (IsValid(entity)) then
|
|
entity:SetInventory(inventory)
|
|
inventory.vars.entity = entity
|
|
end
|
|
end)
|
|
end,
|
|
ShouldSave = function(entity) --ShouldSave
|
|
return entity:GetInventory() and entity:GetInventory() != 0
|
|
end,
|
|
ShouldRestore = function(data) --ShouldRestore
|
|
return data.invID >= 1
|
|
end
|
|
})
|
|
end |