Skip to content

Commit db1e34c

Browse files
committed
fix: fix save command broken
Bug other mod probably breaks the save command
1 parent a54a224 commit db1e34c

File tree

5 files changed

+80
-23
lines changed

5 files changed

+80
-23
lines changed

scripts/generate_hooks.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
# "mc\\server\\ServerPlayer.h",
1111
# "mc\\server\\SimulatedPlayer.h",
1212
# "mc\\network\\LoopbackPacketSender.h",
13-
"mc\\network\\ServerNetworkHandler.h",
13+
# "mc\\network\\ServerNetworkHandler.h",
14+
"mc\\server\\commands\\CommandRegistry.h",
1415
# "mc\\network\\PacketObserver.h",
1516
# "mc\\gametest\\MinecraftGameTestHelper.h",
1617
]
@@ -96,11 +97,15 @@ def gen_hook_cpp(include_path):
9697
print(api)
9798
if api.startswith(f"{className}("):
9899
continue
99-
m = re.match(
100-
r"^(?P<static>static )?(?P<rtn>.+[^,]) (?P<name>\$?[\w_]+)\((?P<params>.*) *\)( const)?;",
101-
api,
102-
).groupdict()
103-
print(m)
100+
if not (
101+
m := re.match(
102+
r"^(?P<static>static )?(?P<rtn>.+[^,]) (?P<name>\$?[\w_]+)\((?P<params>.*) *\)( const)?;",
103+
api,
104+
)
105+
):
106+
continue
107+
groupdict=m.groupdict()
108+
print(groupdict)
104109

105110
def iter_params(params: str):
106111
last_index = 0
@@ -146,21 +151,21 @@ def iter_params(params: str):
146151
# m["params"],
147152
# ),
148153
# )
149-
params = iter_params(m["params"])
154+
params = iter_params(groupdict["params"])
150155
params = list(params)
151156
print(params)
152157
hook_type = (
153158
"LL_AUTO_TYPE_STATIC_HOOK"
154-
if m["static"]
159+
if groupdict["static"]
155160
else "LL_AUTO_TYPE_INSTANCE_HOOK"
156161
)
157-
hook_id = f"HOOK_{className}_{m["name"]}"
162+
hook_id = f"HOOK_{className}_{groupdict["name"]}"
158163
name_count[hook_id] += 1
159164
if name_count[hook_id] > 0:
160165
hook_id = f"{hook_id}{name_count[hook_id]}"
161-
hook_addr = f"&{className}::{m["name"]}"
166+
hook_addr = f"&{className}::{groupdict["name"]}"
162167
hook_priority = "ll::memory::HookPriority::Normal"
163-
hook_rtn = m["rtn"]
168+
hook_rtn = groupdict["rtn"]
164169
alias_list = []
165170
if hook_rtn.find(",") >= 0:
166171
alias_list.append(f"using {hook_id}_rtn = {hook_rtn};")
@@ -185,7 +190,7 @@ def build_marco_param(index: int, param: dict[str, str]):
185190
call_name = "onHookCall"
186191
call_params = f'"{hook_id}"'
187192
if (
188-
m["name"] == "$handle"
193+
groupdict["name"] == "$handle"
189194
and params[0]["type"] == "::NetworkIdentifier const&"
190195
):
191196
call_name = "onHandlePacket"

src/lfp/LeviFakePlayer.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,21 @@ bool LeviFakePlayer::load() {
5959
bool LeviFakePlayer::enable() {
6060
getSelf().getLogger().debug("Enabling...");
6161

62-
auto& config = getConfig().config;
63-
if (config.command.enabled) {
64-
FakePlayerCommand::setup(config.command);
62+
mFixManager->onPluginEnable();
63+
64+
ll::thread::ServerThreadExecutor::getDefault().executeAfter(
65+
[]() {
66+
auto& config = lfp::LeviFakePlayer::getInstance().getConfig().config;
67+
if (config.command.enabled) {
68+
FakePlayerCommand::setup(config.command);
6569
#ifndef LFP_DEBUG
66-
if (config.command.enableTickingCommand && *config.command.enableTickingCommand)
70+
if (config.command.enableTickingCommand && *config.command.enableTickingCommand)
6771
#endif // always enabled in debug build
68-
TickingCommand::setup();
69-
}
70-
mFixManager->onPluginEnable();
72+
TickingCommand::setup();
73+
}
74+
},
75+
ll::chrono::ticks{1}
76+
);
7177
// TODO: crash
7278
// auto& eventBus = ll::event::EventBus::getInstance();
7379
// auto stoppingListener = eventBus.emplaceListener<ll::event::ServerStoppingEvent>([](auto) {

src/lfp/command/FakePlayerCommand.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
#include <string>
44
#include <vector>
55

6+
#include "lfp/Config.h"
67
#include "lfp/utils/DebugUtils.h"
78
#include "ll/api/command/EnumName.h"
89
#include "mc/server/commands/CommandOutput.h"
910
#include "mc/server/commands/CommandPosition.h"
11+
#include "mc/server/commands/CommandRegistry.h"
12+
#include "mc/world/Minecraft.h"
1013
#include "mc/world/level/BlockPos.h"
1114
#include "mc/world/level/dimension/Dimension.h"
1215

@@ -50,7 +53,7 @@ struct LFPCreateCommand {
5053
ll::command::Optional<CommandPosition> pos;
5154
ll::command::Optional<DimensionType> dim;
5255
};
53-
struct LFPCommandWithString {
56+
struct LFPCommandWithNameStr {
5457
std::string name;
5558
};
5659

@@ -148,6 +151,7 @@ void FakePlayerCommand::setup(LeviFakePlayerConfig::CommandConfig const& config)
148151
}
149152
}
150153
);
154+
151155
// lfp create <name: string> [pos: x y z] [dim: Dimension]
152156
command.overload<LFPCreateCommand>()
153157
.text("create")
@@ -179,8 +183,8 @@ void FakePlayerCommand::setup(LeviFakePlayerConfig::CommandConfig const& config)
179183
});
180184

181185
// lfp import name
182-
command.overload<LFPCommandWithString>().text("import").optional("name").execute(
183-
[](CommandOrigin const&, CommandOutput& output, LFPCommandWithString const& params) {
186+
command.overload<LFPCommandWithNameStr>().text("import").optional("name").execute(
187+
[](CommandOrigin const&, CommandOutput& output, LFPCommandWithNameStr const& params) {
184188
auto& manager = FakePlayerManager::getManager();
185189
auto& name = params.name;
186190
if (!name.empty()) {

src/test/TestManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ ll::coro::CoroTask<void> testEntry() {
7272
#elif defined(NDEBUG)
7373
testLogger.warn("Testing in Release Mode");
7474
#endif
75-
co_await 10_tick;
75+
co_await 1_tick;
7676
auto result = co_await TestManager::getInstance().runAllTest();
7777
if (!result) {
7878
testLogger.error("Test Failed!!!");

src/test/tests/OtherTest.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,57 @@
11
#include "../TestManager.h"
22
#include "../utils/TestUtils.h"
33
#include "test/utils/CoroUtils.h"
4+
5+
#include "magic_enum.hpp"
6+
#include "mc/server/commands/CommandRegistry.h"
47
#include <string>
58

69
#include "ll/api/chrono/GameChrono.h"
10+
#include "ll/api/memory/Hook.h"
11+
#include "ll/api/service/Bedrock.h"
12+
713

814
using namespace ll::chrono_literals;
915

1016
namespace lfp::test {
1117

18+
LL_TYPE_INSTANCE_HOOK(
19+
HOOK_CommandRegistry_registerCommand1,
20+
ll::memory::HookPriority::Normal,
21+
CommandRegistry,
22+
&CommandRegistry::registerCommand,
23+
void,
24+
::std::string const& name,
25+
char const* description,
26+
::CommandPermissionLevel requirement,
27+
::CommandFlag f1,
28+
::CommandFlag f2
29+
) {
30+
fmt::println(
31+
"CommandRegistry::registerCommand({}, {}, {}, {}, {})",
32+
name,
33+
description,
34+
magic_enum::enum_name(requirement),
35+
magic_enum::enum_name(f1.value),
36+
magic_enum::enum_name(f2.value)
37+
);
38+
return origin(
39+
std::forward<::std::string const&>(name),
40+
std::forward<char const*>(description),
41+
std::forward<::CommandPermissionLevel>(requirement),
42+
std::forward<::CommandFlag>(f1),
43+
std::forward<::CommandFlag>(f2)
44+
);
45+
};
46+
1247
LFP_CO_TEST(OtherTest, BdsSaveCommand) {
48+
co_await waitUntil([] {
49+
return ll::service::getCommandRegistry()
50+
.transform([](CommandRegistry& reg) {
51+
return nullptr != reg.findCommand("levifakeplayer");
52+
})
53+
.value_or(false);
54+
});
1355
auto result = executeCommandEx("save hold");
1456
auto& [success, count, output] = result;
1557
testLogger.debug("success: {}, count: {}, output: {}", success, count, output);

0 commit comments

Comments
 (0)