• Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта NetZONA.org: https://netzona.org/help/public-offer/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами использования Ваших файлов cookie на Проекте NetZONA.org: https://netzona.org/help/cookies/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с Политикой конфиденциальности Проекта NetZONA.org: https://netzona.org/pages/privacy-policy/

  • Ответы на основные вопросы: https://netzona.org/threads/populjarnye-voprosy-i-otvety-na-nix.6122/

  • Приветствуем на сайте, Гость! Приобрести (купить) Информационную услугу (в том числе группу "Проверенный") на Проекте NetZONA.org: https://netzona.org/account/upgrades

Помощь со скриптом для HL2RP дверей

Статус
В этой теме нельзя размещать новые ответы.

HikkaSurito

Пользователь
Регистрация
21 Авг 2017
Сообщения
33
Реакции
0
Баллы
15
Возраст
25
Адрес
Parts Unknown
Пол
Ладно, я писал в один тред, но мне кажется тут это больше по теме.


Мне нужен маленький скриптик для дарк рп.
Ну, или скорее корректировка.
Вот на хл2рп есть карты, типа сити 17 и прочее. Там есть слайдер двери, которые нельзя открыть. Сделано это для того, чтобы потом подставить скрипт, дабы их могли открывать только комбайны. Но вот проблема, у меня есть чистый скрипт на открывание этих дверей, но чистый он потому, что в нем нет вайтлиста для комбайнов, их могут открывать все, в т.ч. гражданские.
А вот мне нужен этот самый вайтлист. Когда я пытался обратиться за этим на форум фейспанч, мне попытались помочь. Написали такие скрипты, но они не работали. Комбайны просто не могли открыть эти двери, как и гражданские. То есть, скрипт переставал работать. Так что если тут есть хорошие скриптеры, надеюсь на помощь в починке этих скриптов.

P.S. Да, мне нужен вайтлист на работы, типа эти двери может открывать только team_helix и т.д.

А теперь, сами скрипты:

Чистый:

Код:
function KeyPressedUse (ply, key)
    if key == IN_USE then
        local t = {}  
        t.start = ply:GetPos()  
        t.endpos = ply:GetShootPos() + ply:GetAimVector() * 100  
        t.filter = ply
        local trace = util.TraceLine(t)         
        if trace.Entity and trace.Entity:IsValid() and (trace.Entity:GetClass() == "func_door" or trace.Entity:GetClass() == "prop_door_rotating" or trace.Entity:GetClass() == "prop_dynamic") then
            trace.Entity:Fire("Open")
        end
    end
end
hook.Add( "KeyPress", "KeyPressedUse", KeyPressedUse  )

Первая попытка:

Код:
local jobs = { TEAM_WFYUED,
                TEAM_GYUIO };

function KeyPressedUse (ply, key)
     if key == IN_USE then
         if( !table.HasValue( jobs, _p:Team() ) ) then
             _p:ChatPrint( "Incorrect job" );
             return;
            end
         local t = {}  
         t.start = ply:GetPos()  
         t.endpos = ply:GetShootPos() + ply:GetAimVector() * 100  
         t.filter = ply
         local trace = util.TraceLine(t)         
         if trace.Entity and trace.Entity:IsValid() and (trace.Entity:GetClass() == "func_door" or trace.Entity:GetClass() == "prop_door_rotating" or trace.Entity:GetClass() == "prop_dynamic") then
             trace.Entity:Fire("Open")
         end
     end
end
hook.Add( "KeyPress", "KeyPressedUse", KeyPressedUse  )

Вторая попытка:
Код:
local foo = {
timer.Simple(1, function()
    foo[1] = TEAM_HELIX
    foo[2] = TEAM_CMD_SEC
end)}
local tbl = {
     jobs = ["TEAM_HELIX"] = true,
     doors = {
         ["func_door"] = true,
         ["prop_door_rotating"] = true,
         ["prop_dynamic"] = true
     }
}

-- Jobs does not exist until the gamemode has loaded, so we're gonna do it in here.
hook.Add("InitPostEntity", "insertJobs", function()
     local jobs = {
         [TEAM_HELIX] = true,
     }

     table.Merge(tbl.jobs, jobs);
end);

hook.Add("PlayerUse", "openDoors", function(ply, ent)
     if (not IsValid(ply) or not IsValid(ent)) then return; end

     local tr = util.TraceLine({
         start = ply:GetPos(),
         endpos = ply:GetShootPos() + ply:GetAimVector() * 100,
         filter = ply
     });

     if (IsValid(tr.Entity) and tbl.doors[tr.Entity:GetClass()]) then
         if (tbl.jobs[ply:Team()]) then
             -- If the door is locked then it won't open, uncomment this to make the doors unlock and open
             -- tr.Entity:Fire("unlock");
             tr.Entity:Fire("open", "", .5);
         end
     end
end);


Все, надеюсь на помощь, на русском я хотя бы свободно могу расписать все как есть.
 
Думаю, данное можно сделать, примерно, в таком роде:
Код:
if (CLIENT) then return end;

local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

local PlayerData =
{
    ["TEAM_TEAM"] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if (key == IN_USE) and (PlayerData[client:Team()]) then
        local traceTable = {};
        traceTable.start = client:GetPos();
        traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
        traceTable.filter = client;

        local trace = util.TraceLine(traceTable);
        if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
            trace.Entity:Fire("open", "", 0);
        end;
    end;
end);

["TEAM_TEAM"], думаю, стоит изменить под [TEAM_TEAM]. Тут уже как получится.

Тестировал сугубо в одиночной игре, потому за результат никак не ручаюсь.

UPD: Без проверки на команду игрока работает безупречно. Возможно, DarkRP имеет свой приоритет в проверке той, или иной команды.
 
Последнее редактирование:
Думаю, данное можно сделать, примерно, в таком роде:
Код:
if (CLIENT) then return end;

local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

local PlayerData =
{
    ["TEAM_TEAM"] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if (key == IN_USE) and (EntityData[client:Team()]) then
        local traceTable = {};
        traceTable.start = client:GetPos();
        traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
        traceTable.filter = client;

        local trace = util.TraceLine(traceTable);
        if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
            trace.Entity:Fire("open", "", 0);
        end;
    end;
end);

["TEAM_TEAM"], думаю, стоит изменить под [TEAM_TEAM]. Тут уже как получится.

Тестировал сугубо в одиночной игре, потому за результат никак не ручаюсь.

UPD: Без проверки на команду игрока работает безупречно. Возможно, DarkRP имеет свой приоритет в проверке той, или иной команды.

Не работает, а как этот приоритет поменять? Не знаете?
 
Тыкнул сборку DarkRP.
Установил данный исходник, как серверный модуль.
Код:
local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

local PlayerData =
{
    [TEAM_CITIZEN] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if PlayerData[client:Team()] then
        if (key == IN_USE) then
            local traceTable = {};
            traceTable.start = client:GetPos();
            traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
            traceTable.filter = client;

            local trace = util.TraceLine(traceTable);
            if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
                trace.Entity:Fire("open", "", 0);
            end;
        end;
    end;
end);
Вполне работает.
 
Тыкнул сборку DarkRP.
Установил данный исходник, как серверный модуль.
Код:
local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

local PlayerData =
{
    [TEAM_CITIZEN] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if PlayerData[client:Team()] then
        if (key == IN_USE) then
            local traceTable = {};
            traceTable.start = client:GetPos();
            traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
            traceTable.filter = client;

            local trace = util.TraceLine(traceTable);
            if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
                trace.Entity:Fire("open", "", 0);
            end;
        end;
    end;
end);
Вполне работает.

У меня не работает, я сейчас попробую вписать ковычки в TEAM_CITIZEN(в моем случае helix)
 
garrysmod/lua/autorun/server/combinedoors.lua(созданный мной файл)
Попробуй все это дельце уместить следующим образом:
addons/darkrpmodification/lua/darkrp_modules/combinedoors/sv_combinedoors.lua

Скорее всего проблемка в том, что нет инициализации с командами из-за того, что исходник прогружается до того, как подгружается darkrp.
 
Попробуй все это дельце уместить следующим образом:
addons/darkrpmodification/lua/darkrp_modules/combinedoors/sv_combinedoors.lua

Скорее всего проблемка в том, что нет инициализации с командами из-за того, что исходник прогружается до того, как подгружается darkrp.
Выдал ошибку про то, что штуки которая стоит между [] не существует(примерно так и написал)
Это он про команду, так что я попробую вписать ее в ковычки
Скрипт не работает, так что пробую пока что удалить файл в lua/autorun, возможно он врубается быстрее и перехватывает настройки дверей
 
Команда должна быть определенно без ковычек, так как Team() вызывает глобальную переменную.

Если выдает ошибку, значит таковой команды не существует вовсе, но могу и ошибаться.
 
Команда должна быть определенно без ковычек, так как Team() вызывает глобальную переменную.

Если выдает ошибку, значит таковой команды не существует вовсе, но могу и ошибаться.

Команда существует, я другому парню который пытался помочь скинул весь код команды.
И да, эта команда идеально работает.
P.S. Похоже, команды(работы) прогружаются позже модулей.
 
В моем случае, с TEAM_CITIZEN вполне прокатило. Тыкни какую-либо дефолтную команду, да проверь ее на работоспособность.
 
Команда существует, я другому парню который пытался помочь скинул весь код команды.
И да, эта команда идеально работает.
P.S. Похоже, команды(работы) прогружаются позже модулей.

Так, в чем прикол-то.
Попытался вписать без ковычек свою команду, но сервер полетел.
Ладно,попробую дефолт команду,но не думаю что это сработает
 
Так, в чем прикол-то.
Попытался вписать без ковычек свою команду, но сервер полетел.
Ладно,попробую дефолт команду,но не думаю что это сработает

Мне на фейспанче сделали другой скрипт, но он не работает в папке с модулями.
Хотя ошибка про работу не вылезает. Думаю, твой ближе к правде.
 
В моем случае, с TEAM_CITIZEN вполне прокатило. Тыкни какую-либо дефолтную команду, да проверь ее на работоспособность.

Так вот, ты не знаешь как сделать так чтобы работы прогружались раньше скрипта?
Потому что он не находит работы с jobs.lua
 
Для сущей работоспособности сделал данное следующим образом:
Был создан shared-модуль, куда залил кастомную команду (в нашем случае, для примера, добавил TEAM_HELIX).

Тем самым, откинулись всевозможные проблемы, а доступ кастомной фракции заработал так, как нужно.
Код:
local DRP = GM or GAMEMODE;

DRP.CombineDoorsJobWhiteList =
{
    [TEAM_HELIX] = true
};

local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if DRP.CombineDoorsJobWhiteList[client:Team()] then
        if (key == IN_USE) then
            local traceTable = {};
            traceTable.start = client:GetPos();
            traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
            traceTable.filter = client;

            local trace = util.TraceLine(traceTable);
            if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
                trace.Entity:Fire("open", "", 0);
            end;
        end;
    end;
end);

Попробуй сделать, примерно, таким образом. Авось и прокатит.
 
Для сущей работоспособности сделал данное следующим образом:
Был создан shared-модуль, куда залил кастомную команду (в нашем случае, для примера, добавил TEAM_HELIX).

Тем самым, откинулись всевозможные проблемы, а доступ кастомной фракции заработал так, как нужно.
Код:
local DRP = GM or GAMEMODE;

DRP.CombineDoorsJobWhiteList =
{
    [TEAM_HELIX] = true
};

local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if DRP.CombineDoorsJobWhiteList[client:Team()] then
        if (key == IN_USE) then
            local traceTable = {};
            traceTable.start = client:GetPos();
            traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
            traceTable.filter = client;

            local trace = util.TraceLine(traceTable);
            if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
                trace.Entity:Fire("open", "", 0);
            end;
        end;
    end;
end);

Попробуй сделать, примерно, таким образом. Авось и прокатит.

Как сделать shared модуль?
Или он уже в коде?
У меня сервер полетел от этого скрипта, как и тогда
 
Для сущей работоспособности сделал данное следующим образом:
Был создан shared-модуль, куда залил кастомную команду (в нашем случае, для примера, добавил TEAM_HELIX).

Тем самым, откинулись всевозможные проблемы, а доступ кастомной фракции заработал так, как нужно.
Код:
local DRP = GM or GAMEMODE;

DRP.CombineDoorsJobWhiteList =
{
    [TEAM_HELIX] = true
};

local EntityData =
{
    ["func_door"] = true,
    ["prop_door_rotating"] = true,
    ["prop_dynamic"] = true
};

hook.Add("KeyPress", "DoorAccess", function(client, key)
    if DRP.CombineDoorsJobWhiteList[client:Team()] then
        if (key == IN_USE) then
            local traceTable = {};
            traceTable.start = client:GetPos();
            traceTable.endpos = (client:GetShootPos() + client:GetAimVector() * 100);
            traceTable.filter = client;

            local trace = util.TraceLine(traceTable);
            if (trace.Entity and trace.Entity:IsValid() and EntityData[trace.Entity:GetClass()]) then
                trace.Entity:Fire("open", "", 0);
            end;
        end;
    end;
end);

Попробуй сделать, примерно, таким образом. Авось и прокатит.

Как же я тебя заебал наверное хд
 
Попросту создается sh-файл в addons/darkrpmodification/lua/darkrp_modules/yourfolder/sh_yourfile.lua, куда уже вписываются все необходимые фракции/команды/etc.

Уж полететь серверу от данного скрипта вряд ли получится.

UPD: В целом, можно впихнуть все в один модуль. Хуже от этого не будет.
 
Статус
В этой теме нельзя размещать новые ответы.
Главная Регистрация
Назад
Сверху