Welcome to Сообщество игровых серверов NETZONA.ORG

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. Зарегистрировавшись и войдя в систему, вы сможете создавать темы, публиковать ответы в существующих темах, давать репутацию другим участникам, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?
  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта 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

[Help] S.T.A.L.K.E.R Detector Sweps V2 [Нужна помощь]

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

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
Всем привет, на днях скачал аддон из мастерской STEAM для игрового режима NutScript 1.1, как выяснилось детекторы работают только на Entity.
А как многие знают все предметы в NS 1.1 помечаются Entity "nut_item". За счет чего настроить данные детекторы не так просто для NutScript.
Я начал пытаться решить проблему самостоятельно, сначала я начал думать как можно такое вобще сделать , по сколько в NutScript новичок и многое не знаю. Потом я вспомнил как мне помог Hikka назначить определенный предмет в Плагине для NutScript (https://netzona.org/threads/item-cleanup.1972/) , попробывал сделать по аналогии и назначить пример по похожему коду.
Первым я начал переделывать Детектор Bear (Медведь).
Нашел строки где как я думаю и должно показывать направление определенного предмета на детекторе.

Lua:
if CLIENT then
    local matScreen = Material("models/kali/miscstuff/stalker/detectors/detector_bear_c");
    local RTTexture = GetRenderTarget("DTC_BEAR", 512, 512);

    local dot = surface.GetTextureID("models/kali/miscstuff/stalker/detectors/detector_bear_segment_copy");
    local bg = surface.GetTextureID("models/kali/miscstuff/stalker/detectors/detector_bear_copy");

    function SWEP:RenderScreen()
            local NewRT = RTTexture;
            local oldW = ScrW();
            local oldH = ScrH();
            local ply = LocalPlayer();

            matScreen:SetTexture( "$basetexture", NewRT);
      
            local OldRT = render.GetRenderTarget();
            render.SetRenderTarget(NewRT);
            render.SetViewPort( 0, 0, 512, 512);

            cam.Start2D();

            render.Clear( 50, 50, 100, 0 );

            surface.SetDrawColor( 255, 255, 255, 255 );
            surface.SetTexture( bg );
            surface.DrawTexturedRect( 0, 0, 512, 512);

            surface.SetTexture(dot);

            local anoms = {}
            for k,v in ipairs(ents.FindByClass("nut_item")) do
                if (!IsValid(v)) then continue end
                local item = nut.item.instances[v.nutItemID]
                print(v.nutItemID)
                if ( item.isArtefact) then
                    table.insert(anoms, v)
                end
            end
            local dist = 501
            local ent = nil
            for k,v in pairs(anoms) do
                if v:GetPos():Distance(LocalPlayer():GetPos()) < dist then
                    dist = v:GetPos():Distance(LocalPlayer():GetPos())
                    ent = v
                end
            end
            if dist < 500 then
                local ang = ply:GetAngles();
                local pos = ent:GetPos() - ply:GetShootPos()
                surface.SetDrawColor(255, 255, 255, 255)
                pos:Rotate(Angle(0, -1*ang.Yaw, 0));
                if (math.abs(pos.z)<2000) then
                    surface.DrawTexturedRectRotated( 131, 118, 150, 150, ((pos:Angle().y % 15) / 15 < 0.5 and pos:Angle().y - (pos:Angle().y % 15) or (pos:Angle().y % 15) / 15 >= 0.5 and pos:Angle().y - (pos:Angle().y % 15)  + 15) + 30  )
                end
            end

        cam.End2D();

        render.SetRenderTarget(OldRT);
        render.SetViewPort( 0, 0, oldW, oldH )
    end
end

На строках 16-22 я написал следующее

Lua:
            for k,v in ipairs(ents.FindByClass("nut_item")) do
                if (!IsValid(v)) then continue end
                local item = nut.item.instances[v.nutItemID]
                print(v.nutItemID)
                if (item.isArtefact) then
                    table.insert(anoms, v)
                end
            end

Думал что будет работать но вылезла ошибка :
Код:
[ERROR] gamemodes/testing/entities/weapons/nut_detector_bear.lua:263: attempt to index local 'item' (a nil value)
  1. unknown - gamemodes/testing/entities/weapons/nut_detector_bear.lua:263
Якобы переменная item не имеет значения.
Я подумал что за бред?
Т.к делая тоже самое для того что бы Детектор издавал "писк" в зависимости между расстоянием детектора и игрока.
Спустился чуть ниже кода который сверху, увидел следующее :

Код:
function SWEP:Think()
    if SERVER then
        local anoms = {}
        for k,v in ipairs(ents.FindByClass("nut_item")) do
            if (!IsValid(v)) then continue end
            local item = nut.item.instances[v.nutItemID]
            if (item.isArtefact) then
                table.insert(anoms, v)
            end
        end
        local dist = 501
        local ent = nil
        for k,v in pairs(anoms) do
            if v:GetPos():Distance(self.Owner:GetPos()) < dist then
                dist = v:GetPos():Distance(self.Owner:GetPos())
                ent = v
            end
        end
        if dist < 500 and self.LastBeep + dist/300 - CurTime() <= 0 then
            self.LastBeep = CurTime()
            self.Owner:EmitSound(Sound("stalkerdetectors/echo.wav"), 100, 100)//math.Clamp(250-dist/2,50,250))
        end
    end
end

С случае для пищания детектора все заработало без ошибок, и детектор пищит только на предметы с пометкой item.IsArtefact = true.
А в случае для того что-бы детектор показывал местонахождение артефакта, это не сработало и выдовало ошибку.
Как выяснилось похоже это из за того что код с пищанием детектора работает только в (SERVER) Серверной части, а с местонахождением артефакта только в (CLIENT) Клиентской часте, поэтому не видит переменную item. Но не знаю как сделать что бы код с (RenderScreen) Местонахождением артефакта тоже заработал в Серверной части. Возможно я щас сморозил чушь (но это не точно)
---
Кому не сложно помогите разобраться в этой ситуации.
Заранее всем спасибо.
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
https://netzona.org/threads/prodam-detektor-artefaktov.2063/
Могу предложить это )0

