Eski işimden ayrılalı yedi sene oldu ama oyun sektörü içinden ayrılmadım, hala güncel teknolojileri takip ediyor, kendim de bir şeyler üzerine çalışıyorum. Hazır epeydir yazmıyorken burada hem oyuncular hem de yapımcılar için tecrübelerimi aktarmaya çalışayım.
Öncelikle tecrübelerim online oyunlar üzerine bu yüzden odağım burası olacak.
İster milyonlarca oyuncusu olsun, isterse indie bir oyun olsun temelde online oyunların çalışma mantığı aynıdır. Client – Server, Client – Client arasında çeşitli veri transferi olur, bu verilerin bir kısmı memory’de bir kısmı database’de bir kısmı da kullanıcıların sabit sürücülerinde tutulur. Oyun oynarken kim nerede, kim kime ne kadar hasar verdi, kimin canı ne kadar, kimin ne kadar mermisi var gibi bir sürü veri client tarafından okunur ve sunucu ile paylaşılır.
Oyununuzu tasarlarken hangi verilerin localde hangilerinin ise server tarafında tutacağınıza karar verirsiniz. Localde tutulan çoğu şey değiştirilmeye açık olabileceğinden ya da oyun mekanikleri için diğer oyuncuların ihtiyaç duyduğu verileri paylaşmanız gerektiğinden bunun bir dengesi tutturmak zorunda kalırsınız. Her şey tek taraflı olamaz. Çok büyük bir paket gönderirseniz lag oluşması, paket kaybı durumlarıyla karşılaşabilirsiniz, az veri gönderirseniz de hileye daha açık hale gelebilir veya çeşitli özellikleri kullanamayabilirsiniz.
Lokalde ilk hile teşebbüsleri memory üzerinde tutulan geçici değerlerin oynanması üzerine olur. Kullanıcıların hangi değerlerin oyun sırasında değiştiğini takip edip daha sonra bu değerleri istedikleri gibi değiştirecek scriptler hazırlar. Buna karşı çeşitli kütüphanelerle bu verilerin yerleri ve valueları şifrelenmeye çalışılır, değiştirilir, gizlenmeye çalışılır ama günün sonunda buna net önlem almazsanız sürekli güncelleme yapmak gerecektir. Burada işte sınırsız cephane, can, oyunun bazı mekaniklerini değiştirme gibi şeyler yapılır. Bunların ne kadarının sunucuya gideceği veya client tarafında önlenebileceği üzerine çalışmak gerekir. Çeşitli değerleri limitlemek ve kontrol etmek en azından hilenin etkisini azaltmaya yarayacaktır. Örnek:
Does Unity editor contain any anti-cheat protection when you publish the Game?
by inUnity3D
https://forum.unity.com/threads/anti-cheat-toolkit-stop-cheaters-easily.196578/
Başka bir yöntem sunucuya giden paketlerin değiştirilmesi şeklinde olabilir. Network izlenip giden paketlerin içeriğiyle oynanarak istatistik veya sunucu tarafında tutulan bazı başka veriler oynanmaya çalışılabilir. Bunu engellemek için çeşitli kontroller koyabilirsiniz ama latency’e yol açmayacak şekilde işlemler yapıyor olmanız lazım. Her şeyi sunucuda tutmak ayrıca çok büyük maliyet getirecektir. Burada şifreli olarak veri gönderip almanın da işlem maliyetini hesaplamanız lazım.
Diğer bir yöntemimiz daha basit olan direkt oyun dosyalarının configlerinin değiştirilmesiyle geliştirilen uygulamalardır, burda herhangi bir oyun dosyası veya ayarının değişip değişmediğini bütünlüğünü kontrol etmeniz gerekir. Çeşitli şifreleme algoritmaları ya da yazılımlarla bu özellikleri genelde çoğu oyun elde eder. Checksum kontrolü en basit örneğidir. DRM’de burada işin içine girebilir.
Yazılım derken, online oyunları açarken yüklenen güvenlik yazılımlarını görmüşsünüzdür. Bunlar bir yandan temel bazı değerleri kontrol ederken diğer yandan da sizin gönderdiğiniz dosya ve uygulamaları engellemeye çalışır. Sürekli bir güncelleme ve kontrol gerekir. Akıllı olmayan özelliklerini takip ederek güncellemeniz gerekir sadece engellemek değil sert yaptırım uygulamakta hile ile mücadelenin olmazsa olmazıdır. Mobil ve Desktop için farklı yazılımlar piyasada bulunmakta. Maalesef hiç biri mükemmel değil ve sürekli takip gerektirir. Single player ise çok fazla uğraşmanın anlamı yok ama multiplayer büyük bir oyunda en azından bunlardan birisi ile anlaşmanız gerekir.
Bence olmazsa olmaz diğer bir kalem loglama taranın ne kadar detaylı tutulacağı konusudur. Örnek verelim bir MMO üzerinde drop olan, alınan, trade edilen tüm işlemleri loglamalı. Bunları farklı scriptler ile kontrol etmelisiniz. Sürekli bir çalışma olmaz ama periyodik olarak dataları analiz edip sorunlu kullanıcılar üzerine aksiyon alabilirsiniz.
Anlattıklarımı özetlemek gerekirse;
Kritik variable’ları server tarafında tut,
Client tarafında verileri şifreli tut, build alırken ona göre al,
Oyuncudan gelen veriyi kontrol etmeden kaydetme,
Bir güvenlik yazılımını entegre et,
Detaylı log tut ve periyodik kontrol et.
Umarım yardımcı olur. Detaylı kod örneği paylaşamıyorum kullandığımız motora, dile vs göre değişiyor çok ama genel mantık hepsinde aynı.