Metin2 Source Dosyalarının Ayrıntılı Açıklaması

Whistle

Ruhsuz :/
Kurucu
Geliştirici
Yardımsever Üye
Mesaj
11.941
Çözümler
567
Beğeni
13.659
Puan
5.915
Ticaret Puanı
2
Merhaba arkadaşlar,
Normalde eğitim serisinin 6. ünitesinde bu konuyu açmayı planlıyordum ama özel olarak istek geldiği için konuyu açma gereği duydum.

Bu tarz konuları açması zaman alan bir işlem ve bu tarz konuları açmak yılların bilgi birikimini de beraberinde getiriyor. Bu konu da tabii ki de övünmüyorum ama şu noktada sitemimi bulundurmak istiyorum.
Platformumuzda paylaşılan içerikler herkese açık ve isteyenlerin de kaynağı belirtmek şartıyla paylaşabileceğini sürekli belirtiyorum ama insanlara iyilik yaramıyor. Kendi yazdığım bir sistemi paylaşıyorum bakıyorum başka sitelerde kendisi yapmış gibi paylaşanlar, rehber hazırlıyorum kendisi yapmış gibi paylaşanlar. Bu yakındığım kesimin çok az olduğunu da belirtmek istiyorum; bu yüzden de olabildiğinde bu sektöre katkılarımı sunmak istiyorum.

Gelelim konumuza. Bu konumuz daha çok sistem yazmak isteyen kişiler için hazırlanmıştır. Bir platform üzerinde bir şeyler geliştirmek istiyorsanız ilk önce o platformu iyice tanımanız gerek. Bu konu da en azından bu işe yarayacak. İmkan olsa tüm kodları tek tek açıklayabileceğimiz bir konu açardık ama kitap haline getirsek binlerce sayfa yer kaplar. Bu yüzden şu konu da -Metin2 Root Packının İçindeki Python Dosyalarının Oyundaki Karşılığı- olduğu gibi dosyaları açıklayacağım.

Başlamadan önce şunu bilmelisiniz.
Metin2'nin kaynak kodları 2 parçadan oluşur: Bunlar Server ve Client.

Peki nedir bu server ve client?
Çok oyunculu oyunlarda server oyuncuların bilgilerini hafıza da tutmak ve bağlı olan tüm clientlere bilgi göndermekle yükümlüdür. Client ise oyunumuzu oynadığımız program. Serverden gelen verileri bizim anlayacağımız şekilde gösterir.
Mesela MMO Tutkunları'ndan örnek verelim. Tarayıcı ile bu siteyi açtınız ve size sunulan şeyleri görüyorsunuz. Bu kısım client oluyor. Server kısmı ise tüm herkesten gelen verileri işleyip, kaydedip başka bağlı olanlara göndermesini örnek gösterebiliriz. Metin2 gibi oyunlar da buna benzer bir yapı. Terimler de çok iyi değilim ama terimlerle sizi sıkmak istemiyorum. Merak edenler için socket programlama diye aratabilir.

Metin2'nin kaynak kodlarının 2 parçadan oluştuğunu ve gerekli açıklamaları yaptım. Lakin bu her parçanın kendi arasında da parçaları mevcut.
Client kısmı 16 ayrı parçaya ayrılmıştır. Tüm bu parçalar tek bir clienti oluşturur.
Server kısmı ise 8 ayrı parçaya ayrılmıştır. Serverde ki bu parçalar ise game ve dbyi oluşturur.

Ben server kısmının çoğuna baya hakimim ama cliente o kadar hakim değilim. Bu konu da sadece bildiğim şeyleri yazacağım. Bilmediğim yerleri bilmiyorum diye yazacağım. Eğer bilinmeyen yerlerle ilgili bilginiz varsa yorum olarak belirtirseniz konuya dahil ederim.

Şimdi başlayalım Server kısmını incelemeye
Not: Klasör yapısı filesten filese değişiklik gösterebilir. Ben kendi dosyalarımdan örnekliyorum!

Server şu yapıda bulunur.
  • common : Sabitlerin bulunduğu yer.
  • db : Veritabanı işlemlerini yapan çekirdek.
  • game : Veritabanından (db çekirdeğinden) ve clientlerden gelen bilgileri işleyen ve client ile bağlantısı olan yer. Yani oyunun kalbi.
    • lzo : Packların şifrelenmesiyle alakalı bir şey.
    • quest : Server filesimizde ./qc whistle.quest şeklinde komut yazıyoruz. qc'nin kaynak kodlarının bulunduğu yer burası.
  • libgame : game'ye yardımcı dosyalar bulundurur. Daha çok envanter kutucukları ve item efsunları için.
  • liblua : Server filesimizde bulunan lua (quest) kodlarının çalışması için.
  • libpoly : Polinomları işlemek için C kütüphanesi.
  • libsql : Db için sql eklentisi. (veritabanı)
  • libthecore : Bilinmiyor.

Biz sadece common, db ve game içindeki dosyaları inceleyeceğiz. Sırasıyla incelemeye başlayalım o halde. :)

Başlamadan önce dosya türlerini tanıyalım ve Manager yapısını öğrenelim;
  • .h : Header file olarak bilinir. Fonksiyonların, sınıfların, structların vs belirtildiği dosyalar.
  • .cpp : Headerde tanımlı olan sınıf ve fonksiyonların içeriğinin bulunduğu yerdir.

