Kodların arasında sessizce duran Metin2 detayları

Mavi Taş Zırhı'nı çok seviyordum ben. Pazarlarda satılan en pahalı zırh olurdu genelde :D Siyah çelik bile daha ucuzdu :p
+9 Mavi Taş ve +9 Kanlı Kılıç kombini için okul harçlıklarımı biriktirip, aç dolaşıp o parayla yang almıştım, seti tamamladıktan sonra 1 yıl boyunca sadece köyde takılmıştım, hey gidi günler. 😄
 
+9 Mavi Taş ve +9 Kanlı Kılıç kombini için okul harçlıklarımı biriktirip, aç dolaşıp o parayla yang almıştım, seti tamamladıktan sonra 1 yıl boyunca sadece köyde takılmıştım, hey gidi günler. 😄
İşte o muazzam soru geliyor: Eskiler mi güzeldi eskiden mi güzeldik
 
İşte o muazzam soru geliyor: Eskiler mi güzeldi eskiden mi güzeldik
Bence ikisi birden, hem eski masumiyet, çocukluk güzeldi hem de eski günler gerçekten güzeldi ya, şimdi ki nesle bakıyorum da her şeyi ne kadar çabuk tüketiyorlar, eskilerde güzeldi, eskiden de güzeldik. :)
 
gameforge developerlerinin ultra mega zekasına şahit olacağınız bir hata göstermek istiyorum size:

adamlar kalkana wear_unique verip yüzüklere wear_shield vermişler. ve bunu protodan düzenlemek yerine de protoreaderden sırasını değiştirmişler. kimse düşünmedi mi niye kalkana unique wearflagı veriyoruz diye acaba? bu adamların zekasına akıl sır ermez vallahi.

bu arada based proto kullanmıyorsanız sizde protolar böyle olmayabilir. ama mainline ve novaline protoların hepsinde durum bu şekilde :D

Kod:
Genişlet Daralt Kopyala
kalkan kodu

13000    ȣ½ň¯Ɛ+0    ITEM_ARMOR    ARMOR_SHIELD    1    NONE    NONE    WEAR_UNIQUE

yüzük kodu

71145    ¿µ¿øǑ »綻ÀǠƒ´øƮ    ITEM_UNIQUE    UNIQUE_NONE    1    NONE    NONE    WEAR_SHIELD
 
gameforge developerlerinin ultra mega zekasına şahit olacağınız bir hata göstermek istiyorum size:

adamlar kalkana wear_unique verip yüzüklere wear_shield vermişler. ve bunu protodan düzenlemek yerine de protoreaderden sırasını değiştirmişler. kimse düşünmedi mi niye kalkana unique wearflagı veriyoruz diye acaba? bu adamların zekasına akıl sır ermez vallahi.

bu arada based proto kullanmıyorsanız sizde protolar böyle olmayabilir. ama mainline ve novaline protoların hepsinde durum bu şekilde :D

Kod:
Genişlet Daralt Kopyala
kalkan kodu

13000    ȣ½ň¯Ɛ+0    ITEM_ARMOR    ARMOR_SHIELD    1    NONE    NONE    WEAR_UNIQUE

yüzük kodu

71145    ¿µ¿øǑ »綻ÀǠƒ´øƮ    ITEM_UNIQUE    UNIQUE_NONE    1    NONE    NONE    WEAR_SHIELD
Ymir devleri
1718012901068.webp
 
Ymir Logic:
Genişlet Daralt Kopyala
    int pc_set_another_quest_flag (lua_State* L)
    {
        if (!lua_isstring (L, 1) || !lua_isstring (L, 2) || !lua_isnumber (L, 3))
        {
            sys_err ("QUEST wrong set flag");
            return 0;
        }
        else
        {
            const char* sz = lua_tostring (L, 1);
            const char* sz2 = lua_tostring (L, 2);
            CQuestManager& q = CQuestManager::Instance();
            PC* pPC = q.GetCurrentPC(); // Kontrol eklemeyelim, cunku neden ekleyelim ?? (Ymir)
            pPC->SetFlag (string (sz)+"."+sz2, int (rint (lua_tonumber (L, 3))));
            return 0;
        }
    }

    int pc_get_another_quest_flag (lua_State* L)
    {
        if (!lua_isstring (L, 1) || !lua_isstring (L, 2))
        {
            sys_err ("QUEST wrong get flag");
            return 0;
        }
        else
        {
            const char* sz = lua_tostring (L, 1);
            const char* sz2 = lua_tostring (L, 2);
            CQuestManager& q = CQuestManager::Instance();
            PC* pPC = q.GetCurrentPC();
            if (!pPC) // Kontrol ekleyelim, cunku gerekli... (Aynı zamanda yine Ymir)
            {
                return 0;
            }
            lua_pushnumber (L, pPC->GetFlag (string (sz)+"."+sz2));
            return 1;
        }
    }

