Skip to content

Commit 75a8029

Browse files
committed
feat: add onUseBucketPlace & onUseBucketTake #70
1 parent 848bd4f commit 75a8029

File tree

3 files changed

+107
-43
lines changed

3 files changed

+107
-43
lines changed

src/legacy/api/EventAPI.cpp

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -375,49 +375,27 @@ void EnableEventListener(int eventId) {
375375
});
376376
break;
377377

378-
// case EVENT_TYPES::onUseBucketPlace:
379-
// case EVENT_TYPES::onUseBucketTake:
380-
// Event::PlayerUseBucketEvent::subscribe([](const PlayerUseBucketEvent
381-
// &ev) {
382-
// if (ev.mEventType == PlayerUseBucketEvent::EventType::Place) {
383-
// IF_LISTENED(EVENT_TYPES::onUseBucketPlace) {
384-
// CallEvent(
385-
// EVENT_TYPES::onUseBucketPlace,
386-
// PlayerClass::newPlayer((Player *)ev.mPlayer),
387-
// ItemClass::newItem(ev.mBucket),
388-
// BlockClass::newBlock(ev.mBlockInstance),
389-
// Number::newNumber(ev.mFace),
390-
// FloatPos::newPos(ev.mTargetPos,
391-
// ev.mPlayer->getDimensionId()));
392-
// }
393-
// IF_LISTENED_END(EVENT_TYPES::onUseBucketPlace);
394-
// } else if (ev.mEventType == PlayerUseBucketEvent::EventType::Take) {
395-
// IF_LISTENED(EVENT_TYPES::onUseBucketTake) {
396-
// if (ev.mTargetActor) {
397-
// CallEvent(
398-
// EVENT_TYPES::onUseBucketTake,
399-
// PlayerClass::newPlayer((Player *)ev.mPlayer),
400-
// ItemClass::newItem(ev.mBucket),
401-
// EntityClass::newEntity(ev.mTargetActor),
402-
// Number::newNumber(ev.mFace),
403-
// FloatPos::newPos(ev.mTargetPos,
404-
// ev.mPlayer->getDimensionId()));
405-
// } else {
406-
// CallEvent(
407-
// EVENT_TYPES::onUseBucketTake,
408-
// PlayerClass::newPlayer((Player *)ev.mPlayer),
409-
// ItemClass::newItem(ev.mBucket),
410-
// BlockClass::newBlock(ev.mBlockInstance),
411-
// Number::newNumber(ev.mFace),
412-
// FloatPos::newPos(ev.mTargetPos,
413-
// ev.mPlayer->getDimensionId()));
414-
// }
415-
// }
416-
// IF_LISTENED_END(EVENT_TYPES::onUseBucketTake);
417-
// }
418-
// return true;
419-
// });
420-
// break;
378+
case EVENT_TYPES::onUseBucketPlace:
379+
lse::events::PlayerUseBucketPlaceEvent();
380+
break;
381+
case EVENT_TYPES::onUseBucketTake:
382+
lse::events::PlayerUseBucketTakeEvent();
383+
bus.emplaceListener<PlayerUseItemOnEvent>([](PlayerUseItemOnEvent& ev) {
384+
if (ev.item().isItem() && ev.item().getTypeName().contains("bucket")) {
385+
IF_LISTENED(EVENT_TYPES::onUseBucketTake) {
386+
CallEvent(
387+
EVENT_TYPES::onUseBucketTake,
388+
PlayerClass::newPlayer(&ev.self()),
389+
ItemClass::newItem(&ev.item(), false),
390+
BlockClass::newBlock(&ev.blockPos(), ev.self().getDimensionId()),
391+
Number::newNumber(ev.face()),
392+
FloatPos::newPos(ev.clickPos(), ev.self().getDimensionId())
393+
);
394+
}
395+
IF_LISTENED_END(EVENT_TYPES::onUseBucketTake);
396+
}
397+
});
398+
break;
421399

422400
case EVENT_TYPES::onContainerChange:
423401
lse::events::ContainerChangeEvent();

src/legacy/events/EventHooks.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <mc/world/actor/player/Player.h>
2727
#include <mc/world/containers/models/LevelContainerModel.h>
2828
#include <mc/world/events/EventResult.h>
29+
#include <mc/world/item/BucketItem.h>
2930
#include <mc/world/item/CrossbowItem.h>
3031
#include <mc/world/item/ItemInstance.h>
3132
#include <mc/world/item/registry/ItemStack.h>
@@ -828,6 +829,84 @@ LL_TYPE_INSTANCE_HOOK(
828829
origin(id, obj);
829830
}
830831

