KODevelopers 438 #1 Oluşturuldu: Aralık 25, 2017 Merhaba...VipStorage Depo itemleri koyunca bi kaç siliniyor Sonra item süresi eski tarih gösteriyor.1.Soru : Cevap: Anahtar eklemiştim tarih doğru verildi.2.Soru :Cevap : 2 tanesi item koydum.. Sonrada kapattım tekrar açınca Sonrada3. Soru:Cevap : item süresi oluyo neden.CDBAgent-> LoadWarehouseDataVipbool CDBAgent::LoadWarehouseDataVip(string & strAccountID, CUser *pUser){ char strVIPItem[VIPSTORAGE_MAX * 12], strVIPSerial[VIPSTORAGE_MAX * 8]; unique_ptr dbCommand(m_GameDB->CreateCommand()); if (dbCommand.get() == nullptr) return false; if (pUser == nullptr || pUser->m_bLogout) return false; dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length()); if (!dbCommand->Execute(_T("SELECT strVIPItem, strVIPSerial, VIPStorePassword, VIPStoreMinute FROM VIP_WAREHOUSE WHERE strAccountID = ?"))) ReportSQLError(m_GameDB->GetError()); if (!dbCommand->hasData()) return false; memset(strVIPItem, 0x00, sizeof(strVIPItem)); memset(strVIPSerial, 0x00, sizeof(strVIPSerial)); dbCommand->FetchBinary(1, strVIPItem, sizeof(strVIPItem)); dbCommand->FetchBinary(2, strVIPSerial, sizeof(strVIPSerial)); dbCommand->FetchString(3, pUser->VIPStorePassword); dbCommand->FetchUInt32(54, pUser->nVIPExpirationTime); ByteBuffer VitemBuffer, VserialBuffer, VitemExBuffer; VitemBuffer.append(strVIPItem, sizeof(strVIPItem)); VserialBuffer.append(strVIPSerial, sizeof(strVIPSerial)); memset(pUser->m_sVIPItemArray, 0x00, sizeof(pUser->m_sVIPItemArray)); for (int i = 0; i { uint64 nSerialNum; uint32 nItemID; int16 sDurability, sCount; VitemBuffer >> nItemID >> sDurability >> sCount; VserialBuffer >> nSerialNum; _ITEM_TABLE *pTable = g_pMain->GetItemPtr(nItemID); if (pTable == nullptr || sCount continue; if (!pTable->m_bCountable && sCount > 1) sCount = 1; else if (sCount > ITEMCOUNT_MAX) sCount = ITEMCOUNT_MAX; pUser->m_sVIPItemArray[i].nNum = nItemID; pUser->m_sVIPItemArray[i].sDuration = sDurability; pUser->m_sVIPItemArray[i].sCount = sCount; pUser->m_sVIPItemArray[i].nSerialNum = nSerialNum; UserItemSealMap::iterator sealitr = pUser->m_sealedItemMap.find(nSerialNum); if (sealitr != pUser->m_sealedItemMap.end()) { if (sealitr->second->bSealType == 1) pUser->m_sVIPItemArray[i].bFlag = ITEM_FLAG_SEALED; else if (sealitr->second->bSealType == 3) pUser->m_sVIPItemArray[i].bFlag = ITEM_FLAG_BOUND; } if (g_pMain->IsDuplicateItem(nItemID, nSerialNum)) pUser->m_sVIPItemArray[i].bFlag = ITEM_FLAG_DUPLICATE; } return true;}CDBAgent-> UpdateWarehouseDataVipbool CDBAgent::UpdateWarehouseDataVip(string & strAccountID, UserUpdateType type, CUser *pUser){ if (strAccountID.length() == 0) return false; unique_ptr dbCommand(m_GameDB->CreateCommand()); if (dbCommand.get() == nullptr) return false; if (type == UPDATE_LOGOUT || type == UPDATE_ALL_SAVE) pUser->m_dwTime = 0; // This *should* be padded like the database field is (unnecessarily), but I want to see how MSSQL responds. ByteBuffer strVIPItem, strVIPSerial; for (int i = 0; i { _ITEM_DATA *pItem = &pUser->m_sVIPItemArray[i]; strVIPItem nNum sDuration sCount; strVIPSerial nSerialNum; } dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)strVIPItem.contents(), strVIPItem.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)strVIPSerial.contents(), strVIPSerial.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length()); if (!dbCommand->Execute(string_format(_T("UPDATE VIP_WAREHOUSE SET strVIPItem=?, strVIPSerial=? , VIPStoreMinute=%d WHERE strAccountID=?"), pUser->nVIPExpirationTime))) { ReportSQLError(m_GameDB->GetError()); return false; } return true;}Sloth hesaplamıştım eğer yanlış varsa SöyleVIPSTORAGE_MAX 48char strVIPItem[VIPSTORAGE_MAX * 12], strVIPSerial[VIPSTORAGE_MAX * 8];48 * 12 = 576 48 * 8 = 384CREATE TABLE [dbo].[VIP_WAREHOUSE]( [strAccountID] [char](21) NOT NULL, [strUserID] [char](21) NULL, [strVIPItem] [binary](576) NULL, [strVIPSerial] [binary](384) NULL, [VIPStorePassword] [char](4) NOT NULL, [VIPStoreMinute] [int] NOT NULL, CONSTRAINT [PK_WAREHOUSE_VIP] PRIMARY KEY CLUSTERED ( [strAccountID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [dbo].[VIP_WAREHOUSE] ADD CONSTRAINT [DF_VIP_WAREHOUSE_VIPStorePassword_1] DEFAULT ('0') FOR [VIPStorePassword]GOALTER TABLE [dbo].[VIP_WAREHOUSE] ADD CONSTRAINT [DF_VIP_WAREHOUSE_VIPStoreMinute_1] DEFAULT ((0)) FOR [VIPStoreMinute]GODB Deki VIP_WAREHOUSEhttp://prntscr.com/hs3sh1DB Kayıtladıİyi Çalışmalar Ko-kodevelopers.Com Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
KODevelopers 438 #2 Konu Sahibi Aralık 26, 2017 tarihinde gönderildi Son güncellen kimse yok mu :/ Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
goto566 39 #3 Aralık 26, 2017 tarihinde gönderildi Dikkatli incelemedim ama gözüme direk çarpan birşey vardbCommand->FetchUInt32(54/*54 yazmışsın*/, pUser->nVIPExpirationTime);update bölümündede expirationtime yok. birazcık incelemen gerek emre kopyala yapıştırla olmaz herzaman Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş
KODevelopers 438 #4 Konu Sahibi Aralık 26, 2017 tarihinde gönderildi AlıntıDikkatli incelemedim ama gözüme direk çarpan birşey vardbCommand->FetchUInt32(54/*54 yazmışsın*/, pUser->nVIPExpirationTime);update bölümündede expirationtime yok. birazcık incelemen gerek emre kopyala yapıştırla olmaz herzamandbCommand->FetchUInt32(4/*54 yazmışsın*/, pUser->nVIPExpirationTime);Değiştirdim onun bakdım.kendi itemleri süresi göster dedigimi yaptım olmadı..@ goto566Kopyalıp yapıştırmak için yapmıyorumda.. keşke anlabilsek..Süreli ekliydi.#include "stdafx.h"#include "../shared/database/OdbcConnection.h"#include "DBAgent.h"using std::string;using std::unique_ptr;#pragma region CDBAgent::UpdateWarehouseData(string & strAccountID, UserUpdateType type, CUser *pUser)bool CDBAgent::UpdateWarehouseData(string & strAccountID, UserUpdateType type, CUser *pUser){ if (strAccountID.length() == 0) return false; unique_ptr dbCommand(m_GameDB->CreateCommand()); if (dbCommand.get() == nullptr) return false; if (type == UPDATE_LOGOUT || type == UPDATE_ALL_SAVE) pUser->m_dwTime = 0; // This *should* be padded like the database field is (unnecessarily), but I want to see how MSSQL responds. ByteBuffer itemBuffer, serialBuffer, itemTimeBuffer; for (int i = 0; i { _ITEM_DATA *pItem = &pUser->m_sWarehouseArray[i]; itemBuffer nNum sDuration sCount; serialBuffer nSerialNum; itemTimeBuffer nExpirationTime; } dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)itemBuffer.contents(), itemBuffer.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)serialBuffer.contents(), serialBuffer.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)itemTimeBuffer.contents(), itemTimeBuffer.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length()); if (!dbCommand->Execute(string_format(_T("UPDATE WAREHOUSE SET nMoney=%d, dwTime=%d, WarehouseData=?, strSerial=?, WarehouseDataTime=? WHERE strAccountID=?"), pUser->m_iBank, pUser->m_dwTime))) { ReportSQLError(m_GameDB->GetError()); return false; } return true;}#pragma endregion#pragma region CDBAgent::LoadWarehouseData(string & strAccountID, CUser *pUser)bool CDBAgent::LoadWarehouseData(string & strAccountID, CUser *pUser){ char strItem[WAREHOUSE_MAX * 8], strItemTime[WAREHOUSE_MAX * 8], strSerial[WAREHOUSE_MAX * 8], strSeal[WAREHOUSE_MAX * 4]; unique_ptr dbCommand(m_GameDB->CreateCommand()); if (dbCommand.get() == nullptr) return false; if (pUser == nullptr || pUser->m_bLogout) return false; dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length()); if (!dbCommand->Execute(_T("SELECT nMoney, WarehouseData, strSerial, strUserSeal, WarehouseDataTime FROM WAREHOUSE WHERE strAccountID = ?"))) ReportSQLError(m_GameDB->GetError()); if (!dbCommand->hasData()) return false; memset(strItem, 0x00, sizeof(strItem)); memset(strSerial, 0x00, sizeof(strSerial)); memset(strSeal, 0x00, sizeof(strSeal)); memset(strItemTime, 0x00, sizeof(strItemTime)); dbCommand->FetchUInt32(1, pUser->m_iBank); dbCommand->FetchBinary(2, strItem, sizeof(strItem)); dbCommand->FetchBinary(3, strSerial, sizeof(strSerial)); dbCommand->FetchBinary(4, strSeal, sizeof(strSeal)); dbCommand->FetchBinary(5, strItemTime, sizeof(strItemTime)); ByteBuffer itemBuffer, serialBuffer, itemExBuffer, SealBuffer; itemBuffer.append(strItem, sizeof(strItem)); itemExBuffer.append(strItemTime, sizeof(strItemTime)); serialBuffer.append(strSerial, sizeof(strSerial)); SealBuffer.append(strSeal, sizeof(strSeal)); memset(pUser->m_sWarehouseArray, 0x00, sizeof(pUser->m_sWarehouseArray)); for (int i = 0; i { uint64 nSerialNum; uint32 nItemID, nSealSerial; uint32 nItemEx; int16 sDurability, sCount; itemBuffer >> nItemID >> sDurability >> sCount; serialBuffer >> nSerialNum; itemExBuffer >> nItemEx; SealBuffer >> nSealSerial; _ITEM_TABLE *pTable = g_pMain->GetItemPtr(nItemID); if (pTable == nullptr || sCount continue; if (!pTable->m_bCountable && sCount > 1) sCount = 1; else if (sCount > ITEMCOUNT_MAX) sCount = ITEMCOUNT_MAX; pUser->m_sWarehouseArray[i].nNum = nItemID; pUser->m_sWarehouseArray[i].sDuration = sDurability; pUser->m_sWarehouseArray[i].sCount = sCount; pUser->m_sWarehouseArray[i].nSerialNum = nSerialNum; pUser->m_sWarehouseArray[i].nExpirationTime = nItemEx; pUser->m_sWarehouseArray[i].nSerialNum = nSealSerial; UserItemSealMap::iterator sealitr = pUser->m_sealedItemMap.find(nSerialNum); if (sealitr != pUser->m_sealedItemMap.end()) { if (sealitr->second->bSealType == 1) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_SEALED; else if (sealitr->second->bSealType == 3) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_BOUND; } if (g_pMain->IsDuplicateItem(nItemID, nSerialNum)) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_DUPLICATE; /*if (pTable->m_Bound == 1) { if (pUser->m_sWarehouseArray[i].bFlag == ITEM_FLAG_NONE) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_NOT_BOUND; }*/ } return true;}#pragma endregionSüresiz olan.#include "stdafx.h"#include "../shared/database/OdbcConnection.h"#include "DBAgent.h"using std::string;using std::unique_ptr;#pragma region CDBAgent::UpdateWarehouseData(string & strAccountID, UserUpdateType type, CUser *pUser)bool CDBAgent::UpdateWarehouseData(string & strAccountID, UserUpdateType type, CUser *pUser){ if (strAccountID.length() == 0) return false; unique_ptr dbCommand(m_GameDB->CreateCommand()); if (dbCommand.get() == nullptr) return false; if (type == UPDATE_LOGOUT || type == UPDATE_ALL_SAVE) pUser->m_dwTime = 0; // This *should* be padded like the database field is (unnecessarily), but I want to see how MSSQL responds. ByteBuffer itemBuffer, serialBuffer; for (int i = 0; i { _ITEM_DATA *pItem = &pUser->m_sWarehouseArray[i]; itemBuffer nNum sDuration sCount; serialBuffer nSerialNum; } dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)itemBuffer.contents(), itemBuffer.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, (char *)serialBuffer.contents(), serialBuffer.size(), SQL_BINARY); dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length()); if (!dbCommand->Execute(string_format(_T("UPDATE WAREHOUSE SET nMoney=%d, dwTime=%d, WarehouseData=?, strSerial=? WHERE strAccountID=?"), pUser->m_iBank, pUser->m_dwTime))) { ReportSQLError(m_GameDB->GetError()); return false; } return true;}#pragma endregion#pragma region CDBAgent::LoadWarehouseData(string & strAccountID, CUser *pUser)bool CDBAgent::LoadWarehouseData(string & strAccountID, CUser *pUser){ char strItem[WAREHOUSE_MAX * 8], strSerial[WAREHOUSE_MAX * 8], strSeal[WAREHOUSE_MAX * 4]; unique_ptr dbCommand(m_GameDB->CreateCommand()); if (dbCommand.get() == nullptr) return false; if (pUser == nullptr || pUser->m_bLogout) return false; dbCommand->AddParameter(SQL_PARAM_INPUT, strAccountID.c_str(), strAccountID.length()); if (!dbCommand->Execute(_T("SELECT nMoney, WarehouseData, strSerial, strUserSeal FROM WAREHOUSE WHERE strAccountID = ?"))) ReportSQLError(m_GameDB->GetError()); if (!dbCommand->hasData()) return false; memset(strItem, 0x00, sizeof(strItem)); memset(strSerial, 0x00, sizeof(strSerial)); memset(strSeal, 0x00, sizeof(strSeal)); dbCommand->FetchUInt32(1, pUser->m_iBank); dbCommand->FetchBinary(2, strItem, sizeof(strItem)); dbCommand->FetchBinary(3, strSerial, sizeof(strSerial)); dbCommand->FetchBinary(4, strSeal, sizeof(strSeal)); ByteBuffer itemBuffer, serialBuffer, itemExBuffer, SealBuffer; itemBuffer.append(strItem, sizeof(strItem)); serialBuffer.append(strSerial, sizeof(strSerial)); SealBuffer.append(strSeal, sizeof(strSeal)); memset(pUser->m_sWarehouseArray, 0x00, sizeof(pUser->m_sWarehouseArray)); for (int i = 0; i { uint64 nSerialNum; uint32 nItemID, nSealSerial; int16 sDurability, sCount; itemBuffer >> nItemID >> sDurability >> sCount; serialBuffer >> nSerialNum; SealBuffer >> nSealSerial; _ITEM_TABLE *pTable = g_pMain->GetItemPtr(nItemID); if (pTable == nullptr || sCount continue; if (!pTable->m_bCountable && sCount > 1) sCount = 1; else if (sCount > ITEMCOUNT_MAX) sCount = ITEMCOUNT_MAX; pUser->m_sWarehouseArray[i].nNum = nItemID; pUser->m_sWarehouseArray[i].sDuration = sDurability; pUser->m_sWarehouseArray[i].sCount = sCount; pUser->m_sWarehouseArray[i].nSerialNum = nSerialNum; pUser->m_sWarehouseArray[i].nSerialNum = nSealSerial; UserItemSealMap::iterator sealitr = pUser->m_sealedItemMap.find(nSerialNum); if (sealitr != pUser->m_sealedItemMap.end()) { if (sealitr->second->bSealType == 1) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_SEALED; else if (sealitr->second->bSealType == 3) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_BOUND; } if (g_pMain->IsDuplicateItem(nItemID, nSerialNum)) pUser->m_sWarehouseArray[i].bFlag = ITEM_FLAG_DUPLICATE; } return true;}#pragma endregion Mesajı raporla İletiyi paylaş Link to post Sitelerde Paylaş