2V1-d: offline login -> select -> loading against a fake 40250 server
port.login_flow drives the real 40250 root scripts through the ported CPythonNetworkStream and CAccountConnector against a loopback auth + game server built from net/classic (wire layouts, sequence table, cipher) that answers like the 40250 desc.cpp/input*.cpp: handshake, key agreement, LOGIN3/AUTH_SUCCESS, LOGIN2, the character list, DirectEnter reconnect, CHARACTER_SELECT, the loading packets and CLIENT_VERSION, with every sequence byte checked. - NetStream::ActivateCipher decrypts ciphertext already buffered behind KEY_AGREEMENT_COMPLETED (PORT) - CPythonApplication is final (PORT): no application object exists on the platform yet, so its virtual overrides must be called directly - app.GetTime (GetGlobalTime) and camera/center-position stubs - SendClientVersionPacket verbatim in the PhaseGame stand-in Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
4d9b800efb
commit
8d9d863c7e
@@ -3,6 +3,7 @@
|
||||
// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1).
|
||||
#include "UserInterface/StdAfx.h"
|
||||
#include "UserInterface/PythonNetworkStream.h"
|
||||
#include "EterBase/Filename.h"
|
||||
|
||||
#include "../../PlatformStub.h"
|
||||
|
||||
@@ -44,10 +45,40 @@ bool CPythonNetworkStream::SendChatPacket(const char *, BYTE)
|
||||
return mt_platform_stub_return<bool>();
|
||||
}
|
||||
|
||||
// PORT: the 40250 body verbatim ahead of its unit: the loading phase sends it on the main-character packet.
|
||||
bool CPythonNetworkStream::SendClientVersionPacket()
|
||||
{
|
||||
MT_PLATFORM_STUB();
|
||||
return mt_platform_stub_return<bool>();
|
||||
std::string filename;
|
||||
|
||||
GetExcutedFileName(filename);
|
||||
|
||||
filename = CFileNameHelper::NoPath(filename);
|
||||
CFileNameHelper::ChangeDosPath(filename);
|
||||
|
||||
if (LocaleService_IsEUROPE() && false == LocaleService_IsYMIR())
|
||||
{
|
||||
TPacketCGClientVersion2 kVersionPacket;
|
||||
kVersionPacket.header = HEADER_CG_CLIENT_VERSION2;
|
||||
strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1);
|
||||
strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time 앞자리
|
||||
//strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); // old_string_ver
|
||||
//strncpy(kVersionPacket.timestamp, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future
|
||||
//strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past
|
||||
|
||||
if (!Send(sizeof(kVersionPacket), &kVersionPacket))
|
||||
Tracef("SendClientReportPacket Error");
|
||||
}
|
||||
else
|
||||
{
|
||||
TPacketCGClientVersion kVersionPacket;
|
||||
kVersionPacket.header = HEADER_CG_CLIENT_VERSION;
|
||||
strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1);
|
||||
strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1);
|
||||
|
||||
if (!Send(sizeof(kVersionPacket), &kVersionPacket))
|
||||
Tracef("SendClientReportPacket Error");
|
||||
}
|
||||
return SendSequence();
|
||||
}
|
||||
|
||||
bool CPythonNetworkStream::SendExchangeAcceptPacket()
|
||||
|
||||
Reference in New Issue
Block a user