- Регистрация
- 9 Фев 2013
- Сообщения
- 1,395
- Реакции
- 4
- Баллы
- 49
Начнём с того, что любые предметы в игре (и даже сам игрок) являются энтити с различными классами. Разница лишь в классах этих самых энтити.
Перейдем к самому написанию простой энтити. Сначала определимся что и где лежит.
Все энтити лежат в папке entities/, но этих папок, на самом деле много и свою энтити можно положить куда угодно. Например:
Далее в одной из этих папок мы видим одну или несколько других папок (реже - файлов) со своими именами. Эти имена являются классами этих энтити.
Создайте свою папку с любым названием (использовать только латинские символы)
Обычно код разделен на 3 файла, но можно сделать и в одном (для более продвинутых, представлю вариант ниже).
cl_init.lua
init.lua
shared.lua
Пропы имеют класс prop_physics (обычно, но могут быть и prop_physics_multiplayer, prop_static)
Рэгдоллы - класс prop_ragdoll
Оружия, НПС, транспорт имеют каждый свой класс и их бесконечное множество, ибо здесь люди придумывают свои.
С помощью классов вызываются (спавнятся) энтити.Рэгдоллы - класс prop_ragdoll
Оружия, НПС, транспорт имеют каждый свой класс и их бесконечное множество, ибо здесь люди придумывают свои.
Перейдем к самому написанию простой энтити. Сначала определимся что и где лежит.
Все энтити лежат в папке entities/, но этих папок, на самом деле много и свою энтити можно положить куда угодно. Например:
Код:
garrysmod/lua/entities/
garrysmod/gamemodes/darkrp/entities/entities/ (папки для энтити в модах и аддонах делятся на entities, weapons, effects и важно выбрать нужную папку)
garrysmod/gamemodes/sandbox/entities/entities/
garrysmod/addons/itemstore/lua/entities/
и пр.
Создайте свою папку с любым названием (использовать только латинские символы)
Обычно код разделен на 3 файла, но можно сделать и в одном (для более продвинутых, представлю вариант ниже).
cl_init.lua
PHP:
include('shared.lua')
function ENT:Initialize()
end
function ENT:Draw()
self.Entity:DrawModel()
end
PHP:
AddCSLuaFile( "cl_init.lua" )
AddCSLuaFile( "shared.lua" )
include('shared.lua')
function ENT:Initialize()
self:SetModel( "models/Gibs/HGIBS_spine.mdl" ) -- модель энтити
self:PhysicsInit( SOLID_VPHYSICS ) -- физика энтити
self:SetMoveType( MOVETYPE_VPHYSICS )
self:SetSolid( SOLID_VPHYSICS ) -- коллизия энтити
local phys = self:GetPhysicsObject()
if(phys:IsValid()) then phys:Wake() end
end
function ENT:Think()
end
function ENT:Use() -- функция, вызываемая при взаимодействии с энтити (клавиша Е)
end
function ENT:OnRemove() -- функция, вызываемая при удалении энтити
end
shared.lua
PHP:
ENT.Base = "base_gmodentity"
ENT.Type = "anim"
ENT.PrintName = "Название энтити" -- название энтити в меню Q
ENT.Author = "" -- автор
ENT.Contact = "" -- контакты с автором
ENT.Information = "" -- описание энтити
ENT.Category = "Тест" -- категория в меню Q
ENT.Spawnable = false -- разрешается спавнить через спавн-меню Q
ENT.AdminSpawnable = false -- разрешается спавнить только админам
Файл располагать в папке entities/ своего аддона (без создания папки, как показано ранее), игрового мода или основной папки lua
yourname.lua // сами выбирайте название. Первая часть файла (без .lua) будет являться классом энтити
Плюс здесь очевидный, что всё в одном файле и будет проще работать с ним, если код малый.
Минуса сразу два: файл получает клиент и если там важный код, то так лучше не делать; при большом коде будет уже неудобно работать так.
yourname.lua // сами выбирайте название. Первая часть файла (без .lua) будет являться классом энтити
PHP:
ENT.Base = "base_gmodentity"
ENT.Type = "anim"
ENT.PrintName = "Название энтити" -- название энтити в меню Q
ENT.Author = "" -- автор
ENT.Contact = "" -- контакты с автором
ENT.Information = "" -- описание энтити
ENT.Category = "Тест" -- категория в меню Q
ENT.Spawnable = false -- разрешается спавнить через спавн-меню Q
ENT.AdminSpawnable = false -- разрешается спавнить только админам
if SERVER then
AddCSLuaFile()
function ENT:Initialize()
self:SetModel( "models/Gibs/HGIBS_spine.mdl" )
self:PhysicsInit( SOLID_VPHYSICS )
self:SetMoveType( MOVETYPE_VPHYSICS )
self:SetSolid( SOLID_VPHYSICS )
local phys = self:GetPhysicsObject()
if(phys:IsValid()) then phys:Wake() end
end
function ENT:Think()
end
function ENT:Use()
end
function ENT:OnRemove()
end
else then
function ENT:Initialize()
end
function ENT:Draw()
self:DrawModel()
end
end
Минуса сразу два: файл получает клиент и если там важный код, то так лучше не делать; при большом коде будет уже неудобно работать так.
Последнее редактирование: