From 1f2e7e5516c9337b1ed552d16b962d7e368c6f65 Mon Sep 17 00:00:00 2001 From: Qiuzhizhe <42761326+quizhizhe@users.noreply.github.com> Date: Sat, 18 Mar 2023 06:37:40 -0700 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`ProjectileHitBlock`=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LiteLoader/src/llapi/EventAPI.cpp | 50 ++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/LiteLoader/src/llapi/EventAPI.cpp b/LiteLoader/src/llapi/EventAPI.cpp index 8fb78c0..4450cc1 100644 --- a/LiteLoader/src/llapi/EventAPI.cpp +++ b/LiteLoader/src/llapi/EventAPI.cpp @@ -1027,23 +1027,39 @@ TClasslessInstanceHook(bool, "?mayPlace@FireBlock@@UEBA_NAEAVBlockSource@@AEBVBl /////////////////// ProjectileHitBlock /////////////////// -// 没有这个符号 -// TInstanceHook(void, "?onProjectileHit@Block@@QEBAXAEAVBlockSource@@AEBVBlockPos@@AEBVActor@@@Z", -// Block, BlockSource* bs, BlockPos* bp, Actor* actor) { -// // Exclude default position BlockPos::Zero -// if ((bp->x | bp->y | bp->z) == 0) // actor->getPos().distanceTo(bp->center())>5) -// return original(this, bs, bp, actor); -// IF_LISTENED(ProjectileHitBlockEvent) { -// if (this->getTypeName() != "minecraft:air") { -// ProjectileHitBlockEvent ev{}; -// ev.mBlockInstance = Level::getBlockInstance(bp, bs); -// ev.mSource = actor; -// ev.call(); -// } -// } -// IF_LISTENED_END(ProjectileHitBlockEvent) -// return original(this, bs, bp, actor); -// } +// Block::onProjectileHit实际是调用以下其中之一 +TInstanceHook(void, "?onProjectileHit@TargetBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@AEBVActor@@@Z", + Block, BlockSource* bs, BlockPos* bp, Actor* actor) { + // Exclude default position BlockPos::Zero + if ((bp->x | bp->y | bp->z) == 0) // actor->getPos().distanceTo(bp->center())>5) + return original(this, bs, bp, actor); + IF_LISTENED(ProjectileHitBlockEvent) { + if (this->getTypeName() != "minecraft:air") { + ProjectileHitBlockEvent ev{}; + ev.mBlockInstance = Level::getBlockInstance(bp, bs); + ev.mSource = actor; + ev.call(); + } + } + IF_LISTENED_END(ProjectileHitBlockEvent) + return original(this, bs, bp, actor); +} + +TInstanceHook(void, "??onProjectileHit@BellBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@AEBVActor@@@Z", + Block, BlockSource* bs, BlockPos* bp, Actor* actor) { + if ((bp->x | bp->y | bp->z) == 0) + return original(this, bs, bp, actor); + IF_LISTENED(ProjectileHitBlockEvent) { + if (this->getTypeName() != "minecraft:air") { + ProjectileHitBlockEvent ev{}; + ev.mBlockInstance = Level::getBlockInstance(bp, bs); + ev.mSource = actor; + ev.call(); + } + } + IF_LISTENED_END(ProjectileHitBlockEvent) + return original(this, bs, bp, actor); +} /////////////////// RedStoneUpdate ///////////////////