Dosyaları açıklarken manager ismini sıklıkla göreceğiz. Oyunun kaynak kodlarında OOP (Object-oriented programming - Nesne Yönelimli Programlama) denilen yapı kullanılıyor. Peki nedir bu?
Mesela karakter bilgileri char.cpp dosyasında saklanıyor. Sınıf yapısında göre bilgiler eklenir. char_manager.cpp dosyasında ise her karakter için oluşturulan char.cpp sınıfı map/vectorlere eklenir. Yani özetle şunu demek mümkün. manager dosyalarında vector olarak sınıflar saklanır. Daha önce php ile uğraşanlar bu durumu bilir aslında. PHP ile daha az kod ile bu yapı oluşturulduğu için size bir örnek vermek istiyorum;

Burada basit bir düzeyde char ve char_manager yapısı oluşturdum. char sadece tek bir hesapla ilgili işlemleri yaparken. char_manager tüm karakterleri bulunduracak.
PHP:
Genişlet Daralt Kopyala
<?php
/**
* Created by Whistle
*/
class Char
{
    private $id;
    private $name;
    private $level;

    /**
     * Char construct
     * @param int $id
     * @param string $name
     * @param int $level
     */
    public function __construct($id, $name, $level)
    {
        $this->id = $id;
        $this->name = $name;
        $this->level = $level;
    }

    public function GetName() { return $this->name; }
    public function GetPID() { return $this->id; }
    public function GetLevel() { return $this->level; }

    /**
     * Oyuncunun levelini günceller.
     *
     * @param int $level
     */
    public function SetLevel($level)
    {
        $this->level = $level;
    }
}

class CharManager
{
    private $charArray = [];

    /**
     * Yeni bir karakter ekler.
     *
     * @param \Char $obj
     */
    public function AddCharacter(Char $obj)
    {
        //eğer daha önce bu karakter oluşturulmuşsa eklemez.
        if(!in_array($obj, $this->charArray))
        {
            array_push($this->charArray, $obj);
        }
    }

    /**
     * Karakter adına göre arama yapar.
     *
     * @param string $name
     * @return boolean|\Char
     */
    public function FindByCharacterName($name)
    {
        foreach($this->charArray as $char)
        {
            if($char->GetName() == $name)
                return $char;
        }

        return false;
    }

    /**
     * Karakter idsine göre arama yapar.
     *
     * @param int $pid
     * @return boolean|\Char
     */
    public function FindByPID($pid)
    {
        foreach($this->charArray as $char)
        {
            if($char->GetPID() == $pid)
                return $char;
        }

        return false;
    }

    /**
     * Toplam online sayısını verir.
     *
     * @return int
     */
    public function GetOnlineCount() { return count($this->charArray); }
}
?>


Örnek uygulamamızı çalıştırmak için sanki oyuncu oyuna girmiş ve veritabanından verilerini almış gibi sahte kod yazıyoruz. Veriler şu şekilde olsun diyelim.
Sonra bunları hafızaya ekleyeceğiz.
PHP:
Genişlet Daralt Kopyala
<?php
$players = [
    [1, "Whistle", 95],
    [2, "Casro2", 80],
    [3, "MMO Tutkunları", 99],
];

$charManager = new CharManager();

foreach($players as $player)
{
    $charManager->AddCharacter(new Char($player[0], $player[1], $player[2]));
}
?>


Şimdi ben toplam online miktarı ve Whistle adlı oyuncunun tüm verilerine ulaşmak istiyorum diyelim.
PHP:
Genişlet Daralt Kopyala
<?php
var_dump($charManager->FindByCharacterName("Whistle"));
echo "Toplam Online: ".$charManager->GetOnlineCount();
?>

Bu komutun çıktısı şu şekilde olacaktır;
Manager Ornek Uygulama 1.jpg


Evet gördüğümüz gibi toplam 3 oyuncu varmış ve biz Whistle adlı oyuncunun verilerine erişebildik. Tabii ki oyunda bu işlemler bu kadar basit değil. Bu örnek uygulama olduğu için verileri az tuttum.


Mesela son olarak bir uygulama daha yapalım. Mesela oyunda GM komutu ile bir karakterin yükselteceksiniz diyelim. Oyunun çekirdek dosyasının çalışma mantığına göre bunu da gösteriyim;
PHP:
Genişlet Daralt Kopyala
$whistleChar = $charManager->FindByCharacterName("Whistle");

if(!$whisleChar)
    return;

$whistleChar->SetLevel(99);

var_dump($whistleChar);

Şimdi çıktıyı alalım;
Manager Ornek Uygulama 2.jpg


Umarım temel olarak manager yapısını anlayabilmişsinizdir. Sözel anlatımı uygulamaya dökmek için oturup php'de bu kodları yazdım. :D
Virtual id yapısını da eklemeyi düşünüyordum ama bu konu çok uzayacağı için vazgeçtim. Virtual id yapısını ayrı bir konu da daha detaylı açıklayacağım.
İsterseniz konumuza devam edelim. ^_^


Common içindeki dosyalar;
  • billing.h : bilinmiyor.
  • cache.h : Adından da anlaşılayacağı üzere önbellek.
  • d3dtype.h : Renklerle alakalı şeyler.
  • noncopyable.h : Bilinmiyor.
  • pool.h : Bilinmiyor.
  • service.h : Definelerin tanımlı olduğu kısım. Makroları (#ifdef, #ifndef) tetikler. Genelde buraya sistemlerin sabitleri atanır. Örnek: #define CASRO2_OFFLINESHOP gibi.
  • singleton.h : Bilinmiyor.
  • teen_packet.h : Bilinmiyor.
  • VnumHelper.h : Oyunda ki mevcut itemlerin vnumuna göre kategoriye ayrılması. Örneğin: 71136 ise cadılar bayramı ile alakalı item.
  • building.h : Lonca binaları
  • item_length.h : İtemlerle akalı bilgiler bulunur. Flaglar, efsunlar vs.
  • length.h : Oyunun geneliyle alakalı bilgiler bulunur. Bir hesapta açılacak maks karakter miktarı, envanter boyutu, maks depolanan yang miktarı, karakter türleri, mob türleri, chat türleri vs.
  • auction_table.h : Bilinmiyor.
  • stl.h : Bilinmiyor.
  • tables.h : Game ile db arasında burada tanımlanan bilgilere göre veri gönderir (packet). Örn: Oyuna giriş yapılan karakterin bilgileri ve eşyaları, protoların yüklenmesi vs.
  • utils.h : Tam bilmiyorum ama kodlarda yazıları sayıya çeviren fonksiyonlar var.

db içindeki dosyalar;
  • AuictionManager.cpp/h: Bilinmiyor.
  • BlockCountry.cpp/h : Ülkelere göre engelleme. (Veritabanında belirtilen ip aralıklarına sahip olan yerlerden oyuna girişi yasaklar.)
  • Cache.cpp/h : Önbellekleri bulundurur. Oyunda yerden item aldığınızda veya sattığınızda bunlar anlık olarak veritabanına yazılmaz. Hafıza da tutulur ve belli süre aralıklarla kayıt yapılır. Bu yüzden oyunu reboot attığınızda item kaybı varsa oyunu kapatırken yanlış işlem yaptığınız içindir.
  • ClientManager.h: Bu header birden fazla cpp dosyası içindir. Bunlar sırayla;
    • ClientManager.cpp : Burayı db çekirdeğinin kalbi diyebiliriz. game'den gelen verileri burada işler.
    • ClientManagerBoot.cpp : Oyun açılırken veritabanında ki verileri çeker. (npcler de satılan eşyalar, protolar, loncalar, lonca binaları vs)
    • ClientManagerEventFlag.cpp : player.quest tablosunda dwPID değeri 0 olanları çeker ve event flag olarak oyuna tanımlar. Örnek: ay ışığı eventi, exp_rate gibi.
    • ClientManagerGuild.cpp : Loncaların oluşturulması, silinmesi, loncaya üyelerin eklenmesi gibi işlemlerin bulunduğu dosya.
    • ClientManagerHorseName.cpp : Bunu açıklamaya gerek var mı bilmiyorum ama at şekeri ile atınıza isim verdiğinizde bu dosya da çalışır.
    • ClientManagerLogin.cpp : Kullanıcı girişi yaparken, karakteri seçerken gereken bilgileri game gönderir. Game'den gelen bilgileri de veritabanına kayıt eder. Bu listede ki çoğu dosyanın görevi bu. Gelen verileri kayıt eder, veri gönderir. Bu dosya da kısaca oyuncu hesabı bilgilerini barındırır.
    • ClientManagerParty.cpp : Oyunda kurduğumuz gruplar.
    • ClientManagerPlayer.cpp : Oyuna girişte seçilen karakterin bilgilerini işler. İtemler, statüler vs.
  • Config.cpp/h : Server filesinizin db içinde CONFIG, conf.txt gibi dosyalar var. Bunlarda ki verileri alır ve işler.
  • CsvReader.cpp/h : Server filesinizde ki bulunan (item_names.txt, item_proto.txt, mob_names,txt, mob_proto.txt) dosyaların okunmasını için yardımcı dosya. Bu program her tab ile ayrılan şeyleri ayrı sütün olarak algılar. Excel programı ile de protoları açarsanız düzgün bir şekilde sütünlara ayrıldığını görebilirsiniz. (Bu dosyalar ClientManagerBoot.cpp'de okunur, işlenir ve game'ye gönderilir.)
  • DBManager.cpp/h - DBManager_mainline.cpp : Sql sorguları için yazılmış.
  • Grid.cpp/h : Envanterde bulunan kutucuklar var. Onlar için. Görevleri kısaca şu. Belirtilen kutu da item varsa bilgilerini alır. İtem olup olmama kontrolünü filan yapar. Detaylar için dosyayı inceleyebilirsiniz.
  • GuildManager.cpp/h : Loncaların işlendiği yer. Boot aşamasında tüm loncaları veritabanından alır. Oyun kapanırken kayıt yapar vs.
  • HB.cpp/h : Bilinmiyor.
  • ItemAwardManager.cpp/h : player.item_award tablosunda ki verilerin okunması için.
  • ItemIDRangeManager.cpp/h : player.item tablosunda itemlerin idsi var. Bu idlerin tanımlanması için.
  • Lock.cpp/h : Bilinmiyor.
  • LoginData.cpp/h : Giriş yapılan hesapla ilgili bazı bilgileri alır. Premium durumu vs.
  • main.cpp/h : Bunu açıklamaya gerek var mı bilmiyorum ama c++ projelerinde main dosyası bulunur. Bu da onun için. Diğer tüm dosyaların kullanımını burada tanımlanır. db açıldığında sırasıyla yapılacak işlemler burada belirtilir.
  • Marriage.cpp/h : Evlilik.
  • Monarch.cpp/h : Bu kullanılmayan bir özellik olduğu için pas.
  • MoneyLog.cpp/h : Oyuncunun yang log kayıtları.
  • NetBase.cpp/h : Bilinmiyor.
  • Peer.cpp/h : Bilinmiyor.
  • PeerBase.cpp/h : Bilinmiyor.
  • PrivManager.cpp/h : Oyunda drop açıyoruz. Bunla ilgili işlemler.
  • ProtoReader.cpp/h : Protoların okunması için gerekli.
  • QID.h : Bilinmiyor.
  • stdafx.h : Bu da c++ projelerinde bulunan header dosyası.
  • version.cpp : Versiyonla alakalı şey. Filesinizde VERSION.txt diye bir dosya vardır. Bu dosyayı oluşturup versiyonu yazdıran kodlar burada.

Game içindeki dosyaları;
  • affect.cpp/h : Oyunuda sol üst kısımda bulunan etkiler. (oto yang toplama, exp artış miktarı vs)
  • affect_flag.h : Efektlerin kontrolü için fonksiyonlar sunar.
  • ani.cpp/h : Karakter animasyonlarının kontrolü yapıldığı yer.
  • any_function.h : Buradan bakabilirsiniz:
    Linkleri görebilmek için giriş yap veya kayıt ol.
  • arena.cpp/h : Oyuncuların birbirleri ile ws attığı bir harita vardı. Sistemin çalışması için gerekli kontroller burada.
  • auction_manager.cpp/h : Bilinmiyor.
  • auction_packet.h : Bilinmiyor.
  • auth_brazil.cpp/h : Bilinmiyor.
  • banword.cpp/h : Küfür filtresi. (player.banword tablosunda yazan kelimeleri sansürler.)
  • battle.cpp/h : Savaş dinamiklerinin bulunduğu dosya.
  • BattleArena.cpp/h : Savaş arenası.
  • belt_inventory_helper.h : Kemer taktığınız zaman envanterin yanında ki küçük bölgeye potlar koyuluyor. Bu dosya ise hangi itemlerin koyulabileceğini, ne kadar slotun açılacağını denetler.
  • blend_item.cpp/h : Bilinmiyor.
  • block_country.cpp/h : Ülkelere yönelik engelleme kontrolleri. Mesela oyuna ABD'den giriş yapılmasını istemiyorsunuz diyelim. Bu dosya işlemleri yapıyor.
  • BlueDragon.cpp/h : Sürgün mağarasında ki mavi ejderha.
  • BlueDragon_Binder.cpp/h : Bilinmiyor.
  • BlueDragon_Skill.h : Mavi ejderhanın becerileri. Mesela size karşı mavi bi ateş atıyor.
  • buff_on_attributes.cpp/h : Giydiğiniz itemlerin efsunlarına göre karakterinize bufflar verir.
  • buffer_manager.cpp/h : Karakter bufflarını yönetir.
  • building.cpp/h : Lonca binalar.
  • castle.cpp/h : Oyunda kaleler vardı. Bunlarla alakalı.
  • char.h: Karakterlerle ve moblarla alakalı fonksiyon ve structlar burada bulunur. Bu header dosyası birden fazla cpp dosyası tarafından kullanılmaktadır. Sırasıyla;
    • char.cpp : Karakter bilgilerinin saklandığı yer. Karakterin adını, leveli ve bir çok şey burada saklanır.
    • char_affect.cpp : Karakter etkileri. Can yenileme vs.
    • char_battle.cpp : Karakter savaş dinamikleri. Bir moba veya oyuncuya saldırdığınız da ne kadar hasar vereceğiniz hesaplanır. Ya da siz saldırı aldığınız da canınızın ne kadar gideceği filan belirlenir. Efsunlara, yeteneklerinize, statülerinize, ekipman seviyenize kadar her şeyi hesaplar.
    • char_change_empire.cpp : Kralların İzi itemi ile bayrak değiştirdiğiniz zaman bu dosyada ki fonksiyonlar çalışır.
    • char_dragonsoul.cpp : Simya sistemi.
    • char_hackshield.cpp : Hackshield programının çalışması için.
    • char_horse.cpp : At, binekler vs
    • char_item.cpp : İtemler kullanıldığında yapılacak işlemlerden tutun, envanter yönetimine kadar bir çok şey bu dosyada. Game çekirdeğinde en fazla kod bulunan dosyalardan birisi de budur.
    • char_quickslot.cpp : Yetenekleri ve bazı itemleri aşağı kısımda ki taskbara ekliyoruz. Bu özelliğin çalışması için gerekli.
    • char_resist.cpp : Zehir, bleding gibi etkilerin karakterinize uygulayacağı etkiler.
    • char_skill.cpp : Karakter yetenekleri.
    • char_state.cpp : Mob durumları agrasiflik, npc vs.
  • char_manager.cpp/h : Tüm karakterlerin bilgilerinin saklandığı yer burası.
  • check_server.h : Server key kontrolü ile alakalı.
  • cipher.cpp/h : Şifreleme ile alakalı şeyler.
  • ClientPackageCryptInfo.cpp/h : Şifrelenmiş packlarla alakalı.
  • cmd.h: Komut yazdığımız zaman çalışması için gereken fonksiyonlar. Bu header dosyası birden fazla cpp dosyasında kullanılır. Sırayla;
    • cmd.cpp : Komutlar ve komutların kullanabilmek için gerekli yetkilerin ayarlandığı dosya.
    • cmd_emotion.cpp : Duygular.
    • cmd_general.cpp : GM kodu dışında genel olarak kullanılan komutlar. Burada ki komutlar oyuncular tarafından da kullanılabilir.
    • cmd_gm.cpp : GM'lerin kullanabildiği kodlar burada bulunur.
    • cmd_oxevent.cpp : OX eventle ilgili komutlar.
  • config.cpp/h : Filesinizin kanal dosyaları içinde CONFIG dosyası bulunur. Bu dosyaların okunması için.
  • constants.cpp/h : Bazı sabitlerin bulunduğu yer. Örn: Efsun listesi, lonca ve karakter level atlaması için gerekli exp oranlarının bulunduğu bölge.
  • crc32.cpp/h : Bilinmiyor.
  • cube.cpp/h : Craft sistemi. İksir yapımı, item dönüşümleri vs.
  • db.cpp/h : Veritabanı ile alakalı şeyler. Query çalıştırma vs.
  • debug_allocator.h : Bilinmiyor.
  • debug_allocator_adapter.h : Bilinmiyor.
  • debug_ptr.h : Bilinmiyor.
  • desc.cpp/h : Packet gönderip almak için gerekli fonksiyonlar.
  • desc_client.cpp/h : Yeni bir client açıldığında socket bağlantısı kurması için.
  • desc_manager.cpp/h : Bağlı clientler, hesaplar ve karakter bilgilerinin bulunduğu dosya.
  • desc_p2p.cpp/h : Yeni bir p2p bağlantısı açıp sonlandırma.
  • dev_log.cpp/h : Geliştirme aşamasında daha detaylı log kayıtlarını tutar. Bunun için test serveri aktif ediniz.
  • dragon_soul_table.cpp/h : Simya taş kademeleri.
  • DragonLair.cpp/h: Sürgün içinde ki mavi ejderha ile alakalı.
  • DragonSoul.cpp/h : Simya sistemi.
  • dungeon.cpp/h : Dungeon kontrolleri. game99 içinde bulunan haritalar için. Yeni bir giriş yapıldığında sanal core oluşturma, grup halinde oyuncuları aynı bölgeye atma vs.
  • empire_text_convert.cpp/h : Aynı krallıkta olmayan oyuncular ile iletişim kurulmuyor. Lisanı geliştirdikçe ufak ufak anlaşılır oluyordu. Bu dosya da yazdığınız yazının karşıda ki oyuncu da nasıl gözükeceği düzenler.
  • entitiy.cpp/h entitiy_view.cpp : Varlıklar (karakter mob vs.) gözükmesi için
  • event.cpp/h : Zaman ayarlı eventlerin düzenlenmesi için.
  • event_queue.cpp/h : Bilinmiyor.
  • exchange.cpp/h : Oyuncular arası ticaret. (ticaret penceresi)
  • fifo_allocator.h : Bilinmiyor.
  • file_loader.cpp/h : Filesinizde ki metin dosyalarının okunması için.
  • FileMonitor_Freebsd.cpp/h : Bilinmiyor.
  • fishing.cpp/h : Balıkçılık.
  • FSM.cpp/h : Bilinmiyor.
  • gm.cpp/h : GM :D
  • group_text_parse_tree.cpp/h : Bilinmiyor.
  • guild.cpp/h : Lonca bilgilerine ulaşmak için.
  • guild_manager.cpp/h : Tüm loncaların hafıza tutulduğu bölge.
  • guild_war.cpp : Lonca savaşı.
  • HackShield.cpp/h : HackShield programı için.
  • HackShield_Impl.cpp/h : HackShield programı için.
  • horse_rider.cpp/h : At sürme ile alakalı.
  • horsename_manager.cpp/h : Atına özel olarak isim ekleyen oyuncuların at isimleri burada bulunur.
  • IFileMonitor.h : Bilinmiyor.
  • input.h: Packetlerin işlenmesi için gerekli. Bu header dosyası birden fazla dosyada kullanılır. Sırasıyla;
    • input_auth.cpp : Login işlemleri.
    • input_db.cpp : DB ile Game arasında iletişim sonucu yapılacak işlemler. Mesela lonca eklediniz ve db gönderdiniz. db çekirdeği eklemeleri yaptıktan sonra tekrardan bu dosyaya packet gönderir ve bu dosya da loncanın objesinin yaratılması için guild_manager'a verileri gönderir.
    • input_login.cpp : Karakter seçtikten sonra oyuna girerken yapılacak işlemler.
    • input_main.cpp : Bu dosya da ise Client (istemci) ~ Server arasında ki ilişki içindir. Clientten gelen packetler burada analiz edilir ve yapılacak işlemler belirlenir. Mesela Casro2'de arkadaş ekleyeceksiniz diyelim. Siz clientte kişinin adını yazıp gönderiyorsunuz. Packet buraya geliyor ve arkadaş eklemek için tanımlanan fonksiyona CInputMain::Messenger gönderdiğiniz veri iletiliyor. Casro2 serveri bazı kontrolleri yaptıktan sonra MessengerManager'a arkadaşın eklenmesi için veriyi gönderiyor. Daha detaylı öğrenmek için kodları okumalısınız.
    • input_p2p.cpp : Coreler arası iletişimde kullanılır. Mesela siz genel sohbet kanalın da bir şey yazdınız. Yazdığınız tüm kanallar da gözükür.
    • input_teen.cpp : Bilinmiyor.
    • input_udp.cpp : TCP ve UDP terimlerini araştırın.
  • ip_ban.cpp/h : Banlı olan ip adreslerinden oyuna bağlanmasını engellemek için.
  • item.h: İtemlerle alakalı fonksiyonların ve structların bulunduğu header dosyası. Bu dosya birden fazla cpp dosyasında kullanılıyor. Sırasıyla;
    • item.cpp : Oyunda bulunan itemlerin bilgileri burada tutulur. Siz oyuna giriş yaptınız diyelim. Her bir eşyanız için tek tek item.cpp'de ki sınıf yaratılacak ve managerda ki vectörlere eklenecek. Protolarda tanımlı eşyalarda tanımlıdır.
    • item_addon.cpp : Eşyanın verdiği hasar vs.
    • item_attribute.cpp : Eşyalar efsun eklemek, efsun bilgilerini almak vs gibi işlemlerin bulunduğu dosya.
  • item_manager.h: Tüm itemlerin kontrolünün yapıldığı yer. İtem oluşturma, bulmak ve silme gibi fonksiyonlar bulunur. Bu header dosyası birden fazla cpp dosyası tarafından kullanılır. Sırasıyla;
    • item_manager.cpp : Tüm itemlerin kontrolerinin yapıldığı yer. İtem oluşturma, bulma, silme.
    • item_manager_idrange.cpp : Yeni item oluşturulduğunda id oluşturmak için.
    • item_manager_private_types.h : Droplarla alakalı.
    • item_manager_read_tables.cpp : Filesiniz de mob_drop_item.txt, special_item_group.txt, common_drop_item.txt bulunan txt dosyalarını okur.
  • limit_time.h : Zaman ayarlarıyla ilgili sabitler var.
  • locale.cpp : Ülkeden ülkeye serverde değişiklikler mevcut. Server türkiye için ayarlanmışsa locale/turkey dizininde ki verilerin alınması için yardımcı fonksiyonlar bulunur.
  • locale_service.cpp/h : Sabit olarak tanımlanan ülkeler bulunur. Bu ülkelerin karşılığında hangi dosyaların yükleneceği belirtilir. Almanya için ayarlanmışsa locale/germany dizini yüklenir.
  • log.cpp/h : Oyunda yapılan aktivitelerin kaydını veritabanına ekler.
  • login_data.cpp/h : Giriş yapmış kullanıcıların bilgilerini tutar.
  • login_sim.h : Login için veritabanına packetler gönderir.
  • lua_incl.h : Lua için eklenmiş.
  • lzo_manager.cpp/h : Lzo şifrelemesi ile ilgili.
  • lzoconf.h : Buraya bakın:
    Linkleri görebilmek için giriş yap veya kayıt ol.
  • lzodefs.h : Buraya bakın:
    Linkleri görebilmek için giriş yap veya kayıt ol.
  • main.cpp : c++ projelerinde main dosyası bulunur. Bu da onun için. Diğer tüm dosyaların kullanımını burada tanımlanır. game açıldığında sırasıyla yapılacak işlemler burada belirtilir.
  • malloc_allocator.h : Bilinmiyor.
  • map_location.cpp/h : Haritaların lokasyon bilgileri için. Mevcut konumu verdiğinizde haritanın indexini alır vs.
  • MarkManagar.h: Bu birden fazla cpp dosyasında kullanılıyor. Lonca ikonları için eklenen bir dosya. Kullanan diğer dosyalar sırayla şu şekilde;
    • MarkConvert.cpp : Resimlerin dönüştürülmesi.
    • MarkManager.cpp : Lonca resmi eklemiş tüm loncaların bilgilerini tutar.
  • MarkImage.cpp/h : Lonca ikonu resimlerini oluşturma, silme vs.
  • marriage.cpp/h : Evlilik.
  • matrix_card.cpp/h : Bilinmiyor.
  • messenger_manager.cpp/h : Arkadaş listesi.
  • minilzo.h : Lzo için ayrı bir eklenti. Buraya bakın:
    Linkleri görebilmek için giriş yap veya kayıt ol.
  • mining.cpp/h : Madencilik.
  • mob_manager.cpp/h : Oyunda ki slotlar.
  • monarch.cpp/h : Bu özellik kullanılmadığı için pas.
  • motion.cpp/h : Slotların, oyuncuların hareketleriyle ilgili. share/data içinde ki dosyaları okur.
  • object_allocator.h : Classlarla ilgili. Obje ekleme, silme vs.
  • over9refine.cpp/h : Dönüşüm.
  • OXEvent.cpp/h : OX eventi.
  • p2p.cpp/h : P2P bağlantısı. Yeni bağlantı oluşturma, sonlandırma, packet gönderme vs gibi işlemleri yapar.
  • packet.h : Client ~ Server, Server ~ db arasında gönderilecek verilerin şemaları bulunur.
  • packet_info.cpp/h : Client ve db'den packet geldiği zaman hangi fonksiyonların çalıştırılacağı belirlenir.
  • panama.cpp/h : Bilinmiyor.
  • party.cpp/h : Oyuncu grupları.
  • passpod.cpp/h : Bilinmiyor.
  • pcbang.cpp/h : Bilinmiyor.
  • PetSystem.cpp/h : Evcil olmayan petler.
  • polymorph.cpp/h : Dönüşüm.
  • pool.h : Bilinmiyor.
  • priv_manager.cpp/h : Bayraklara göre drop oranları.
  • profiler.h : Bilinmiyor.
  • protocol.h : Packet ile gönderilen verileri şifreler.
  • pvp.cpp/h : İki oyuncu arasında düello.
  • quest.h : Questler için bazı sabitleri ve structları bulundurur..
  • questevent.cpp/h : Questlerimizde kullandığımız timerlar.
  • questlua.cpp/h : Derlenmiş questleri okur.
  • questmanager.h : Genellikle quest fonksiyonlarının eklendiği dosyalarda kullanılıyor. Quest fonksiyonu listesi için: Metin2 Quest Fonksiyonları (Açıklamalı Şekilde)
    • questlua_affect.cpp : Quest fonksiyonları ile efsunlama işlemleri.
    • questlua_arena.cpp : Oyuncuların ws attığı attığı bölge için.
    • questlua_ba.cpp : Battlearena için.
    • questlua_building.cpp : Lonca binaları için. Arazi satın alma vs.
    • questlua_danceevent.cpp : Karakter dansları.
    • questlua_dragonlair.cpp : Sürgün mağarasında ki kristal ejderha için.
    • questlua_dragonsoul.cpp : Simya sistemi ile gelen quest fonksiyonları.
    • questlua_dungeon.cpp : Dungeonlar için quest fonksiyonları. (O haritaya özel duyuru, mob sayısı, toplu ışınlama vs.)
    • questlua_forked.cpp : Bilinmiyor.
    • questlua_game.cpp : Oyun için gerekli quest fonksiyonları. (Depo açma vs)
    • questlua_global.cpp : Global olarak kullanılan quest fonksiyonları. (syserr yazdırma, item adını almak, ox soruları eklemek vs.)
    • questlua_guild.cpp : Loncalar için eklenen quest fonksiyonları.
    • questlua_horse.cpp : At için eklenen quest fonksiyonları.
    • questlua_item.cpp : İtemler için eklenen quest fonksiyonları.
    • questlua_marriage.cpp : Evlilik.
    • questlua_mgmt.cpp : Bu özellik kullanılmadığı için pas.
    • questlua_monarch.cpp : Bu özellik kullanılmadığı için pas.
    • questlua_npc.cpp : NPC, Mob için eklenen quest fonksiyonları.
    • questlua_party.cpp : Oyuncu grupları için eklenen quest fonksiyonları.
    • questlua_pc.cpp : Oyuncu için eklenen quest fonksiyonları. (level, yang bilgilerini alma vs.)
    • questlua_pet.cpp : Evcil olmayan petler için.
    • questlua_quest.cpp : Questler için. (state atlatma vs)
    • questlua_speedserver.cpp : Bilinmiyor.
    • questlua_target.cpp : Görevlerde NPC'lerin başında ok oluyor. Bu özelliğin çalışması için eklenen quest fonksiyonları.
    • questmanager.cpp : Tüm questleri hafızada tutar. Oyuncu oyuna girdiğinde quest bilgilerini gönderir.
  • questnpc.cpp/h : Quest npcleri için.
  • questpc.cpp/h : Oyuncunun görevleri için.
  • refine.cpp/h : Eşya geliştirme.
  • regen.cpp/h : Spawn.
  • safebox.cpp/h : Depo.
  • sectree.cpp/h : Entitiy ve haritalar..
  • sectree_manager.cpp/h : Tüm haritaları ve entitiyleri hafızada tutar.
  • sequence.cpp/h : Packetlerde doğrulama için gönderilen şifreli kod. Bazı fileslerde bu özellik devredışı.
  • shop.cpp/h : Satış yapan NPC ve oyuncu pazarları.
  • shop_manager.cpp : Satış yapan npcleri ve tüm oyuncu pazarların bilgilerinin tutar.
  • shopEx.cpp/h : Satış yapan NPC.
  • shutdown_manager.cpp/h : /shutdown komutu için.
  • skill.cpp/h : Yetenekler.
  • skill_power.cpp/h : Yeteneklerin leveli.
  • spam.h : ....
  • SpeedServer.cpp/h : Bilinmiyor.
  • stable_priority_queue.h : Bilinmiyor.
  • start_position.cpp/h : Bulunduğunuz krallığa göre varsayılan spawn noktaları.
  • state.h : Bilinmiyor.
  • stdafx.h : Bu da c++ projelerinde bulunan header dosyası.
  • target.cpp/h : NPC başlarında bulunan ok için.
  • test.cpp : Bilinmiyor.
  • test_allocator.cpp : Bilinmiyor.
  • test_stacktrace.cpp : Bilinmiyor.
  • test_window.cpp : Harita dosyalarında bulunan server_attr dosyaları için.
  • text_file_loader.cpp/h : Files içinde oyun ayarlarının bulunduğu bir sürü txt dosyaları mevcut. Bunları yüklenmesi için.
  • threeway_war.cpp/h : Üç yol savaşı
  • TrafficProfiler.cpp : Bilinmiyor.
  • trigger.cpp : Bilinmiyor.
  • typedef.h : Vectorler bulunuyor.
  • unique_item.h : Unique eşya türünün alt türleri.
  • utils.cpp/h : Komutla gönderilen değelerin alınması için fonksiyonlar var.
  • vector.cpp : Bilinmiyor.
  • version.cpp : Versiyonla alakalı şey. Filesinizde VERSION.txt diye bir dosya vardır. Bu dosyayı oluşturup versiyonu yazdıran kodlar burada.
  • vid.h : Bilinmiyor.
  • war_map.cpp/h : Savaş bölgeleri.
  • wedding.cpp/h : Evlilik haritası.
  • xmas_event.cpp/h : Yılbaşı eventi.
  • XTrapManager.cpp : Bilinmiyor.
Evet arkadaşlar server kısmını bitirdik. Bilinmeyen dosyalar ile ilgili bilginiz varsa konu altından katkılarınızı sunabilirsiniz. :)
 
