Система дверей хранит владение, но не отпирает и не запирает двери сама: это делает отдельный SWEP через ENTITY:CanBeOpenedBy и ent:Fire("lock"/"unlock"). Ниже минимальный рабочий SWEP.
1. Каркас оружия
lua/weapons/keys/shared.lua:
SWEP.PrintName = "Ключи"
SWEP.Slot = 1
SWEP.ViewModel = "models/weapons/c_arms.mdl"
SWEP.WorldModel = ""
SWEP.Primary.ClipSize = -1
SWEP.Primary.Automatic = false
SWEP.Secondary.ClipSize = -1
2. Логика замка
Тот же файл: трейс на дверь, проверка прав через CanBeOpenedBy, переключение состояния.
function SWEP:PrimaryAttack()
self:SetNextPrimaryFire(CurTime() + 0.5)
if CLIENT then return end
local ply = self:GetOwner()
local tr = ply:GetEyeTrace()
local door = tr.Entity
if not IsValid(door) or not door:IsDoor() then return end
if not door:CanBeOpenedBy(ply) then return end
if door:GetInternalVariable("m_bLocked") then
door:Fire("unlock")
ply:ChatPrint("Дверь отперта")
else
door:Fire("lock")
ply:ChatPrint("Дверь заперта")
end
end
3. Двойные двери
Если у двери есть парная створка (ENTITY:GetPartnerDoor), запирайте обе разом:
local partner = door:GetPartnerDoor()
if IsValid(partner) then
partner:Fire(door:GetInternalVariable("m_bLocked") and "unlock" or "lock")
end
Итог
CanBeOpenedBy уже учитывает владельца, совладельцев, команду и профессию: SWEP не должен дублировать эту логику, только вызывать проверку и дёргать Fire.