4545#include " mc/network/ConnectionRequest.h"
4646#include " mc/network/MinecraftPacketIds.h"
4747#include " mc/network/MinecraftPackets.h"
48+ #include " mc/network/NetEventCallback.h"
4849#include " mc/network/ServerNetworkHandler.h"
4950#include " mc/network/packet/BossEventPacket.h"
5051#include " mc/network/packet/LevelChunkPacket.h"
@@ -2435,16 +2436,18 @@ Local<Value> PlayerClass::removeBossBar(const Arguments& args) {
24352436}
24362437
24372438Local<Value> PlayerClass::sendSimpleForm (const Arguments& args) {
2438- CHECK_ARGS_COUNT (args, 4 );
2439+ CHECK_ARGS_COUNT (args, 5 );
24392440 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
24402441 CHECK_ARG_TYPE (args[1 ], ValueKind::kString );
24412442 CHECK_ARG_TYPE (args[2 ], ValueKind::kArray );
24422443 CHECK_ARG_TYPE (args[3 ], ValueKind::kArray );
24432444 CHECK_ARG_TYPE (args[4 ], ValueKind::kFunction );
2445+ if (args.size () > 5 ) CHECK_ARG_TYPE (args[5 ], ValueKind::kBoolean );
24442446
24452447 try {
24462448 Player* player = get ();
24472449 if (!player) return Local<Value>();
2450+ bool update = args.size () > 5 ? args[5 ].asBoolean ().value () : false ;
24482451
24492452 // 普通格式
24502453 auto textsArr = args[2 ].asArray ();
@@ -2463,26 +2466,25 @@ Local<Value> PlayerClass::sendSimpleForm(const Arguments& args) {
24632466 form.appendButton (textsArr.get (i).asString ().toString ());
24642467 }
24652468 }
2466- form.sendTo (
2467- *player,
2468- [engine{EngineScope::currentEngine ()},
2469- callback{script::Global (args[4 ].asFunction ())
2470- }](Player& pl, int chosen, ll::form::FormCancelReason reason) {
2471- if ((ll::getGamingStatus () != ll::GamingStatus::Running)) return ;
2472- if (!EngineManager::isValid (engine)) return ;
2473-
2474- EngineScope scope (engine);
2475- try {
2476- callback.get ().call (
2477- {},
2478- PlayerClass::newPlayer (&pl),
2479- chosen >= 0 ? Number::newNumber (chosen) : Local<Value>(),
2480- reason.has_value () ? Number::newNumber ((uchar)reason.value ()) : Local<Value>()
2481- );
2482- }
2483- CATCH_IN_CALLBACK (" sendSimpleForm" )
2469+ auto formCallback = [engine{EngineScope::currentEngine ()},
2470+ callback{script::Global (args[4 ].asFunction ())
2471+ }](Player& pl, int chosen, ll::form::FormCancelReason reason) {
2472+ if ((ll::getGamingStatus () != ll::GamingStatus::Running)) return ;
2473+ if (!EngineManager::isValid (engine)) return ;
2474+
2475+ EngineScope scope (engine);
2476+ try {
2477+ callback.get ().call (
2478+ {},
2479+ PlayerClass::newPlayer (&pl),
2480+ chosen >= 0 ? Number::newNumber (chosen) : Local<Value>(),
2481+ reason.has_value () ? Number::newNumber ((uchar)reason.value ()) : Local<Value>()
2482+ );
24842483 }
2485- );
2484+ CATCH_IN_CALLBACK (" sendSimpleForm" )
2485+ };
2486+ if (update) form.sendUpdate (*player, std::move (formCallback));
2487+ else form.sendTo (*player, std::move (formCallback));
24862488
24872489 return Number::newNumber (1 );
24882490 }
@@ -2496,37 +2498,40 @@ Local<Value> PlayerClass::sendModalForm(const Arguments& args) {
24962498 CHECK_ARG_TYPE (args[2 ], ValueKind::kString );
24972499 CHECK_ARG_TYPE (args[3 ], ValueKind::kString );
24982500 CHECK_ARG_TYPE (args[4 ], ValueKind::kFunction );
2501+ if (args.size () > 5 ) CHECK_ARG_TYPE (args[5 ], ValueKind::kBoolean );
24992502
25002503 try {
25012504 Player* player = get ();
25022505 if (!player) return Local<Value>();
2506+ bool update = args.size () > 5 ? args[5 ].asBoolean ().value () : false ;
25032507
25042508 ll::form::ModalForm form (
25052509 args[0 ].asString ().toString (),
25062510 args[1 ].asString ().toString (),
25072511 args[2 ].asString ().toString (),
25082512 args[3 ].asString ().toString ()
25092513 );
2510- form.sendTo (
2511- *player,
2512- [engine{EngineScope::currentEngine ()},
2513- callback{script::Global (args[4 ].asFunction ())
2514- }](Player& pl, ll::form::ModalFormResult const & chosen, ll::form::FormCancelReason reason) {
2515- if ((ll::getGamingStatus () != ll::GamingStatus::Running)) return ;
2516- if (!EngineManager::isValid (engine)) return ;
2517-
2518- EngineScope scope (engine);
2519- try {
2520- callback.get ().call (
2521- {},
2522- PlayerClass::newPlayer (&pl),
2523- chosen ? Boolean::newBoolean (static_cast <bool >(*chosen)) : Local<Value>(),
2524- reason.has_value () ? Number::newNumber ((uchar)reason.value ()) : Local<Value>()
2525- );
2526- }
2527- CATCH_IN_CALLBACK (" sendModalForm" )
2514+ auto formCallback = [engine{EngineScope::currentEngine ()},
2515+ callback{script::Global (args[4 ].asFunction ())
2516+ }](Player& pl, ll::form::ModalFormResult const & chosen, ll::form::FormCancelReason reason
2517+ ) {
2518+ if ((ll::getGamingStatus () != ll::GamingStatus::Running)) return ;
2519+ if (!EngineManager::isValid (engine)) return ;
2520+
2521+ EngineScope scope (engine);
2522+ try {
2523+ callback.get ().call (
2524+ {},
2525+ PlayerClass::newPlayer (&pl),
2526+ chosen ? Boolean::newBoolean (static_cast <bool >(*chosen)) : Local<Value>(),
2527+ reason.has_value () ? Number::newNumber ((uchar)reason.value ()) : Local<Value>()
2528+ );
25282529 }
2529- );
2530+ CATCH_IN_CALLBACK (" sendModalForm" )
2531+ };
2532+
2533+ if (update) form.sendUpdate (*player, std::move (formCallback));
2534+ else form.sendTo (*player, std::move (formCallback));
25302535
25312536 return Number::newNumber (2 );
25322537 }
@@ -2537,20 +2542,19 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
25372542 CHECK_ARGS_COUNT (args, 2 );
25382543 CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
25392544 CHECK_ARG_TYPE (args[1 ], ValueKind::kFunction );
2545+ if (args.size () > 2 ) CHECK_ARG_TYPE (args[2 ], ValueKind::kBoolean );
25402546
25412547 try {
25422548 Player* player = get ();
25432549 if (!player) return Local<Value>();
2550+ bool update = args.size () > 2 ? args[2 ].asBoolean ().value () : false ;
25442551
25452552 auto formData = ordered_json::parse (args[0 ].asString ().toString ());
2546- ll::form::Form::sendRawTo (
2547- *player,
2548- formData.dump (),
2553+ auto formCallback =
25492554 [id{player->getOrCreateUniqueID ()},
25502555 engine{EngineScope::currentEngine ()},
25512556 callback{script::Global (args[1 ].asFunction ())},
2552- formData = std::move (formData
2553- )](Player& player, std::optional<std::string> const & result, ll::form::FormCancelReason reason) {
2557+ formData](Player& player, std::optional<std::string> const & result, ll::form::FormCancelReason reason) {
25542558 if ((ll::getGamingStatus () != ll::GamingStatus::Running)) return ;
25552559 if (!EngineManager::isValid (engine)) return ;
25562560 auto newResult = lse::form::CustomFormWrapper::convertResult (result, formData);
@@ -2565,8 +2569,10 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
25652569 );
25662570 }
25672571 CATCH_IN_CALLBACK (" sendCustomForm" )
2568- }
2569- );
2572+ };
2573+ if (update) ll::form::Form::sendRawUpdate (*player, formData.dump (), std::move (formCallback));
2574+ else ll::form::Form::sendRawTo (*player, formData.dump (), std::move (formCallback));
2575+
25702576 return Number::newNumber (3 );
25712577 } catch (const ordered_json::exception& e) {
25722578 lse::LegacyScriptEngine::getInstance ().getSelf ().getLogger ().error (
@@ -2581,17 +2587,19 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
25812587Local<Value> PlayerClass::sendForm (const Arguments& args) {
25822588 CHECK_ARGS_COUNT (args, 2 );
25832589 CHECK_ARG_TYPE (args[1 ], ValueKind::kFunction );
2590+ if (args.size () > 2 ) CHECK_ARG_TYPE (args[2 ], ValueKind::kBoolean );
25842591
25852592 try {
25862593 Player* player = get ();
25872594 if (!player) return Local<Value>();
2595+ bool update = args.size () > 2 ? args[2 ].asBoolean ().value () : false ;
25882596
25892597 if (IsInstanceOf<SimpleFormClass>(args[0 ])) {
25902598 Local<Function> callback = args[1 ].asFunction ();
2591- SimpleFormClass::sendForm (SimpleFormClass::extract (args[0 ]), player, callback);
2599+ SimpleFormClass::sendForm (SimpleFormClass::extract (args[0 ]), player, callback, update );
25922600 } else if (IsInstanceOf<CustomFormClass>(args[0 ])) {
25932601 Local<Function> callback = args[1 ].asFunction ();
2594- CustomFormClass::sendForm (CustomFormClass::extract (args[0 ]), player, callback);
2602+ CustomFormClass::sendForm (CustomFormClass::extract (args[0 ]), player, callback, update );
25952603 } else {
25962604 LOG_WRONG_ARG_TYPE (__FUNCTION__);
25972605 return Local<Value>();
0 commit comments