Son düzenleme:
Konunun devamı yazılmıştır. 15:16 - 10.03.2020 'de başladım ve şuan 17:33 - 10.03.2020 kabaca 2 saat boyunca yazmışım. Yorulduğum için burada bırakıyorum. Daha sonra devamını yazacağım. Konuya eklenenler kısaca;
Manager yapısını anlatmak için kısa bir bilgi ve kod örneği ekledim.
Game çekirdeği içinde ki dosyaların yarısından fazlasının açıklamasını yaptım
:disney-is-frozen32:
 
Server kısmının tamamı bitti. İlerleyen günlerde client içinde ki dosyaların açıklamalarını da ekleyebilirim. :)
 
libthecore, game ve db işlemlerinin işletim sistemi ile bağlantısının oluştuğu yer.

işlemlerin bellek yönetimi ordan sağlanıyor, client <-> server soketleri ordan düzenleniyor. kısacası orası oyunun iskeleti.

bu arada client ve serverde LZO'nun kullanıldığı tek yer lonca resimleri. lzo kaldırılabilir aslında..


not : bugün çoğu server fileslerde ki kanalları çok çekirdekli ( core1 , core2 vs ) yapıyorsa nedeni libthecore'nin 32 bit derleniyor olması..
 
auction dosyaları metin2 nin yarım bıraktığı açık arttırma sistemi dosyaları bi işlevi olmadığı için kaldırabilirsiniz.

