Skip to content

Commit 8caac8b

Browse files
killcerrn15421
andauthored
fix: fix some events (#247)
* fix:fix some events Co-authored-by: killcerr <[email protected]> * feat: fix AttackBlock event --------- Co-authored-by: n15421 <[email protected]>
1 parent ebb9382 commit 8caac8b

File tree

3 files changed

+113
-95
lines changed

3 files changed

+113
-95
lines changed

src/lse/events/BlockEvents.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "ll/api/service/Bedrock.h"
1010
#include "mc/legacy/ActorRuntimeID.h"
1111
#include "mc/legacy/ActorUniqueID.h"
12+
#include "mc/scripting/modules/minecraft/events/ScriptBlockGlobalEventListener.h"
1213
#include "mc/server/commands/CommandOrigin.h"
1314
#include "mc/server/commands/CommandOriginType.h"
1415
#include "mc/world/actor/ArmorStand.h"
@@ -250,26 +251,27 @@ LL_TYPE_STATIC_HOOK(
250251
origin(player, pos, region, level);
251252
}
252253

253-
// LL_TYPE_INSTANCE_HOOK(
254-
// BlockExplodedHook,
255-
// HookPriority::Normal,
256-
// Block,
257-
// &Block::onExploded,
258-
// void,
259-
// BlockSource& region,
260-
// BlockPos const& pos,
261-
// Actor* entitySource
262-
//) {
263-
// IF_LISTENED(EVENT_TYPES::onBlockExploded) {
264-
// CallEvent(
265-
// EVENT_TYPES::onBlockExploded,
266-
// BlockClass::newBlock(pos, region.getDimensionId()),
267-
// EntityClass::newEntity(entitySource)
268-
// );
269-
// }
270-
// IF_LISTENED_END(EVENT_TYPES::onBlockExploded);
271-
// origin(region, pos, entitySource);
272-
// }
254+
LL_TYPE_INSTANCE_HOOK(
255+
BlockExplodedHook,
256+
HookPriority::Normal,
257+
ScriptModuleMinecraft::ScriptBlockGlobalEventListener,
258+
&ScriptBlockGlobalEventListener::$onBlockExploded,
259+
EventResult,
260+
Dimension& dimension,
261+
BlockPos const& blockPos,
262+
Block const& destroyedBlock,
263+
Actor* source
264+
) {
265+
IF_LISTENED(EVENT_TYPES::onBlockExploded) {
266+
CallEvent(
267+
EVENT_TYPES::onBlockExploded,
268+
BlockClass::newBlock(blockPos, dimension.getDimensionId()),
269+
EntityClass::newEntity(source)
270+
);
271+
}
272+
IF_LISTENED_END(EVENT_TYPES::onBlockExploded);
273+
return origin(dimension, blockPos, destroyedBlock, source);
274+
}
273275

274276
namespace redstone {
275277
inline bool RedstoneUpdateEvent(BlockSource& region, BlockPos const& pos, int& strength, bool& isFirstTime) {
@@ -476,9 +478,7 @@ void FarmDecayEvent() { FarmDecayHook::hook(); }
476478
void PistonPushEvent() { PistonPushHook::hook(); }
477479
void ExplodeEvent() { ExplodeHook::hook(); }
478480
void RespawnAnchorExplodeEvent() { RespawnAnchorExplodeHook::hook(); }
479-
void BlockExplodedEvent() {
480-
// BlockExplodedHook ::hook();
481-
}
481+
void BlockExplodedEvent() { BlockExplodedHook ::hook(); }
482482
void RedstoneUpdateEvent() {
483483
redstone::RedstoneTorchBlockHook::hook();
484484
redstone::RedStoneWireBlockHook::hook();

src/lse/events/EntityEvents.cpp

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -183,28 +183,31 @@ LL_TYPE_INSTANCE_HOOK(
183183
origin(owner, res);
184184
}
185185

186-
// LL_TYPE_INSTANCE_HOOK(
187-
// ProjectileHitBlockHook,
188-
// HookPriority::Normal,
189-
// ActorEventCoordinator,
190-
// &ActorEventCoordinator::sendEvent,
191-
// CoordinatorResult,
192-
// EventRef<ActorGameplayEvent<CoordinatorResult>> const& event
193-
//) {
194-
// IF_LISTENED(EVENT_TYPES::onProjectileHitBlock) {
195-
// if (pos != BlockPos::ZERO() && !this->isAir()) {
196-
// if (!CallEvent(
197-
// EVENT_TYPES::onProjectileHitBlock,
198-
// BlockClass::newBlock(*this, pos, region),
199-
// EntityClass::newEntity(&const_cast<Actor&>(projectile))
200-
// )) {
201-
// return CoordinatorResult::Cancel;
202-
// }
203-
// }
204-
// }
205-
// IF_LISTENED_END(EVENT_TYPES::onProjectileHitBlock);
206-
// origin(event);
207-
// }
186+
LL_TYPE_INSTANCE_HOOK(
187+
ProjectileHitBlockHook,
188+
HookPriority::Normal,
189+
ProjectileComponent,
190+
&ProjectileComponent::onHit,
191+
void,
192+
::Actor& owner,
193+
::HitResult const& res
194+
) {
195+
IF_LISTENED(EVENT_TYPES::onProjectileHitBlock) {
196+
auto& region = owner.getDimensionBlockSourceConst();
197+
auto& block = region.getBlock(res.mBlock);
198+
if (res.mType == HitResultType::Tile && res.mBlock != BlockPos::ZERO() && block.isAir()) {
199+
if (!CallEvent(
200+
EVENT_TYPES::onProjectileHitBlock,
201+
BlockClass::newBlock(block, res.mBlock, region),
202+
EntityClass::newEntity(&owner)
203+
)) {
204+
return;
205+
}
206+
}
207+
}
208+
IF_LISTENED_END(EVENT_TYPES::onProjectileHitBlock);
209+
return origin(owner, res);
210+
}
208211

209212
LL_TYPE_INSTANCE_HOOK(
210213
MobHurtHook,
@@ -377,9 +380,7 @@ void ProjectileCreatedEvent() { ProjectileSpawnHook1::hook(); };
377380
void ActorRideEvent() { ActorRideHook::hook(); }
378381
void WitherDestroyEvent() { WitherDestroyHook::hook(); }
379382
void ProjectileHitEntityEvent() { ProjectileHitEntityHook::hook(); }
380-
void ProjectileHitBlockEvent() {
381-
// ProjectileHitBlockHook::hook();
382-
}
383+
void ProjectileHitBlockEvent() { ProjectileHitBlockHook::hook(); }
383384
void MobHurtEvent() {
384385
MobHurtHook::hook();
385386
MobHurtEffectHook::hook();

src/lse/events/PlayerEvents.cpp

Lines changed: 64 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "ll/api/memory/Memory.h"
99
#include "ll/api/service/Bedrock.h"
1010
#include "mc/deps/ecs/WeakEntityRef.h"
11+
#include "mc/network/ServerPlayerBlockUseHandler.h"
1112
#include "mc/server/ServerPlayer.h"
1213
#include "mc/server/module/VanillaServerGameplayEventListener.h"
1314
#include "mc/world/ContainerID.h"
@@ -33,6 +34,7 @@
3334
#include "mc/world/item/BucketItem.h"
3435
#include "mc/world/item/ItemInstance.h"
3536
#include "mc/world/item/ItemStack.h"
37+
#include "mc/world/item/PotionItem.h"
3638
#include "mc/world/level/BedrockSpawner.h"
3739
#include "mc/world/level/BlockSource.h"
3840
#include "mc/world/level/ChangeDimensionRequest.h"
@@ -224,29 +226,29 @@ LL_TYPE_INSTANCE_HOOK(
224226
origin(container, slot, oldItem, newItem, forceBalanced);
225227
}
226228

227-
// LL_TYPE_INSTANCE_HOOK(
228-
// AttackBlockHook,
229-
// HookPriority::Normal,
230-
// Block,
231-
// &Block::attack,
232-
// bool,
233-
// Player* player,
234-
// BlockPos const& pos
235-
//) {
236-
// IF_LISTENED(EVENT_TYPES::onAttackBlock) {
237-
// ItemStack const& item = player->getSelectedItem();
238-
// if (!CallEvent(
239-
// EVENT_TYPES::onAttackBlock,
240-
// PlayerClass::newPlayer(player),
241-
// BlockClass::newBlock(pos, player->getDimensionId()),
242-
// !item.isNull() ? ItemClass::newItem(&const_cast<ItemStack&>(item)) : Local<Value>()
243-
// )) {
244-
// return false;
245-
// }
246-
// }
247-
// IF_LISTENED_END(EVENT_TYPES::onAttackBlock);
248-
// return origin(player, pos);
249-
// }
229+
LL_STATIC_HOOK(
230+
AttackBlockHook,
231+
HookPriority::Normal,
232+
&ServerPlayerBlockUseHandler::onStartDestroyBlock,
233+
void,
234+
ServerPlayer& player,
235+
const BlockPos& pos,
236+
int face
237+
) {
238+
IF_LISTENED(EVENT_TYPES::onAttackBlock) {
239+
ItemStack const& item = player.getSelectedItem();
240+
if (!CallEvent(
241+
EVENT_TYPES::onAttackBlock,
242+
PlayerClass::newPlayer(&player),
243+
BlockClass::newBlock(pos, player.getDimensionId()),
244+
!item.isNull() ? ItemClass::newItem(&const_cast<ItemStack&>(item)) : Local<Value>()
245+
)) {
246+
return;
247+
}
248+
}
249+
IF_LISTENED_END(EVENT_TYPES::onAttackBlock);
250+
return origin(player, pos, face);
251+
}
250252

251253
LL_TYPE_INSTANCE_HOOK(
252254
UseFrameHook1,
@@ -306,26 +308,42 @@ LL_TYPE_INSTANCE_HOOK(EatHook1, HookPriority::Normal, Player, &Player::eat, void
306308
IF_LISTENED_END(EVENT_TYPES::onAte);
307309
origin(instance);
308310
}
309-
310-
// LL_TYPE_INSTANCE_HOOK(
311-
// EatHook2,
312-
// HookPriority::Normal,
313-
// ItemStack,
314-
// &ItemStack::useTimeDepleted,
315-
// ::ItemUseMethod,
316-
// Level* level,
317-
// Player* player
318-
//) {
319-
// IF_LISTENED(EVENT_TYPES::onAte) {
320-
// if (isPotionItem() || getTypeName() == "minecraft:milk_bucket") {
321-
// if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(player), ItemClass::newItem(this))) {
322-
// return ItemUseMethod::Unknown;
323-
// }
324-
// }
325-
// }
326-
// IF_LISTENED_END(EVENT_TYPES::onAte);
327-
// return origin(level, player);
328-
// }
311+
LL_TYPE_INSTANCE_HOOK(
312+
EatHook2,
313+
HookPriority::Normal,
314+
PotionItem,
315+
&PotionItem::$useTimeDepleted,
316+
::ItemUseMethod,
317+
::ItemStack& inoutInstance,
318+
Level* level,
319+
Player* player
320+
) {
321+
IF_LISTENED(EVENT_TYPES::onAte) {
322+
if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(player), ItemClass::newItem(&inoutInstance))) {
323+
return ItemUseMethod::Unknown;
324+
}
325+
}
326+
IF_LISTENED_END(EVENT_TYPES::onAte);
327+
return origin(inoutInstance, level, player);
328+
}
329+
LL_TYPE_INSTANCE_HOOK(
330+
EatHook3,
331+
HookPriority::Normal,
332+
Item,
333+
(uintptr_t)BucketItem::$vftable()[79],
334+
::ItemUseMethod,
335+
::ItemStack& inoutInstance,
336+
Level* level,
337+
Player* player
338+
) {
339+
IF_LISTENED(EVENT_TYPES::onAte) {
340+
if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(player), ItemClass::newItem(&inoutInstance))) {
341+
return ItemUseMethod::Unknown;
342+
}
343+
}
344+
IF_LISTENED_END(EVENT_TYPES::onAte);
345+
return origin(inoutInstance, level, player);
346+
}
329347

330348
LL_TYPE_INSTANCE_HOOK(
331349
ChangeDimensionHook,
@@ -656,16 +674,15 @@ void CloseContainerEvent() {
656674
CloseContainerHook2::hook();
657675
}
658676
void ChangeSlotEvent() { ChangeSlotHook::hook(); }
659-
void AttackBlockEvent() {
660-
// AttackBlockHook::hook();
661-
}
677+
void AttackBlockEvent() { AttackBlockHook::hook(); }
662678
void UseFrameEvent() {
663679
UseFrameHook1::hook();
664680
UseFrameHook2::hook();
665681
}
666682
void EatEvent() {
667683
EatHook1::hook();
668-
// EatHook2::hook();
684+
EatHook2::hook();
685+
EatHook3::hook();
669686
}
670687
void ChangeDimensionEvent() { ChangeDimensionHook::hook(); };
671688
void OpenContainerScreenEvent() { OpenContainerScreenHook::hook(); }

0 commit comments

Comments
 (0)