Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...
KODevelopers

VipStorage Depo Sıkındı Yardım

Önerilen Mesajlar

Merhaba...

VipStorage Depo itemleri koyunca bi kaç siliniyor Sonra item süresi eski tarih gösteriyor.

1.Soru :

bLNE58.jpg

Cevap: Anahtar eklemiştim tarih doğru verildi.

2.Soru :

g9mYy5.jpg

Cevap : 2 tanesi item koydum.. Sonrada kapattım tekrar açınca Sonrada

3. Soru:

AyBXm0.jpg

Cevap : item süresi oluyo neden.


CDBAgent-> LoadWarehouseDataVip



bool 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-> UpdateWarehouseDataVip



bool 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öyle


VIPSTORAGE_MAX 48

char strVIPItem[VIPSTORAGE_MAX * 12], strVIPSerial[VIPSTORAGE_MAX * 8];

48 * 12 = 576
48 * 8 = 384




CREATE 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]
GO

ALTER TABLE [dbo].[VIP_WAREHOUSE] ADD CONSTRAINT [DF_VIP_WAREHOUSE_VIPStorePassword_1] DEFAULT ('0') FOR [VIPStorePassword]
GO

ALTER TABLE [dbo].[VIP_WAREHOUSE] ADD CONSTRAINT [DF_VIP_WAREHOUSE_VIPStoreMinute_1] DEFAULT ((0)) FOR [VIPStoreMinute]
GO



DB Deki VIP_WAREHOUSE

http://prntscr.com/hs3sh1

DB Kayıtladı

İyi Çalışmalar Ko-kodevelopers.Com

İletiyi paylaş


Link to post
Sitelerde Paylaş

Dikkatli incelemedim ama gözüme direk çarpan birşey var
dbCommand->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

İletiyi paylaş


Link to post
Sitelerde Paylaş
Alıntı
Dikkatli incelemedim ama gözüme direk çarpan birşey var
dbCommand->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


dbCommand->FetchUInt32(4/*54 yazmışsın*/, pUser->nVIPExpirationTime);

Değiştirdim onun bakdım.

kendi itemleri süresi göster dedigimi yaptım olmadı..

@ goto566

Kopyalı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 endregion



Sü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

İletiyi paylaş


Link to post
Sitelerde Paylaş

×
×
  • Yeni Oluştur...