- Katılım
- 25 Haz 2024
- Konular
- 125
- Mesajlar
- 839
- Çözüm
- 16
- Online süresi
- 2mo 11d
- Reaksiyon Skoru
- 505
- Altın Konu
- 1
- Başarım Puanı
- 164
- MmoLira
- 3,706
- DevLira
- 45
ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!
Merhabalar bi önceki soru cevap konumda dali offlineshop eklerken yaşadığım sorundan bahsetmiştim offlineshop tablosuna kaydın silindiğini söylemiştim bunun nedeni item tablosunda offlineshop içerisinde boş olarak göründüğü için pazar kapandığı görünüyor o yüzden siliniyormuş neyse konumuza gelelim şimdi
[CODE title="Cache.cpp"]void CItemCache::OnFlush()
{
if (m_data.vnum == 0) // vnum이 0이면 삭제하라고 표시된 것이다.
{
char szQuery[QUERY_MAX_LEN];
snprintf (szQuery, sizeof (szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);
CDBManager::instance().ReturnQuery (szQuery, QID_ITEM_DESTROY, 0, NULL);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);
}
}
else
{
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
bool isSocket = false, isAttr = false;
memset (&alSockets, 0, sizeof (long) * ITEM_SOCKET_MAX_NUM);
memset (&aAttr, 0, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM);
TPlayerItem* p = &m_data;
if (memcmp (alSockets, p->alSockets, sizeof (long) * ITEM_SOCKET_MAX_NUM))
{
isSocket = true;
}
if (memcmp (aAttr, p->aAttr, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM))
{
isAttr = true;
}
char szColumns[QUERY_MAX_LEN];
char szValues[QUERY_MAX_LEN];
char szUpdate[QUERY_MAX_LEN];
int iLen = snprintf (szColumns, sizeof (szColumns), "id, owner_id, `window`, pos, count, vnum");
int iValueLen = snprintf (szValues, sizeof (szValues), "%u, %u, %d, %d, %u, %u",
p->id, p->owner, p->window, p->pos, p->count, p->vnum);
int iUpdateLen = snprintf (szUpdate, sizeof (szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u",
p->owner, p->window, p->pos, p->count, p->vnum);
if (isSocket)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen, ", socket0, socket1, socket2");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", socket0=%lu, socket1=%lu, socket2=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
}
if (isAttr)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen,
", attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3"
", attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", attrtype0=%d, attrvalue0=%d"
", attrtype1=%d, attrvalue1=%d"
", attrtype2=%d, attrvalue2=%d"
", attrtype3=%d, attrvalue3=%d"
", attrtype4=%d, attrvalue4=%d"
", attrtype5=%d, attrvalue5=%d"
", attrtype6=%d, attrvalue6=%d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
}
#ifdef WJ_OFFLINE_SHOP_SYSTEM
if (p->price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", price=%u", p->price);
}
#ifdef WJ_CHEQUE_SYSTEM
if (p->cheque_price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", cheque_price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->cheque_price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", cheque_price=%u", p->cheque_price);
}
#endif
#endif
char szItemQuery[QUERY_MAX_LEN +#endif #endifrintf (szItemQuery, sizeof (szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush :REPLACE (%s)", szItemQuery);
}
CDBManager::instance().ReturnQuery (szItemQuery, QID_ITEM_SAVE, 0, NULL);
//g_item_info.Add(p->vnum);
++g_item_count;
}
m_bNeedQuery = false;
}[/CODE]
Cache.cpp dosyamda bu şekilde item tablosuna kayıt yapıyor ama tablodaki enum değerini 13 olarak gönderdiği için tabloya kayıt sağlanmıyor ve böyle bir syserr atıyor
[CODE title="syserr"]SYSERR: Jan 28 15:26:03.725535 :: ChildLoop: AsyncSQL: query failed: Data truncated for column 'window' at row 1 (query: REPLACE INTO item (id, owner_id, `window`, pos, count, vnum, socket0, socket1, socket2, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, price) VALUES(70000001, 10001, 13, 0, 1, 19, 1, 0, 0, 16, 2, 22, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123) errno: 1265)
[/CODE]
syserr de ki enum değerini OFFLINE_SHOP olarak değiştirince sorun kalmıyor ama neden 13 olarak gönderdiğini bulamadım length.h dosyasını kontrol ettiğimde
[CODE title="length.h"]enum EWindows
{
RESERVED_WINDOW,
INVENTORY,
EQUIPMENT,
SAFEBOX,
MALL,
DRAGON_SOUL_INVENTORY,
BELT_INVENTORY,
#ifdef WJ_OFFLINE_SHOP_SYSTEM
OFFLINE_SHOP,
#endif
#ifdef ENABLE_SPLIT_IN#ifdef SKILL_BOOK_INVENTORY,
UPG#endif#endif#endif#endifN#ifdefY,
BOX_INVENTORY,
EFSUN_INVENTORY,
CICEK_INVENTORY,
#endif
GROUND
};[/CODE]
d#endifrim bu şekilde fakat navicat tablosundaki window değerleri;
[CODE title="enum değerleri"]'INVENTORY','EQUIPMENT','SAFEBOX','MALL','DRAGON_SOUL_INVENTORY','BELT_INVENTORY','OFFLINE_SHOP','GROUND'[/CODE]
bu şekilde :/ işin içinden çıkamadım varmı yardımcı olacak ?
[CODE title="Cache.cpp"]void CItemCache::OnFlush()
{
if (m_data.vnum == 0) // vnum이 0이면 삭제하라고 표시된 것이다.
{
char szQuery[QUERY_MAX_LEN];
snprintf (szQuery, sizeof (szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);
CDBManager::instance().ReturnQuery (szQuery, QID_ITEM_DESTROY, 0, NULL);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);
}
}
else
{
long alSockets[ITEM_SOCKET_MAX_NUM];
TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
bool isSocket = false, isAttr = false;
memset (&alSockets, 0, sizeof (long) * ITEM_SOCKET_MAX_NUM);
memset (&aAttr, 0, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM);
TPlayerItem* p = &m_data;
if (memcmp (alSockets, p->alSockets, sizeof (long) * ITEM_SOCKET_MAX_NUM))
{
isSocket = true;
}
if (memcmp (aAttr, p->aAttr, sizeof (TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM))
{
isAttr = true;
}
char szColumns[QUERY_MAX_LEN];
char szValues[QUERY_MAX_LEN];
char szUpdate[QUERY_MAX_LEN];
int iLen = snprintf (szColumns, sizeof (szColumns), "id, owner_id, `window`, pos, count, vnum");
int iValueLen = snprintf (szValues, sizeof (szValues), "%u, %u, %d, %d, %u, %u",
p->id, p->owner, p->window, p->pos, p->count, p->vnum);
int iUpdateLen = snprintf (szUpdate, sizeof (szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u",
p->owner, p->window, p->pos, p->count, p->vnum);
if (isSocket)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen, ", socket0, socket1, socket2");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", socket0=%lu, socket1=%lu, socket2=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);
}
if (isAttr)
{
iLen += snprintf (szColumns + iLen, sizeof (szColumns) - iLen,
", attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3"
", attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6");
iValueLen += snprintf (szValues + iValueLen, sizeof (szValues) - iValueLen,
", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
iUpdateLen += snprintf (szUpdate + iUpdateLen, sizeof (szUpdate) - iUpdateLen,
", attrtype0=%d, attrvalue0=%d"
", attrtype1=%d, attrvalue1=%d"
", attrtype2=%d, attrvalue2=%d"
", attrtype3=%d, attrvalue3=%d"
", attrtype4=%d, attrvalue4=%d"
", attrtype5=%d, attrvalue5=%d"
", attrtype6=%d, attrvalue6=%d",
p->aAttr[0].bType, p->aAttr[0].sValue,
p->aAttr[1].bType, p->aAttr[1].sValue,
p->aAttr[2].bType, p->aAttr[2].sValue,
p->aAttr[3].bType, p->aAttr[3].sValue,
p->aAttr[4].bType, p->aAttr[4].sValue,
p->aAttr[5].bType, p->aAttr[5].sValue,
p->aAttr[6].bType, p->aAttr[6].sValue);
}
#ifdef WJ_OFFLINE_SHOP_SYSTEM
if (p->price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", price=%u", p->price);
}
#ifdef WJ_CHEQUE_SYSTEM
if (p->cheque_price)
#ifdef iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", cheque_price");
iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u", p->cheque_price);
iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, ", cheque_price=%u", p->cheque_price);
}
#endif
#endif
char szItemQuery[QUERY_MAX_LEN +#endif #endifrintf (szItemQuery, sizeof (szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);
if (g_test_server)
{
sys_log (0, "ItemCache::Flush :REPLACE (%s)", szItemQuery);
}
CDBManager::instance().ReturnQuery (szItemQuery, QID_ITEM_SAVE, 0, NULL);
//g_item_info.Add(p->vnum);
++g_item_count;
}
m_bNeedQuery = false;
}[/CODE]
Cache.cpp dosyamda bu şekilde item tablosuna kayıt yapıyor ama tablodaki enum değerini 13 olarak gönderdiği için tabloya kayıt sağlanmıyor ve böyle bir syserr atıyor
[CODE title="syserr"]SYSERR: Jan 28 15:26:03.725535 :: ChildLoop: AsyncSQL: query failed: Data truncated for column 'window' at row 1 (query: REPLACE INTO item (id, owner_id, `window`, pos, count, vnum, socket0, socket1, socket2, attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3, attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6, price) VALUES(70000001, 10001, 13, 0, 1, 19, 1, 0, 0, 16, 2, 22, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123) errno: 1265)
[/CODE]
syserr de ki enum değerini OFFLINE_SHOP olarak değiştirince sorun kalmıyor ama neden 13 olarak gönderdiğini bulamadım length.h dosyasını kontrol ettiğimde
[CODE title="length.h"]enum EWindows
{
RESERVED_WINDOW,
INVENTORY,
EQUIPMENT,
SAFEBOX,
MALL,
DRAGON_SOUL_INVENTORY,
BELT_INVENTORY,
#ifdef WJ_OFFLINE_SHOP_SYSTEM
OFFLINE_SHOP,
#endif
#ifdef ENABLE_SPLIT_IN#ifdef SKILL_BOOK_INVENTORY,
UPG#endif#endif#endif#endifN#ifdefY,
BOX_INVENTORY,
EFSUN_INVENTORY,
CICEK_INVENTORY,
#endif
GROUND
};[/CODE]
d#endifrim bu şekilde fakat navicat tablosundaki window değerleri;
[CODE title="enum değerleri"]'INVENTORY','EQUIPMENT','SAFEBOX','MALL','DRAGON_SOUL_INVENTORY','BELT_INVENTORY','OFFLINE_SHOP','GROUND'[/CODE]
bu şekilde :/ işin içinden çıkamadım varmı yardımcı olacak ?