если же сам хочешь, то попробуй проверить валиден ли item, но без функции IsValid т.е if (item and ...
Вообще, когда я делал детектор (переписывал), примерно пол кода я точно удалил.
 

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
https://netzona.org/threads/prodam-detektor-artefaktov.2063/
Могу предложить это )0

если же сам хочешь, то попробуй проверить валиден ли item, но без функции IsValid т.е if (item and ...
Вообще, когда я делал детектор (переписывал), примерно пол кода я точно удалил.

Если бы я имел возможность купить скрипт этот за деньги, я бы даже парится не стал и сразу купил, но сейчас не копейки в кармане нету.
-----

А так я попробывал сделать как ты сказал , написал

Lua:
            for k,v in ipairs(ents.FindByClass("nut_item")) do
                local item = nut.item.instances[v.nutItemID]
                if (item and item.isArtefact) then
                    table.insert(anoms, v)
                end
            end
Ошибка пропала, но результата нету, детектор по прежнему только пищит

zEci4V39Vf4.jpg
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Купи у меня и не парься. Я там код менял, менял. Вообщем, долго там.
 

GermanAizek

Пользователь
Регистрация
23 Ноя 2014
Сообщения
58
Реакции
0
Баллы
19
Я помню делал для нат итемов и там что-то изи было. Проблема не возникало. Единственное возникла проблема в просчете у медведя, с его углами и подсветкой. Там матан нужен (тригонометрия).
 

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
А у меня тут целое проблемище) Хз, что делать, попробую может ещё пошаманю
 

danlimons

Пользователь
Регистрация
6 Фев 2018
Сообщения
97
Реакции
0
Баллы
19
Возраст
23
Веб-сайт
vk.com
На счет артефактов. Скажите как пермапропить аномалии
 

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
На счет артефактов. Скажите как пермапропить аномалии
Если с Ворк Шопа то не как, можешь сделать что бы центр аномалии это был любой невидимый проп, таким образом ты сможешь их пермапропить и таскать физ ганом. (Если нужна помощь как это сделать то отпишись в этой же теме)
 

danlimons

Пользователь
Регистрация
6 Фев 2018
Сообщения
97
Реакции
0
Баллы
19
Возраст
23
Веб-сайт
vk.com
Если с Ворк Шопа то не как, можешь сделать что бы центр аномалии это был любой невидимый проп, таким образом ты сможешь их пермапропить и таскать физ ганом. (Если нужна помощь как это сделать то отпишись в этой же теме)
И как сделать так, чтобы центр аномалии был невидимым пропом?
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Если с Ворк Шопа то не как, можешь сделать что бы центр аномалии это был любой невидимый проп, таким образом ты сможешь их пермапропить и таскать физ ганом. (Если нужна помощь как это сделать то отпишись в этой же теме)
Пермапропить можно что угодно, но тут придется переписывать скрипт на перм ентитей, что довольно легко сделать при знание луа.
 

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
Лол, я хз что происходит с гарисом но тогда проблема которая возникла она очень странная, я сделал проверку на валидность айтема для детектора медведь
Lua:
if (IsValid(i) and item[i:getNetVar("id", "")].isArtefact) then
он мне бил ошибку
Код:
[ERROR] addons/detectorsswepsv2/lua/weapons/detector_bear/shared.lua:179: attempt to index global 'item' (a nil value)
  1. unknown - addons/detectorsswepsv2/lua/weapons/detector_bear/shared.lua:179
