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..
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
(https://puu.sh/EWkpb/3c2b3d88b8.png)
Köszönöm a válaszokat, rosszul kezelte őket ;)