From b14f5fe505508ddf90b2d6071a6f54c050aa3794 Mon Sep 17 00:00:00 2001 From: Qiuzhizhe <42761326+quizhizhe@users.noreply.github.com> Date: Sat, 18 Mar 2023 06:36:37 -0700 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`BlockExploded`=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 | 57 +++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/LiteLoader/src/llapi/EventAPI.cpp b/LiteLoader/src/llapi/EventAPI.cpp index 84e09b5..e6a24a0 100644 --- a/LiteLoader/src/llapi/EventAPI.cpp +++ b/LiteLoader/src/llapi/EventAPI.cpp @@ -926,20 +926,49 @@ TClasslessInstanceHook(unsigned short, } /////////////////// BlockExploded /////////////////// -// 没有这个符号 -// TInstanceHook(void, "?onExploded@Block@@QEBAXAEAVBlockSource@@AEBVBlockPos@@PEAVActor@@@Z", -// Block, BlockSource* bs, BlockPos* bp, Actor* actor) { -// IF_LISTENED(BlockExplodedEvent) { -// if (actor) { -// BlockExplodedEvent ev{}; -// ev.mBlockInstance = BlockInstance::createBlockInstance(this, *bp, bs->getDimensionId()); -// ev.mExplodeSource = actor; -// ev.call(); -// } -// } -// IF_LISTENED_END(BlockExplodedEvent) -// return original(this, bs, bp, actor); -// } +// block::onExploded实际是调用以下其中之一 +// StairBlock +TInstanceHook(void, "onExploded@StairBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@PEAVActor@@@Z", + Block, BlockSource* bs, BlockPos* bp, Actor* actor) { + IF_LISTENED(BlockExplodedEvent) { + if (actor) { + BlockExplodedEvent ev{}; + ev.mBlockInstance = BlockInstance::createBlockInstance(this, *bp, bs->getDimensionId()); + ev.mExplodeSource = actor; + ev.call(); + } + } + IF_LISTENED_END(BlockExplodedEvent) + return original(this, bs, bp, actor); +} +//TntBlock +TInstanceHook(void, "?onExploded@TntBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@PEAVActor@@@Z", + Block, BlockSource* bs, BlockPos* bp, Actor* actor) { + IF_LISTENED(BlockExplodedEvent) { + if (actor) { + BlockExplodedEvent ev{}; + ev.mBlockInstance = BlockInstance::createBlockInstance(this, *bp, bs->getDimensionId()); + ev.mExplodeSource = actor; + ev.call(); + } + } + IF_LISTENED_END(BlockExplodedEvent) + return original(this, bs, bp, actor); +} +//TopSnowBlock +TInstanceHook(void, "?onExploded@TopSnowBlock@@UEBAXAEAVBlockSource@@AEBVBlockPos@@PEAVActor@@@Z", + Block, BlockSource* bs, BlockPos* bp, Actor* actor) { + IF_LISTENED(BlockExplodedEvent) { + if (actor) { + BlockExplodedEvent ev{}; + ev.mBlockInstance = BlockInstance::createBlockInstance(this, *bp, bs->getDimensionId()); + ev.mExplodeSource = actor; + ev.call(); + } + } + IF_LISTENED_END(BlockExplodedEvent) + return original(this, bs, bp, actor); +} /////////////////// FireSpread ///////////////////