Skip to content

Commit 4cc6262

Browse files
committed
feat: add missing hopper events #88
1 parent 71d3beb commit 4cc6262

File tree

3 files changed

+92
-23
lines changed

3 files changed

+92
-23
lines changed

src/legacy/api/EventAPI.cpp

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -639,30 +639,13 @@ void EnableEventListener(int eventId) {
639639
lse::events::PistonPushEvent();
640640
break;
641641

642-
// case EVENT_TYPES::onHopperSearchItem:
643-
// Event::HopperSearchItemEvent::subscribe(
644-
// [](const HopperSearchItemEvent &ev) {
645-
// IF_LISTENED(EVENT_TYPES::onHopperSearchItem) {
646-
// CallEvent(EVENT_TYPES::onHopperSearchItem,
647-
// FloatPos::newPos(ev.mPos, ev.mDimensionId),
648-
// Boolean::newBoolean(ev.isMinecart),
649-
// ItemClass::newItem(ev.mItemStack));
650-
// }
651-
// IF_LISTENED_END(EVENT_TYPES::onHopperSearchItem);
652-
// });
653-
// break;
642+
case EVENT_TYPES::onHopperSearchItem:
643+
lse::events::HopperEvent(true);
644+
break;
654645

655-
// case EVENT_TYPES::onHopperPushOut:
656-
// Event::HopperPushOutEvent::subscribe([](const HopperPushOutEvent &ev) {
657-
// IF_LISTENED(EVENT_TYPES::onHopperPushOut) {
658-
// CallEvent(EVENT_TYPES::onHopperPushOut,
659-
// FloatPos::newPos(ev.mPos, ev.mDimensionId),
660-
// Boolean::newBoolean(ev.isMinecart),
661-
// ItemClass::newItem(ev.mItemStack));
662-
// }
663-
// IF_LISTENED_END(EVENT_TYPES::onHopperPushOut);
664-
// });
665-
// break;
646+
case EVENT_TYPES::onHopperPushOut:
647+
lse::events::HopperEvent(false);
648+
break;
666649

667650
case EVENT_TYPES::onFireSpread:
668651
bus.emplaceListener<FireSpreadEvent>([](FireSpreadEvent& ev) {

src/legacy/events/EventHooks.cpp

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <mc/world/actor/ActorDefinitionIdentifier.h>
2626
#include <mc/world/actor/ArmorStand.h>
2727
#include <mc/world/actor/FishingHook.h>
28+
#include <mc/world/actor/Hopper.h>
2829
#include <mc/world/actor/boss/WitherBoss.h>
2930
#include <mc/world/actor/item/ItemActor.h>
3031
#include <mc/world/actor/player/Player.h>
@@ -1041,6 +1042,82 @@ LL_TYPE_INSTANCE_HOOK(
10411042
origin(region, pos, projectile);
10421043
}
10431044

1045+
namespace HopperEvents {
1046+
enum class HopperStatus { None, PullIn, PullOut } hopperStatus = HopperStatus::None;
1047+
Vec3 hopperPos;
1048+
1049+
LL_TYPE_INSTANCE_HOOK(
1050+
HopperPullInHook,
1051+
HookPriority::Normal,
1052+
Hopper,
1053+
&Hopper::_tryPullInItemsFromAboveContainer,
1054+
bool,
1055+
BlockSource& region,
1056+
Container& toContainer,
1057+
Vec3 const& pos
1058+
) {
1059+
hopperStatus = HopperStatus::PullIn;
1060+
hopperPos = pos;
1061+
return origin(region, toContainer, pos);
1062+
}
1063+
1064+
LL_TYPE_INSTANCE_HOOK(
1065+
HopperPushOutHook,
1066+
HookPriority::Normal,
1067+
Hopper,
1068+
&Hopper::_pushOutItems,
1069+
bool,
1070+
BlockSource& region,
1071+
Container& fromContainer,
1072+
Vec3 const& position,
1073+
int attachedFace
1074+
) {
1075+
hopperStatus = HopperStatus::PullOut;
1076+
hopperPos = position;
1077+
return origin(region, fromContainer, position, attachedFace);
1078+
}
1079+
1080+
LL_TYPE_INSTANCE_HOOK(
1081+
HopperAddItemHook,
1082+
HookPriority::Normal,
1083+
Hopper,
1084+
&Hopper::_addItem,
1085+
bool,
1086+
BlockSource& region,
1087+
Container& container,
1088+
ItemStack& item,
1089+
int face,
1090+
int itemCount
1091+
) {
1092+
IF_LISTENED(EVENT_TYPES::onHopperSearchItem) {
1093+
if (hopperStatus == HopperStatus::PullIn) {
1094+
CallEventRtnValue(
1095+
EVENT_TYPES::onHopperSearchItem,
1096+
false,
1097+
FloatPos::newPos(hopperPos, region.getDimensionId()),
1098+
Boolean::newBoolean(this->mTransferedFromChestMinecart),
1099+
ItemClass::newItem(&item, false)
1100+
);
1101+
}
1102+
}
1103+
IF_LISTENED_END(EVENT_TYPES::onHopperSearchItem);
1104+
IF_LISTENED(EVENT_TYPES::onHopperPushOut) {
1105+
if (hopperStatus == HopperStatus::PullOut) {
1106+
CallEventRtnValue(
1107+
EVENT_TYPES::onHopperPushOut,
1108+
false,
1109+
FloatPos::newPos(hopperPos, region.getDimensionId()),
1110+
Boolean::newBoolean(this->mTransferedFromChestMinecart),
1111+
ItemClass::newItem(&item, false)
1112+
);
1113+
}
1114+
}
1115+
IF_LISTENED_END(EVENT_TYPES::onHopperPushOut);
1116+
hopperStatus = HopperStatus::None;
1117+
return origin(region, container, item, face, itemCount);
1118+
}
1119+
} // namespace HopperEvents
1120+
10441121
void PlayerStartDestroyBlock() { PlayerStartDestroyHook::hook(); }
10451122
void PlayerDropItem() {
10461123
PlayerDropItemHook1::hook();
@@ -1097,6 +1174,14 @@ void PlayerConsumeTotemEvent() { PlayerConsumeTotemHook::hook(); }
10971174
void PlayerSetArmorEvent() { PlayerSetArmorHook::hook(); }
10981175
void ProjectileHitEntityEvent() { ProjectileHitEntityHook::hook(); }
10991176
void ProjectileHitBlockEvent() { ProjectileHitBlockHook::hook(); }
1177+
void HopperEvent(bool pullIn) {
1178+
HopperEvents::HopperAddItemHook::hook();
1179+
if (pullIn) {
1180+
HopperEvents::HopperPullInHook::hook();
1181+
} else {
1182+
HopperEvents::HopperPushOutHook::hook();
1183+
}
1184+
}
11001185

11011186
// NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast)
11021187
// NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)

src/legacy/events/EventHooks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,6 @@ void PlayerConsumeTotemEvent();
3838
void PlayerSetArmorEvent();
3939
void ProjectileHitEntityEvent();
4040
void ProjectileHitBlockEvent();
41+
void HopperEvent(bool pullIn);
4142

4243
} // namespace lse::events

0 commit comments

Comments
 (0)