Transmutation+Offlineshop(help)

Indította Red, 2017-01-20, 19:49:46

2017-01-20, 19:49:46 Utolsó szerkesztés: 2017-01-20, 19:56:22 Szerző: Red
Sziasztok.

Beraktam a Transmutation systemet, működik is minden okés de, szeretném összehozni az offlineshoppal a systemet.
Kliensben már kiegészítettem amik kelletek, most jönne a forrás része ahol elakadtam.

offlineshop.cpp

Ebbe a részbe:
bool COfflineShop::AddGuest(LPCHARACTER ch, LPCHARACTER npc)
{
// If there is no ch, return false
if (!ch)
return false;

// If ch is exchanging, return false
if (ch->GetExchange())
return false;

// If target is shopping, return false
if (ch->GetShop())
return false;

// If target is look at private shop, return false
if (ch->GetMyShop())
return false;

// If target is look at offline shop, return false
if (ch->GetOfflineShop())
return false;

// If the npc is nullptr, return false
if (!npc)
return false;

// Start process
ch->SetOfflineShop(this);
m_map_guest.insert(GuestMapType::value_type(ch, false));

TPacketGCShop pack;
pack.header = HEADER_GC_OFFLINE_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_START;

TPacketGCOfflineShopStart pack2;
memset(&pack2, 0, sizeof(pack2));
pack2.owner_vid = npc->GetVID();

#ifdef USE_LENTS_SHOULDER_SASH
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6,applytype0,applyvalue0,applytype1,applyvalue1,applytype2,applyvalue2,applytype3,applyvalue3,applytype4,applyvalue4,applytype5,applyvalue5,applytype6,applyvalue6,applytype7,applyvalue7 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), npc->GetOfflineShopRealOwner()));
#else
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), npc->GetOfflineShopRealOwner()));
#endif
if (pMsg->Get()->uiNumRows == 0)
{
DBManager::instance().DirectQuery("DELETE FROM player.offline_shop_npc WHERE owner_id = %u", npc->GetOfflineShopRealOwner());
ch->SetOfflineShop(NULL);
ch->SetOfflineShopOwner(NULL);
M2_DESTROY_CHARACTER(npc);
return false;
}

MYSQL_ROW row;
while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
BYTE bPos = 0;
str_to_number(bPos, row[0]);

str_to_number(pack2.items[bPos].count, row[1]);
str_to_number(pack2.items[bPos].vnum, row[2]);
str_to_number(pack2.items[bPos].price, row[3]);

DWORD alSockets[ITEM_SOCKET_MAX_NUM];
for (int i = 0, n = 4; i < ITEM_SOCKET_MAX_NUM; ++i, n++)
str_to_number(alSockets[i], row[n]);

TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
for (int i = 0, iStartType = 7, iStartValue = 8; i < ITEM_ATTRIBUTE_MAX_NUM; ++i, iStartType += 2, iStartValue += 2)
{
str_to_number(aAttr[i].bType, row[iStartType]);
str_to_number(aAttr[i].sValue, row[iStartValue]);
}

thecore_memcpy(pack2.items[bPos].alSockets, alSockets, sizeof(pack2.items[bPos].alSockets));
thecore_memcpy(pack2.items[bPos].aAttr, aAttr, sizeof(pack2.items[bPos].aAttr));
}

pack.size = sizeof(pack) + sizeof(pack2);

if (ch->GetDesc())
{
ch->GetDesc()->BufferedPacket(&pack, sizeof(TPacketGCShop));
ch->GetDesc()->Packet(&pack2, sizeof(TPacketGCOfflineShopStart));
}

return true;
}



Kellene beleraknom ezt a thecore_memcpy-ek alatt:
#ifdef __CHANGE_LOOK_SYSTEM__
pack2.items[i].dwLookVnum = item.pkItem->GetItemLook();
#endif


[spoiler]De, lehet tévedek és ebben kell hozzáadni:
void COfflineShop::Refresh(LPCHARACTER ch)
{
TPacketGCShop pack;
pack.header = HEADER_GC_OFFLINE_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_UPDATE_ITEM2;

TPacketGCOfflineShopStart pack2;
memset(&pack2, 0, sizeof(pack2));
pack2.owner_vid = 0;

#ifdef USE_LENTS_SHOULDER_SASH
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6,applytype0,applyvalue0,applytype1,applyvalue1,applytype2,applyvalue2,applytype3,applyvalue3,applytype4,applyvalue4,applytype5,applyvalue5,applytype6,applyvalue6,applytype7,applyvalue7 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), ch->GetPlayerID()));
#else
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), ch->GetPlayerID()));
#endif

MYSQL_ROW row;
while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
BYTE bPos = 0;
str_to_number(bPos, row[0]);

str_to_number(pack2.items[bPos].count, row[1]);
str_to_number(pack2.items[bPos].vnum, row[2]);
str_to_number(pack2.items[bPos].price, row[3]);

DWORD alSockets[ITEM_SOCKET_MAX_NUM];
for (int i = 0, n = 4; i < ITEM_SOCKET_MAX_NUM; ++i, n++)
str_to_number(alSockets[i], row[n]);

TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
for (int i = 0, iStartType = 7, iStartValue = 8; i < ITEM_ATTRIBUTE_MAX_NUM; ++i, iStartType += 2, iStartValue += 2)
{
str_to_number(aAttr[i].bType, row[iStartType]);
str_to_number(aAttr[i].sValue, row[iStartValue]);
}

thecore_memcpy(pack2.items[bPos].alSockets, alSockets, sizeof(pack2.items[bPos].alSockets));
thecore_memcpy(pack2.items[bPos].aAttr, aAttr, sizeof(pack2.items[bPos].aAttr));
}

pack.size = sizeof(pack) + sizeof(pack2);

if (ch->GetDesc())
{
ch->GetDesc()->BufferedPacket(&pack, sizeof(TPacketGCShop));
ch->GetDesc()->Packet(&pack2, sizeof(TPacketGCOfflineShopStart));
}
}
[/spoiler]

Alapjáraton ezt a cuccot a shop.cpp-ből néztem ki és így szimplán nem fordul le.
Gondolom még a query részeket is ki kell egészítenem dwvnum oszloppal.


Ha, valaki tudna segíteni, útbaigazítani azt megköszönném.


Esetleg ha leírnád a hibát amit fordításnál ír :o
Másrészt meg nemigazán látom értelmét a rendszernek. Kb ugyanaz mint a fegyver kosztüm.

2017-01-20, 21:01:23 #2 Utolsó szerkesztés: 2017-01-20, 21:03:30 Szerző: Red
error: using obsolete binding at 'i'
error: 'item' was not declared


Fegyver kosztümöket is tudom transmutálni pls.

2017-01-20, 21:07:10 #3 Utolsó szerkesztés: 2017-01-20, 21:09:34 Szerző: 5310pati
Idézetet írta: Red Dátum 2017-01-20, 21:01:23Fegyver kosztümöket is tudom transmutálni pls.

Annak aztán sok értelme van :-X :-X

Am az a baja, hogy nincs az "item" deklarálva abban a fv-ben, se "i", mivel az adatokat mysqlből szedi mint látod, és a "row"-ban vannak az adatok.
str_to_number(pack2.items[bPos].count, row[1]);
str_to_number(pack2.items[bPos].vnum, row[2]);
str_to_number(pack2.items[bPos].price, row[3]);

A SELECT-et kell bővítened, majd ezek alapján elmenteni a dwLookVnum változódba.
Am elég sok helyen bele kell piszkálnod offshopba, nem csak ebben a fv-ben. Én egy fokozat rendszert csináltam amihez kb ugyanott kell módosítani és jó pár hely volt offshopnál.

Ezt már egyszer megcsináltam és akkor más volt a hiba üzenet. Azt majd holnap bemásolom mára elteszem magam.

Nyílván rosszul írtad meg.

[spoiler]Am még mindig nem értem mi értelme van ennek a rendszernek amikor ott vannak a kosztümök. :-X[/spoiler]

Pati, mit nem értesz? Ez egy fegyver kosztümjének a kosztüm fegyvere. Hát szerintem teljesen egyértelmű.
Van egy kardod felszerelve, amire ha felveszel egy kosztüm fegyvert akkor egy harmadik kinézete lesz a tárgyadnak, egy zseniális rendszer.
Az ember csak fiatalon találhat ki igazán új dolgokat. Utána már túl tapasztalt, túl híres (...) és túl ostoba.


Én mit nem értek? Te mit nem értesz...
Azt mondtam nem értem mi értelme van ennek. Nem azt hogy mi ez a rendszer.

 :'(
Ha nem látod a válaszom, valamit elrontottál:

Kemény programozok mindenhol, mindenki csak renccsereket készít.. #sosad :'(

Na programozó istenek.

így nézz ki a offlineshop.cpp:

bool COfflineShop::AddGuest(LPCHARACTER ch, LPCHARACTER npc)
{
// If there is no ch, return false
if (!ch)
return false;

// If ch is exchanging, return false
if (ch->GetExchange())
return false;

// If target is shopping, return false
if (ch->GetShop())
return false;

// If target is look at private shop, return false
if (ch->GetMyShop())
return false;

// If target is look at offline shop, return false
if (ch->GetOfflineShop())
return false;

// If the npc is nullptr, return false
if (!npc)
return false;

// Start process
ch->SetOfflineShop(this);
m_map_guest.insert(GuestMapType::value_type(ch, false));

TPacketGCShop pack;
pack.header = HEADER_GC_OFFLINE_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_START;

TPacketGCOfflineShopStart pack2;
memset(&pack2, 0, sizeof(pack2));
pack2.owner_vid = npc->GetVID();

#ifdef USE_LENTS_SHOULDER_SASH
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6,applytype0,applyvalue0,applytype1,applyvalue1,applytype2,applyvalue2,applytype3,applyvalue3,applytype4,applyvalue4,applytype5,applyvalue5,applytype6,applyvalue6,applytype7,applyvalue7 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), npc->GetOfflineShopRealOwner()));
#else
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), npc->GetOfflineShopRealOwner()));
#endif
if (pMsg->Get()->uiNumRows == 0)
{
DBManager::instance().DirectQuery("DELETE FROM player.offline_shop_npc WHERE owner_id = %u", npc->GetOfflineShopRealOwner());
ch->SetOfflineShop(NULL);
ch->SetOfflineShopOwner(NULL);
M2_DESTROY_CHARACTER(npc);
return false;
}

MYSQL_ROW row;
while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
BYTE bPos = 0;
str_to_number(bPos, row[0]);

str_to_number(pack2.items[bPos].count, row[1]);
str_to_number(pack2.items[bPos].vnum, row[2]);
str_to_number(pack2.items[bPos].price, row[3]);
#ifdef __CHANGE_LOOK_SYSTEM__
str_to_number(pack2.items[bPos].dwLookVnum, row[4]);
#endif

DWORD alSockets[ITEM_SOCKET_MAX_NUM];
for (int i = 0, n = 4; i < ITEM_SOCKET_MAX_NUM; ++i, n++)
str_to_number(alSockets[i], row[n]);

TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
for (int i = 0, iStartType = 7, iStartValue = 8; i < ITEM_ATTRIBUTE_MAX_NUM; ++i, iStartType += 2, iStartValue += 2)
{
str_to_number(aAttr[i].bType, row[iStartType]);
str_to_number(aAttr[i].sValue, row[iStartValue]);
}

thecore_memcpy(pack2.items[bPos].alSockets, alSockets, sizeof(pack2.items[bPos].alSockets));
thecore_memcpy(pack2.items[bPos].aAttr, aAttr, sizeof(pack2.items[bPos].aAttr));
#ifdef __CHANGE_LOOK_SYSTEM__
pack2.items[bPos].dwLookVnum = item.pkItem->GetItemLook();
#endif
}

pack.size = sizeof(pack) + sizeof(pack2);

if (ch->GetDesc())
{
ch->GetDesc()->BufferedPacket(&pack, sizeof(TPacketGCShop));
ch->GetDesc()->Packet(&pack2, sizeof(TPacketGCOfflineShopStart));
}

return true;
}


Packet.h-ban ezt:
struct packet_offline_shop_item

Kiegészítettem ezzel:
#ifdef __CHANGE_LOOK_SYSTEM__
DWORD dwLookVnum;
#endif


És ennyi az error:
error: 'item' was not declared in this scope

Ha, a bPos helyett i-t használok a dwLookVnum-nak akkor error:
error: 'i' was not declared in this scope
error: 'item' was not declared in this scope




Itt van ez az "item" de sajnos ezzel így abba a funkcióban nem tud mit kezdeni.

Igen Stepi ez az én bajom. Ezért is nyitottam a témát.

NEM AZÉRT, HOGY VAN-E ÉRTELME A SYSTEMNEK PLS.

bool COfflineShop::AddGuest(LPCHARACTER ch, LPCHARACTER npc)
{
// If there is no ch, return false
if (!ch)
return false;

// If ch is exchanging, return false
if (ch->GetExchange())
return false;

// If target is shopping, return false
if (ch->GetShop())
return false;

// If target is look at private shop, return false
if (ch->GetMyShop())
return false;

// If target is look at offline shop, return false
if (ch->GetOfflineShop())
return false;

// If the npc is nullptr, return false
if (!npc)
return false;

// Start process
ch->SetOfflineShop(this);
m_map_guest.insert(GuestMapType::value_type(ch, false));

TPacketGCShop pack;
pack.header = HEADER_GC_OFFLINE_SHOP;
pack.subheader = SHOP_SUBHEADER_GC_START;

TPacketGCOfflineShopStart pack2;
memset(&pack2, 0, sizeof(pack2));
pack2.owner_vid = npc->GetVID();

#ifdef USE_LENTS_SHOULDER_SASH
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6,applytype0,applyvalue0,applytype1,applyvalue1,applytype2,applyvalue2,applytype3,applyvalue3,applytype4,applyvalue4,applytype5,applyvalue5,applytype6,applyvalue6,applytype7,applyvalue7 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), npc->GetOfflineShopRealOwner()));
#else
std::auto_ptr<SQLMsg> pMsg(DBManager::instance().DirectQuery("SELECT pos,count,vnum,price,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6 FROM %soffline_shop_item WHERE owner_id = %u", get_table_postfix(), npc->GetOfflineShopRealOwner()));
#endif
if (pMsg->Get()->uiNumRows == 0)
{
DBManager::instance().DirectQuery("DELETE FROM player.offline_shop_npc WHERE owner_id = %u", npc->GetOfflineShopRealOwner());
ch->SetOfflineShop(NULL);
ch->SetOfflineShopOwner(NULL);
M2_DESTROY_CHARACTER(npc);
return false;
}

MYSQL_ROW row;
while (NULL != (row = mysql_fetch_row(pMsg->Get()->pSQLResult)))
{
BYTE bPos = 0;
str_to_number(bPos, row[0]);

str_to_number(pack2.items[bPos].count, row[1]);
str_to_number(pack2.items[bPos].vnum, row[2]);
str_to_number(pack2.items[bPos].price, row[3]);
#ifdef __CHANGE_LOOK_SYSTEM__
str_to_number(pack2.items[bPos].dwLookVnum, row[4]);
#endif

DWORD alSockets[ITEM_SOCKET_MAX_NUM];
for (int i = 0, n = 4; i < ITEM_SOCKET_MAX_NUM; ++i, n++)
str_to_number(alSockets[i], row[n]);

TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];
for (int i = 0, iStartType = 7, iStartValue = 8; i < ITEM_ATTRIBUTE_MAX_NUM; ++i, iStartType += 2, iStartValue += 2)
{
str_to_number(aAttr[i].bType, row[iStartType]);
str_to_number(aAttr[i].sValue, row[iStartValue]);
}

thecore_memcpy(pack2.items[bPos].alSockets, alSockets, sizeof(pack2.items[bPos].alSockets));
thecore_memcpy(pack2.items[bPos].aAttr, aAttr, sizeof(pack2.items[bPos].aAttr));
#ifdef __CHANGE_LOOK_SYSTEM__
pack2.items[bPos].dwLookVnum = item.pkItem->GetItemLook();
#endif
}

pack.size = sizeof(pack) + sizeof(pack2);

if (ch->GetDesc())
{
ch->GetDesc()->BufferedPacket(&pack, sizeof(TPacketGCShop));
ch->GetDesc()->Packet(&pack2, sizeof(TPacketGCOfflineShopStart));
}

return true;
}

Ha ezt használod akkor baj van mert nem bővítetted a SELECT query-t.
Amit így elment a lookvnum változódba a socket0 értéke.
+ ez a rész felesleges ha már átírtad hogy a row-ból kapjon értéket:
#ifdef __CHANGE_LOOK_SYSTEM__
pack2.items[bPos].dwLookVnum = item.pkItem->GetItemLook();
#endif

Írj fölé egy:
LPITEM item;
et

#ifdef __CHANGE_LOOK_SYSTEM__
    LPITEM item;
    pack2.items[bPos].dwLookVnum = item.pkItem->GetItemLook();
#endif

2017-01-21, 10:23:14 #15 Utolsó szerkesztés: 2017-01-21, 10:26:24 Szerző: 5310pati
Ezzel csak eltünik az errort, de nem fog működni a dolog, mivel az "item" nem kapott értéket. :-X

Valamit előbb lehagytam, hogy ha a row[4]-ből akarod olvasni az lookvnum értékét, akkor a 2 következő ciklus kezdeti értékét is növelned kell 1-el, hogy ne csússzanak el az adatok.

Üzenet összefésülés: 2017-01-21, 10:25:33

De ha mindenképp ennyire LPITEM-el szeretnétek megoldani akkor így:
LPITEM item = GetInventoryItem(bPos);
if (!item)
return false;
else
pack2.items[bPos].dwLookVnum = item->GetItemLook();

Bár ez is csak tárgy berakásnál működik ugye, mert ami boltba van arra nem jó a GetInventoryItem fv.

Rendben eddig okés minden. Még 1 kérdésem lenne.
Ennek a résznek a végére, hogy adjam hozzá a dwVnum-ot?
int iUpdateLen = snprintf(szValues, sizeof(szValues), "%u,%u,%d,%u,%lld,%u", pkItem->GetID(), ch->GetPlayerID(), bDisplayPos, pkItem->GetCount(), llPrice, pkItem->GetVnum());

Azt vágom, hogy a funkció elején hozzá kell adni a void-ba meg a h fájlban is, csak az érdekelnek ennek a végére, hogy írjam be mert, nem nagyon akarja nekem elfogadni sehogy.


Hát ha el akarod menteni berakáskor a lookvnum értékét akkor nem ártana.
Arra figyelj h char.cpp-ben is bővíteni kell a berakást. Nekem legalábbis ott is van, mivel az felel a bolt nyitásért, a offshop_manager meg a nyitva lévő boltba való tárgy hozzáadásért.

Jah char.cpp-ben is megtalálható ugyan ez a rész.
int iLen = snprintf(szColumns, sizeof(szColumns), "id,owner_id,pos,count,price,vnum");
int iUpdateLen = snprintf(szValues, sizeof(szValues), "%u,%u,%d,%u,%lld,%u", pkItem->GetID(), GetPlayerID(), (pTable + i)->display_pos, pkItem->GetCount(), (pTable + i)->price, pkItem->GetVnum());