Özel Varlık Oluşturma

Garry's Mod'da Özel Bir Varlık (Entity) Oluşturma

Giriş

Varlıklar (Entity) Nedir?

Garry's Mod'da görüp dokunabildiğiniz neredeyse her şey bir Varlık'tır (Entity). Oyun dünyasında bir konumu olan herhangi bir nesne bir Varlıktır. Oyuncu bir Varlıktır, proplar Varlıktır, hatta Oyun Dünyası'nın kendisi bile özel ve benzersiz bir Varlıktır.

Varlıklar, nasıl göründükleri ve onlarla nasıl etkileşime girilebileceği gibi şeyleri kontrol edebilen, geliştirici tarafından tanımlanmış özel davranışlara sahip olabilirler. Varlıklar genellikle Oyun Modlarının (Gamemode) ve Eklentilerin (Addon) temel parçalarıdır.

Bir Varlığın Bileşenleri Nelerdir?

Varlıkların 3 Alan'ın (Realm) hepsinde de özellikleri vardır:

  • Client (İstemci) - Varlığın çizilmesi/görüntülenmesi.
  • Server (Sunucu) - Varlığın davranışını ve etkileşimlerini kontrol etme.
  • Shared (Paylaşılan) - Hem Sunucu hem de İstemci Alanları tarafından kullanılabilen yapılandırma ve özellikler.

Shared aslında bir Alan (Realm) değildir. Sadece hem İstemci'nin hem de Sunucu'nun Paylaşılan bir dosyada bulunan aynı kodu çalıştıracağı anlamına gelir.

Kurulum

Dosya Konumu

Bir Varlığı oluşturan dosya(lar) ya bir Eklenti (Addon) ya da bir Oyun Modu (Gamemode) içine yerleştirilmelidir.

Eklenti Varlık Konumu
addons/ ├── my-addon-name/ │ ├── lua/ │ │ ├── entities/ │ │ │ └── ...
Oyun Modu Varlık Konumu
gamemodes/ ├── my-gamemode-name/ │ ├── entities/ │ │ ├── entities/ │ │ │ └── ...

Dosya Yapısı

Varlıklar şu yöntemlerden biri kullanılarak oluşturulabilir:

  • Her biri bir Alan'ın (Realm) kodunu ve yapılandırmasını içeren 3 ayrı dosya.
    • Bu yaklaşım kod organizasyonuna yardımcı olur.
    • Bu dosyaları içeren klasörün adı (aşağıdaki örnekte my-entity-name), Varlığın Sınıf Adı (Class Name) olarak kullanılacaktır.
  • Dosyalar şunlardır:
    • cl_init.lua
      • İstemci Alanı (Client Realm)
    • init.lua
      • Sunucu Alanı (Server Realm)
    • shared.lua
      • Paylaşılan Alan (Shared Realm)
entities/ ├── my-entity-name/ │ ├── cl_init.lua │ ├── init.lua │ └── shared.lua
  • Her 3 Alan (Realm) için tüm kodu ve yapılandırmayı içeren 1 dosya.
    • Bu yaklaşım öncelikle basit varlıklar oluştururken kullanışlıdır.
  • Dosyanın adı (aşağıdaki örnekte my-entity-name), Varlığın Sınıf Adı (Class Name) olarak kullanılacaktır.
entities/ ├── my-entity-name.lua

Bir Varlık Oluşturma

Ayrı Dosyalarla Bir Varlık Oluşturma

shared.lua örneği:
-- Varlığın türünü, temelini, yazdırılabilir adını ve yazarını paylaşılan erişim (hem sunucu hem de istemci) için tanımlar ENT.Type = "anim" -- Varlık türünü 'anim' olarak ayarlar, bu da onun animasyonlu bir Varlık olduğunu gösterir. ENT.Base = "base_gmodentity" -- Bu Varlığın 'base_gmodentity' tabanlı olduğunu ve onun işlevselliğini miras aldığını belirtir. ENT.PrintName = "Test Varlığı" -- Oluşturma (spawn) menüsünde görünecek olan isim. ENT.Author = "Adınız" -- Bu Varlığın yazarının adı. ENT.Category = "Test Varlıkları" -- Bu Varlığın oluşturma menüsündeki kategorisi. ENT.Contact = "STEAM_0:1:12345678" -- Bu Varlığın yazarının iletişim bilgileri. ENT.Purpose = "Varlık oluşturmayı test etmek." -- Bu Varlığın amacı. ENT.Spawnable = true -- Bu Varlığın oyuncular tarafından oluşturma menüsünde oluşturulup oluşturulamayacağını belirtir.
init.lua örneği:
AddCSLuaFile("cl_init.lua") AddCSLuaFile("shared.lua") include("shared.lua") -- Varlık için sunucu tarafı başlatma fonksiyonu function ENT:Initialize() self:SetModel( "models/hunter/blocks/cube025x025x025.mdl" ) -- Varlık için modeli ayarlar. self:PhysicsInit( SOLID_VPHYSICS ) -- Varlık için fiziği başlatır, onu katı ve etkileşime girilebilir hale getirir. self:SetMoveType( MOVETYPE_VPHYSICS ) -- Varlığın nasıl hareket edeceğini fizik kullanarak ayarlar. self:SetSolid( SOLID_VPHYSICS ) -- Varlığı katı yaparak çarpışmalara izin verir. local phys = self:GetPhysicsObject() -- Varlığın fizik nesnesini alır. if phys:IsValid() then -- Fizik nesnesinin geçerli olup olmadığını kontrol eder. phys:Wake() -- Fizik nesnesini etkinleştirir, Varlığı fiziğe (yerçekimi, çarpışmalar, vb.) tabi kılar. end end
cl_init.lua örneği:
include("shared.lua") -- Varlık için istemci tarafı çizim fonksiyonu function ENT:Draw() self:DrawModel() -- Varlığın modelini çizer. Bu fonksiyon her karede çağrılır. end

