Petrenko
Пользователь
Всем привет, на днях скачал аддон из мастерской STEAM для игрового режима NutScript 1.1, как выяснилось детекторы работают только на Entity.
А как многие знают все предметы в NS 1.1 помечаются Entity "nut_item". За счет чего настроить данные детекторы не так просто для NutScript.
Я начал пытаться решить проблему самостоятельно, сначала я начал думать как можно такое вобще сделать , по сколько в NutScript новичок и многое не знаю. Потом я вспомнил как мне помог Hikka назначить определенный предмет в Плагине для NutScript (https://netzona.org/threads/item-cleanup.1972/) , попробывал сделать по аналогии и назначить пример по похожему коду.
Первым я начал переделывать Детектор Bear (Медведь).
Нашел строки где как я думаю и должно показывать направление определенного предмета на детекторе.
На строках 16-22 я написал следующее
Думал что будет работать но вылезла ошибка :
Якобы переменная item не имеет значения.
Я подумал что за бред?
Т.к делая тоже самое для того что бы Детектор издавал "писк" в зависимости между расстоянием детектора и игрока.
Спустился чуть ниже кода который сверху, увидел следующее :
С случае для пищания детектора все заработало без ошибок, и детектор пищит только на предметы с пометкой item.IsArtefact = true.
А в случае для того что-бы детектор показывал местонахождение артефакта, это не сработало и выдовало ошибку.
Как выяснилось похоже это из за того что код с пищанием детектора работает только в (SERVER) Серверной части, а с местонахождением артефакта только в (CLIENT) Клиентской часте, поэтому не видит переменную item. Но не знаю как сделать что бы код с (RenderScreen) Местонахождением артефакта тоже заработал в Серверной части. Возможно я щас сморозил чушь (но это не точно)
---
Кому не сложно помогите разобраться в этой ситуации.
Заранее всем спасибо.
А как многие знают все предметы в 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
Я подумал что за бред?
Т.к делая тоже самое для того что бы Детектор издавал "писк" в зависимости между расстоянием детектора и игрока.
Спустился чуть ниже кода который сверху, увидел следующее :
Код:
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) Местонахождением артефакта тоже заработал в Серверной части. Возможно я щас сморозил чушь (но это не точно)
---
Кому не сложно помогите разобраться в этой ситуации.
Заранее всем спасибо.