Durumlar ve Alemler

Garry's Mod'da 'realm' (alan) olarak da bilinen Lua durumları, birbirleriyle yalnızca net ve file kütüphaneleri gibi dolaylı yollarla etkileşime girebilen ve iletişim kurabilen Lua dilinin ayrı örnekleridir. Ayrı Lua durumları oldukları için, bir durumdaki global değişkenler dolaylı iletişim yöntemleri kullanılmadan başka bir durumda alınamaz.

Durumlar, özel fonksiyonlarını ve geri çağrılarını (callback), oyun motoru tarafından dahil edilen Lua dosyaları aracılığıyla yükler. Aşağıda her bir durum altında açıkça listelenenler dışındaki tüm dosyaların kullanılabilmesi için Lua'dan dahil edilmesi gerekir.

Garry's Mod'da 3 adet Lua durumu bulunur:

İstemci (Client)

image.png

İstemci (client) durumu, oyun istemcisini temsil eden Lua durumudur. Oyuncu girdisini alır ve sunucuya gönderirken, diğer varlıklar ve oyuncular hakkındaki verileri alır, ardından tüm bu bilgileri Tahmin (Prediction) için kullanır. İstemci, varlıkları sunucunun tickrate'i ile senkronize olarak simüle eder, ancak her karede (frame) görüntü işleme (rendering) gerçekleştirir.

İstemci (client) durumu, sunucu (server) durumuyla net kütüphanesi ve sunucu taraflı concommand'leri çalıştırarak etkileşim kurabilir ve iletişim kurabilir.

Lua kodu, CLIENT global değişkeninin true olup olmadığını kontrol ederek istemci (client) durumunda çalışıp çalışmadığını tespit edebilir.

Oyun Motoru Lua Dosyaları - İstemci (Client)

  • lua/includes/init.lua
  • lua/derma/init.lua
  • lua/gamemodes/base/gamemode/cl_init.lua (bu, ayarlanan oyun modundan bağımsız olarak her zaman yüklenir)
  • lua/autorun/*.lua
  • lua/autorun/client/*.lua
  • lua/postprocess/*.lua
  • lua/vgui/*.lua
  • lua/matproxy/*.lua
  • lua/skins/default.lua
  • lua/gamemodes/<gamemode_name>/gamemode/cl_init.lua
  • lua/gamemodes/base/entities/entities/*.lua
  • lua/gamemodes/base/entities/entities/*/cl_init.lua
  • lua/gamemodes/base/entities/weapons/*.lua
  • lua/gamemodes/base/entities/weapons/*/cl_init.lua
  • lua/entities/*.lua
  • lua/entities/*/cl_init.lua
  • lua/weapons/*.lua
  • lua/weapons/*/cl_init.lua
  • lua/gamemodes/<gamemode_name>/entities/entities/*.lua
  • lua/gamemodes/<gamemode_name>/entities/entities/*/cl_init.lua
  • lua/gamemodes/<gamemode_name>/entities/weapons/*.lua
  • lua/gamemodes/<gamemode_name>/entities/weapons/*/cl_init.lua

Sunucu (Server)

image.png

Sunucu (server) durumu, oyun sunucusunu temsil eden Lua durumudur. Bir Listen Server aracılığıyla oyun istemcisiyle aynı sistemde veya bir Dedicated Server olarak ayrı bir sistemde olabilir. Oyuncu girdilerini alır, statik bir tickrate'de fizik ve varlık simülasyonu gerçekleştirir, ardından sonucu bağlı olan tüm oyunculara ağ üzerinden gönderir.

Sunucu (server) durumu, istemci (client) durumuyla net kütüphanesi (ve eskiden umsg kütüphanesi) aracılığıyla etkileşim kurabilir ve iletişim kurabilir.

Lua kodu, SERVER global değişkeninin true olup olmadığını kontrol ederek sunucu (server) durumunda çalışıp çalışmadığını tespit edebilir.

