port: P3-c PythonExchange + exchange module (1:1 40250)
Copy PythonExchange.cpp/PythonExchangeModule.cpp verbatim, drop the pending stand-in and the exchange module stub, register initTrade() after initNonPlayer(). The fake server answers CG_EXCHANGE START with the partner's item + gold and CANCEL with END; port.login_flow drives the exchange round-trip through the Python exchange/net modules and uiexchange. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
9298500df9
commit
72b19b677d
@@ -50,6 +50,7 @@
|
||||
#include "GameLib/ItemManager.h"
|
||||
#include "UserInterface/PythonItem.h"
|
||||
#include "UserInterface/StdAfx.h"
|
||||
#include "UserInterface/PythonExchange.h"
|
||||
#include "UserInterface/PythonCharacterManager.h"
|
||||
#include "UserInterface/InstanceBase.h"
|
||||
#include "UserInterface/PythonBackground.h"
|
||||
@@ -518,6 +519,26 @@ int main(int argc, char** argv)
|
||||
CHECK(pump_until(2, [&] { return !ground.GetGroundItemPosition(FakeLoginServer::kGroundItemVID, &item_pos); }));
|
||||
}
|
||||
|
||||
// Exchange (CPythonExchange + exchange module): net.SendExchangeStartPacket → the fake partner's GC_EXCHANGE
|
||||
// START/ITEM_ADD/GOLD_ADD fill the target side and open uiexchange; net.SendExchangeExitPacket → END.
|
||||
if (server)
|
||||
{
|
||||
CHECK(py("import net\nnet.SendExchangeStartPacket(" + std::to_string(FakeLoginServer::kMainVID) + ")"));
|
||||
CHECK(pump_until(2, [&] { return CPythonExchange::Instance().GetElkFromTarget() == FakeLoginServer::kExchangeGold; }));
|
||||
CHECK(py("import exchange\n"
|
||||
"assert exchange.isTrading() == 1\n"
|
||||
"assert exchange.GetItemVnumFromTarget(0) == " + std::to_string(FakeLoginServer::kExchangeItemVnum) + "\n"
|
||||
"assert exchange.GetItemCountFromTarget(0) == 1\n"
|
||||
"assert exchange.GetElkFromSelf() == 0"));
|
||||
CHECK(py("import net\nnet.SendExchangeExitPacket()"));
|
||||
CHECK(pump_until(2, [&] { return !CPythonExchange::Instance().isTrading(); }));
|
||||
CHECK(server->Has("game2:exchange 0 " + std::to_string(FakeLoginServer::kMainVID)));
|
||||
CHECK(server->Has("game2:exchange 5"));
|
||||
// uiexchange.CloseDialog armed wndMgr.OnceIgnoreMouseLeftButtonUpEvent (in the client that release belongs
|
||||
// to the click that closed the dialog); spend it so step 8's click-release is not swallowed.
|
||||
PythonBoot::UIMouseButton(1, false, 400, 520);
|
||||
}
|
||||
|
||||
// 8. (批次 2V3) Click-to-move: a left click on the ground below the actor reaches game.GameWindow's
|
||||
// OnMouseLeftButtonDown → player.SetMouseState(MBT_LEFT, MBS_PRESS); CPythonPlayer picks the ground
|
||||
// through the cursor ray (CScreen::SetCursorPosition → CPythonBackground::GetPickingPoint) and the
|
||||
@@ -565,7 +586,8 @@ int main(int argc, char** argv)
|
||||
want.push_back(e);
|
||||
for (const auto& e : events)
|
||||
if (e.rfind(prefix, 0) == 0 && e.find(":move ") == std::string::npos &&
|
||||
e.find(":pickup ") == std::string::npos)
|
||||
e.find(":pickup ") == std::string::npos &&
|
||||
e.find(":exchange ") == std::string::npos)
|
||||
got.push_back(e);
|
||||
CHECK(want == got);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user