Merhaba Arkadaslar Marty Sourcesinden Aldıgım Fix'i Sizlerle Paylasma Gereği Duydum
Oncelikle Fix ten Biraz Bahsedeyim Pazara Koyulan İtemi Aynı Anda 2 Kişi Çekmeye Çalışınca Oyundan Atıyordu
Bu fixle Onu Engellemiş Olacağız.
Haydi Başlayalım
game/src/shop.cpp Açalım Ve Aratalım :
Ve Bu Kod Satırını Alttaki Kodlar İle Değiştiriyoruz:
C++ ile Metin2'de Aynı Anda Aynı Eşyayı Birden Fazla Oyuncunun Almasını Engelleme Sistemi
Metin2 özel sunucularında karşılaşılan yaygın sorunlardan birisi, iki veya daha fazla oyuncunun aynı anda bir eşyayı alması durumunda ortaya çıkan hatalardır. Bu durum, özellikle PvP sistemlerinde ya da sınırlı sayıda bulunan nadir eşyalar için büyük sorunlara yol açabilir. Bu yazıda, C++ tabanlı bir fix sistemiyle, aynı anda iki kişinin bir eşyayı almasını engellemeyi ele alacağız. Bu çözüm, InterSteLLaR tarafından geliştirilen bir yöntemdir ve Metin2Lobby topluluğu için önemli bir yenilik olarak karşımıza çıkmaktadır.
Sorun Nedir?
Bazı eşyaların düşüş oranları çok düşüktür ve sunucuda sınırlı sayıdadır. Bu eşyalar, genellikle PvP savaşlarında düşer ya da belirli görevlerden sonra verilir. Ancak, iki oyuncu aynı anda aynı eşyayı almayı denediğinde, sunucu bu durumu doğru yönetemediğinden hem veritabanında hem de oyun içi nesne yönetiminde çakışmalar meydana gelir. Bu da oyuncuların hata mesajları almasına, eşya sahiplerinin değişmesine ya da hatta oyundan atılmasına neden olabilir.
Fixin Amacı
Bu fixin amacı, bir oyuncunun bir eşyayı alırken, diğer oyuncuların aynı eşyaya erişimini engellemektir. Bu işlem, eşyanın alınması sırasında geçici olarak kilitlenerek sağlanır. Bu sayede, eşyanın birden fazla kişiye geçmesi engellenmiş olur. Bu sistem, hem game server tarafında hem de client tarafında küçük değişikliklerle entegre edilebilir.
C++ Kaynak Kodlarında Uygulama
Öncelikle, eşya alma fonksiyonuna müdahale edilir. Bu işlem genellikle char_item.cpp dosyasında gerçekleşir. Burada, bir eşya alındığında, o eşyanın geçici olarak bir liste üzerinde tutulması sağlanır. Bu liste, eşyanın şu anda bir oyuncu tarafından alındığını ve diğer oyuncuların erişimini engeller.
Kod örneği:
Olası Hatalar ve Çözümler
Bu sistemin uygulanmasında dikkat edilmesi gereken bazı durumlar vardır. Örneğin, oyuncu eşyayı almadan bağlantısı koparsa, eşya hala kilitli kalabilir. Bu gibi durumlar için, connection lost anında eşyanın kilidinin açılması gerekir. Ayrıca, eşyanın alındığına dair bir geri bildirim mesajı kullanıcıya gösterilmelidir. Bu, hem kullanıcı deneyimini artırır hem de hata durumlarını azaltır.
Avantajlar
Sonuç
Bu fix, Metin2 özel sunucularında daha stabil ve adil bir oyun deneyimi sunmak için önemli bir adımdır. InterSteLLaR tarafından önerilen bu sistem, C++ bilgisi olan geliştiriciler için oldukça uygulanabilir bir yapıya sahiptir. Metin2Lobby topluluğu, bu gibi gelişmelerle birlikte daha da büyüyecek ve Metin2 özel sunucu dünyasında daha fazla yeniliğe imza atacaktır.
Preventing Multiple Players from Taking the Same Item Simultaneously in C++ | InterSteLLaR
One of the common issues in Metin2 private servers occurs when two or more players attempt to take the same item at the exact moment, causing errors. This situation can lead to significant problems, especially with rare items that have low drop rates or limited quantities. In this article, we will examine a C++-based fix that prevents multiple players from taking the same item simultaneously. This solution was developed by InterSteLLaR and represents an important update for the Metin2Lobby community.
What Is The Problem?
Some items have very low drop rates and are available in limited numbers on the server. These items usually drop during PvP battles or after completing specific quests. However, if two players attempt to pick up the same item at the same time, the server may fail to manage the situation correctly, leading to conflicts both in the database and in-game object management. This causes players to receive error messages, items changing owners incorrectly, or even being disconnected from the game.
The Purpose of the Fix
The purpose of this fix is to temporarily lock an item when one player attempts to pick it up, preventing other players from accessing it. By locking the item during the pickup process, the system ensures that only one player receives the item. This approach can be integrated into both the game server and client sides with minor modifications.
Implementation in C++ Source Code
Firstly, the function responsible for picking up items must be modified. This typically occurs in the char_item.cpp file. Here, when an item is picked up, it should be temporarily stored in a list that marks the item as locked and inaccessible to other players.
Code example:
Potential Issues and Solutions
There are some critical considerations when implementing this system. For instance, if a player disconnects before successfully picking up the item, the item may remain locked. To address such cases, the lock must be released automatically upon connection loss. Additionally, feedback should be provided to the user indicating whether the pickup was successful, enhancing user experience and reducing potential errors.
Benefits
Conclusion
This fix is an important step toward providing a more stable and fair gaming experience on Metin2 private servers. Proposed by InterSteLLaR, this system is highly applicable for developers familiar with C++. As a result, the Metin2Lobby community will continue growing and bring forth more innovations within the world of Metin2 private servers.
Oncelikle Fix ten Biraz Bahsedeyim Pazara Koyulan İtemi Aynı Anda 2 Kişi Çekmeye Çalışınca Oyundan Atıyordu
Bu fixle Onu Engellemiş Olacağız.
Haydi Başlayalım
game/src/shop.cpp Açalım Ve Aratalım :
Kod:
LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid);
Ve Bu Kod Satırını Alttaki Kodlar İle Değiştiriyoruz:
Kod:
Kod:
LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid); if (IsPCShop()) { if (!pkSelectedItem) { sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d", ch->GetPlayerID(), m_pkPC->GetPlayerID()); return SHOP_SUBHEADER_GC_SOLD_OUT; } if ((pkSelectedItem->GetOwner() != m_pkPC)) { sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d", ch->GetPlayerID(), m_pkPC->GetPlayerID()); return SHOP_SUBHEADER_GC_SOLD_OUT; } }
C++ ile Metin2'de Aynı Anda Aynı Eşyayı Birden Fazla Oyuncunun Almasını Engelleme Sistemi
Metin2 özel sunucularında karşılaşılan yaygın sorunlardan birisi, iki veya daha fazla oyuncunun aynı anda bir eşyayı alması durumunda ortaya çıkan hatalardır. Bu durum, özellikle PvP sistemlerinde ya da sınırlı sayıda bulunan nadir eşyalar için büyük sorunlara yol açabilir. Bu yazıda, C++ tabanlı bir fix sistemiyle, aynı anda iki kişinin bir eşyayı almasını engellemeyi ele alacağız. Bu çözüm, InterSteLLaR tarafından geliştirilen bir yöntemdir ve Metin2Lobby topluluğu için önemli bir yenilik olarak karşımıza çıkmaktadır.
Sorun Nedir?
Bazı eşyaların düşüş oranları çok düşüktür ve sunucuda sınırlı sayıdadır. Bu eşyalar, genellikle PvP savaşlarında düşer ya da belirli görevlerden sonra verilir. Ancak, iki oyuncu aynı anda aynı eşyayı almayı denediğinde, sunucu bu durumu doğru yönetemediğinden hem veritabanında hem de oyun içi nesne yönetiminde çakışmalar meydana gelir. Bu da oyuncuların hata mesajları almasına, eşya sahiplerinin değişmesine ya da hatta oyundan atılmasına neden olabilir.
Fixin Amacı
Bu fixin amacı, bir oyuncunun bir eşyayı alırken, diğer oyuncuların aynı eşyaya erişimini engellemektir. Bu işlem, eşyanın alınması sırasında geçici olarak kilitlenerek sağlanır. Bu sayede, eşyanın birden fazla kişiye geçmesi engellenmiş olur. Bu sistem, hem game server tarafında hem de client tarafında küçük değişikliklerle entegre edilebilir.
C++ Kaynak Kodlarında Uygulama
Öncelikle, eşya alma fonksiyonuna müdahale edilir. Bu işlem genellikle char_item.cpp dosyasında gerçekleşir. Burada, bir eşya alındığında, o eşyanın geçici olarak bir liste üzerinde tutulması sağlanır. Bu liste, eşyanın şu anda bir oyuncu tarafından alındığını ve diğer oyuncuların erişimini engeller.
Kod örneği:
Kod:
if ( pItem && !pItem->IsLocked() ) { pItem->LockForUser( ch->GetPlayerID() ); }
Olası Hatalar ve Çözümler
Bu sistemin uygulanmasında dikkat edilmesi gereken bazı durumlar vardır. Örneğin, oyuncu eşyayı almadan bağlantısı koparsa, eşya hala kilitli kalabilir. Bu gibi durumlar için, connection lost anında eşyanın kilidinin açılması gerekir. Ayrıca, eşyanın alındığına dair bir geri bildirim mesajı kullanıcıya gösterilmelidir. Bu, hem kullanıcı deneyimini artırır hem de hata durumlarını azaltır.
Avantajlar
- Birden fazla oyuncunun aynı eşyayı alması engellenir.
- Sunucu güvenliği artırılır.
- Veritabanında eşya çakışmaları önlenir.
- PvP sistemlerinde adil oynanış sağlanır.
Sonuç
Bu fix, Metin2 özel sunucularında daha stabil ve adil bir oyun deneyimi sunmak için önemli bir adımdır. InterSteLLaR tarafından önerilen bu sistem, C++ bilgisi olan geliştiriciler için oldukça uygulanabilir bir yapıya sahiptir. Metin2Lobby topluluğu, bu gibi gelişmelerle birlikte daha da büyüyecek ve Metin2 özel sunucu dünyasında daha fazla yeniliğe imza atacaktır.
Preventing Multiple Players from Taking the Same Item Simultaneously in C++ | InterSteLLaR
One of the common issues in Metin2 private servers occurs when two or more players attempt to take the same item at the exact moment, causing errors. This situation can lead to significant problems, especially with rare items that have low drop rates or limited quantities. In this article, we will examine a C++-based fix that prevents multiple players from taking the same item simultaneously. This solution was developed by InterSteLLaR and represents an important update for the Metin2Lobby community.
What Is The Problem?
Some items have very low drop rates and are available in limited numbers on the server. These items usually drop during PvP battles or after completing specific quests. However, if two players attempt to pick up the same item at the same time, the server may fail to manage the situation correctly, leading to conflicts both in the database and in-game object management. This causes players to receive error messages, items changing owners incorrectly, or even being disconnected from the game.
The Purpose of the Fix
The purpose of this fix is to temporarily lock an item when one player attempts to pick it up, preventing other players from accessing it. By locking the item during the pickup process, the system ensures that only one player receives the item. This approach can be integrated into both the game server and client sides with minor modifications.
Implementation in C++ Source Code
Firstly, the function responsible for picking up items must be modified. This typically occurs in the char_item.cpp file. Here, when an item is picked up, it should be temporarily stored in a list that marks the item as locked and inaccessible to other players.
Code example:
Kod:
if ( pItem && !pItem->IsLocked() ) { pItem->LockForUser( ch->GetPlayerID() ); }
Potential Issues and Solutions
There are some critical considerations when implementing this system. For instance, if a player disconnects before successfully picking up the item, the item may remain locked. To address such cases, the lock must be released automatically upon connection loss. Additionally, feedback should be provided to the user indicating whether the pickup was successful, enhancing user experience and reducing potential errors.
Benefits
- Prevents multiple players from taking the same item.
- Increases server stability and security.
- Avoids item ownership conflicts in the database.
- Ensures fair gameplay in PvP scenarios.
Conclusion
This fix is an important step toward providing a more stable and fair gaming experience on Metin2 private servers. Proposed by InterSteLLaR, this system is highly applicable for developers familiar with C++. As a result, the Metin2Lobby community will continue growing and bring forth more innovations within the world of Metin2 private servers.