Oyun Motoru Lua Dosyaları - Sunucu (Server)

  • lua/includes/init.lua
  • lua/gamemodes/base/gamemode/init.lua (bu, ayarlanan oyun modundan bağımsız olarak her zaman yüklenir)
  • lua/autorun/*.lua
  • lua/autorun/server/*.lua
  • lua/gamemodes/<gamemode_name>/gamemode/init.lua
  • lua/gamemodes/base/entities/entities/*.lua
  • lua/gamemodes/base/entities/entities/*/init.lua
  • lua/gamemodes/base/entities/weapons/*.lua
  • lua/gamemodes/base/entities/weapons/*/init.lua
  • lua/entities/*.lua
  • lua/entities/*/init.lua
  • lua/weapons/*.lua
  • lua/weapons/*/init.lua
  • lua/gamemodes/<gamemode_name>/entities/entities/*.lua
  • lua/gamemodes/<gamemode_name>/entities/entities/*/init.lua
  • lua/gamemodes/<gamemode_name>/entities/weapons/*.lua
  • lua/gamemodes/<gamemode_name>/entities/weapons/*/init.lua
image.png

Menü (menu) durumu, oyun istemcisindeki izole edilmiş dahili bir Lua durumudur ve yalnızca ana menü için kullanılır. İstemci (client) durumunda bulunmayan ekstra fonksiyonlara sahiptir. Menü modifikasyonları ve eklentileri resmi olarak desteklenmez, bu nedenle menü (menu) durumu kodunu çalıştırmak, oyun motorunun Lua dosyalarından birinin üzerine yazmayı gerektirir. Bu nedenle, kasıtlı olarak bir şeyin üzerine yazmıyorsanız, kodunuzu menüde çalışacak şekilde ayarlama konusunda endişelenmenize gerek yoktur.

Menü (menu) durumu, istemci (client) veya sunucu (server) durumlarıyla etkileşime giremez; yani, menü (menu) durumu, istemci veya sunucu üzerinde bir geri çağrı (callback) oluşmasına neden olacak herhangi bir fonksiyonu çalıştıramaz. İstemci (client) ve menü (menu) durumları, her zaman ortak bir dosya sistemini paylaştıkları için file kütüphanesi aracılığıyla dolaylı olarak iletişim kurabilirler.

Lua kodu, MENU_DLL global değişkeninin true olup olmadığını kontrol ederek menü (menu) durumunda çalışıp çalışmadığını tespit edebilir.

Oyun Motoru Lua Dosyaları

  • lua/includes/init_menu.lua
  • lua/derma/init.lua
  • lua/menu/menu.lua
  • lua/vgui/*.lua

Diğer

Bunlar gerçek durumlar değildir; daha ziyade, temsil ettikleri fonksiyonun veya kancanın (hook), belirtilen durumlarından herhangi birinde yürütülebileceğini belirtirler:

  • Paylaşılan (Shared) (İstemci ve Sunucu)
image.png
  • İstemci ve Menü
image.png
  • Paylaşılan (Shared) ve Menü (tüm durumlar - İstemci, Sunucu ve Menü)
image.png

Bu, fonksiyonun/kancanın (hook) farklı durumlarda aynı değerleri döndüreceği veya aynı şeyi yapacağı anlamına gelmez. Örneğin, Entity:GetPos fonksiyonu hem Sunucuda hem de İstemcide çağrılabildiğinden "paylaşılan" (shared) olarak kabul edilir. undo.GetTable da paylaşılan bir fonksiyondur, ancak açıklamasında belirtildiği gibi İstemci ve Sunucuda farklı çalışır. Öte yandan, math ve string gibi kütüphaneler 3 durumda da aynı işlevselliğe sahiptir.

"Paylaşılan (Shared)" bir durum değildir

Sunucu (Server) ve İstemci (Client) durumlarının (halk arasında "Paylaşılan (Shared)" olarak bilinir) çalışma zamanında tamamen ayrı olduğunu ve bir arada var olamayacaklarını hatırlamak önemlidir. Yani, şunun gibi bir şey:

if SERVER and CLIENT then -- her zaman false... end

hiçbir anlam ifade etmez, çünkü SERVER and CLIENT koşulu, her iki durumun karşılıklı olarak birbirini dışlaması nedeniyle her zaman false döndürecektir. Herhangi bir anda ikisinden yalnızca biri doğru (true) olabilir.

Bu yüzden, "Paylaşılan durum (Shared state)" sizi yanıltmasın; bu aslında bir durum değildir. "Paylaşılan (Shared)", CLIENT ve SERVER'ın aynı anda true olacağı anlamına gelmez - bu sadece bir kod parçasının herhangi bir anda Sunucuda veya İstemcide çalıştırılabileceğini, ancak her ikisinde "aynı anda" çalıştırılamayacağını ifade etmenin kısa bir yoludur.

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