mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
289 lines
8.3 KiB
Lua
289 lines
8.3 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:PlayerLoadedCharacter(client, character)
|
||
|
|
if (CAMI.PlayerHasAccess(client, "Helix - Manage Smugglers")) then
|
||
|
|
netstream.Start(client, "ixSmugglingCacheUIDs", self.cacheIDList)
|
||
|
|
end
|
||
|
|
|
||
|
|
local uniqueID = "ixSmuggling"..client:SteamID64()
|
||
|
|
timer.Create(uniqueID, 60, 0, function()
|
||
|
|
if (!IsValid(client)) then timer.Remove(uniqueID) return end
|
||
|
|
|
||
|
|
local char = client:GetCharacter()
|
||
|
|
if (!char) then return end
|
||
|
|
|
||
|
|
local pickupItems = char:GetSmugglingPickupDelay()
|
||
|
|
|
||
|
|
if (#pickupItems == 0) then return end
|
||
|
|
|
||
|
|
local k = 1
|
||
|
|
while (#pickupItems >= k and pickupItems[k][1] < os.time()) do
|
||
|
|
char:SetSmugglingPickupItems(pickupItems[k][2], pickupItems[k][3], 1)
|
||
|
|
|
||
|
|
k = k + 1
|
||
|
|
end
|
||
|
|
|
||
|
|
if (k > 1) then
|
||
|
|
local newTbl = {}
|
||
|
|
for i = k, #pickupItems do
|
||
|
|
newTbl[#newTbl + 1] = pickupItems[i]
|
||
|
|
end
|
||
|
|
|
||
|
|
char.vars.smugglingPickupDelay = newTbl
|
||
|
|
char:Save()
|
||
|
|
end
|
||
|
|
|
||
|
|
client:UpdateStashWaypoints()
|
||
|
|
end)
|
||
|
|
|
||
|
|
local pickupItems = character:GetSmugglingPickupItems()
|
||
|
|
for k, v in pairs(pickupItems) do
|
||
|
|
if (k == "__invalid_cache") then continue end
|
||
|
|
|
||
|
|
local bFound = false
|
||
|
|
for _, v1 in pairs(self.pickupCaches) do
|
||
|
|
if (k == v1.uniqueID) then
|
||
|
|
bFound = true
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if (bFound) then continue end
|
||
|
|
|
||
|
|
pickupItems["__invalid_cache"] = pickupItems["__invalid_cache"] or {}
|
||
|
|
for k1, v1 in pairs(v) do
|
||
|
|
pickupItems["__invalid_cache"][k1] = (pickupItems["__invalid_cache"][k1] or 0) + v1
|
||
|
|
end
|
||
|
|
|
||
|
|
pickupItems[k] = nil
|
||
|
|
end
|
||
|
|
|
||
|
|
character.vars.smugglingPickupItems = pickupItems
|
||
|
|
|
||
|
|
client:UpdateStashWaypoints(pickupItems)
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:RegisterSaveEnts()
|
||
|
|
ix.saveEnts:RegisterEntity("ix_smuggler", true, true, true, {
|
||
|
|
OnSave = function(entity, data) --OnSave
|
||
|
|
data.name = entity:GetDisplayName()
|
||
|
|
data.description = entity:GetDescription()
|
||
|
|
data.model = entity:GetModel()
|
||
|
|
data.items = entity.items
|
||
|
|
data.money = entity.money
|
||
|
|
data.maxStock = entity.maxStock
|
||
|
|
data.stashList = entity.stashList
|
||
|
|
data.motion = nil
|
||
|
|
|
||
|
|
if (entity.ixIsActiveSmuggler) then
|
||
|
|
data.active = self.nextRotation
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
OnRestore = function(entity, data) --OnRestore
|
||
|
|
entity:SetModel(data.model)
|
||
|
|
entity:SetSolid(SOLID_BBOX)
|
||
|
|
entity:PhysicsInit(SOLID_BBOX)
|
||
|
|
|
||
|
|
local physObj = entity:GetPhysicsObject()
|
||
|
|
if (IsValid(physObj)) then
|
||
|
|
physObj:EnableMotion()
|
||
|
|
physObj:Sleep()
|
||
|
|
end
|
||
|
|
|
||
|
|
entity:SetDisplayName(data.name)
|
||
|
|
entity:SetDescription(data.description)
|
||
|
|
|
||
|
|
local items = {}
|
||
|
|
for uniqueID, itemData in pairs(data.items) do
|
||
|
|
items[tostring(uniqueID)] = itemData
|
||
|
|
end
|
||
|
|
|
||
|
|
entity.items = items
|
||
|
|
entity.money = data.money
|
||
|
|
entity.maxStock = data.maxStock
|
||
|
|
entity.stashList = data.stashList
|
||
|
|
|
||
|
|
if (data.active and !self.nextRotation and data.active > os.time() + 300) then
|
||
|
|
self.nextRotation = data.active
|
||
|
|
entity:SetActive()
|
||
|
|
else
|
||
|
|
entity:SetInactive()
|
||
|
|
end
|
||
|
|
end,
|
||
|
|
})
|
||
|
|
|
||
|
|
ix.saveEnts:RegisterEntity("ix_pickupcache", true, true, true, {
|
||
|
|
OnSave = function(entity, data) --OnSave
|
||
|
|
data.name = entity:GetDisplayName()
|
||
|
|
data.uniqueID = entity.uniqueID
|
||
|
|
data.model = entity:GetModel()
|
||
|
|
data.locationId = entity:GetLocationId()
|
||
|
|
data.motion = false
|
||
|
|
end,
|
||
|
|
OnRestore = function(entity, data) --OnRestore
|
||
|
|
entity:SetNewModel(data.model)
|
||
|
|
|
||
|
|
local physObj = entity:GetPhysicsObject()
|
||
|
|
if (IsValid(physObj)) then
|
||
|
|
physObj:EnableMotion()
|
||
|
|
physObj:Sleep()
|
||
|
|
end
|
||
|
|
|
||
|
|
entity:SetDisplayName(data.name)
|
||
|
|
entity:SetLocationId(data.locationId)
|
||
|
|
entity:UpdateUniqueID(data.uniqueID)
|
||
|
|
end,
|
||
|
|
ShouldSave = function(entity)
|
||
|
|
return self.pickupCaches[entity.uniqueID]
|
||
|
|
end
|
||
|
|
})
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:SaveData()
|
||
|
|
local smugglers = {}
|
||
|
|
for _, entity in ipairs(ents.FindByClass("ix_smuggler")) do
|
||
|
|
local bodygroups = {}
|
||
|
|
|
||
|
|
for _, v in ipairs(entity:GetBodyGroups() or {}) do
|
||
|
|
bodygroups[v.id] = entity:GetBodygroup(v.id)
|
||
|
|
end
|
||
|
|
|
||
|
|
smugglers[#smugglers + 1] = {
|
||
|
|
name = entity:GetDisplayName(),
|
||
|
|
description = entity:GetDescription(),
|
||
|
|
pos = entity:GetPos(),
|
||
|
|
angles = entity:GetAngles(),
|
||
|
|
model = entity:GetModel(),
|
||
|
|
skin = entity:GetSkin(),
|
||
|
|
bodygroups = bodygroups,
|
||
|
|
items = entity.items,
|
||
|
|
money = entity.money,
|
||
|
|
maxStock = entity.maxStock,
|
||
|
|
stashList = entity.stashList
|
||
|
|
}
|
||
|
|
|
||
|
|
if (entity.ixIsActiveSmuggler) then
|
||
|
|
smugglers[#smugglers].active = self.nextRotation
|
||
|
|
end
|
||
|
|
end
|
||
|
|
ix.data.Set("smugglers", smugglers)
|
||
|
|
|
||
|
|
local caches = {}
|
||
|
|
for uid, entity in pairs(self.pickupCaches) do
|
||
|
|
if (!IsValid(entity)) then
|
||
|
|
self.pickupCaches[uid] = nil
|
||
|
|
continue
|
||
|
|
end
|
||
|
|
|
||
|
|
local bodygroups = {}
|
||
|
|
|
||
|
|
for _, v in ipairs(entity:GetBodyGroups() or {}) do
|
||
|
|
bodygroups[v.id] = entity:GetBodygroup(v.id)
|
||
|
|
end
|
||
|
|
|
||
|
|
caches[#caches + 1] = {
|
||
|
|
name = entity:GetDisplayName(),
|
||
|
|
uniqueID = uid,
|
||
|
|
pos = entity:GetPos(),
|
||
|
|
angles = entity:GetAngles(),
|
||
|
|
model = entity:GetModel(),
|
||
|
|
skin = entity:GetSkin(),
|
||
|
|
bodygroups = bodygroups,
|
||
|
|
locationId = entity:GetLocationId()
|
||
|
|
}
|
||
|
|
end
|
||
|
|
ix.data.Set("smuggling_caches", caches)
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:LoadData()
|
||
|
|
if (!ix.config.Get("SaveEntsOldLoadingEnabled")) then return end
|
||
|
|
|
||
|
|
local caches = ix.data.Get("smuggling_caches") or {}
|
||
|
|
for _, v in ipairs(caches) do
|
||
|
|
local entity = ents.Create("ix_pickupcache")
|
||
|
|
entity:SetPos(v.pos)
|
||
|
|
entity:SetAngles(v.angles)
|
||
|
|
entity:Spawn()
|
||
|
|
|
||
|
|
entity:SetNewModel(v.model)
|
||
|
|
entity:SetSkin(v.skin or 0)
|
||
|
|
|
||
|
|
local physObj = entity:GetPhysicsObject()
|
||
|
|
if (IsValid(physObj)) then
|
||
|
|
physObj:EnableMotion(false)
|
||
|
|
physObj:Sleep()
|
||
|
|
end
|
||
|
|
|
||
|
|
entity:SetDisplayName(v.name)
|
||
|
|
entity:SetLocationId(v.locationId)
|
||
|
|
|
||
|
|
for id, bodygroup in pairs(v.bodygroups or {}) do
|
||
|
|
entity:SetBodygroup(id, bodygroup)
|
||
|
|
end
|
||
|
|
|
||
|
|
entity:UpdateUniqueID(v.uniqueID)
|
||
|
|
end
|
||
|
|
|
||
|
|
for _, v in ipairs(ix.data.Get("smugglers") or {}) do
|
||
|
|
local entity = ents.Create("ix_smuggler")
|
||
|
|
entity:SetPos(v.pos)
|
||
|
|
entity:SetAngles(v.angles)
|
||
|
|
entity:Spawn()
|
||
|
|
|
||
|
|
entity:SetModel(v.model)
|
||
|
|
entity:SetSkin(v.skin or 0)
|
||
|
|
entity:SetSolid(SOLID_BBOX)
|
||
|
|
entity:PhysicsInit(SOLID_BBOX)
|
||
|
|
|
||
|
|
local physObj = entity:GetPhysicsObject()
|
||
|
|
|
||
|
|
if (IsValid(physObj)) then
|
||
|
|
physObj:EnableMotion(false)
|
||
|
|
physObj:Sleep()
|
||
|
|
end
|
||
|
|
|
||
|
|
entity:SetDisplayName(v.name)
|
||
|
|
entity:SetDescription(v.description)
|
||
|
|
|
||
|
|
for id, bodygroup in pairs(v.bodygroups or {}) do
|
||
|
|
entity:SetBodygroup(id, bodygroup)
|
||
|
|
end
|
||
|
|
|
||
|
|
local items = {}
|
||
|
|
for uniqueID, data in pairs(v.items) do
|
||
|
|
items[tostring(uniqueID)] = data
|
||
|
|
end
|
||
|
|
|
||
|
|
entity.items = items
|
||
|
|
entity.money = v.money
|
||
|
|
entity.maxStock = v.maxStock
|
||
|
|
entity.stashList = v.stashList
|
||
|
|
|
||
|
|
if (v.active and !self.nextRotation and v.active > os.time() + 300) then
|
||
|
|
self.nextRotation = v.active
|
||
|
|
entity:SetActive()
|
||
|
|
else
|
||
|
|
entity:SetInactive()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function PLUGIN:PostLoadData()
|
||
|
|
timer.Simple(10, function()
|
||
|
|
if (!self.nextRotation) then
|
||
|
|
self:RotateActiveSmuggler()
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
end
|