[C ++] Öğeleri DB aracılığıyla göndermek için işlevler.

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba arkadaşlar :)

Öncelikle /db/src/ClientManager.cpp En altta bir yere ekleyin:

Kod:
int CClientManager::GetEmptyMallPosition(BYTE itemSize, DWORD accountID) {     char query[QUERY_MAX_LEN];     snprintf(query, sizeof(query), "SELECT `pos`, `vnum` FROM `player`.`item` WHERE `owner_id` = '%d' AND `window` = 'MALL'", accountID);     std::unique_ptr<SQLMsg> pkMsg(CDBManager::instance().DirectQuery(query));     if (pkMsg->Get()->uiNumRows == 0)         return 0;     MYSQL_ROW row;     BYTE itemPos;     DWORD itemVnum;     bool slots[45];     while ((row = mysql_fetch_row(pkMsg->Get()->pSQLResult)))     {         str_to_number(itemPos, row[0]);         str_to_number(itemVnum, row[1]);         TItemTable * itemTab = m_map_itemTableByVnum.find(itemVnum)->second;         if (!itemTab)             continue;         for (int i = 0; i < itemTab->bSize; i++)             slots[itemPos+5*i] = true;     }     for (int i = 0; i < 45-5*itemSize; i++)     {         bool isEmpty = true;         for (int j = 0; i < itemSize; i++)         {             if (slots[i+5*j])                 isEmpty = false;         }         if (isEmpty)             return i;     }     return -1; } void CClientManager::GiveItemRewardToPlayer(DWORD accountID, DWORD itemVnum) {     TItemTable * rewardItemTable = m_map_itemTableByVnum.find(itemVnum)->second;     if (!rewardItemTable)     {         sys_err("cannot find item by vnum=%d", itemVnum);         return;     }     int emptyPos = GetEmptyMallPosition(rewardItemTable->bSize, accountID);     if (emptyPos == -1)     {         sys_err("cannot find empty position for item %d", itemVnum);         return;     }     DWORD newItemID = GainItemID();     char queryItem[QUERY_MAX_LEN];     snprintf(queryItem, sizeof(queryItem), "INSERT INTO item (id, owner_id, window, pos, vnum, count, socket0, socket1, socket2, socket3, socket4, socket5) VALUES(%d, %d, 'MALL', %d, %d, 1, 0, 0, 0, 0, 0, 0)", newItemID, accountID, emptyPos, itemVnum);     CDBManager::instance().DirectQuery(queryItem); }


Sorgudaki kalemin sabit miktarı 1 kalem için belirtilir. Kim yorulursa, örneğin yönteme bir argüman ekleyecektir, böylece miktar daha kolay değiştirilebilir.
Ek olarak, kalem geçici olup olmadığını kontrol etmedim, bu nedenle depoya bir tane eklerseniz, onu açtıktan hemen sonra kaybolacaktır.

İyi kullanımlar :)

[C ++] Öğeleri DB aracılığıyla göndermek için işlevler.

Metin2 özel sunucularında veritabanı (DB) üzerinden ögelerin gönderilmesi, oyuncuların envanterlerine veya belirli bir karaktere özel ögelerin aktarılması için kritik öneme sahiptir. Bu işlem genellikle admin paneli veya özel event sistemleri ile yapılır. Bu yazıda, C++ dilinde yazılmış Metin2 server kaynak kodları üzerinden özellikle DB üzerinden ögelerin nasıl gönderileceğine dair fonksiyonlar üzerinde duracağız.

Temel Veri Yapısı
Metin2 sunucusunda ögeler genellikle item_proto tablosundan gelir ve her ögeye özel bir vnum (virtual number) atanmıştır. Bu numara, ögenin hangi prototipten üretileceğini belirtir. DB üzerinden bir öge gönderimi sırasında bu vnum'u doğru şekilde tanımlamak büyük önem taşır.

Öge Gönderim Fonksiyonları
C++ tarafında bir ögeyi DB üzerinden göndermek için aşağıdaki temel adımları izlemek gerekir:

1. Oyuncu ID'sini Belirleme: Gönderilecek ögenin hangi karaktere ait olacağı belirlenmelidir. Bu genellikle player_id ya da char_id ile yapılır.
2. Öge Bilgilerini Hazırlama: Vnum, miktar, süresi gibi bilgiler hazırlanır.
3. DB Insert İşlemi: INSERT INTO sorgusu ile player_item veya benzeri tabloya kayıt yapılır.
4. Oyuncuya Bildirim: Eğer oyuncu online ise, ögenin envanterine düşmesi sağlanır.

Basit Bir C++ Kod Parçası
void SendItemToPlayer(DWORD playerID, DWORD itemVnum, BYTE itemCount) {
char query[512];
snprintf(query, sizeof(query),
"INSERT INTO player_item (owner_id, vnum, count) VALUES (%u, %u, %d)",
playerID, itemVnum, itemCount);
SQLThreadDirectQuery(query);
}

Not: Bu fonksiyon sadece DB'ye kayıt atar. Gerçek zamanlı olarak oyuncunun envanterine düşürmek için client-server senkronizasyonu da gerekebilir. Bu işlem genellikle packet yoluyla yapılır.

Ekstra Özellikler
Metin2 özel sunucularında bazı geliştiriciler özel GUI veya Python tabanlı yönetim sistemleri kullanarak bu işlemleri daha kolay hale getirebilir. Bu tür sistemler genellikle py root veya uiscript dosyaları üzerinden entegre edilir. Ancak temel işlevsellik hâlâ C++ ve server src üzerinden sağlanır.

Güvenlik Uyarısı
DB üzerinden öge gönderimi sırasında mutlaka SQL injection saldırılarına karşı korunma sağlanmalıdır. Sorgular için prepared statements veya snprintf gibi güvenli fonksiyonlar kullanılmalıdır. Auth ve game server güvenliği bu bağlamda kritik öneme sahiptir.

Sonuç
Metin2 özel sunucularında DB üzerinden ögeleri göndermek, PvP sunucularında ödül sistemleri, özel etkinlikler veya admin kontrolleri için oldukça yaygın bir yöntemdir. C++ tabanlı sunucu geliştirme bilgisiyle bu işlemler güvenli ve etkili bir şekilde yapılabilir. Bu tür sistemlerin doğru kurulması, server src ve client src uyumuna bağlıdır.


Functions for Sending Items via DB in [C ++]

In Metin2 private servers, sending items through database (DB) is crucial for delivering items to players' inventories or assigning specific items to certain characters. This process is typically done via admin panels or special event systems. In this article, we will focus on functions related to how to send items through DB using Metin2 server source code written in C++.

Basic Data Structure
In Metin2, items usually come from the item_proto table, and each item has a unique vnum (virtual number). This number specifies which prototype the item is created from. Correctly defining this vnum during item sending via DB is highly important.

Item Sending Functions
To send an item via DB in C++, you need to follow these basic steps:

1. Determine Player ID: The character to whom the item will be sent must be identified. Usually done with player_id or char_id.
2. Prepare Item Information: Values such as vnum, amount, duration are prepared.
3. DB Insert Operation: An INSERT INTO query is used to insert into tables like player_item.
4. Notify Player: If the player is online, ensure the item drops into their inventory.

Simple C++ Code Snippet
void SendItemToPlayer(DWORD playerID, DWORD itemVnum, BYTE itemCount) {
char query[512];
snprintf(query, sizeof(query),
"INSERT INTO player_item (owner_id, vnum, count) VALUES (%u, %u, %d)",
playerID, itemVnum, itemCount);
SQLThreadDirectQuery(query);
}

Note: This function only inserts into the DB. To make the item appear in the player's inventory in real-time, client-server synchronization may be required. This is generally done via packets.

Additional Features
Some developers in Metin2 private servers use custom GUIs or Python-based management systems to simplify these processes. Such systems are often integrated through py root or uiscript files. However, the fundamental functionality still relies on C++ and server src.

Security Warning
During item sending via DB, protection against SQL injection attacks must be ensured. Secure functions like prepared statements or snprintf should be used for queries. Auth and game server security are critical in this context.

Conclusion
Sending items via DB in Metin2 private servers is a common practice for reward systems, special events, or admin controls in PvP servers. With knowledge of C++-based server development, these operations can be performed securely and efficiently. Proper setup of such systems depends on compatibility between server src and client src.
 

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

Benzer konular

Geri
Üst Alt