Physgun Wiki

Как написать SWEP ключей

Система дверей хранит владение, но не отпирает и не запирает двери сама: это делает отдельный 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.