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.
error: using obsolete binding at 'i'
error: 'item' was not declared
Fegyver kosztümöket is tudom transmutálni pls.
Idézetet írta: Red Dátum 2017-01-20, 21:01:23Fegyver kosztümöket is tudom transmutálni pls.
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fci.memecdn.com%2F9978963.jpg&hash=58d03e9aa73f0aac5561ef415198389ed9dd213b)
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.
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi3.kym-cdn.com%2Fentries%2Ficons%2Foriginal%2F000%2F006%2F482%2Ftemplate.jpg&hash=57b22ba35c9a058998bb7a2649cca7d2689838d6)
Én mit nem értek? Te mit nem értesz...
Azt mondtam nem értem mi értelme van ennek. Nem azt hogy mi ez a rendszer.
:'(
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
(https://board.ddmt2.net/proxy.php?request=http%3A%2F%2Fi.imgur.com%2FxqTg5a9.png&hash=f063a24cfcae019c34d08bab6e6cd45601575d8f)
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
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());