|
25 | 25 | #include <mc/world/actor/ActorDefinitionIdentifier.h> |
26 | 26 | #include <mc/world/actor/ArmorStand.h> |
27 | 27 | #include <mc/world/actor/FishingHook.h> |
| 28 | +#include <mc/world/actor/Hopper.h> |
28 | 29 | #include <mc/world/actor/boss/WitherBoss.h> |
29 | 30 | #include <mc/world/actor/item/ItemActor.h> |
30 | 31 | #include <mc/world/actor/player/Player.h> |
@@ -1041,6 +1042,82 @@ LL_TYPE_INSTANCE_HOOK( |
1041 | 1042 | origin(region, pos, projectile); |
1042 | 1043 | } |
1043 | 1044 |
|
| 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 | + |
1044 | 1121 | void PlayerStartDestroyBlock() { PlayerStartDestroyHook::hook(); } |
1045 | 1122 | void PlayerDropItem() { |
1046 | 1123 | PlayerDropItemHook1::hook(); |
@@ -1097,6 +1174,14 @@ void PlayerConsumeTotemEvent() { PlayerConsumeTotemHook::hook(); } |
1097 | 1174 | void PlayerSetArmorEvent() { PlayerSetArmorHook::hook(); } |
1098 | 1175 | void ProjectileHitEntityEvent() { ProjectileHitEntityHook::hook(); } |
1099 | 1176 | 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 | +} |
1100 | 1185 |
|
1101 | 1186 | // NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast) |
1102 | 1187 | // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables) |
|
0 commit comments