C++ [Yang Limiti] Statu Farkıyla

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
@ ; arkadaşımızın uzun emekler sonucu düzenleyip paylaştığı ana konudur kendisi konuyu kapattığı için ben tekrardan açtım, anlatım birebir aynıdır, belki kodları hatasız almak isteyenler bu konudan faydalanacak, dolayısıyla Statu arkadaşımıza emekleri için çok teşekkür ederim bunu düzenlerken bile çok yoruldum, emeğinin boşa gitmesini istemedim. :ka19:

Açılır: tables.h

Aratılır:
Kod:
Kod:
typedef struct SPlayerTable[/FONT]
Bulunur:
Kod:
Kod:
INT        gold;
Değiştirilir:
Kod:
Kod:
long long    gold;
___________________________________

Açılır: packet.h ve alttaki kod blokları bulunur
Kod:
Kod:
typedef struct packet_points typedef struct packet_point_change
Alttaki kod blokları ile değiştirilir:

___________________________________

Açılır: char.h

Aratılır:
Kod:
Kod:
typedef struct character_point
Bulunur:
Kod:
Kod:
long            points[POINT_MAX_NUM]; ve long            gold;
Değiştirilir:
Kod:
Kod:
long            points[POINT_MAX_NUM]; ve long            gold;
Aratılır:
Kod:
Kod:
typedef struct character_point_instant
Bulunur:
Kod:
Kod:
long            points[POINT_MAX_NUM];
Değiştirilir:
Kod:
Kod:
long            points[POINT_MAX_NUM];
___________________________________

Açılır: char.h

Aratılır:
Kod:
Kod:
// Money related

255inciy9497400.png


Resimdeki kısım aşağıdakilerle değiştirilir:

___________________________________

Açılır: char.cpp

Aratılır:
Kod:
Kod:
void CHARACTER::OpenMyShop(const char * c_pszSign, TShopItemTable * pTable, BYTE bItemCount)
Bulunur:

Değiştirilir:

___________________________________

Açılır: char.cpp

Aratılır:
Kod:
Kod:
CHARACTER::Disconnect
Bulunur:
Kod:
Kod:
snprintf(buf, sizeof(buf), "%s %d %d %ld %d",          inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment());
Değiştirilir:
Kod:
Kod:
snprintf(buf, sizeof(buf), "%s %lld %d %ld %d",         inet_ntoa(GetDesc()->GetAddr().sin_addr), GetGold(), g_bChannel, GetMapIndex(), GetAlignment());
___________________________________

Açılır: char.cpp

Aratılır:
Kod:
Kod:
CHARACTER::PointChange
Kod bloğu bulunur:
Kod:
Kod:
case POINT_GOLD:
Aşağıdaki kod bloğu ile değiştirilir:

Aynı cpp de bulunur:
Kod:
Kod:
if (bAmount)             pack.amount = amount;         else             pack.amount = 0;
Değiştirilir:
Kod:
if (bAmount)
Kod:
pack.amount = (long long)amount;         else             pack.amount = 0;
___________________________________

Açılır: char_item.cpp

Aratılır:
Kod:
Kod:
if (GetGold() < cost)
Değiştirilir:
Kod:
Kod:
if (GetGold() < (long long)cost)
Aratılır:
Kod:
Kod:
if (GetGold() < prt->cost)
Değiştirilir:
Kod:
Kod:
if (GetGold() < (long long)prt->cost)
Aratılır:
Kod:
Kod:
if (gold <= 0 || gold > GetGold())
Değiştirilir:
Kod:
Kod:
if (gold <= 0 || (long long)gold > GetGold())
___________________________________

Açılır: cmd_gm.cpp

Kod bloğu bulunur:
Değiştirilir:

___________________________________

Açılır: input_main.cpp

Aratılır:
Kod:
Kod:
if (ch->GetGold() >= GOLD_MAX)
Değiştirilir:
Kod:
Kod:
if (ch->GetGold() > g_llMaxGold)
Aratılır:
Kod:
Kod:
void CInputMain::Exchange
Kod bloğu bulunur:
Kod:
Kod:
case EXCHANGE_SUBHEADER_CG_ELK_ADD:
Değiştirilir:

___________________________________

Açılır: shopEx.cpp

Aratılır:
Kod:
Kod:
int CShopEx::Buy
Kod bloğu bulunur:
Kod:
Kod:
case SHOP_COIN_TYPE_GOLD:
Değiştirilir:

___________________________________

Açılır: shop_manager.cpp

Aratılır:
Kod:
Kod:
void CShopManager::Sell
Bulunur:
Değiştirilir:

___________________________________

Açılır: shop.cpp

Bulunur:
Değiştirilir:

___________________________________

Açılır: questlua_pc.cpp

Bulunur:
Kod:
Kod:
sys_err("QUEST wrong ChangeGold %d (now %d)", gold, ch->GetGold());
Değiştirilir:
Kod:
Kod:
sys_err("QUEST wrong ChangeGold %d (now %lld)", gold, ch->GetGold());
___________________________________

Burda yeni config kodu oluşturuyoruz.

Açılır: config.h

Eklenir:
Kod:
Kod:
extern long long    g_llMaxGold;
___________________________________

Burda yeni config kodu oluşturuyoruz.


Açılır: config.cpp

Eklenir:
Kod:
Kod:
long long    g_llMaxGold = 9223372036854775807LL;
Aratılır:
Kod:
Kod:
TOKEN("empire_whisper")
Kod bloğunun altına eklenir:

___________________________________

Açılır: ClientManagerPlayer.cpp

Bulunur:
Kod:
Kod:
"gold = %d, " sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %d ", pTab->name, pTab->id, pTab->gold);
Değiştirilir:
Kod:
Kod:
"gold = %lld, " sys_log(0, "[PLAYER_LOAD] ID %s pid %d gold %lld ", pTab->name, pTab->id, pTab->gold);
Aratılır:
Kod:
Kod:
CClientManager::__QUERY_PLAYER_CREATE
Bulunur:
Değiştirilir:

___________________________________

Server-lib

Açılır: libthecore/src/utils.c

Aratılır:
Kod:
Kod:
int MINMAX(int min, int value, int max)
Kod bloğunun altına eklenir:

Eğer hata alırsanız "int MINMAX(int min, int value, int max)" kod bloğunu silip tekrar deneyin.
Not: bu işlem utils.h dede yapılmalıdır

___________________________________

Açılır: libthecore/src/utils.h

Aratılır:
Kod:
Kod:
extern int MINMAX(int min, int value, int max);
Atlına eklenir:
Kod:
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);
Eğer hata alırsanız "extern int MINMAX(int min, int value, int max);" silip deneyin.
Not: bu işlem utils.c dede yapılmalıdır

___________________________________

Client bölümü

Açılır: pachet.h

Kod blokları bulunur:
Kod:
Kod:
typedef struct packet_points typedef struct packet_point_change
Bu kod blokları ile değiştirilir:

___________________________________

Açılır: AbstractPlayer.h

Aratılır:
Kod:
Kod:
virtual int        GetStatus(DWORD dwType) = 0;
Değiştirilir:
Kod:
Kod:
virtual long long GetStatus(DWORD dwType) = 0;
___________________________________

Açılır: PythonPlayer.h

Kod bloğu bulunur:
Kod:
Kod:
typedef struct SPlayerStatus
Bu kod bloğu ile değiştirilir:

Bulunur:
Kod:
Kod:
void    SetStatus(DWORD dwType, long lValue); int        GetStatus(DWORD dwType);
Bunlarla değiştirilir:
Kod:
Kod:
void            SetStatus(DWORD dwType, long long lValue);     long long        GetStatus(DWORD dwType);
___________________________________

Açılır: PythonPlayer.cpp

Bulunur:
Kod:
Kod:
const DWORD POINT_MAGIC_NUMBER = 0xe73ac1da;
Değiştirilir:
Kod:
Kod:
const long long POINT_MAGIC_NUMBER = 0xe73ac1da;
Kod blokları bulunur:
Kod:
Kod:
void CPythonPlayer::SPlayerStatus::SetPoint(UINT ePoint, long long lPoint) ve long long CPythonPlayer::SPlayerStatus::GetPoint(UINT ePoint)
Bu kod blokları ile değiştirilir:
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; }
Bulunur:
Kod:
Kod:
void CPythonPlayer::SetStatus(DWORD dwType, long lValue
Değiştirilir:
Kod:
Kod:
void CPythonPlayer::SetStatus(DWORD dwType, long long lValue)
Bulunur:
Kod:
Kod:
int CPythonPlayer::GetStatus(DWORD dwType)
Değiştirilir:
Kod:
Kod:
long long CPythonPlayer::GetStatus(DWORD dwType)
___________________________________

Açılır: PythonPlayerModule.cpp

Kod bloğu bulunur:
Kod:
Kod:
PyObject * playerGetElk(PyObject* poSelf, PyObject* poArgs)
Değiştirilir:
Kod:
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); }

Not: Bilmeyenler için açıklama :

C++ ' ta long long değişkeninin maximum değeri 9,223,372,036,854,775,807 seksilyondur.

Kaynak :
Metin2'de C++ Yang Limiti Sistemi ile Statu Farkı Kullanımı

Metin2 özel sunucularında C++ sistem geliştirmek, oyuncuların deneyimini artırmak ve sunucunun dengesini korumak açısından büyük önem taşır. Bu bağlamda, Yang Limiti sistemi, özellikle PvP odaklı sunucularda ekonomik dengeleri korumak için hayati bir rol oynar. Bu sistem, oyuncuların elindeki yang miktarına göre belirli sınırlamalar getirerek, yüksek seviye karakterlerin düşük seviye karakterlere karşı avantajını minimize eder. Bu yazıda, C++ tabanlı yang limiti sisteminin nasıl çalıştığını ve statu farkı ile nasıl entegre edildiğini detaylıca inceleyeceğiz.

Yang Limiti Nedir?

Yang, Metin2 oyununda kullanılan sanal para birimidir. Sunucuların ekonomisi, bu yang akışı üzerinden şekillenir. Ancak bazı yüksek seviye oyuncuların elinde milyonlarca yang bulunması, düşük seviye oyuncuların ekonomik olarak dışlanmasına neden olabilir. Bu durumu engellemek için yang limiti sistemi devreye girer. Bu sistem sayesinde, belirli bir yang miktarının üzerinde olan karakterler, belirli eylemlerde bulunurken sınırlamalara tabi tutulabilir. Örneğin, bir karakterin elinde 10 milyar yang varsa, PvP sırasında statu bonusları azaltılabilir veya belirli item kullanımında kısıtlama getirilebilir.

Statu Farkı Nedir ve Neden Önemlidir?[/BR][/BR]
Statu, Metin2’de karakterin sahip olduğu güç, dayanıklılık, zeka gibi temel nitelik değerleridir. Oyuncuların PvP esnasında sahip oldukları statu farkı, kazanma şanslarını doğrudan etkiler. Yüksek statu değerlerine sahip bir karakter, düşük statuya sahip bir karaktere göre daha fazla hasar verir ve daha az hasar alır. Bu nedenle, yang limiti sistemi ile statu farkı arasında bir denge kurulması, adil bir oyun ortamı için kritiktir.

C++ ile Yang Limiti ve Statu Farkı Entegrasyonu

Metin2 özel sunucularında C++ kaynak kod üzerinde yapılan değişikliklerle, yang limiti ve statu farkı ilişkisi programlanabilir. Öncelikle, her karakterin elindeki yang miktarı kontrol edilmeli ve bu miktar, belirlenen eşik değerlerine göre sınıflandırılmalıdır. Örneğin:
- 0 - 1 Milyar Yang → Normal
- 1 - 10 Milyar Yang → Orta Derecede Güçlü
- 10 Milyar üzeri → Yüksek Derecede Güçlü

Her bu sınıfa göre, karakterin PvP sırasında sahip olduğu statu bonusları ayarlanabilir. Bu sistem, game core dosyalarında geliştirilir. Client src ve server src üzerinde yapılan bu değişiklikler, martysama gibi bilinen sistemlerle entegre edilebilir. Ayrıca, Python sistem ile uiscript dosyaları üzerinden kullanıcı arayüzüne de yansıtılarak, oyunculara bakiye durumu ve statu farkı bilgisi gösterilebilir.

PVP Sistemleri İçin Stratejik Bir Yaklaşım

Bu tür sistemler, PvP oyunlarını daha adil ve rekabetçi hale getirir. Özellikle Metin2 PvP sistem tasarlarken, yang limiti ve statu farkı gibi unsurlar göz önünde bulundurulmalıdır. Bu sayede, zengin oyuncuların ekonomik gücünü savaş gücüne dönüştürmesi engellenmiş olur. Bu, Metin2 Development sürecinde stratejik bir avantaj sağlar.

Sonuç

Metin2lobby.com olarak, Metin2 özel sunucu geliştirme konusunda en iyi uygulamaları sunuyoruz. C++ sistem geliştirme, yang limiti, statu farkı gibi konular, sunucu dengesi için kritik öneme sahiptir. Bu tür gelişmiş sistemlerin doğru uygulanması, oyuncu memnuniyetini artırır ve uzun vadeli bir oyun ekosistemi oluşturur.


Using C++ Yang Limit System with Status Difference in Metin2

Metin2 private servers, developing C++ systems is crucial for enhancing player experience and maintaining server balance. In this context, the Yang Limit system plays a vital role in preserving economic balance especially on PvP-oriented servers. This system introduces limitations based on players' yang amounts, minimizing advantages high-level characters may have over low-level ones. In this article, we will examine in detail how the C++ based yang limit system works and how it integrates with status difference.

What Is Yang Limit?

Yang is the virtual currency used in the game Metin2. The server economy is shaped around the flow of yang. However, having millions of yang in high-level players' possession can lead to lower-level players being economically excluded. To prevent this, the yang limit system comes into play. With this system, characters possessing more than a certain amount of yang may be subject to restrictions during certain actions. For example, if a character has 10 billion yang, status bonuses might be reduced during PvP or certain item usage could be limited.

What Is Status Difference and Why Is It Important?

Status refers to basic attribute values like strength, stamina, and intelligence that a character possesses in Metin2. The status difference between players directly affects their chances of winning during PvP. A character with higher status values will deal more damage and take less damage compared to a lower-status character. Therefore, establishing a balance between yang limit and status difference is critical for a fair gaming environment.

Integrating Yang Limit and Status Difference with C++

In Metin2 private servers, modifications made to C++ source code allow programming the relationship between yang limit and status difference. First, each character's yang amount must be checked and classified according to predetermined threshold values. For example:
- 0 - 1 Billion Yang → Normal
- 1 - 10 Billion Yang → Moderately Strong
- Over 10 Billion → Highly Strong

Based on these classes, status bonuses during PvP can be adjusted. This system is developed within game core files. Modifications made to client src and server src can be integrated with known systems like martysama. Additionally, through Python systems and uiscript files, player interface can display balance status and status difference information to players.

Strategic Approach for PVP Systems

Such systems make PvP games more fair and competitive. Especially when designing Metin2 PvP systems, factors like yang limit and status difference should be taken into account. This prevents wealthy players from converting their economic power into battle strength. This provides strategic advantage in Metin2 Development.

Conclusion

As Metin2lobby.com, we offer best practices in Metin2 private server development. Elements like C++ system development, yang limit, and status difference are critically important for server balance. Proper implementation of such advanced systems increases player satisfaction and creates a long-term gaming ecosystem.
 

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

Benzer konular

Geri
Üst Alt