Tek Bir Dosya ile Varlık Oluşturma

AddCSLuaFile() -- Varlığın türünü, temelini, yazdırılabilir adını ve yazarını paylaşılan erişim (hem sunucu hem de istemci) için tanımlar ENT.Type = "anim" -- Varlık türünü 'anim' olarak ayarlar, bu da onun animasyonlu bir Varlık olduğunu gösterir. ENT.Base = "base_gmodentity" -- Bu Varlığın 'base_gmodentity' tabanlı olduğunu ve onun işlevselliğini miras aldığını belirtir. ENT.PrintName = "Test Varlığı" -- Oluşturma (spawn) menüsünde görünecek olan isim. ENT.Author = "Adınız" -- Bu Varlığın yazarının adı. ENT.Category = "Test Varlıkları" -- Bu Varlığın oluşturma menüsündeki kategorisi. ENT.Contact = "STEAM_0:1:12345678" -- Bu Varlığın yazarının iletişim bilgileri. ENT.Purpose = "Varlık oluşturmayı test etmek." -- Bu Varlığın amacı. ENT.Spawnable = true -- Bu Varlığın oyuncular tarafından oluşturma menüsünde oluşturulup oluşturulamayacağını belirtir. -- Bu, hem İstemci hem de Sunucu alanlarında çağrılacaktır function ENT:Initialize() -- Sunucu alanı için olan kodun yanlışlıkla İstemci üzerinde çalışmadığından emin olun if SERVER then self:SetModel( "models/hunter/blocks/cube025x025x025.mdl" ) -- Varlık için modeli ayarlar. self:PhysicsInit( SOLID_VPHYSICS ) -- Varlık için fiziği başlatır, onu katı ve etkileşime girilebilir hale getirir. self:SetMoveType( MOVETYPE_VPHYSICS ) -- Varlığın nasıl hareket edeceğini fizik kullanarak ayarlar. self:SetSolid( SOLID_VPHYSICS ) -- Varlığı katı yaparak çarpışmalara izin verir. local phys = self:GetPhysicsObject() -- Varlığın fizik nesnesini alır. if phys:IsValid() then -- Fizik nesnesinin geçerli olup olmadığını kontrol eder. phys:Wake() -- Fizik nesnesini etkinleştirir, Varlığı fiziğe (yerçekimi, çarpışmalar, vb.) tabi kılar. end end end -- Bu, bu satırın altındaki hiçbir şeyin Sunucu'da çalıştırılmamasını sağlamak için yaygın bir tekniktir if not CLIENT then return end -- Varlık için istemci tarafı çizim fonksiyonu function ENT:Draw() self:DrawModel() -- Varlığın modelini çizer. Bu fonksiyon her karede çağrılır. end

Bunlardan herhangi birinin ne işe yaradığından emin değil misiniz? Öğrenmek için mavi renkli fonksiyonlara() tıklamaktan çekinmeyin.

ENTITY:Initialize() ve ENTITY:Draw(), Hook olarak kabul edilir. Yukarıdaki örneklerde bunlar tıklanabilir değildir, ancak bu sayfanın sol üst köşesine is:event (iki boşluk) yazarak hook'ları arayabilirsiniz.

Bu Hook'lar oyun tarafından her çağrıldığında, Varlığınız onlar için tanımladığınız kodu çalıştırır. Varlığınızın nesne sınıfını kaydetmek için burada ENT olarak yazılırlar.

Sonuçlar

Varlığı ister tek bir dosyayla ister birkaç dosyayla oluşturmuş olun, nihai sonuç aynı olmalıdır.

Oluşturma menüsündeki Varlık

Varlığın kendisi

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord