SellPacket

Indította Deadly2000, 2020-01-02, 19:56:46

Valamelyik nap fedeztem fel egy problematikát, melyre próbáltam mindenhol orvosságot találni, illetve magamtól megoldani a szituációt ,de sajnos nem jött össze.
A lényeg annyi lenne :
Eladsz 1 tárgyat (inventory, spec inventory, bárhonnan.. akkor a szerver kidob a  bejelentkező képernyőre. (eladja azért csak kidob)
Utána jártam mi okozhatná ezt meg is találtam, mivel syserrbe kaptam egy hiba üzenetet

HACKER] Force sell-script used by name [%u]%s."

Ez odáig vezetett ,hogy a shop_manager.cpp -ben az  eladás függvénynél van gubasz, mivel valamiért azt hiszi ,hogy hackkel próbálom eladni  a tárgyakat.

Ez a része a függvénynek így néz ki 
if (IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_SELL))
{

ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can't sell this item."));
sys_err("[HACKER] Force sell-script used by name [%u]%s.", ch->GetPlayerID(), ch->GetName());
return;
}


Mielőtt valaki azt írná kommenteld ki . ( nem megy ) :D


Illetve még a kliens részét is megtaláltam.

bool CPythonNetworkStream::SendShopSellPacketNew(BYTE wSlot, BYTE byCount, BYTE byType)
{
if (!__CanActMainInstance())
return true;

TPacketCGShop PacketShop;
PacketShop.header = HEADER_CG_SHOP;
PacketShop.subheader = SHOP_SUBHEADER_CG_SELL2;

if (!Send(sizeof(TPacketCGShop), &PacketShop))
{
Tracef("SendShopSellPacket Errorn");
return false;
}
if (!Send(sizeof(BYTE), &wSlot))
{
Tracef("SendShopAddSellPacket Errorn");
return false;
}
if (!Send(sizeof(BYTE), &byCount))
{
Tracef("SendShopAddSellPacket Errorn");
return false;
}
#ifdef ENABLE_SPECIAL_STORAGE
if (!Send(sizeof(BYTE), &byType))
{
Tracef("SendShopAddSellPacket Error\n");
return false;
}
#endif
if (!Send(sizeof(BYTE), &byType))
{
Tracef("SendShopAddSellPacket Errorn");
return false;
}

Tracef(" SendShopSellPacketNew(wSlot=%d, byCount=%d, byType=%d)n", wSlot, byCount, byType);

return SendSequence();
}



Egy rávezető választ vagy megoldást nagyon szívesen meghallgatnék ;)

Nyilván azért dob ki, mert nem jól kezeli a packeteket.
A sellpacketeket nézd át..

“Majdnem minden tudásunkért nem azoknak tartozunk, akik egyetértettek, hanem azoknak, akik nem.”

Vagy nem jól adja vissza az értéket a kliensnek, én akkor találkoztam ilyennel.

Sajnos a C++ ,hoz nem nagyon értek. Viszont van egy sejtésem ..
Az okozhatja például ,ha a szerveroldalon BYTE van míg a kliensen WORD példaképpen

Idézetet írta: Deadly2000 Dátum 2020-01-02, 23:06:45
Sajnos a C++ ,hoz nem nagyon értek. Viszont van egy sejtésem ..
Az okozhatja például ,ha a szerveroldalon BYTE van míg a kliensen WORD példaképpen

Még szép, hogy okozhatja a problémát az, ha a küldött adat típus kisebb, mint a fogadott deklarációnál megadott típus definíció mérete, mivel egy BYTE 255 integer lehet maximum, míg a WORD 65535 lehet maximum, ergo ha egy eladott tárgy pozíciója-ja 300, akkor azt a BYTE 255-re szűkíti le, mert annyi fér bele maximum és azt küldi ki a szervernek és az szopacs tud lenni, mert egy másik pozíción lévő tárgyat próbál eladni. Ráadásul ha rosszul definiált adat típusok vannak kliens oldalon és azt küldjük át a szervernek, akkor a szerver oldalon eltérő adat méretek össze vissza csúszhatnak és rossz ofszeteket generálhatnak, ebből egy katyvasz tud lenni!

Miért küldöd ki 2x a window_type-ot? :-X

2020-01-04, 16:56:59 #6 Utolsó szerkesztés: 2020-01-04, 17:06:33 Szerző: Deadly2000
Köszönöm a válaszokat, rosszul kezelte őket ;)