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

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

Petrenko

Участник
#1
Всем привет, на днях скачал аддон из мастерской 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

Модератор
Команда форума
#2
https://netzona.org/threads/prodam-detektor-artefaktov.2063/
Могу предложить это )0

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

Petrenko

Участник
#3
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
Ошибка пропала, но результата нету, детектор по прежнему только пищит

 

Hikka

Модератор
Команда форума
#4
Купи у меня и не парься. Я там код менял, менял. Вообщем, долго там.
 

GermanAizek

Участник
#5
Я помню делал для нат итемов и там что-то изи было. Проблема не возникало. Единственное возникла проблема в просчете у медведя, с его углами и подсветкой. Там матан нужен (тригонометрия).
 

Petrenko

Участник
#11
На счет артефактов. Скажите как пермапропить аномалии
Если с Ворк Шопа то не как, можешь сделать что бы центр аномалии это был любой невидимый проп, таким образом ты сможешь их пермапропить и таскать физ ганом. (Если нужна помощь как это сделать то отпишись в этой же теме)
 

danlimons

Пользователь
#12
Если с Ворк Шопа то не как, можешь сделать что бы центр аномалии это был любой невидимый проп, таким образом ты сможешь их пермапропить и таскать физ ганом. (Если нужна помощь как это сделать то отпишись в этой же теме)
И как сделать так, чтобы центр аномалии был невидимым пропом?
 

Hikka

Модератор
Команда форума
#15
Если с Ворк Шопа то не как, можешь сделать что бы центр аномалии это был любой невидимый проп, таким образом ты сможешь их пермапропить и таскать физ ганом. (Если нужна помощь как это сделать то отпишись в этой же теме)
Пермапропить можно что угодно, но тут придется переписывать скрипт на перм ентитей, что довольно легко сделать при знание луа.
 

Petrenko

Участник
#16
Лол, я хз что происходит с гарисом но тогда проблема которая возникла она очень странная, я сделал проверку на валидность айтема для детектора медведь
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.

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

Hikka

Модератор
Команда форума
#17
ккинь участок кода.
я посмотрю что не так.
ограничение.символов.
 

Petrenko

Участник
#18
Код:
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

Модератор
Команда форума
#19
У меня так сделано.
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"), то выдаем этот предмет в инвентарь игроку. Имхо это простое решение.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Помощь Пользователи
Для новорегов к ознакомлению: https://netzona.org/threads/perexod-v-gruppu-proverennyx-polzovatelej.734/
Редактировать

Вы не присоединились ни к одной комнате.

    Вы не присоединились ни к одной комнате.