print("cl_init.lua")
include('shared.lua')
surface.CreateFont("NameYourFont", {
font = "Arial",
extended = false,
size = 13,
weight = 500,
blursize = 0,
scanlines = 0,
antialias = true,
underline = false,
italic = false,
strikeout = false,
symbol = false,
rotary = false,
shadow = false,
additive = false,
outline = true,
})
function ENT:Draw()
self:DrawModel()
local alpha = 255
local viewdist = 200
local max = viewdist
local min = viewdist * 0.75
local dist = LocalPlayer():EyePos():Distance( self:GetPos() )
if dist > min and dist < max then
alpha = 255
elseif dist > max then
alpha = 0
end
local oang = self:GetAngles()
local opos = self:GetPos()
local ang = self:GetAngles()
local pos = self:GetPos()
ang:RotateAroundAxis( oang:Up(), 90 )
ang:RotateAroundAxis( oang:Right(), -90)
pos = pos + oang:Forward() * 21 + oang:Up() * 20
if alpha > 0 then
cam.Start3D2D( pos, ang, 0.1)
draw.SimpleTextOutlined("Money", "NameYourFont", 0, 0, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, alpha))
cam.End3D2D()
end
end
AddCSLuaFile("cl_init.lua")
AddCSLuaFile("shared.lua")
include("shared.lua")
function ENT:Intialize()
self:SetModel("models/props/cs_assault/Money.mdl")
self:SetPhysics(SOLID_VPHYSICS)
self:SetMoveType(MOVETYPE_VPHYSICS)
self:SetSolid(SOLID_VPHYSICS)
self:SetUseType(SIMPLE_USE)
local GPO = self:GetPhysicsObject()
GPO:SetMass(1)
GPO:SetVelocity((self:GetUp() * 2))
if GPO:IsValid() then
GPO:Wake()
end
end
function ENT:AcceptInput(activator, caller)
if ply:IsPlayer() == false then
return
end
end
function ENT:Use(activator, caller)
notification.AddLegacy("Вы нашли деньги!", NOTIFY_UNDO, 2)
end
function ENT:Think()
end
AddCSLuaFile("cl_init.lua")
ENT.Base = "base_gmodentity"
ENT.Type = "anim"
ENT.Category = "Jager's Entity"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.PrintName = "Пачка денег"
ENT.Author = "Nikolay Jager"
ENT.Contact = "[URL="https://steamcommunity.com/profiles/76561199074802664/"]Steam Community :: Окончательно Гойданулся[/URL]"
Надпись появилась, но модель так и осталась Error. Но все равно спасибоПопробуй Color с большой буквы написать)
У тебя на 56 строчке нет обьектаВсем привет, недавно начал изучать GLua и дошел до момента когда начинаю создавать Entity. Вчера я сделал свое первое энтити и он работал как надо. Сегодня я решил сделать свое второе энтити, суть такова: Когда вы нажимаете на "E", то вылазит уведомление "Вы нашли деньги!". Когда я дописал код и зашел в Сандбокс, спавню Энтити и вместо модельки денег спавнится ERROR(Использую модельку денег с CSS и CSS у меня включен)
И текстуры карты при наблюдении за ERROR ломаютсяПосмотреть вложение 47685
GarrysMod\garrysmod\addons\123\lua\entities\dengi\(Тут 3 файла с кодом, ниже эти самые файлы)
cl_init.lua:print("cl_init.lua") include('shared.lua') surface.CreateFont("NameYourFont", { font = "Arial", extended = false, size = 13, weight = 500, blursize = 0, scanlines = 0, antialias = true, underline = false, italic = false, strikeout = false, symbol = false, rotary = false, shadow = false, additive = false, outline = true, }) function ENT:Draw() self:DrawModel() local alpha = 255 local viewdist = 200 local max = viewdist local min = viewdist * 0.75 local dist = LocalPlayer():EyePos():Distance( self:GetPos() ) if dist > min and dist < max then alpha = 255 elseif dist > max then alpha = 0 end local oang = self:GetAngles() local opos = self:GetPos() local ang = self:GetAngles() local pos = self:GetPos() ang:RotateAroundAxis( oang:Up(), 90 ) ang:RotateAroundAxis( oang:Right(), -90) pos = pos + oang:Forward() * 21 + oang:Up() * 20 if alpha > 0 then cam.Start3D2D( pos, ang, 0.1) draw.SimpleTextOutlined("Money", "NameYourFont", 0, 0, Color(255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, alpha)) cam.End3D2D() end end
init.lua:AddCSLuaFile("cl_init.lua") AddCSLuaFile("shared.lua") include("shared.lua") function ENT:Intialize() self:SetModel("models/props/cs_assault/Money.mdl") self:SetPhysics(SOLID_VPHYSICS) self:SetMoveType(MOVETYPE_VPHYSICS) self:SetSolid(SOLID_VPHYSICS) self:SetUseType(SIMPLE_USE) local GPO = self:GetPhysicsObject() GPO:SetMass(1) GPO:SetVelocity((self:GetUp() * 2)) if GPO:IsValid() then GPO:Wake() end end function ENT:AcceptInput(activator, caller) if ply:IsPlayer() == false then return end end function ENT:Use(activator, caller) notification.AddLegacy("Вы нашли деньги!", NOTIFY_UNDO, 2) end function ENT:Think() end
shared.lua:AddCSLuaFile("cl_init.lua") ENT.Base = "base_gmodentity" ENT.Type = "anim" ENT.Category = "Jager's Entity" ENT.Spawnable = true ENT.AdminOnly = true ENT.PrintName = "Пачка денег" ENT.Author = "Nikolay Jager" ENT.Contact = "[URL="https://steamcommunity.com/profiles/76561199074802664/"]Steam Community :: Окончательно Гойданулся[/URL]"
Ошибка:
[123] addons/123/lua/entities/dengi/cl_init.lua:56: attempt to call global 'color' (a nil value)
1. unknown - addons/123/lua/entities/dengi/cl_init.lua:56
Буду очень благодарен за помощь с моей проблемой
color
, ошибка не относится к коду который ты скинул. Пришли актуальный код плизif entity_distance > view_distance then return end
в начале функции ENT:Draw(). В таком случае у тебя вообще не будет выполняться эта функция, если проверка дистанции не прошла успешно. GPO:SetMass(1)
GPO:SetVelocity((self:GetUp() * 2))
if GPO:IsValid() then
GPO:Wake()
end
if GPO:IsValid() then
, потому что если почему-то физический объект не проинициализируется, то в этом месте сыпанет ошибкойENT:AcceptInput(activator, caller)
обычно используется для взаимодействия между разными энтити (не-игроками), по аналогии с Input-ами энтити, которые можно сделать в хаммере. Если ты этим не собираешься пользоваться, то лучше удалить эту функцию, чтобы повысить читаемость кода. Игроки при нажатии E на энтити всегда вызовут метод ENT:Use()
.3 и 4 пункты применял, а вот по поводу 2 пункта, мне же надо еще прописать эти 2 переменные(entity_distance и view_distance) и где мне их прописать если надо в начале Draw() прописать эту строку(if entity_distance > view_distance then return end)У тебя на 56 строчке нет обьектаcolor
, ошибка не относится к коду который ты скинул. Пришли актуальный код плиз
Из того, что могу посоветовать, пока ты доносишь актуальный код:
1. Лучше использовать DistToSqr для проверки дистанции, если дистанцию для обработки ты знаешь заранее (тут ты знаешь - 200) или понимаешь как работает квадратичная дистанция. Это намного быстрее, потому что под капотом обычный Distance все равно вычисляет квадрат и использует по сути DistToSqr, а это очень дорогая процедура. В таком случае тебе нужно будет посчитать квадрат числа 200 вместо компьютера и вставить его в код. Это будет очень большое число - не смущайся, так работает геометрия в трехмерном пространстве.
2. Обычно, ограничение дистанции прорисовки делают для сохранения ресурсов, но у тебя только меняется прозрачность шрифта, а это никак на сохранение ресурсов не меняется. Гораздо профитнее сделатьif entity_distance > view_distance then return end
в начале функции ENT:Draw(). В таком случае у тебя вообще не будет выполняться эта функция, если проверка дистанции не прошла успешно.
3.
Lua:GPO:SetMass(1) GPO:SetVelocity((self:GetUp() * 2)) if GPO:IsValid() then GPO:Wake() end
два вызова методов у GPO:
GPO:SetMass(1)
GPO:SetVelocity((self:GetUp() * 2))
лучше внести в блокif GPO:IsValid() then
, потому что если почему-то физический объект не проинициализируется, то в этом месте сыпанет ошибкой
4.ENT:AcceptInput(activator, caller)
обычно используется для взаимодействия между разными энтити (не-игроками), по аналогии с Input-ами энтити, которые можно сделать в хаммере. Если ты этим не собираешься пользоваться, то лучше удалить эту функцию, чтобы повысить читаемость кода. Игроки при нажатии E на энтити всегда вызовут методENT:Use()
.
про 2 пункт это условное название переменных, чтобы просто мысль донести) если переделать в реальный код, то выглядеть будет примерно так:3 и 4 пункты применял, а вот по поводу 2 пункта, мне же надо еще прописать эти 2 переменные(entity_distance и view_distance) и где мне их прописать если надо в начале Draw() прописать эту строку(if entity_distance > view_distance then return end)
и еще не понял первый пункт, как использовать функцию DistToSqr
function ENT:Draw()
local view_dist = 40000 -- 200*200
local entity_dist = self:GetPos():DistToSqr(LocalPlayer():GetPos())
if entity_dist > view_dist then return end
end
function ENT:Draw()
if self:GetPos():DistToSqr(LocalPlayer():GetPos()) > 40000 then return end
end
entity:GetPos():Distance(other_entity:GetPos()) > 200
entity:GetPos():DistToSqr(other_entity:GetPos()) > 40000 -- 200*200=40000
попробуй указать путь до модельки в одном регистре, без больших букв. помнится мне, что у Lua и непосредственно игрового движка разное отношение к регистру букв в путях до файловНадпись появилась, но модель так и осталась Error. Но все равно спасибо