Nu stiu de la ce e, nu l-am implementat niciodată, dar te pot ajuta cu idei, poate reușești.
In primul rand, se vede clar din video că se apelează fereastra + acel loading circle. Practic asta inseamnă că python face partea de UI + trimite request către server. Practic pe fir urmează binarul C++ incearcă să citească raspunsul primit de la server. Deci stim unde să punem un traceback, practic intra in sursa client si du-te in UserInterface/PythonNetworkStreamPhaseGame.cpp(sau unde a avut resursa partea de network), intr-una din ăstea ai implementat probabil functia Recv, practic cauta ceva gen bool CPythonNetworkStream::Recv(). Sub ea ai un if statement ceva gen if (!Recv(sizeof(pachetul tau ), &p))
return false; -> Aici te deconectează pe ascuns!. inainte de return adaugi un TraceError. Bonus poti sa adaugi si la void CPythonNetworkStream::Disconnect() un TraceError si practic vei vedea clar în syserr.txt dacă binarul inițiază deconectarea în momentul respectiv. Sigur e ceva incompatibilitate intre DWORD, int sau byte pe undeva. Mai jos e un exemplu cum il am eu implementat. Si practic dacă apare UNKNOWN OFFLINESHOP SUBHEADER, e clar că serverul trimite un subheader pe care clientul nu îl are definit în enum-ul din binar, iar dacă iti returnează un subheader înseamnă că structura pachetului din acea funcție e greșită.
Cod: Selectaţi tot
bool CPythonNetworkStream::RecvOfflineshopPacket()
{
TPacketGCNewOfflineshop pack;
if(!Recv(sizeof(pack), &pack))
{
TraceError("=== OFFLINESHOP CRASH === Eroare la citirea pachetului principal!");
return false;
}
// Aici vedem ce subheader se execută fix în secunda când te dă afară
TraceError("=== OFFLINESHOP DEBUG === Am primit subheader-ul: %d", pack.bSubHeader);
switch (pack.bSubHeader)
{
case offlineshop::SUBHEADER_GC_SHOP_LIST: return RecvOfflineshopShopList();
case offlineshop::SUBHEADER_GC_SHOP_OPEN: return RecvOfflineshopShopOpen();
case offlineshop::SUBHEADER_GC_SHOP_OPEN_OWNER: return RecvOfflineshopShopOpenOwner();
case offlineshop::SUBHEADER_GC_SHOP_OPEN_OWNER_NO_SHOP: return RecvOfflineshopShopOpenOwnerNoShop();
case offlineshop::SUBHEADER_GC_SHOP_CLOSE: return RecvOfflineshopShopClose();
case offlineshop::SUBHEADER_GC_SHOP_BUY_ITEM_FROM_SEARCH: return RecvOfflineshopShopBuyItemFromSearch();
case offlineshop::SUBHEADER_GC_SHOP_FILTER_RESULT: return RecvOfflineshopShopFilterResult();
case offlineshop::SUBHEADER_GC_OFFER_LIST: return RecvOfflineshopOfferList();
case offlineshop::SUBHEADER_GC_SHOP_SAFEBOX_REFRESH: return RecvOfflineshopShopSafeboxRefresh();
case offlineshop::SUBHEADER_GC_AUCTION_LIST: return RecvOfflineshopAuctionList();
case offlineshop::SUBHEADER_GC_OPEN_MY_AUCTION: return RecvOfflineshopOpenMyAuction();
case offlineshop::SUBHEADER_GC_OPEN_MY_AUCTION_NO_AUCTION: return RecvOfflineshopOpenMyAuctionNoAuction();
case offlineshop::SUBHEADER_GC_OPEN_AUCTION: return RecvOfflineshopOpenAuction();
#ifdef ENABLE_NEW_SHOP_IN_CITIES
case offlineshop::SUBHEADER_GC_INSERT_SHOP_ENTITY: return RecvOfflineshopInsertEntity();
case offlineshop::SUBHEADER_GC_REMOVE_SHOP_ENTITY: return RecvOfflineshopRemoveEntity();
#endif
#ifdef ENABLE_OFFLINESHOP_REWORK
case offlineshop::SUBHEADER_GC_NOTIFICATION: return RecvOfflineshopNotification();
#endif
default:
TraceError("UNKNOWN OFFLINESHOP SUBHEADER : %d ",pack.bSubHeader);
return false;
}
}