[LUA] Поднятие оружия на клавишу E

Хочу сделать так, чтобы оружие с пола нельзя было сразу поднять, а только по нажатию клавиши E. Как это можно реализовать?

Советую вставить в: darkrp/gamemode/init.lua (в самом низу)

local function IsKeyPressed(ply)
    return ply:KeyDown(IN_USE)
end

hook.Add("PlayerCanPickupWeapon", "podnatijeoruzhia", function(ply, weapon)
    if not IsKeyPressed(ply) then
        return false
    end
end)

Функция работает, да, но появилась проблема: теперь у всех проф отсутствует оружие

Тогда попробуй так:


local function IsLookingAtWeapon(ply, weapon)
    local plyPos = ply:EyePos()
    local weaponPos = weapon:GetPos()
    local plyLookDir = ply:EyeAngles():Forward()

    return plyPos:DistToSqr(weaponPos) <= 10000 and plyLookDir:Dot((weaponPos - plyPos):GetNormalized()) > 0.95
end

hook.Add("PlayerCanPickupWeapon", "podnatijeoruzhia", function(ply, weapon)

    if IsLookingAtWeapon(ply, weapon) and ply:KeyDown(IN_USE) then

        return true
    elseif weapon:CreatedByMap() or weapon:GetClass() == "spawned_weapon" then

        return true
    end

    return false
end)

Не помогло

Что именно за оружия пропали?

Да в принципе все оружие изначально которое выдается у каждой профы. Хоть стандартные по типу физ гана и тул гана, хоть из аддонов

Наглядно

Хорошо попробуй тогда это:


hook.Add("KeyPress", "PlayerPressE", function(ply, key)
    if key == IN_USE and ply:EyePos():Distance(ply:GetEyeTrace().HitPos) <= 100 then
        local ent = ply:GetEyeTrace().Entity
        if IsValid(ent) and ent:IsWeapon() and not ent:IsPlayerHolding() then
            ply:PickupObject(ent)
        end
    end
end)

Теперь вернулось стартовое оружие но не работает хук

В autorun/server

hook.Add("PlayerUse", "VozmiOruzhieBlyat", function(ply, ent)
    if IsValid(ent) and ply:Alive() and ply:IsPlayer() and ent:IsWeapon() and not ent:IsPlayerHolding() then
        local distance = ply:GetPos():DistToSqr(ent:GetPos())
        if distance <= 10000 then
            ply:PickupObject(ent)
            return false 
        end
    end
end)

А куда его вписывать то
Скриншот 18-07-2023 170741

1 лайк

Просто создай новый файл там например oruzhiepickup.lua

Все как и раньше: стартовое оружие есть, подбора на Е - нет

Можно реализовать, если ты создаешь оружие, как spawned_weapon. Оно уже в целом не будет подниматься моментально. Это самый обычный способ, который, как правило, не вызывает серьёзных багов. Расскажи, в каких случаях у тебя получается поднимать то оружие, которое подниматься не должно. Если ты создаешь его через инструмент “Создатель”, то оно создается, как обычный SWEP.
Ниже код, который написан на коленке и не проверен, он берёт свойства оружия созданного через обычный спавн и переделывает его в spawned_weapon. Может быть это решит твою проблему.

hook.Add(
    "OnEntityCreated",
    "convert_weapon_to_spawned_weapon",
    function(ent)
        if not IsValid(ent) or not ent:IsWeapon() then return end
        local spawned_weapon = ents.Create("spawned_weapon")
        local model = (ent:GetModel() == "models/weapons/v_physcannon.mdl" and "models/weapons/w_physics.mdl") or ent:GetModel()
        model = util.IsValidModel(model) and model or "models/weapons/w_rif_ak47.mdl"
        spawned_weapon:SetModel(model)
        spawned_weapon:SetSkin(ent:GetSkin() or 0)
        spawned_weapon:SetWeaponClass(ent:GetClass())
        spawned_weapon.nodupe = true
        timer.Simple(
            0,
            function()
                spawned_weapon:SetPos(ent:GetPos())
                ent:Remove()
                spawned_weapon:Spawn()
            end
        )
    end
)

Вообщем дело в том что я нашел рабочий код на запрет профам брать в руки оружие если оно им не положено, но когда я подхожу к запрещенному оружию которое валяется на земле, начинается сущий ад.


В связи с этим я решил, что если у меня оружие будет подниматься через кнопку Е, то выдавать сообщение о запрещенном игроку оружии оно будет только после нажатия.
Мне надо сделать так, чтобы когда игрок покупал коробку оружия у торговца, то он смог бы поднять это оружие только на кнопку Е.
А еще кстати консоль жалуется на твой код:
Без имени-1

Так ведь оружие с DarkRP и так поднимается по нажатию [E], разве нет?

Там для оружия специально отдельный класс сделан ради этого

SV часть

local timer_Simple = timer.Simple
local ENTITY = FindMetaTable('Entity')
local PLAYER = FindMetaTable('Player')
local GiveAmmo = PLAYER.GiveAmmo
local SetHealth = ENTITY.SetHealth
local Health = ENTITY.Health
local SetSolidFlags = ENTITY.SetSolidFlags

local IsValid = IsValid
local GetClass = ENTITY.GetClass
local EmitSound = ENTITY.EmitSound
local math_Clamp = math.Clamp
local GetMaxHealth = ENTITY.GetMaxHealth
local UseTriggerBounds = ENTITY.UseTriggerBounds
local Armor = PLAYER.Armor
local GetMaxArmor = PLAYER.GetMaxArmor
local SetArmor = PLAYER.SetArmor
local Tammo = {
    item_ammo_357 = function(pl) GiveAmmo(pl, 6, '357') end,
    item_ammo_357_large = function(pl) GiveAmmo(pl, 20, '357') end,
    item_ammo_ar2 = function(pl) GiveAmmo(pl, 20, 'AR2') end,
    item_ammo_ar2_large = function(pl) GiveAmmo(pl, 100, 'AR2') end,
    item_ammo_ar2_altfire = function(pl) GiveAmmo(pl, 1, 'AR2AltFire') end,
    item_ammo_crossbow = function(pl) GiveAmmo(pl, 6, 'XBowBolt') end,
    item_healthkit = function(pl)
        local hp = Health(pl)
        local maxhp = GetMaxHealth(pl)
        if hp >= maxhp then return true end
        SetHealth(pl, math_Clamp(25 + hp, 0, maxhp))
        EmitSound(pl, 'ItemBattery.Touch')
    end,
    item_healthvial = function(pl)
        local hp = Health(pl)
        local maxhp = GetMaxHealth(pl)
        if hp >= maxhp then return true end
        SetHealth(pl, math_Clamp(10 + hp, 0, maxhp))
        EmitSound(pl, 'ItemBattery.Touch')
    end,
    item_ammo_pistol = function(pl) GiveAmmo(pl, 20, 'Pistol') end,
    item_ammo_pistol_large = function(pl) GiveAmmo(pl, 100, 'Pistol') end,
    item_rpg_round = function(pl) GiveAmmo(pl, 1, 'RPG_Round') end,
    item_box_buckshot = function(pl) GiveAmmo(pl, 20, 'Buckshot') end,
    item_ammo_smg1 = function(pl) GiveAmmo(pl, 45, 'SMG1') end,
    item_ammo_smg1_large = function(pl) GiveAmmo(pl, 225, 'SMG1') end,
    item_ammo_smg1_grenade = function(pl) GiveAmmo(pl, 1, 'SMG1_Grenade') end,
    item_battery = function(pl)
        local ar = Armor(pl)
        local maxar = GetMaxArmor(pl)
        if ar >= maxar then return true end
        SetArmor(pl, math_Clamp(15 + ar, 0, maxar))
        EmitSound(pl, 'ItemBattery.Touch')
    end,
}

hook.Add("AllowPlayerPickup", "Disable_auto_pickup", function(pl, ent)
    local t = Tammo[GetClass(ent)]
    if t then
        local f = t(pl)
        if f then return true end
        ent:Remove()
        return false
    end
end)

hook.Add('OnPlayerPhysicsDrop', 'Disable_auto_pickup', function(pl, ent) UseTriggerBounds(ent, false) end)
hook.Add("OnEntityCreated", "Disable_auto_pickup", function(ent)
    if not (ent:IsWeapon() or Tammo[GetClass(ent)]) then return end
    timer_Simple(0, function()
        if not IsValid(ent) then return end
        SetSolidFlags(ent, 10)
    end)
end)