```lua
-- Файл: lua/weapons/custom_weapon.lua
SWEP.PrintName = "Кастомное Оружие"
SWEP.Author = "ВашеИмя"
SWEP.Instructions = "Левый клик для стрельбы."
SWEP.Spawnable = true
SWEP.AdminOnly = false
-- Настройка амуниции (можно изменить под ваши нужды)
SWEP.Primary.ClipSize = -1
SWEP.Primary.DefaultClip = -1
SWEP.Primary.Automatic = false
SWEP.Primary.Ammo = "none"
SWEP.Secondary.ClipSize = -1
SWEP.Secondary.DefaultClip = -1
SWEP.Secondary.Automatic = false
SWEP.Secondary.Ammo = "none"
-- Отключаем использование стандартных рук и ViewModel (настраивается по необходимости)
SWEP.UseHands = false
SWEP.ViewModel = "" -- Задайте дефолтную модель или оставьте пустым для отключения
SWEP.ViewModelFOV = 54
-- Указываем модель для мира (что видят другие игроки)
SWEP.WorldModel = "models/deadfall/weapons/fb wz,35 vis.mdl" -- Исправленный путь к модели
-- Установка типа хватки и инициализация модели оружия
function SWEP:Initialize()
    self:SetHoldType("pistol") -- Измените тип хватки при необходимости
    if CLIENT then self:CreateWeaponModel() end
end

-- Функция создания клиентской модели оружия
function SWEP:CreateWeaponModel()
    if not IsValid(self:GetOwner()) then return end
    self.WeaponModel = ClientsideModel(self.WorldModel, RENDERGROUP_BOTH)
    if IsValid(self.WeaponModel) then
        self.WeaponModel:SetNoDraw(true)
    else
        print("Ошибка: Не удалось создать клиентскую модель оружия по пути " .. self.WorldModel)
    end
end

-- Деплой оружия
function SWEP:Deploy()
    if CLIENT then self:CreateWeaponModel() end
    -- Воспроизвести анимацию поднятия оружия
    self:SendWeaponAnim(ACT_VM_DRAW)
    return true
end

-- Холдер оружия (во время переключения)
function SWEP:Holster()
    if CLIENT and IsValid(self.WeaponModel) then
        self.WeaponModel:Remove()
        self.WeaponModel = nil
    end
    return true
end

-- Очистка модели оружия при удалении SWEP
function SWEP:OnRemove()
    if CLIENT and IsValid(self.WeaponModel) then
        self.WeaponModel:Remove()
        self.WeaponModel = nil
    end
end

-- Основная отрисовка HUD (можно настроить по необходимости)
function SWEP:DrawHUD()
    -- Пример: Отрисовка кастомного прицела
    -- local centerX = ScrW() / 2
    -- local centerY = ScrH() / 2
    -- surface.SetDrawColor(255, 255, 255, 255)
    -- surface.DrawLine(centerX - 10, centerY, centerX + 10, centerY)
    -- surface.DrawLine(centerX, centerY - 10, centerX, centerY + 10)
end

-- Определение действия при первичном атаке (например, стрельба)
function SWEP:PrimaryAttack()
    if not self:CanPrimaryAttack() then return end
    self:SetNextPrimaryFire(CurTime() + self:GetPrimaryFireDelay())
    -- Воспроизвести звуковой эффект
    self:EmitSound("Weapon_Pistol.Single")
    -- Воспроизвести анимацию выстрела
    self:SendWeaponAnim(ACT_VM_PRIMARYATTACK)
    -- Создать эффект дымки (Muzzle Flash)
    if CLIENT then
        local vm = self:GetOwner():GetViewModel()
        if IsValid(vm) then
            local attachment = vm:LookupAttachment("muzzle")
            if attachment > 0 then
                local pos = vm:GetAttachment(attachment).Pos
                local effect = EffectData()
                effect:SetOrigin(pos)
                effect:SetNormal(vm:GetForward())
                effect:SetScale(1)
                util.Effect("MuzzleFlash", effect)
            end
        end
    end

    -- Реализуйте логику нанесения урона или создания трассировки выстрела
    if SERVER then
        local owner = self:GetOwner()
        if not IsValid(owner) then return end
        local trace = owner:GetEyeTrace()
        if trace.Hit and trace.Entity:IsValid() then
            local dmg = DamageInfo()
            dmg:SetDamage(10) -- Установите необходимое значение урона
            dmg:SetDamageType(DMG_BULLET)
            dmg:SetAttacker(owner)
            dmg:SetInflictor(self)
            dmg:SetDamagePosition(trace.HitPos)
            trace.Entity:TakeDamageInfo(dmg)
        end
    end
end

-- Определение задержки между выстрелами
function SWEP:GetPrimaryFireDelay()
    return 1 -- 1 секунда задержки между выстрелами
end

-- Проверка возможности атаки
function SWEP:CanPrimaryAttack()
    -- Поскольку амуниция отключена, всегда можно атаковать
    return true
end

-- Определение действия при вторичной атаке (например, альтернативная стрельба)
function SWEP:SecondaryAttack()
    -- Если вторичная атака не используется, можно оставить пустым или реализовать альтернативное действие
    -- Пример: Вызов функции при вторичном клике
    -- self:EmitSound("Weapon_Pistol.Empty")
end

-- Отрисовка клиентской модели оружия, привязанной к руке игрока
if CLIENT then
    function SWEP:DrawWorldModel()
        if not IsValid(self:GetOwner()) then
            self:DrawModel()
            return
        end

        if not IsValid(self.WeaponModel) then
            self:CreateWeaponModel()
            if not IsValid(self.WeaponModel) then return end
        end

        local owner = self:GetOwner()
        local boneIndex = owner:LookupBone("ValveBiped.Bip01_R_Hand") -- Кость правой руки
        if boneIndex then
            local boneMatrix = owner:GetBoneMatrix(boneIndex)
            if boneMatrix then
                local pos, ang = boneMatrix:GetTranslation(), boneMatrix:GetAngles()
                -- Настройка углов поворота для правильного отображения модели
                ang:RotateAroundAxis(ang:Forward(), 10)
                ang:RotateAroundAxis(ang:Right(), 180)
                ang:RotateAroundAxis(ang:Up(), 180)
                -- Настройка позиции относительно кости руки
                pos = pos + ang:Forward() * -1.5 + ang:Right() * -2 + ang:Up() * 2.3
                self.WeaponModel:SetRenderOrigin(pos)
                self.WeaponModel:SetRenderAngles(ang)
                -- Отрисовка модели
                self.WeaponModel:DrawModel()
            else
                -- Если не удалось получить матрицу кости, отрисовать по-старому
                self:DrawModel()
            end
        else
            -- Если кость не найдена, отрисовать по-старому
            self:DrawModel()
        end
    end

    -- Обновление позиции модели при изменении владельца
    function SWEP:Think()
        if IsValid(self.WeaponModel) and IsValid(self:GetOwner()) then
            local owner = self:GetOwner()
            local boneIndex = owner:LookupBone("ValveBiped.Bip01_R_Hand")
            if boneIndex then
                local boneMatrix = owner:GetBoneMatrix(boneIndex)
                if boneMatrix then
                    local pos, ang = boneMatrix:GetTranslation(), boneMatrix:GetAngles()
                    -- Настройка углов поворота для правильного отображения модели
                    ang:RotateAroundAxis(ang:Forward(), 10)
                    ang:RotateAroundAxis(ang:Right(), 180)
                    ang:RotateAroundAxis(ang:Up(), 180)
                    -- Настройка позиции относительно кости руки
                    pos = pos + ang:Forward() * -1.5 + ang:Right() * -2 + ang:Up() * 2.3
                    self.WeaponModel:SetRenderOrigin(pos)
                    self.WeaponModel:SetRenderAngles(ang)
                end
            end
        end
    end
end
```
Оптимизируй код, структурируй код,  улучши код.