Oyun Hareketi
Oyunun hareket sisteminin nasıl çalıştığını kavramak kolay değildir. Bu sayfa, neler olup bittiğini açıklamaya çalışacaktır.
İstemci vs Sunucu vs Tek Oyunculu
Bir sunucuya bağlı istemciler genellikle, sunucunun ne yapacağını daha yapmadan tahmin etmek için Prediction (Tahmin) kullanır. Eğer çok oyunculu modda çalışmayı planlıyorsanız, devam etmeden önce tahmin sisteminin nasıl çalıştığını anlamalısınız. Tek oyunculu modda ise, istemcinin kare hızının oyunun tickrate'inden daha hızlı olabilmesi nedeniyle tahmin (interpolasyon) hala geçerlidir, ancak aksi takdirde göz ardı edilebilir.
Eğer çok oyunculu modda tahmin sistemi devre dışı bırakılırsa, tüm istemci taraflı simülasyonlar devre dışı kalır ve aşağıda buna atıfta bulunan kısımları göz ardı edebilirsiniz. Kullanıcının girdisi ve diğer veriler sunucuya gönderilir ve istemci, oyuncunun yeni durumunu sunucudan alana kadar güncellenmez.
Kullanıcı Komutu (User Command)
Oyun, oyuncu girdisini bir kullanıcı komutu (CUserCmd) yapısı aracılığıyla takip eder. Bu yapılar, oyuncunun tuşları ve fare hareketleri kullanılarak oluşturulur. Bu kullanıcı komutu daha sonra motor içinde bir kuyrukta saklanır.
CreateMove
Her karede, istemci dahili olarak CreateMove fonksiyonunu çalıştırır. Bu, yeni bir kullanıcı komutu oluşturur, klavye ve fare girdisini okur, bu bilgiyi komuta aktarır ve oyuncunun ve diğer nesnelerin bu bilgiyi değiştirmek için kendi dahili CreateMove fonksiyonlarını çalıştırmasına izin verir. Ardından, kontrol GM:CreateMove hook'una devredilir.
Bu hook, tüm dahili kontroller ve güncellemeler tamamlandıktan sonra çalışır, bu nedenle komut yapısı yerel oyuncu girdisini yönetmek için ihtiyacınız olan tüm bilgileri içermelidir. Ancak, yalnızca istemcide çalıştığı için kolayca geçersiz kılınabilir. Eğer oyuncunun sunucu tarafında belirli bir durumda olmasına güveniyorsanız, değişikliklerinizi bu hook yerine bir sonraki hook'u kullanarak sunucuda zorunlu kılmalısınız.
Bu fonksiyonun aşağıda bahsedilen CMoveData ile ilgili olmadığını unutmayın, hareket verisi (move data) henüz ayarlanmamıştır.
StartCommand
Tahmin sisteminin etkin olduğu çok oyunculu bir oyunda, oyuncu fiziği gibi bazı fizik olayları istemcide simüle edilir. Bu simülasyon aynı zamanda kuyruktaki kullanıcı komutlarının sonuçlarını da tahmin edecektir. GM:StartCommand hook'u, istemci tahmininin ilk adımı olarak dahili olarak çağrılan şeydir.
Hem tek oyunculu hem de çok oyunculu modda, tahmin edilmeyen kullanıcı komutları istemciden sunucuya gönderilir (tek oyunculuda olduğu gibi oyununuz hem istemci hem de sunucu olabilir) ve burada StartCommand tekrar çalıştırılır. Bu süreç, istemci tahminiyle paralel olarak işler.
Her iki durumda da, mevcut tüm kuyruktaki kullanıcı komutları sırayla işlenir. Bu hook, kontrolleri değiştirmek için (hareketi engelleme vb.) iyi bir yerdir çünkü bundan sonraki her şey burada olanlara bağlıdır ve istemcilerin değişikliklerinizi atlamasını önlemek için gerekli olan hem istemcide hem de sunucuda çalıştırılır. Ancak, eğer istemci tahmin yapıyorsa, bu hook'ta istemci ve sunucuda iki farklı şey yapmanın tahmin hatalarına yol açacağını unutmayın.
SetupMove
GM:SetupMove hook'u, veriyi kullanıcı komutundan bir CMoveData yapısına aktarmak ve hareket ettirdiğiniz varlığın (muhtemelen oyuncunun) başlangıç noktasını/hızını ayarlamak için kullanılır.
Burada kullanıcı komutunda yapılan değişiklikler göz ardı edilir. Dahili olarak, komut zaten okunmuş ve değerleri hareket verisini (move data) oluşturmak için kullanılmıştır. Ancak, kullanıcı komutuna dayalı olarak kendi hareket verisi değişikliklerinizi kolayca yapmanıza olanak tanımak için yine de bir argüman olarak sağlanır.
Bu hook, sunucuda ve çok oyunculu modda istemcide çağrılır. Eğer tahmin düzgün bir şekilde gerçekleşiyorsa, istemci ve sunucudaki aynı kullanıcı komutu verildiğinde, sonuçtaki hareket verisi de aynı olmalıdır.
Move
GM:Move hook'u işin büyük kısmını yapar. Fizik hesaplamaları, çarpışma kontrolleri ve diğer yoğun işler burada yapılmalıdır. Bu kontrollerin sonuçları hareket verisi (move data) yapısına yazılmalıdır.
Yani bu hook'ta, örneğin, MoveData yapısına bakar, diğer faktörlere (basılı tuşlar, hız vb.) göre başlangıç noktasını hareket ettirir ve bu sırada zemin ve duvarlarla çarpışmayı hesaba katarsınız.
Unutmayın ki sadece hareket verisi (move data) yapısını değiştirmelisiniz, hareket ettirilecek varlığı değil. Bunun nedeni, bu hook'ların tahmin hatalarını çözmek için birden çok kez çağrılabilmesidir.
FinishMove
GM:FinishMove hook'u, hareket verisindeki değişiklikleri varlığınıza uygulamanız gereken yerdir. Tahmini hesaplamak için istemcide birden çok kez çalışabilen diğer hook'ların aksine, bu hook tahmin tamamlandıktan sonra yalnızca bir kez çağrılır.
Drive Sistemi
drive sistemi, tüm bunları daha modüler hale getirmek ve sadece oyuncuyu değil, diğer nesneleri de kontrol edebilmenizi sağlamak için icat edilmiştir.
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord