From c053b82e5b10687e17b1e1af7a5385ef64cbae0e Mon Sep 17 00:00:00 2001 From: killcerr Date: Sun, 25 May 2025 19:14:26 +0800 Subject: [PATCH 1/2] feat: refactor onAte event --- src/lse/events/PlayerEvents.cpp | 57 ++++----------------------------- 1 file changed, 7 insertions(+), 50 deletions(-) diff --git a/src/lse/events/PlayerEvents.cpp b/src/lse/events/PlayerEvents.cpp index 81cfa764..71824bcc 100644 --- a/src/lse/events/PlayerEvents.cpp +++ b/src/lse/events/PlayerEvents.cpp @@ -285,54 +285,15 @@ LL_TYPE_INSTANCE_HOOK( return origin(player, pos); } -LL_TYPE_INSTANCE_HOOK(EatHook1, HookPriority::Normal, Player, &Player::eat, void, ItemStack const& instance) { +LL_TYPE_INSTANCE_HOOK(EatHook, HookPriority::Normal, Player, &Player::completeUsingItem, void) { IF_LISTENED(EVENT_TYPES::onAte) { - if (!CallEvent( - EVENT_TYPES::onAte, - PlayerClass::newPlayer(this), - ItemClass::newItem(&const_cast(instance)) - )) { - return; - } - } - IF_LISTENED_END(EVENT_TYPES::onAte); - origin(instance); -} -LL_TYPE_INSTANCE_HOOK( - EatHook2, - HookPriority::Normal, - PotionItem, - &PotionItem::$useTimeDepleted, - ::ItemUseMethod, - ::ItemStack& inoutInstance, - Level* level, - Player* player -) { - IF_LISTENED(EVENT_TYPES::onAte) { - if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(player), ItemClass::newItem(&inoutInstance))) { - return ItemUseMethod::Unknown; - } - } - IF_LISTENED_END(EVENT_TYPES::onAte); - return origin(inoutInstance, level, player); -} -LL_TYPE_INSTANCE_HOOK( - EatHook3, - HookPriority::Normal, - Item, - (uintptr_t)BucketItem::$vftable()[79], - ::ItemUseMethod, - ::ItemStack& inoutInstance, - Level* level, - Player* player -) { - IF_LISTENED(EVENT_TYPES::onAte) { - if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(player), ItemClass::newItem(&inoutInstance))) { - return ItemUseMethod::Unknown; - } + if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(this), ItemClass::newItem(&*mItemInUse->mItem))) + stopUsingItem(); + else origin(); + return; } IF_LISTENED_END(EVENT_TYPES::onAte); - return origin(inoutInstance, level, player); + origin(); } LL_TYPE_INSTANCE_HOOK( @@ -676,11 +637,7 @@ void UseFrameEvent() { UseFrameHook1::hook(); UseFrameHook2::hook(); } -void EatEvent() { - EatHook1::hook(); - EatHook2::hook(); - EatHook3::hook(); -} +void EatEvent() { EatHook::hook(); } void ChangeDimensionEvent() { ChangeDimensionHook::hook(); }; void OpenContainerScreenEvent() { OpenContainerScreenHook::hook(); } void UseRespawnAnchorEvent() { UseRespawnAnchorHook::hook(); } From b7e714bceec36db678f893223280015bb0a33b36 Mon Sep 17 00:00:00 2001 From: killcerr Date: Sun, 25 May 2025 19:40:59 +0800 Subject: [PATCH 2/2] feat: refactor onAte event --- src/lse/events/PlayerEvents.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lse/events/PlayerEvents.cpp b/src/lse/events/PlayerEvents.cpp index 71824bcc..bba9d56d 100644 --- a/src/lse/events/PlayerEvents.cpp +++ b/src/lse/events/PlayerEvents.cpp @@ -287,7 +287,10 @@ LL_TYPE_INSTANCE_HOOK( LL_TYPE_INSTANCE_HOOK(EatHook, HookPriority::Normal, Player, &Player::completeUsingItem, void) { IF_LISTENED(EVENT_TYPES::onAte) { - if (!CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(this), ItemClass::newItem(&*mItemInUse->mItem))) + const std::set item_names{"minecraft:potion", "minecraft:milk_bucket", "minecraft:medicine"}; + auto checked = mItemInUse->mItem->getItem()->isFood() || item_names.contains(mItemInUse->mItem->getTypeName()); + if (checked + && !CallEvent(EVENT_TYPES::onAte, PlayerClass::newPlayer(this), ItemClass::newItem(&*mItemInUse->mItem))) stopUsingItem(); else origin(); return;