832+
LL_TYPE_INSTANCE_HOOK(
833+
PlayerUseBucketPlaceHook,
834+
HookPriority::Normal,
835+
BucketItem,
836+
&BucketItem::_emptyBucket,
837+
bool,
838+
BlockSource& region,
839+
Block const& contents,
840+
BlockPos const& pos,
841+
Actor* placer,
842+
ItemStack const& instance,
843+
uchar face
844+
) {
845+
IF_LISTENED(EVENT_TYPES::onUseBucketPlace) {
846+
CallEventRtnValue(
847+
EVENT_TYPES::onUseBucketPlace,
848+
false,
849+
PlayerClass::newPlayer(static_cast<Player*>(placer)),
850+
ItemClass::newItem(&const_cast<ItemStack&>(instance), false),
851+
BlockClass::newBlock(&contents, &pos, &region),
852+
Number::newNumber(face),
853+
FloatPos::newPos(pos, region.getDimensionId())
854+
);
855+
}
856+
IF_LISTENED_END(EVENT_TYPES::onUseBucketPlace);
857+
return origin(region, contents, pos, placer, instance, face);
858+
}
859+
860+
LL_TYPE_INSTANCE_HOOK(
861+
PlayerUseBucketTakeHook1,
862+
HookPriority::Normal,
863+
BucketItem,
864+
&BucketItem::_takeLiquid,
865+
bool,
866+
ItemStack& item,
867+
Actor& entity,
868+
BlockPos const& pos
869+
) {
870+
IF_LISTENED(EVENT_TYPES::onUseBucketTake) {
871+
CallEventRtnValue(
872+
EVENT_TYPES::onUseBucketTake,
873+
false,
874+
PlayerClass::newPlayer(&static_cast<Player&>(entity)),
875+
ItemClass::newItem(&item, false),
876+
BlockClass::newBlock(&pos, entity.getDimensionId()),
877+
Number::newNumber(-1),
878+
FloatPos::newPos(pos, entity.getDimensionId())
879+
);
880+
}
881+
IF_LISTENED_END(EVENT_TYPES::onUseBucketTake);
882+
return origin(item, entity, pos);
883+
}
884+
885+
LL_TYPE_INSTANCE_HOOK(
886+
PlayerUseBucketTakeHook2,
887+
HookPriority::Normal,
888+
BucketItem,
889+
&BucketItem::_takePowderSnow,
890+
bool,
891+
ItemStack& item,
892+
Actor& entity,
893+
BlockPos const& pos
894+
) {
895+
IF_LISTENED(EVENT_TYPES::onUseBucketTake) {
896+
CallEventRtnValue(
897+
EVENT_TYPES::onUseBucketTake,
898+
false,
899+
PlayerClass::newPlayer(&static_cast<Player&>(entity)),
900+
ItemClass::newItem(&item, false),
901+
BlockClass::newBlock(&pos, entity.getDimensionId()),
902+
Number::newNumber(-1),
903+
FloatPos::newPos(pos, entity.getDimensionId())
904+
);
905+
}
906+
IF_LISTENED_END(EVENT_TYPES::onUseBucketTake);
907+
return origin(item, entity, pos);
908+
}
909+
831910
void PlayerStartDestroyBlock() { PlayerStartDestroyHook::hook(); }
832911
void PlayerDropItem() { PlayerDropItemHook::hook(); }
833912
void PlayerOpenContainerEvent() { PlayerOpenContainerHook::hook(); }
@@ -872,6 +951,11 @@ void PlayerSleepEvent() { PlayerSleepHook::hook(); }
872951
void PlayerOpenInventoryEvent() { PlayerOpenInventoryHook::hook(); }
873952
void PlayerPullFishingHookEvent() { PlayerPullFishingHook::hook(); }
874953
void ScoreChangedEvent() { ScoreChangedHook::hook(); }
954+
void PlayerUseBucketPlaceEvent() { PlayerUseBucketPlaceHook::hook(); }
955+
void PlayerUseBucketTakeEvent() {
956+
PlayerUseBucketTakeHook1::hook();
957+
PlayerUseBucketTakeHook2::hook();
958+
}
875959

876960
// NOLINTEND(cppcoreguidelines-pro-type-reinterpret-cast)
877961
// NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)

src/legacy/events/EventHooks.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,7 @@ void PlayerSleepEvent();
3232
void PlayerOpenInventoryEvent();
3333
void PlayerPullFishingHookEvent();
3434
void ScoreChangedEvent();
35+
void PlayerUseBucketPlaceEvent();
36+
void PlayerUseBucketTakeEvent();
3537

3638
} // namespace lse::events

0 commit comments

Comments
 (0)