Files
wnsrc/gamemodes/darkrp/plugins/container_placement/sv_plugin.lua

101 lines
2.6 KiB
Lua
Raw Normal View History

2024-08-04 23:54:45 +03:00
--[[
| 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("ixPlaceContainer")
net.Receive("ixPlaceContainer", function(_, client)
local realTime = RealTime()
if ((client.ixNextContainerPlacement or 0) <= realTime) then
local containerInfo = client:GetLocalVar("containerToPlaceInfo")
if (containerInfo) then
local bResponse = net.ReadBool()
if (bResponse) then
local pos = net.ReadVector()
local angles = net.ReadAngle()
-- i honestly haven't found any other way to check pos and angles receiven from client
local dummy = ents.Create("prop_dynamic_override")
dummy:SetMoveType(MOVETYPE_NONE)
dummy:SetModel(containerInfo.model)
dummy:SetPos(pos)
dummy:SetAngles(angles)
dummy:AddEFlags(EF_NODRAW)
dummy:Spawn()
dummy:Activate()
if (!dummy:IsInSolidEnviromentOrFloating()) then
PLUGIN:CreateContainer(client, pos, angles, containerInfo.model, containerInfo.name, "container:" .. containerInfo.model)
ix.item.instances[containerInfo.itemID]:Remove()
end
dummy:Remove()
end
client:SetLocalVar("containerToPlaceInfo", nil)
end
-- probably should be higher
client.ixNextContainerPlacement = realTime + 2
end
end)
-- function (almost) identical to the one in containers plugin
function PLUGIN:CreateContainer(client, pos, angles, model, name, invType)
local container = ents.Create("ix_wncontainer")
container:SetPos(pos)
container:SetAngles(angles)
container:SetModel(model)
container:Spawn()
container:DropToFloor()
-- we don't want our newely created container to be moved around
local physObj = container:GetPhysicsObject()
if (IsValid(physObj)) then
physObj:EnableMotion(false)
physObj:Sleep()
end
ix.inventory.New(0, invType, function(inventory)
inventory.vars.isBag = true
inventory.vars.isContainer = true
inventory.vars.entity = container
if (IsValid(container)) then
container:SetInventory(inventory)
if (ix.saveEnts) then
ix.saveEnts:SaveEntity(container)
end
end
end)
ix.log.Add(client, "containerSpawned", name)
end
function PLUGIN:PlayerSwitchWeapon(client, _, newWeapon)
if (client:GetLocalVar("containerToPlaceInfo") and newWeapon:GetClass() != "ix_keys") then
client:SetLocalVar("containerToPlaceInfo", nil)
end
end
function PLUGIN:OnPlayerRestricted(client)
if (client:GetLocalVar("containerToPlaceInfo")) then
client:SetLocalVar("containerToPlaceInfo", nil)
end
end