Sınırsız Yang Limiti Yapımı 21 Milyar ( SRC ) - Pelin Melek Aslan

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 49

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhabalar , son zamanlarda kendini bu tür şeylerde kendini çok üstün gören çok egolu kişiler olduğu için ücretsiz paylaşmaya karar verdim.



Kanıt





- Pelin Melek Aslan -

Anlatım ;



Src 'den common klasörüne giriniz



1) Ortak / tables.h dosyasına gidin.

1.1) aşağıdaki yapıya gidin:



Kod:
typedef struct SPlayerTable



1.2) INT gold; sort erre: kısmını değiştirin.



Kod:
long long    gold;



Src'den game klasörüne giriniz



packet.h dosyasını açın ve aşağıdakini aratın.



Kod:
typedef struct packet_points typedef struct packet_point_change



bunları aşağıdaki kodları ile değiştiriniz ;



Kod:
typedef struct packet_points {     BYTE        header;     long long    points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change {     int            header;    DWORD        dwVID;     BYTE        type;     long long    amount;     long long    value; } TPacketGCPointChange;



char.h dosyasını açın ve aşağıdakileri ekleyin.



Kod:
typedef struct character_point typedef struct character_point_instant



Kod:
long            points[POINT_MAX_NUM]; long            gold;



Kod:
long            points[POINT_MAX_NUM];



2.1) "// Money related" bu kodu aratın ;



Kod:
long long        GetGold() const                    { return m_points.gold;    } void            SetGold(long long gold)            { m_points.gold = gold;    } bool            DropGold(int gold); int                GetAllowedGold() const; void            GiveGold(int iAmount);    // CÄCL°^ RÖR¸¸é CÄCL şDac, ·Î±× µîRÇ Al¸®













3) Dosya char.cpp açın.

3.1.1) aşağıdaki prosedüre git:



Kod:
void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount)



3.1.2), o yer nerede bulacağı belli ki(sözdizimi aynı değildir!):



Kod:
Kod:
int64_t nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<int64_t>((pTable+n)->price); nTotalMoney += static_cast<int64_t>(GetGold()); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ld lÉR» AE°úÇDz© »óÁ^R» z*Lö°^ lr¨R´D´U")); return; }



3.1.3) Alttaki kodlar ile söz dizimini değiştirin. ;



Kod:
long long nTotalMoney = 0; for (int n = 0; n < bItemCount; ++n) nTotalMoney += static_cast<long long>((pTable+n)->price); nTotalMoney += static_cast<long long>(GetGold()); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] Overflow (GOLD_MAX) id %u name %s", GetPlayerID(), GetName()); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ld lÉR» AE°úÇDz© »óÁ^R» z*Lö°^ lr¨R´D´U")); return; }



Dosyasını değiştirerek g_llMaxGold değeri bu konuda konuşmak olacaktır CONFIG 'e tahsis edileceği gibi unutmayın.



3.2) "CHARACTER:Disconnect" aratın ve aşağıdakileri değiştirin ;



Kod:
snprintf(buf, sizeof(buf), "%s %d %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment());





Değiştir



Kod:
snprintf(buf, sizeof(buf), "%s %lld %d %ld %d", inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment());



3.3) "CHARACTER::pointChange" yordamını atlayabilirsiniz.



3.3.1) başında değişken türü ile zaten uzun uzun yazmalısınız



3.3.2) "case POINT_GOLD:" aratın ve aşşağıdaki şubeyi tamamen değiştirin.



Kod:
case POINT_GOLD: { long long newGold = MINMAXLL(0, static_cast<long long>(GetGold()) + static_cast<long long>(amount), g_llMaxGold); SetGold(newGold); val = GetGold(); } break;



Not: MINMAXL yeni işlevi, ama sonra hakkında yazıyorum.



3.3.3) "PointChange-en" dizinini değiştirin ;



Kod:
if (bAmount) pack.amount = amount; else pack.amount = 0;



Değiştir



Kod:
if (bAmount) pack.amount = (long long)amount; else pack.amount = 0;



4.) Char_item.cpp dosyayı açın.

4.1 ) "GetGold()" kısmını aratın ve kısımları long long long yapıcağız.



Kod:
if (GetGold() < (long long)cost) if (GetGold() < (long long)prt->cost) if (gold <= 0 || (long long)gold > GetGold())





değiştirin bununla dizini



5.) cmd_gm.cpp dosyayı açın.

5.1) do_set arayın Arama ve GOLD dal, değiştirin:



Kod:
case 0:    // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); int before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); int after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break;



Değiştir



Kod:
case 0:    // gold { int gold = 0; str_to_number(gold, arg3); DBManager::instance().SendMoneyLog(MONEY_LOG_MISC, 3, gold); long long before_gold = tch->GetGold(); tch->PointChange(POINT_GOLD, gold, true); long long after_gold = tch->GetGold(); if (0 == after_gold && 0 != before_gold) { LogManager::instance().CharLog(tch, gold, "ZERO_GOLD", "GM"); } } break;



5.) İnput_main.cpp dosyayı açın.

5.1.1) (2x) için Arama:



Kod:
if (ch->GetGold() >= GOLD_MAX)



Aratın ve değiştirin ;



Kod:
if (ch->GetGold() > g_llMaxGold)



5.2.1) "void CInputMain::Exchange" Aratın

5.2.2) Bulun:



Kod:
case EXCHANGE_SUBHEADER_CG_ELK_ADD:



Kod:
[FONT=Arial]5.2.3) tüm şube, bu değiştirin:[/FONT]



Kod:
case EXCHANGE_SUBHEADER_CG_ELK_ADD:    // arg1 == amount of gold if (ch->GetExchange()) { const long long nTotalGold = static_cast<long long>(ch->GetExchange()->GetCompany()->GetOwner()->GetGold()) + static_cast<long long>(pinfo->arg1); if (g_llMaxGold < nTotalGold) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("»ó´ëacRÇ AN±Yl×RE 20ld lÉR» AE°úÇDz© °L·^¸¦ ÇNLö°^ lr¨R´D´U..")); sys_err("[OVERFLOW_GOLD] ELK_ADD (%lld) id %u name %s ", ch->GetExchange()->GetCompany()->GetOwner()->GetGold(), ch->GetExchange()->GetCompany()->GetOwner()->GetPlayerID(), ch->GetExchange()->GetCompany()->GetOwner()->GetName()); return; } if (ch->GetExchange()->GetCompany()->GetAcceptStatus() != true) ch->GetExchange()->AddGold(pinfo->arg1); } break;





6.) shopEx.cpp dosyayı açın.

6.1.1) bu fonksiyon Bulabilirsiniz:



Kod:
int CShopEx::Buy



6.1.2) Ve orada bulunan ilk switchben "case SHOP_COIN_TYPE_GOLD:" bu şube için:tüm değiştirin



Kod:
case SHOP_COIN_TYPE_GOLD: if (it->second)    // if other empire, price is triple dwPrice *= 3; if (ch->GetGold() < (long long) dwPrice) { sys_log(1, "ShopEx::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; } break;



7.) Shop_manager.cpp dosyayı açın.

7.1.1) Gidip "void CShopManager::Sell" prosedürü.

7.1.2) aşağıdaki Değiştirin:



Kod:
const int64_t nTotalMoney = static_cast<int64_t>(ch->GetGold()) + static_cast<int64_t>(dwPrice); if (GOLD_MAX <= nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %u", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ldlÉRE AE°úÇDz© a°Ç°R» CCLö lr¨R´D´U.")); return; }



Değiştir :



Kod:
const long long nTotalMoney = static_cast<long long>(ch->GetGold()) + static_cast<long long>(dwPrice); if (g_llMaxGold < nTotalMoney) { sys_err("[OVERFLOW_GOLD] id %u name %s gold %lld", ch->GetPlayerID(), ch->GetName(), ch->GetGold()); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("20ldlÉRE AE°úÇDz© a°Ç°R» CCLö lr¨R´D´U.")); return; }



8.) Shop.cpp dosyayı açın.

8.1.1) bu Ara:



Kod:
if (ch->GetGold() < (int) dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; }



8.1.2) bu Değiştirin:



Kod:
if (ch->GetGold() < dwPrice) { sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %d", ch->GetName(), ch->GetGold(), dwPrice); return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY; }



9.) questlua_pc.cpp dosyayı açın.

9.1.1) bu.



Kod:
sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold());



Değiştir :



Kod:
sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold());



10.) Config açın.h dosyası.

10.1 alt tarafta yapıştırmak için aşağıdaki satırı:



Kod:
extern long long    g_llMaxGold;



11.) Config.cpp dosyayı açın.

11.1) bildirinin sonuna aşağıdaki satırı yapıştırın bulunduğu dosya başına:



Kod:
long long    g_llMaxGold = 2140000000;



11.2.1), şunu arayın:



Kod:
// LOG_KEEP_DAYS_EXTEND log_set_expiration_days(2); // END_OF_LOG_KEEP_DAYS_EXTEND while (fgets(buf, 256, fp)) { parse_token(buf, token_string, value_string);





1.2.2) yapıştır Altında, diğer(aşağıda) gösterir:



Kod:
TOKEN("max_gold") { long long money = 0; str_to_number(money, value_string); g_llMaxGold = MINMAXLL(2000000000, money, 9223372036854775807LL); fprintf(stderr, "PLAYER_MAX_GOLD: %lld\n", g_llMaxGold); }



Src'den db klasörüne girin



1.) Clientmanagerplayer.cpp dosyayı açın.

1.1.1) bu Ara:



Kod:
"gold = %d, "



değiştir :



Kod:
"gold = %lld, "



1.2.1) bu Ara:



Kod:
sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold);



değiştir :



Kod:
sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %lld ", pTab->name, pTab->id, pTab->gold);



1.3.1), bu işlem için Bak: "CClientManager::__QUERY_PLAYER_CREATE" sorgusu

1.3.2) aşağıdaki Değiştirin:



Kod:
else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %d, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %d, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job);



Değiştir :



Kod:
else { peer->EncodeHeader(HEADER_DG_PLAYER_CREATE_FAILED, dwHandle, 0); return; } queryLen = snprintf(queryStr, sizeof(queryStr), "INSERT INTO player%s " "(id, account_id, name, level, st, ht, dx, iq, " "job, voice, dir, x, y, z, " "hp, mp, random_hp, random_sp, stat_point, stamina, part_base, part_main, part_hair, gold, playtime, " "skill_level, quickslot) " "VALUES(0, %u, '%s', %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, " "%d, %d, %d, %d, %d, %d, %d, 0, %lld, 0, ", GetTablePostfix(), packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.st, packet->player_table.ht, packet->player_table.dx, packet->player_table.iq, packet->player_table.job, packet->player_table.voice, packet->player_table.dir, packet->player_table.x, packet->player_table.y, packet->player_table.z, packet->player_table.hp, packet->player_table.sp, packet->player_table.sRandomHP, packet->player_table.sRandomSP, packet->player_table.stat_point, packet->player_table.stamina, packet->player_table.part_base, packet->player_table.part_base, packet->player_table.gold); sys_log(0, "PlayerCreate accountid %d name %s level %d gold %lld, st %d ht %d job %d", packet->account_id, packet->player_table.name, packet->player_table.level, packet->player_table.gold, packet->player_table.st, packet->player_table.ht, packet->player_table.job);



1.4) navicata Git ve oyuncu değiştirme.oyuncu masa altın alan ve player bölümünde, pld 20'den büyük tamsayı. yap

Player -> Design Table'den



Src'den-thecore:

1.) Libthecore/src klasörüne git ve araçları utils.c dosya.

1.1.1), bu fonksiyon:



Kod:
int MINMAX(int min, int value, int max)



1.1.2) aşağıdaki yapıştırın:



Kod:
long long MAXLL(long long a, long long b) { return a < b ? a : b; } long long MINLL(long long a, long long b) { return a > b ? a : b; } long long MINMAXLL(long long min, long long val, long long max) { register long long tv; tv = (min > val ? min : val); return (max < tv) ? max : tv; }



2.) Bu libthecore/klasör bulunur ve araçları utils.h dosyası

2.1.1), aşağıdaki satırı bulun:



Kod:
extern int MINMAX(int min, int value, int max);



2.1.2) aşağıdaki yapıştırın:



Kod:
extern long long MAXLL(long long a, long long b); extern long long MINLL(long long a, long long b); extern long long MINMAXLL(long long min, long long val, long long max);



İstemci-bin:

1.) Paket packet.h dosyası.

1.1) aşağıdaki yapıları:



Kod:
typedef struct packet_points typedef struct packet_point_change



1.2) onları bu Değiştirin:



Kod:
typedef struct packet_points { BYTE        header; long long    points[POINT_MAX_NUM]; } TPacketGCPoints; typedef struct packet_point_change { int            header; DWORD        dwVID; BYTE        Type; long long    amount; // aU¸d °Ş long long    value;  // ÇöRç °Ş } TPacketGCPointChange;



2.) Bu AbstractPlayer açın.h dosyası.

2.1) bu satırı Bulun:



Kod:
virtual int        GetStatus(DWORD dwType) = 0;



değiştir :



Kod:
virtual long long    GetStatus(DWORD dwType) = 0;



3.) Bu PythonPlayer açın.h dosyası.

3.1.1) bu yapı için Bak: "typedef struct SPlayerStatus"

3.1.2) bu Değiştirin:



Kod:
typedef struct SPlayerStatus { TItemData            aItem[c_Inventory_Count]; TItemData            aDSItem[c_DragonSoul_Inventory_Count]; TQuickSlot            aQuickSlot[QUICKSLOT_MAX_NUM]; TSkillInstance        aSkill[SKILL_MAX_NUM]; long long            m_alPoint[POINT_MAX_NUM]; long                lQuickPageIndex; void SetPoint(UINT ePoint, long long lPoint); long long GetPoint(UINT ePoint); } TPlayerStatus;



3.2.1), bu satırları Bulun:

Kod:
void    SetStatus(DWORD dwType, long lValue); int        GetStatus(DWORD dwType);



3.2.2) ve Sonra da bu değişikliği:



Kod:
void            SetStatus(DWORD dwType, long long lValue); long long        GetStatus(DWORD dwType);



4.) Pythonplayer.cpp dosyayı açın.

4.1.1) bunun için Bak:



Kod:
const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da;



4.1.2) tip uzun-uzun, şöyle yazın:



Kod:
const long long POINT_MAGIC_NUMBER = 0xe73ac1da;



Prosedür ve fonksiyon aşağıdaki örnekte değiştirebilir aşağıda 4.2) Hemen:



Kod:
Kod:
void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long long lPoint) { m_alPoint[ePoint]=lPoint ^ POINT_MAGIC_NUMBER; } long long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint) { return m_alPoint[ePoint] ^ POINT_MAGIC_NUMBER; }





4.3.1) bu satırı Bulun:



Kod:
void CPythonPlayer::SetStatus(DWORD dwType, long lValue)



değiştirin :



Kod:
void CPythonPlayer::SetStatus(DWORD dwType, long long lValue)



4.4.1 bu satırı Bulun:



Kod:
int CPythonPlayer::GetStatus(DWORD dwType)



değiştirin :



Kod:
long long CPythonPlayer::GetStatus(DWORD dwType)



5.) Pythonplayermodule.cpp dosyayı açın.

5.1.1) playerGetElk komutu Bulun.

5.1.2) Ve bu değiştirin:



Kod:
PyObject * playerGetElk(PyObject* poSelf, PyObject* poArgs) { long long llGold = CPythonPlayer::Instance().GetStatus(POINT_GOLD); #ifdef _DEBUG Tracef("GetElk(): %lld\n", llGold); #endif return PyLong_FromLongLong(llGold); }



Son olarak CONFIG'e



Kod:
MAX_GOLD: 20000000000



Eklentisini yapınız sınır 20 milyardır.



Bukadar uğraşıp sizler için paylaştım bir teşekkürü eksik görmeyin.



- Pelin Melek Aslan - , iyi forumlar dilerim.
Sınırsız Yang Limiti Yapımı 21 Milyar (SRC) - Pelin Melek Aslan

Metin2 sunucularında sınırsız yang limiti sistemi, oyuncuların daha fazla işlem yapabilmesi ve oyun içi ekonomiyi daha dengeli hale getirmek için geliştirilen önemli bir özelliktir. Bu yazıda, Pelin Melek Aslan tarafından geliştirilen 'Sınırsız Yang Limiti Yapımı 21 Milyar' adlı SRC tabanlı sistemi detaylıca inceleyeceğiz. Bu sistem, Metin2 geliştiricilerinin özellikle tercih ettiği C++ tabanlı bir yapıya sahiptir ve Martysama gibi popüler geliştirici sistemlerine entegre edilebilir.

Yang Sisteminin Önemi
Metin2 oyununda Yang, oyun içi para birimidir. Yang sınırlamaları, sunucu güvenliği ve ekonomi dengesi için uygulanmaktadır. Ancak bazı özel sunucularda, sınırsız yang kullanımı sunucu ekonomisini daha serbest hale getirebilir. Bu sistem, özellikle PvP sunucularında ve özel sistemlere sahip Metin2 sunucularında büyük önem taşır.

Pelin Melek Aslan Sistemine Genel Bakış
Pelin Melek Aslan tarafından geliştirilen bu sistem, Metin2 sunucularında 21 milyar yang sınırının kaldırılmasını sağlar. Bu sistem, game_src üzerinde değişiklik yapılarak entegre edilir. SRC dosyaları üzerinde yapılan bu düzenlemeler, hem güvenlik hem de performans açısından optimize edilmiştir. Sistem, C++ tabanlı bir yapıya sahip olduğu için sunucu üzerinde minimum CPU tüketimi ile çalışır.

Nasıl Entegre Edilir?
Bu SRC tabanlı sistem, doğrudan game_src klasörüne entegre edilmelidir. İlk adım olarak, mevcut yang sınırlamasını tanımlayan fonksiyonlar bulunur ve bu fonksiyonlar değiştirilir. Değişiklikler, auth ve game sunucusu arasında senkronize çalışacak şekilde ayarlanır. Bu sayede hem oyuncu hem de admin paneli üzerinden işlemler güvenli şekilde yapılır. Bu işlem sırasında dikkat edilmesi gereken en önemli konu, veritabanı (db) ile olan bağlantıların doğru şekilde tanımlanmasıdır.

Dikkat Edilmesi Gerekenler
Sınırsız yang sistemi, sunucu ekonomisini olumsuz etkileyebilir. Bu nedenle, sunucu sahipleri bu sistemi kullanmadan önce oyun içi ekonomi dengesini iyi analiz etmelidir. Ayrıca, bu sistemle birlikte anti-cheat mekanizmalarının da güncellenmiş olması gerekir. Aksi takdirde, sunucuda hile kullanımı artabilir. Bu nedenle, Pelin Melek Aslan'ın sunduğu SRC dosyaları, ekstra güvenlik önlemleriyle birlikte kullanılmalıdır.

Python ve Py Root Entegrasyonları
Bu SRC tabanlı sistem, aynı zamanda Python kök yapısı (py root) ile de entegre edilebilir. Özellikle UIscript ile çalışan arayüzlerde, yang limiti kontrolü daha dinamik hale getirilebilir. Py GUI kullanılarak arayüzde özel butonlar ve bildirimler eklenebilir. Bu sayede hem geliştiriciler hem de oyuncular için daha kullanıcı dostu bir yapı oluşturulur.

Sonuç
Sınırsız yang limiti sistemi, Metin2 özel sunucularında güçlü bir ekonomik yapı kurmak isteyen geliştiriciler için önemli bir özelliktir. Pelin Melek Aslan'ın geliştirdiği SRC tabanlı sistem, C++ bilgisi olan geliştiriciler için ideal bir çözümdür. Sunucu güvenliği ve performansı göz önünde bulundurularak hazırlanmış bu sistem, doğru şekilde entegre edildiğinde Metin2 sunucularınızda etkili bir şekilde çalışacaktır.


Unlimited Yang Limit Implementation 21 Billion (SRC) - Pelin Melek Aslan

In Metin2 servers, the unlimited yang limit system is a significant feature developed to allow players to perform more transactions and balance in-game economy. In this article, we will examine in detail the SRC-based system titled 'Unlimited Yang Limit Implementation 21 Billion' developed by Pelin Melek Aslan. This system has a C++ based structure, which is especially preferred by Metin2 developers, and can be integrated into popular developer systems like Martysama.

Importance of the Yang System
In the Metin2 game, Yang is the in-game currency. Yang limits are implemented for server security and economic balance. However, on certain private servers, unlimited yang usage may provide a more flexible in-game economy. This system is particularly important on PvP servers and Metin2 servers with special systems.

Overview of Pelin Melek Aslan System
The system developed by Pelin Melek Aslan removes the 21 billion yang cap on Metin2 servers. The system is integrated by making changes directly on the game_src. These modifications made on the SRC files are optimized in terms of both security and performance. Since the system is based on C++, it operates with minimal CPU consumption on the server.

How to Integrate?
This SRC-based system must be directly integrated into the game_src folder. First, the functions defining yang limits are identified and modified. Changes are configured to work synchronously between the auth and game servers. Thus, operations via both player and admin panels are securely handled. The most important aspect to consider during this process is ensuring that database (db) connections are properly defined.

Points to Consider
An unlimited yang system might negatively impact server economy. Therefore, server owners should analyze in-game economic balance carefully before implementing this system. Additionally, anti-cheat mechanisms should also be updated along with this system. Otherwise, cheating may increase on the server. For this reason, SRC files provided by Pelin Melek Aslan should be used alongside extra security measures.

Python and Py Root Integration
This SRC-based system can also be integrated with Python root structures (py root). Especially in interfaces running with UIscript, yang limit checks can become more dynamic. Special buttons and notifications can be added using Py GUI, resulting in a more user-friendly structure for both developers and players.

Conclusion
The unlimited yang limit system is a key feature for developers aiming to build a strong economic framework on Metin2 private servers. The SRC-based system developed by Pelin Melek Aslan is an ideal solution for developers with C++ knowledge. When properly integrated, considering server security and performance, this system will operate effectively on your Metin2 servers.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Geri
Üst Alt