FSM.cpp ise ymir çalışanlarının fatih sultan mehmet han'a duydukları saygıdan dolayı oluşturulmuş dosyalardır.
 
Altın bir paylaşım. Gerçekten çok teşekkür ederim kendi adıma. Zaten öğrenmeye udemy üzerindeki kursu satın alarak başladım, ilerletmeye devam ediyorum. Eline sağlık. 3 İmparatorluk projeniz ne durumda acaba ? Merak ettim :)
 
Rica ederim. :) 3 imparatorluk projesi bana ait değil. Daha önce Casro2 projesinin ekibinde yer alan arkadaşlarımız tarafından proje başlatılmıştı. İlgimi çektiği ve belki yardımım dokunabilir diye sonradan ekibe dahil oldum. Sağ olsunlar geliştirme ekibine beni kabul ettiler.

Üç İmparatorluk - Geliştirme buradan gelişmeleri takip edebilirsiniz.
 
Client kısmı ile ilgilide bir paylaşım gelir mi ? :) Çok güzel bir katkı olmuş olur. Zaten bu bile fazlasıyla iyi.
 
3 imparatorluk projesi ile ilgili merak ettiğiniz her şeyi, önerileri vs 3 İmparatorluk bu bölüme yapabilirsiniz. Bu seferlik sorunuzu yanıtlıyorum.

