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

Создание собственной энтити (скриптовой энтити, Entity, SEnt)

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

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Начнём с того, что любые предметы в игре (и даже сам игрок) являются энтити с различными классами. Разница лишь в классах этих самых энтити.
Пропы имеют класс prop_physics (обычно, но могут быть и prop_physics_multiplayer, prop_static)
Рэгдоллы - класс 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
init.lua
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) будет являться классом энтити
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
Плюс здесь очевидный, что всё в одном файле и будет проще работать с ним, если код малый.
Минуса сразу два: файл получает клиент и если там важный код, то так лучше не делать; при большом коде будет уже неудобно работать так.
 
Последнее редактирование:

Petrenko

Пользователь
Регистрация
1 Май 2017
Сообщения
279
Реакции
0
Баллы
37
Возраст
28
При использовании
была ошибка
ENT.Base = "base_entity"
ENT.Type = "entity"


Код:
[ERROR] gamemodes/base/entities/entities/base_entity/init.lua:68: Tried to use a NULL entity!

  1. SetPos - [C]:-1
   2. SpawnFunction - gamemodes/base/entities/entities/base_entity/init.lua:68
    3. Spawn_SENT - gamemodes/sandbox/gamemode/commands.lua:655
     4. unknown - gamemodes/sandbox/gamemode/commands.lua:720
      5. unknown - lua/includes/modules/concommand.lua:54

Использовал

ENT.Base = "base_gmodentity"
ENT.Type = "anim"


И все заработало без ошибок.
 
  • Хорошо "0"
Реакции: Neon

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Пофиксил в первом посте
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу