45
45
#include " mc/network/ConnectionRequest.h"
46
46
#include " mc/network/MinecraftPacketIds.h"
47
47
#include " mc/network/MinecraftPackets.h"
48
+ #include " mc/network/NetEventCallback.h"
48
49
#include " mc/network/ServerNetworkHandler.h"
49
50
#include " mc/network/packet/BossEventPacket.h"
50
51
#include " mc/network/packet/LevelChunkPacket.h"
@@ -2435,16 +2436,18 @@ Local<Value> PlayerClass::removeBossBar(const Arguments& args) {
2435
2436
}
2436
2437
2437
2438
Local<Value> PlayerClass::sendSimpleForm (const Arguments& args) {
2438
- CHECK_ARGS_COUNT (args, 4 );
2439
+ CHECK_ARGS_COUNT (args, 5 );
2439
2440
CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
2440
2441
CHECK_ARG_TYPE (args[1 ], ValueKind::kString );
2441
2442
CHECK_ARG_TYPE (args[2 ], ValueKind::kArray );
2442
2443
CHECK_ARG_TYPE (args[3 ], ValueKind::kArray );
2443
2444
CHECK_ARG_TYPE (args[4 ], ValueKind::kFunction );
2445
+ if (args.size () > 5 ) CHECK_ARG_TYPE (args[5 ], ValueKind::kBoolean );
2444
2446
2445
2447
try {
2446
2448
Player* player = get ();
2447
2449
if (!player) return Local<Value>();
2450
+ bool update = args.size () > 5 ? args[5 ].asBoolean ().value () : false ;
2448
2451
2449
2452
// 普通格式
2450
2453
auto textsArr = args[2 ].asArray ();
@@ -2463,26 +2466,25 @@ Local<Value> PlayerClass::sendSimpleForm(const Arguments& args) {
2463
2466
form.appendButton (textsArr.get (i).asString ().toString ());
2464
2467
}
2465
2468
}
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
+ );
2484
2483
}
2485
- );
2484
+ CATCH_IN_CALLBACK (" sendSimpleForm" )
2485
+ };
2486
+ if (update) form.sendUpdate (*player, std::move (formCallback));
2487
+ else form.sendTo (*player, std::move (formCallback));
2486
2488
2487
2489
return Number::newNumber (1 );
2488
2490
}
@@ -2496,37 +2498,40 @@ Local<Value> PlayerClass::sendModalForm(const Arguments& args) {
2496
2498
CHECK_ARG_TYPE (args[2 ], ValueKind::kString );
2497
2499
CHECK_ARG_TYPE (args[3 ], ValueKind::kString );
2498
2500
CHECK_ARG_TYPE (args[4 ], ValueKind::kFunction );
2501
+ if (args.size () > 5 ) CHECK_ARG_TYPE (args[5 ], ValueKind::kBoolean );
2499
2502
2500
2503
try {
2501
2504
Player* player = get ();
2502
2505
if (!player) return Local<Value>();
2506
+ bool update = args.size () > 5 ? args[5 ].asBoolean ().value () : false ;
2503
2507
2504
2508
ll::form::ModalForm form (
2505
2509
args[0 ].asString ().toString (),
2506
2510
args[1 ].asString ().toString (),
2507
2511
args[2 ].asString ().toString (),
2508
2512
args[3 ].asString ().toString ()
2509
2513
);
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
+ );
2528
2529
}
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));
2530
2535
2531
2536
return Number::newNumber (2 );
2532
2537
}
@@ -2537,20 +2542,19 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
2537
2542
CHECK_ARGS_COUNT (args, 2 );
2538
2543
CHECK_ARG_TYPE (args[0 ], ValueKind::kString );
2539
2544
CHECK_ARG_TYPE (args[1 ], ValueKind::kFunction );
2545
+ if (args.size () > 2 ) CHECK_ARG_TYPE (args[2 ], ValueKind::kBoolean );
2540
2546
2541
2547
try {
2542
2548
Player* player = get ();
2543
2549
if (!player) return Local<Value>();
2550
+ bool update = args.size () > 2 ? args[2 ].asBoolean ().value () : false ;
2544
2551
2545
2552
auto formData = ordered_json::parse (args[0 ].asString ().toString ());
2546
- ll::form::Form::sendRawTo (
2547
- *player,
2548
- formData.dump (),
2553
+ auto formCallback =
2549
2554
[id{player->getOrCreateUniqueID ()},
2550
2555
engine{EngineScope::currentEngine ()},
2551
2556
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) {
2554
2558
if ((ll::getGamingStatus () != ll::GamingStatus::Running)) return ;
2555
2559
if (!EngineManager::isValid (engine)) return ;
2556
2560
auto newResult = lse::form::CustomFormWrapper::convertResult (result, formData);
@@ -2565,8 +2569,10 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
2565
2569
);
2566
2570
}
2567
2571
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
+
2570
2576
return Number::newNumber (3 );
2571
2577
} catch (const ordered_json::exception & e) {
2572
2578
lse::LegacyScriptEngine::getInstance ().getSelf ().getLogger ().error (
@@ -2581,17 +2587,19 @@ Local<Value> PlayerClass::sendCustomForm(const Arguments& args) {
2581
2587
Local<Value> PlayerClass::sendForm (const Arguments& args) {
2582
2588
CHECK_ARGS_COUNT (args, 2 );
2583
2589
CHECK_ARG_TYPE (args[1 ], ValueKind::kFunction );
2590
+ if (args.size () > 2 ) CHECK_ARG_TYPE (args[2 ], ValueKind::kBoolean );
2584
2591
2585
2592
try {
2586
2593
Player* player = get ();
2587
2594
if (!player) return Local<Value>();
2595
+ bool update = args.size () > 2 ? args[2 ].asBoolean ().value () : false ;
2588
2596
2589
2597
if (IsInstanceOf<SimpleFormClass>(args[0 ])) {
2590
2598
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 );
2592
2600
} else if (IsInstanceOf<CustomFormClass>(args[0 ])) {
2593
2601
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 );
2595
2603
} else {
2596
2604
LOG_WRONG_ARG_TYPE (__FUNCTION__);
2597
2605
return Local<Value>();
0 commit comments