Skip to content

Commit 2cb2b41

Browse files
committed
feat: item use callback
1 parent f0df07b commit 2cb2b41

File tree

4 files changed

+41
-111
lines changed

4 files changed

+41
-111
lines changed

src-client/pc/callback/LevelCallbacks.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
1414
&::ClientInstance::$onLevelExit,
1515
void
1616
) {
17-
CallbackManager::getInstance().invokeCallback("OnClientLevelExit");
17+
CallbackManager::getInstance().invokeCallback("LevelExit", true);
1818
return origin();
1919
}
2020

@@ -25,6 +25,6 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
2525
&::ClientInstance::$onLevelCorrupt,
2626
void
2727
) {
28-
CallbackManager::getInstance().invokeCallback("OnClientLevelCorrupt");
28+
CallbackManager::getInstance().invokeCallback("LevelCorrupt", true);
2929
return origin();
3030
}

src-test/pc/test/PrimordialCoreTest.cpp

Lines changed: 3 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,6 @@
66

77
namespace pc {
88

9-
void Hooked_OriginalFunction(CallbackManager& mgr, int damage) {
10-
Game::EventScope scope;
11-
12-
mgr.invokeCallback("OnTakeDamage", damage);
13-
14-
if (scope.isPrevented()) {
15-
PrimordialCoreTest::getLogger().warn("Original default functionality was prevented by a callback!");
16-
return; // 直接返回,从而阻止原函数的默认行为
17-
}
18-
19-
PrimordialCoreTest::getLogger().info("Executing default original functionality. Damage: {}", damage);
20-
}
21-
229
PrimordialCoreTest& PrimordialCoreTest::getInstance() {
2310
static PrimordialCoreTest instance;
2411
return instance;
@@ -30,89 +17,11 @@ bool PrimordialCoreTest::load() {
3017

3118
CallbackManager& mgr = CallbackManager::getInstance();
3219

33-
// 添加不同签名的事件
34-
mgr.addCallback(
35-
"OnLogin",
36-
[](std::string user, int age) { getLogger().info("[User] {} logged in. Age: {}", user, age); },
37-
10
38-
);
39-
40-
mgr.addCallback("OnSystem", [](int code) { getLogger().info("Code: {}", code); });
41-
42-
// 高优先级测试
43-
mgr.addCallback(
44-
"OnLogin",
45-
[](std::string user, int) { getLogger().info("[Admin] Priority check for {}", user); },
46-
100
47-
);
48-
49-
// 调用
50-
getLogger().info("--- Triggering Login ---");
51-
// 注意:必须显式构造std::string,否则推导为const char*导致类型不匹配
52-
mgr.invokeCallback("OnLogin", std::string("Alice"), 25);
53-
54-
getLogger().info("--- Triggering System ---");
55-
mgr.invokeCallback("OnSystem", 404);
56-
57-
// 回调 A:不阻止默认行为
58-
mgr.addCallback(
59-
"OnTakeDamage",
60-
[](int damage) { getLogger().info("Callback A saw damage: {}", damage); },
61-
10
62-
);
63-
64-
// 回调 B:满足特定条件时阻止默认行为
65-
mgr.addCallback(
66-
"OnTakeDamage",
67-
[](int damage) {
68-
if (damage > 100) {
69-
getLogger().warn("Callback B: Damage too high! Preventing default.");
70-
Game::getInstance().preventDefault(); // 直接调用,无需返回特定类型
71-
}
72-
},
73-
20
74-
);
75-
76-
getLogger().info("=== 测试1:不会被阻止(damage=50) ===");
77-
Hooked_OriginalFunction(mgr, 50);
78-
79-
getLogger().info("=== 测试2:会被回调 B 阻止(damage=150) ===");
80-
Hooked_OriginalFunction(mgr, 150);
81-
82-
// 测试嵌套调用
83-
getLogger().info("=== 测试3:嵌套调用测试 ===");
84-
mgr.addCallback(
85-
"OnTakeDamage",
86-
[&mgr](int damage) {
87-
getLogger().info("Callback C: Triggering nested event");
88-
Game::EventScope scope;
89-
mgr.invokeCallback("OnNestedEvent", damage);
90-
},
91-
30
92-
);
93-
94-
mgr.addCallback("OnNestedEvent", [](int damage) {
95-
getLogger().info("Nested callback: Damage = {}", damage);
96-
// 这里调用 preventDefault 不会影响外层 OnTakeDamage 的状态
97-
Game::getInstance().preventDefault();
20+
mgr.addCallback("LevelInitialize", [](bool isClientSide, uint64 levelId, std::string levelName) {
21+
if (isClientSide) getLogger().info("OnClientLevelInitialize: {}, {}", levelId, levelName);
22+
else getLogger().info("OnServerLevelInitialize: {}, {}", levelId, levelName);
9823
});
9924

100-
{
101-
Game::EventScope scope;
102-
mgr.invokeCallback("OnTakeDamage", 200);
103-
getLogger().info("Outer scope prevented: {}", scope.isPrevented() ? "Yes" : "No");
104-
}
105-
106-
{
107-
Game::EventScope scope;
108-
mgr.invokeCallback("OnTakeDamage", 20);
109-
getLogger().info("Outer scope prevented: {}", scope.isPrevented() ? "Yes" : "No");
110-
}
111-
112-
//mgr.addCallback("OnServerLevelTick", [](uint64 tick) { getLogger().info("OnServerLevelTick: {}", tick); });
113-
//mgr.addCallback("OnClientLevelTick", [](uint64 tick) { getLogger().info("OnClientLevelTick: {}", tick); });
114-
//mgr.addCallback("tick", []() { getLogger().info("tick"); });
115-
11625
return true;
11726
}
11827

src/pc/callback/ItemCallbacks.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
#include "mc/world/item/Item.h"
33
#include "mc/world/item/ItemUsedOnEventContext.h"
44
#include "mc/world/actor/Actor.h"
5+
#include "mc/world/actor/player/Player.h"
56
#include "mc/world/level/Level.h"
67
#include "mc/world/level/Tick.h"
8+
#include "mc/nbt/CompoundTag.h"
79

810
#include "ll/api/memory/Hook.h"
911

@@ -13,7 +15,7 @@
1315
using namespace pc;
1416

1517
LL_AUTO_TYPE_INSTANCE_HOOK(
16-
ItemOnUseHook,
18+
ItemOnUsedOnHook,
1719
HookPriority::Normal,
1820
::Item,
1921
&::Item::useOn,
@@ -27,6 +29,34 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
2729
::Vec3 const& clickPos,
2830
::ItemUsedOnEventContext itemUsedOnEventContext
2931
) {
30-
PrimordialCore::getLogger().info("Current Tick: {}", entity.getLevel().getCurrentServerTick().tickID);
32+
CallbackManager::getInstance().invokeCallback(
33+
"ItemUsedOn",
34+
entity.getLevel().isClientSide(),
35+
item.getFullNameHash().mStr,
36+
item.getAuxValue(),
37+
*item.mUserData,
38+
entity.getOrCreateUniqueID(),
39+
x,
40+
y,
41+
z,
42+
face,
43+
clickPos.x,
44+
clickPos.y,
45+
clickPos.z,
46+
itemUsedOnEventContext.mIsFirstEvent
47+
);
3148
return origin(item, entity, x, y, z, face, clickPos, itemUsedOnEventContext);
3249
}
50+
51+
LL_AUTO_TYPE_INSTANCE_HOOK(
52+
ItemOnUsedHook,
53+
HookPriority::Normal,
54+
::Item,
55+
&::Item::$use,
56+
::ItemStack&,
57+
::ItemStack& item,
58+
::Player& player
59+
) {
60+
//PrimordialCore::getLogger().info("ItemOnUsedHook Current Tick: {}", player.getLevel().getCurrentServerTick().tickID);
61+
return origin(item, player);
62+
}

src/pc/callback/LevelCallbacks.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
2727
::std::unordered_map<::std::string, ::std::unique_ptr<::BiomeJsonDocumentGlue::ResolvedBiomeData>>>>
2828
biomeIdToResolvedData
2929
) {
30-
if (isClientSide()) {
31-
CallbackManager::getInstance().invokeCallback("OnClientLevelInitialize", levelName);
32-
} else {
33-
CallbackManager::getInstance().invokeCallback("OnServerLevelInitialize", levelName);
34-
}
30+
CallbackManager::getInstance().invokeCallback("LevelInitialize", isClientSide(), uint64(levelId), levelName);
3531
return origin(levelName, levelSettings, experiments, levelId, biomeIdToResolvedData);
3632
}
3733

@@ -44,13 +40,12 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
4440
) {
4541
{
4642
Game::EventScope scope;
43+
CallbackManager::getInstance().invokeCallback("LevelTick", isClientSide(), getCurrentTick().tickID);
4744
if (isClientSide()) {
48-
CallbackManager::getInstance().invokeCallback("OnClientLevelTick", getCurrentTick().tickID);
4945
#if defined(LL_PLAT_C)
5046
CallbackManager::getInstance().invokeCallback("tick");
5147
#endif
5248
} else {
53-
CallbackManager::getInstance().invokeCallback("OnServerLevelTick", getCurrentTick().tickID);
5449
#if defined(LL_PLAT_S)
5550
CallbackManager::getInstance().invokeCallback("tick");
5651
#endif
@@ -71,11 +66,7 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
7166
void,
7267
bool stopNetwork
7368
) {
74-
if (getLevel()->isClientSide()) {
75-
CallbackManager::getInstance().invokeCallback("OnClientStartLeaveGame", stopNetwork);
76-
} else {
77-
CallbackManager::getInstance().invokeCallback("OnServerStartLeaveGame", stopNetwork);
78-
}
69+
CallbackManager::getInstance().invokeCallback("StartLeaveGame", getLevel()->isClientSide(), stopNetwork);
7970
return origin(stopNetwork);
8071
}
8172

@@ -86,6 +77,6 @@ LL_AUTO_TYPE_INSTANCE_HOOK(
8677
&::ServerInstance::$onLevelCorrupt,
8778
void
8879
) {
89-
CallbackManager::getInstance().invokeCallback("OnServerLevelCorrupt");
80+
CallbackManager::getInstance().invokeCallback("LevelCorrupt", false);
9081
return origin();
9182
}

0 commit comments

Comments
 (0)