Kodlarla vakit geçirdikçe bu projede çalışan neredeyse tüm yazılımcıların profesyonellikten oldukça uzak olduğunu düşünmeye başlamanız oldukça normal, bunun gibi bir sürü örnek var hadi diyelim farklı kişiler farklı fonksiyonları yazdı, sizden önce yapandan hiç mi kopya çekmediniz yahu, bir kontrol koymak bu kadar zor mu ? 🤔
 
Ymir Logic:
Genişlet Daralt Kopyala
    int pc_set_another_quest_flag (lua_State* L)
    {
        if (!lua_isstring (L, 1) || !lua_isstring (L, 2) || !lua_isnumber (L, 3))
        {
            sys_err ("QUEST wrong set flag");
            return 0;
        }
        else
        {
            const char* sz = lua_tostring (L, 1);
            const char* sz2 = lua_tostring (L, 2);
            CQuestManager& q = CQuestManager::Instance();
            PC* pPC = q.GetCurrentPC(); // Kontrol eklemeyelim, cunku neden ekleyelim ?? (Ymir)
            pPC->SetFlag (string (sz)+"."+sz2, int (rint (lua_tonumber (L, 3))));
            return 0;
        }
    }

    int pc_get_another_quest_flag (lua_State* L)
    {
        if (!lua_isstring (L, 1) || !lua_isstring (L, 2))
        {
            sys_err ("QUEST wrong get flag");
            return 0;
        }
        else
        {
            const char* sz = lua_tostring (L, 1);
            const char* sz2 = lua_tostring (L, 2);
            CQuestManager& q = CQuestManager::Instance();
            PC* pPC = q.GetCurrentPC();
            if (!pPC) // Kontrol ekleyelim, cunku gerekli... (Aynı zamanda yine Ymir)
            {
                return 0;
            }
            lua_pushnumber (L, pPC->GetFlag (string (sz)+"."+sz2));
            return 1;
        }
    }

Kodlarla vakit geçirdikçe bu projede çalışan neredeyse tüm yazılımcıların profesyonellikten oldukça uzak olduğunu düşünmeye başlamanız oldukça normal, bunun gibi bir sürü örnek var hadi diyelim farklı kişiler farklı fonksiyonları yazdı, sizden önce yapandan hiç mi kopya çekmediniz yahu, bir kontrol koymak bu kadar zor mu ? 🤔
char_item.cpp içinde gezinirken aynı kontrolün bazı yerde yapıldığını bazı yerde yapılmadığını görmüştüm ve vardır bir bildikleri deyip geçmiştim, yokmuş bir bildikleri 🤣
 
char_item.cpp içinde gezinirken aynı kontrolün bazı yerde yapıldığını bazı yerde yapılmadığını görmüştüm ve vardır bir bildikleri deyip geçmiştim, yokmuş bir bildikleri 🤣
Bir bildikleri vardır diye hiç ellemediğim belli başlı yerler var ama onlarda genelde tahmin ediyorum ki geliştirmenin ilk dönemlerinde yapıyı oluşturan sr. devlerden kalma, yoksa dediğiniz gibi char_xx.cpp dosyalarını questlua_xx.cpp dosyalarını incelemek kriz geçirmeye sebebiyet verebilir. 😄

Sonra core verip duruyor :D
Bu konuya o kadar taktım ki artık kafayı yeme derecesindeyim, dosyaları tek tek okuyup kontrol koymaya başladım, bu ss sadece server tarafı için ve henüz tüm dosyaları bitirmedim muhtemelen 400'ü geçecek. 😄

Adsız.webp


Yani derleyiciler zaten artık modern, koyduğunuz ekstra kontrol performansı etkilemeyecek bile, fazladan kontrol ekleyip saçma sapan corelarla uğraşmaktan kurtulmak varken koca şirket neden bunu yapmadı aklım mantığım almıyor. :unsure:
 
Bu konuya o kadar taktım ki artık kafayı yeme derecesindeyim, dosyaları tek tek okuyup kontrol koymaya başladım, bu ss sadece server tarafı için ve henüz tüm dosyaları bitirmedim muhtemelen 400'ü geçecek. 😄

17537 eklentisini görüntüle

Yani derleyiciler zaten artık modern, koyduğunuz ekstra kontrol performansı etkilemeyecek bile, fazladan kontrol ekleyip saçma sapan corelarla uğraşmaktan kurtulmak varken koca şirket neden bunu yapmadı aklım mantığım almıyor. :unsure:
!ch yerine ch == nullptr kullanmışsın
SE.jpeg
 
Sys_err yazarken canı sıkılan Ymir devinden ufak çaplı resital ; :ROFLMAO:

questlua_quest.cpp:
Genişlet Daralt Kopyala
    int quest_coroutine_yield (lua_State* L)
    {
        CQuestManager& q = CQuestManager::instance();
        // other_pc_block 내부에서는 yield가 일어나서는 안된다. 절대로.
        if (q.IsInOtherPCBlock())
        {
            sys_err ("FATAL ERROR! Yield occur in other_pc_block.");
            PC* pPC = q.GetOtherPCBlockRootPC();
            if (NULL == pPC)
            {
                sys_err ("    ... FFFAAATTTAAALLL Error. RootPC is NULL");
                return 0;
            }
            QuestState* pQS = pPC->GetRunningQuestState();
            if (NULL == pQS || NULL == q.GetQuestStateName (pPC->GetCurrentQuestName(), pQS->st))
            {
                sys_err ("    ... WHO AM I? WHERE AM I? I only know QuestName(%s)...", pPC->GetCurrentQuestName().c_str());
            }
            else
            {
                sys_err ("    Current Quest(%s). State(%s)", pPC->GetCurrentQuestName().c_str(), q.GetQuestStateName (pPC->GetCurrentQuestName(), pQS->st));
            }
            return 0;
        }
        return lua_yield (L, lua_gettop (L));
    }
 
Sys_err yazarken canı sıkılan Ymir devinden ufak çaplı resital ; :ROFLMAO:

questlua_quest.cpp:
Genişlet Daralt Kopyala
    int quest_coroutine_yield (lua_State* L)
    {
        CQuestManager& q = CQuestManager::instance();
        // other_pc_block 내부에서는 yield가 일어나서는 안된다. 절대로.
        if (q.IsInOtherPCBlock())
        {
            sys_err ("FATAL ERROR! Yield occur in other_pc_block.");
            PC* pPC = q.GetOtherPCBlockRootPC();
            if (NULL == pPC)
            {
                sys_err ("    ... FFFAAATTTAAALLL Error. RootPC is NULL");
                return 0;
            }
            QuestState* pQS = pPC->GetRunningQuestState();
            if (NULL == pQS || NULL == q.GetQuestStateName (pPC->GetCurrentQuestName(), pQS->st))
            {
                sys_err ("    ... WHO AM I? WHERE AM I? I only know QuestName(%s)...", pPC->GetCurrentQuestName().c_str());
            }
            else
            {
                sys_err ("    Current Quest(%s). State(%s)", pPC->GetCurrentQuestName().c_str(), q.GetQuestStateName (pPC->GetCurrentQuestName(), pQS->st));
            }
            return 0;
        }
        return lua_yield (L, lua_gettop (L));
    }

RootPc :D
 
Detaydan çok saçmalık var desem daha doğru olur. 😄 Tek tek incelerken o kadar fazla şeye denk geliyorsunuz ki yani bazılarını görünce gerçekten üstümü başımı yırtma aşamasına geldim. Tek tek çok fazla örnek verilebilir ama ben genel olarak metin2 projesinin kaynak kodları hakkında bir yorum yapayım;

Hard-coded bölümlerle dolu (nerdeyse tamamı), yazılım eğitimi alan bir gence okulda gösterecekleri ve "sakın bunu yapma" diyecekleri bütün yanlış teknikleri içeren, projenin başlangıcında yer alan bir iki senior yazılımcının yaptığı işin üstüne ekleme yaparken çalışan hiçbir şeyi değiştirmeyip 20 yıl sonra bile 2004'e uygun yazılan demode her şeyi muhafaza eden (ki o ekipten hala devam edenler var diye biliyorum, onlarda kaçak kat çıkmaya devam ediyor), C++ bir projede C tipi çok fazla referans içeren, null pointer ve overflow kontrollerinin yüzlercesinin eksik olduğu ve bütün bunları göz önünde bulundurup okurken bu oyun bu altyapıyla tüm dünyada nasıl anlık 5 milyon oyuncuya ulaştı diye düşündüren bir proje, hem saygı duyup hem de lanet ettiren cinsten. :LOL:

Dünya çapında 7 milyon aktif oyuncu reklamı yalandan ibaret, çinli botların ve easymetin2 ile başlayarak M2Bob'a kadar devam eden serüvenin sorumlusu GF'nin, fazla oyuncu göstermek amacı ile botlarla bizzat anlaştığı ve daha sonra ellerinde patladığı, medyadan özür diledikleri mükemmel bir hikayesi var. Araştırmanı öneririm
 
Dünya çapında 7 milyon aktif oyuncu reklamı yalandan ibaret, çinli botların ve easymetin2 ile başlayarak M2Bob'a kadar devam eden serüvenin sorumlusu GF'nin, fazla oyuncu göstermek amacı ile botlarla bizzat anlaştığı ve daha sonra ellerinde patladığı, medyadan özür diledikleri mükemmel bir hikayesi var. Araştırmanı öneririm
anlatta bilelim
 
Geri
Üst