mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 21:53:46 +03:00
180 lines
5.2 KiB
Lua
180 lines
5.2 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
|
|
|
|
function PLUGIN:DatabaseConnected()
|
|
local query = mysql:Create("ix_container_inactive")
|
|
query:Create("inv_id", "INT UNSIGNED NOT NULL")
|
|
query:Create("steamid", "VARCHAR(20) NOT NULL")
|
|
query:Create("character_id", "INT UNSIGNED NOT NULL")
|
|
query:Create("money", "INT UNSIGNED NOT NULL")
|
|
query:Create("datetime", "INT UNSIGNED NOT NULL")
|
|
query:Create("model", "TEXT NOT NULL")
|
|
query:PrimaryKey("inv_id")
|
|
query:Execute()
|
|
end
|
|
|
|
function PLUGIN:PlayerLoadedCharacter(client, character)
|
|
for k, v in ipairs(ents.FindByClass("ix_wncontainer")) do
|
|
v:UpdatePrivateOwner(client)
|
|
end
|
|
end
|
|
|
|
function PLUGIN:OnCharacterBanned(character, time)
|
|
if (time == true) then
|
|
self:OnCharacterBannedByID(character:GetID(), true)
|
|
end
|
|
end
|
|
|
|
function PLUGIN:CharacterDeleted(client, id)
|
|
self:OnCharacterBannedByID(id, true)
|
|
|
|
local query = mysql:Delete("ix_container_inactive")
|
|
query:Where("character_id", id)
|
|
query:Execute()
|
|
end
|
|
|
|
function PLUGIN:OnCharacterBannedByID(charID, time)
|
|
if (time == true) then
|
|
for k, v in ipairs(ents.FindByClass("ix_wncontainer")) do
|
|
if (v.ownerCharID == charID) then
|
|
v:ChangeType(v.PKHOLD)
|
|
else
|
|
v:RemoveUser(charID)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:CanTransferItem(item, oldInv, newInv)
|
|
if (newInv and newInv.vars and IsValid(newInv.vars.entity)) then
|
|
local entity = newInv.vars.entity
|
|
if (entity:GetClass() != "ix_wncontainer") then return end
|
|
|
|
local entityType = entity:GetType()
|
|
if (entityType == entity.PKHOLD or entityType == entity.CLEANUP or entityType == entity.MANCLEANUP) then
|
|
return false
|
|
end
|
|
|
|
if (entityType == entity.PRIVATE and entity:GetPremium() and entity.premiumExpired) then
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:PostPlayerXenforoGroupsUpdate(client)
|
|
local steamID = client:SteamID64()
|
|
local hasAccess = CAMI.PlayerHasAccess(client, "Helix - Premium Container")
|
|
for k, v in ipairs(ents.FindByClass("ix_wncontainer")) do
|
|
if (v.owner == steamID and v:GetType() == v.PRIVATE and v:GetPremium()) then
|
|
v.premiumExpired = !hasAccess
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:ContainerRemoved(container, inventory)
|
|
local name, model, id, chips, itemText = "unknown", "error", 0, 0, "no items"
|
|
local bShouldLog = false
|
|
if (IsValid(container) and (container:GetClass() == "ix_container" or container:GetClass() == "ix_wncontainer")) then
|
|
name = container:GetDisplayName()
|
|
model = container:GetModel()
|
|
id = inventory:GetID()
|
|
chips = container:GetMoney()
|
|
if (chips > 0) then
|
|
bShouldLog = true
|
|
end
|
|
end
|
|
|
|
local items = inventory:GetItems()
|
|
if (table.Count(items) > 0) then
|
|
itemText = "items: "
|
|
for _, v in pairs(items) do
|
|
if (!v.maxStackSize or v.maxStackSize == 1) then
|
|
itemText = itemText.." "..v:GetName().." (#"..v:GetID()..");"
|
|
else
|
|
itemText = itemText.." "..v:GetStackSize().."x "..v:GetName().." (#"..v:GetID()..");"
|
|
end
|
|
end
|
|
|
|
bShouldLog = true
|
|
end
|
|
|
|
if (bShouldLog) then
|
|
ix.log.AddRaw(string.format("Container '%s' removed (inv #%d; model: %s) with %d chips and %s", name, id, model, chips, itemText))
|
|
end
|
|
end
|
|
|
|
function PLUGIN:RegisterSaveEnts()
|
|
ix.saveEnts:RegisterEntity("ix_wncontainer", true, true, true, {
|
|
OnSave = function(entity, data) --OnSave
|
|
data.motion = false
|
|
local inventory = entity:GetInventory()
|
|
data.invID = inventory:GetID()
|
|
data.model = entity:GetModel()
|
|
data.name = entity:GetDisplayName()
|
|
data.pass = entity:GetPass()
|
|
data.money = entity:GetMoney()
|
|
data.premium = entity:GetPremium() == true
|
|
entity:SaveType(data)
|
|
end,
|
|
OnRestore = function(entity, data) --OnRestore
|
|
local data2 = ix.container.stored[data.model:lower()] -- Model name
|
|
if (data2) then
|
|
local inventoryID = tonumber(data.invID) -- invID
|
|
|
|
if (!inventoryID or inventoryID < 1) then
|
|
ErrorNoHalt(string.format(
|
|
"[Helix] Attempted to restore container inventory with invalid inventory ID '%s' (%s, %s)\n",
|
|
tostring(inventoryID), data.name or "no name", data.model or "no model"))
|
|
|
|
return
|
|
end
|
|
|
|
entity:SetModel(data.model) -- Model name
|
|
entity:SetSolid(SOLID_VPHYSICS)
|
|
entity:PhysicsInit(SOLID_VPHYSICS)
|
|
|
|
if (data.name) then -- Display name
|
|
entity:SetDisplayName(data.name)
|
|
end
|
|
entity:SetPass(data.pass)
|
|
if (data.pass and data.pass != "") then
|
|
entity.Sessions = {}
|
|
end
|
|
entity:SetMoney(data.money)
|
|
entity:SetPremium(data.premium)
|
|
entity:RestoreType(data)
|
|
|
|
|
|
ix.inventory.Restore(inventoryID, data2.width, data2.height, function(inventory)
|
|
inventory.vars.isBag = true
|
|
inventory.vars.isContainer = true
|
|
inventory.vars.entity = entity
|
|
|
|
if (IsValid(entity)) then
|
|
entity:SetInventory(inventory)
|
|
entity:CheckActivity()
|
|
end
|
|
end)
|
|
|
|
local physObject = entity:GetPhysicsObject()
|
|
if (IsValid(physObject)) then
|
|
physObject:EnableMotion()
|
|
end
|
|
end
|
|
end,
|
|
ShouldSave = function(entity)
|
|
local inventory = entity:GetInventory()
|
|
return entity:GetModel() != "models/error.mdl" and inventory:GetID() != 0 --avoid bad save that somehow happened
|
|
end
|
|
})
|
|
end |