En son clientin durumuyla ilgili paylaşım Üç İmparatorluk - Geliştirme | Sayfa 2 burada yapılmıştır. Bir üstünde ise paylaşımını yaptığımız konuyla ilgili teknik bilgiler yer almaktadır. İlginiz için teşekkür ederim :)
 
elinize Sağlık hocam tşk ederim paylaşım için

kurmuş olduğum altyapı files mevcut ticaretle ilgili bir hata mevcut çözemedim çözdüm ama düzeltemedim lin paylaşıldı yardımcı olabilme imkanınız varmı acaba nerelere dikkat etmem gerek acaba ? metin2 ye karşı çok ilgim var zor bir tane alt yapı buldum adam etmek istiyorum bakalım olacak gibi inş




ticaret gerçekleşiyor ancak

ürünü 200m ye sattım diyelim ticaret bittikten sonra 200m azar azar gelmeye başlıyor 10 m 20m 1m gibi azar azar geliyor
 
elinize Sağlık hocam tşk ederim paylaşım için

kurmuş olduğum altyapı files mevcut ticaretle ilgili bir hata mevcut çözemedim çözdüm ama düzeltemedim lin paylaşıldı yardımcı olabilme imkanınız varmı acaba nerelere dikkat etmem gerek acaba ? metin2 ye karşı çok ilgim var zor bir tane alt yapı buldum adam etmek istiyorum bakalım olacak gibi inş




ticaret gerçekleşiyor ancak

ürünü 200m ye sattım diyelim ticaret bittikten sonra 200m azar azar gelmeye başlıyor 10 m 20m 1m gibi azar azar geliyor

bu tarz sorularınızı forumuzun soru cevap kısmına açarsanız sorununuza daha hızlı çözüm bulabilirsiniz.
 
Geri
Üst