Эта ошибка била на клиентскую часть тоесть на игрока и у него было по 10000000000 ошибок в секунду, я хз почему в этом случае детектор не видит значения в item.
Но самый прикол в том что когда я сделал эту проверку валидности для детектора Велес все заработало и он видит значение в item.
WB99GvUde4c.jpg

Почему он тогда не видит значение item в детекторе Медведь, шо за бред? Как можно еще попробывать сделать проверку на валидность что бы медведь увидил значение в item??
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
ккинь участок кода.
я посмотрю что не так.
ограничение.символов.
 

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
Код:
function SWEP:RenderScreen()
            local NewRT = RTTexture;
            local oldW = ScrW();
            local oldH = ScrH();
            local ply = LocalPlayer();

            matScreen:SetTexture( "$basetexture", NewRT);
       
            local OldRT = render.GetRenderTarget();
            render.SetRenderTarget(NewRT);
            render.SetViewPort( 0, 0, 512, 512);

            cam.Start2D();

            render.Clear( 50, 50, 100, 0 );

            surface.SetDrawColor( 255, 255, 255, 255 );
            surface.SetTexture( bg );
            surface.DrawTexturedRect( 0, 0, 512, 512);

            surface.SetTexture(dot);

            local anoms = {}
            for k,v in ipairs(ents.FindByClass("nut_item")) do
                if (IsValid(v) and item[v:getNetVar("id", "")].isArtefact) then
                    table.insert(anoms, v)
                end
            end
            local dist = 501
            local ent = nil
            for k,v in pairs(anoms) do
                if v:GetPos():Distance(LocalPlayer():GetPos()) < dist then
                    dist = v:GetPos():Distance(LocalPlayer():GetPos())
                    ent = v
                end
            end
            if dist < 500 then
                local ang = ply:GetAngles();
                local pos = ent:GetPos() - ply:GetShootPos()
                surface.SetDrawColor(255, 255, 255, 255)
                pos:Rotate(Angle(0, -1*ang.Yaw, 0));
                if (math.abs(pos.z)<2000) then
                    surface.DrawTexturedRectRotated( 131, 118, 150, 150, ((pos:Angle().y % 15) / 15 < 0.5 and pos:Angle().y - (pos:Angle().y % 15) or (pos:Angle().y % 15) / 15 >= 0.5 and pos:Angle().y - (pos:Angle().y % 15)  + 15) + 30  )
                end
            end

        cam.End2D();

        render.SetRenderTarget(OldRT);
        render.SetViewPort( 0, 0, oldW, oldH )
    end
end
SWEP.LastBeep = 0
function SWEP:Think()
    if SERVER then
        local anoms = {}
        for k,v in ipairs(ents.FindByClass("nut_item")) do
            if (!IsValid(v)) then continue end
            local item = nut.item.instances[v.nutItemID]
            if (item.isArtefact) then
                table.insert(anoms, v)
            end
        end
        local dist = 501
        local ent = nil
        for k,v in pairs(anoms) do
            if v:GetPos():Distance(self.Owner:GetPos()) < dist then
                dist = v:GetPos():Distance(self.Owner:GetPos())
                ent = v
            end
        end
        if dist < 500 and self.LastBeep + dist/300 - CurTime() <= 0 then
            self.LastBeep = CurTime()
            self.Owner:EmitSound(Sound("stalkerdetectors/echo.wav"), 100, 100)//math.Clamp(250-dist/2,50,250))
        end
    end
end
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
У меня так сделано.
Lua:
            local dist, ent, item = self.DistBeep, nil, nut.item.list
            for _, v in ipairs(ents.FindByClass("nut_item")) do
                if (IsValid(v) and item[v:getNetVar("id", "")] != nil and item[v:getNetVar("id", "")].isAnomaly) then
                    dist = v:GetPos():Distance(ply:GetPos())
                    ent = v
                end
            end

Т.к если присвоить item[v:getNetVar("id", "")] в переменную, то он сыпет ошибки в консоль, вот уж не знаю в чем причина.
И да, я не использую таблицу, я вывожу сразу предметы из цикла.

p.s я бы не использовал nut_item, а прописал в код аномалий. Т.е например, берешь ентити anom_shock к примеру, идешь в код ищешь ENT:Use или событие которое отвечает за подъем ентити (или вызвал бы хук при котором поднимаешь ентити и делаешь условие если entity == "anom_shock"), то выдаем этот предмет в инвентарь игроку. Имхо это простое решение.
 
Последнее редактирование:

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
Спасибо, пойду проверю :)
Ограничение в символах//////////
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу