Skip to content

Commit e793871

Browse files
authored
Merge pull request #281 from toxicity188/codex/add-interact-listeners-to-hitboxlistener
fix: inline hitbox interact locals and always fire listener hooks
2 parents cfd3585 + 76caaa3 commit e793871

File tree

9 files changed

+99
-5
lines changed

9 files changed

+99
-5
lines changed

api/src/main/java/kr/toxicity/model/api/nms/HitBoxListener.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
package kr.toxicity.model.api.nms;
88

99
import kr.toxicity.model.api.event.ModelDamageSource;
10+
import kr.toxicity.model.api.event.ModelInteractAtEvent;
11+
import kr.toxicity.model.api.event.ModelInteractEvent;
1012
import kr.toxicity.model.api.platform.PlatformEntity;
1113
import org.jetbrains.annotations.NotNull;
1214

@@ -49,6 +51,8 @@ public interface HitBoxListener {
4951
return new Builder()
5052
.sync(this::sync)
5153
.damage(this::damage)
54+
.interact(this::interact)
55+
.interactAt(this::interactAt)
5256
.remove(this::remove)
5357
.mount(this::mount)
5458
.dismount(this::dismount);
@@ -63,12 +67,16 @@ class Builder {
6367

6468
private static final Consumer<HitBox> DEFAULT_SYNC = h -> {};
6569
private static final OnDamage DEFAULT_DAMAGE = (h, s, d) -> false;
70+
private static final Consumer<ModelInteractEvent> DEFAULT_INTERACT = h -> {};
71+
private static final Consumer<ModelInteractAtEvent> DEFAULT_INTERACT_AT = h -> {};
6672
private static final Consumer<HitBox> DEFAULT_REMOVE = h -> {};
6773
private static final BiConsumer<HitBox, PlatformEntity> DEFAULT_MOUNT = (h, e) -> {};
6874
private static final BiConsumer<HitBox, PlatformEntity> DEFAULT_DISMOUNT = (h, e) -> {};
6975

7076
private Consumer<HitBox> sync = DEFAULT_SYNC;
7177
private OnDamage damage = DEFAULT_DAMAGE;
78+
private Consumer<ModelInteractEvent> interact = DEFAULT_INTERACT;
79+
private Consumer<ModelInteractAtEvent> interactAt = DEFAULT_INTERACT_AT;
7280
private Consumer<HitBox> remove = DEFAULT_REMOVE;
7381
private BiConsumer<HitBox, PlatformEntity> mount = DEFAULT_MOUNT;
7482
private BiConsumer<HitBox, PlatformEntity> dismount = DEFAULT_DISMOUNT;
@@ -103,6 +111,30 @@ private Builder() {
103111
return this;
104112
}
105113

114+
/**
115+
* Adds an interact handler.
116+
*
117+
* @param interact the interact handler
118+
* @return this builder
119+
* @since 2.0.2
120+
*/
121+
public @NotNull Builder interact(@NotNull Consumer<ModelInteractEvent> interact) {
122+
this.interact = this.interact == DEFAULT_INTERACT ? interact : this.interact.andThen(interact);
123+
return this;
124+
}
125+
126+
/**
127+
* Adds an interact-at handler.
128+
*
129+
* @param interactAt the interact-at handler
130+
* @return this builder
131+
* @since 2.0.2
132+
*/
133+
public @NotNull Builder interactAt(@NotNull Consumer<ModelInteractAtEvent> interactAt) {
134+
this.interactAt = this.interactAt == DEFAULT_INTERACT_AT ? interactAt : this.interactAt.andThen(interactAt);
135+
return this;
136+
}
137+
106138
/**
107139
* Adds a remove handler.
108140
*
@@ -157,6 +189,16 @@ public boolean damage(@NotNull HitBox hitBox, @NotNull ModelDamageSource source,
157189
return Builder.this.damage.event(hitBox, source, damage);
158190
}
159191

192+
@Override
193+
public void interact(@NotNull ModelInteractEvent event) {
194+
interact.accept(event);
195+
}
196+
197+
@Override
198+
public void interactAt(@NotNull ModelInteractAtEvent event) {
199+
interactAt.accept(event);
200+
}
201+
160202
@Override
161203
public void remove(@NotNull HitBox hitBox) {
162204
remove.accept(hitBox);
@@ -224,6 +266,22 @@ interface OnDamage {
224266
*/
225267
boolean damage(@NotNull HitBox hitBox, @NotNull ModelDamageSource source, double damage);
226268

269+
/**
270+
* Called when the hitbox receives an interaction.
271+
*
272+
* @param event the interaction event
273+
* @since 2.0.2
274+
*/
275+
void interact(@NotNull ModelInteractEvent event);
276+
277+
/**
278+
* Called when the hitbox receives an interaction at a specific position.
279+
*
280+
* @param event the interaction-at event
281+
* @since 2.0.2
282+
*/
283+
void interactAt(@NotNull ModelInteractAtEvent event);
284+
227285
/**
228286
* Called when the hitbox is removed.
229287
*

api/src/main/java/kr/toxicity/model/api/tracker/Tracker.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.concurrent.atomic.AtomicBoolean;
3939
import java.util.concurrent.atomic.AtomicInteger;
4040
import java.util.function.BiConsumer;
41+
import java.util.function.BiFunction;
4142
import java.util.function.BiPredicate;
4243
import java.util.function.Predicate;
4344
import java.util.function.Supplier;
@@ -678,6 +679,26 @@ public boolean replace(@NotNull Predicate<RenderedBone> filter, @NotNull String
678679

679680
//--- Update action ---
680681

682+
/**
683+
* Registers a hitbox-listener builder hook that is applied when hitboxes are created.
684+
* <p>
685+
* This delegates to {@link kr.toxicity.model.api.bone.BoneEventDispatcher#handleCreateHitBox(BiFunction)}
686+
* in this tracker's render pipeline event dispatcher.
687+
* </p>
688+
*
689+
* <pre>{@code
690+
* tracker.listenHitBox((bone, builder) -> builder.interact(event -> {
691+
* // custom interaction handling
692+
* }));
693+
* }</pre>
694+
*
695+
* @param function the hitbox listener builder transformer
696+
* @since 2.0.2
697+
*/
698+
public void listenHitBox(@NotNull BiFunction<RenderedBone, HitBoxListener.Builder, HitBoxListener.Builder> function) {
699+
pipeline.eventDispatcher().handleCreateHitBox(function);
700+
}
701+
681702
/**
682703
* Creates a hitbox for bones matching a predicate.
683704
*

nms/v1_21_R1/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R1/HitBoxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ internal class HitBoxImpl(
345345
MAIN_HAND -> ModelInteractionHand.RIGHT
346346
OFF_HAND -> ModelInteractionHand.LEFT
347347
})
348+
listener.interact(interact)
348349
if (!interact.call().triggered()) return InteractionResult.FAIL
349350
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand))
350351
return InteractionResult.SUCCESS
@@ -356,6 +357,7 @@ internal class HitBoxImpl(
356357
MAIN_HAND -> ModelInteractionHand.RIGHT
357358
OFF_HAND -> ModelInteractionHand.LEFT
358359
}, vec.toBukkit())
360+
listener.interactAt(interact)
359361
if (!interact.call().triggered()) return InteractionResult.FAIL
360362
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand, vec))
361363
return InteractionResult.SUCCESS

nms/v1_21_R3/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R3/HitBoxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ internal class HitBoxImpl(
358358
MAIN_HAND -> ModelInteractionHand.RIGHT
359359
OFF_HAND -> ModelInteractionHand.LEFT
360360
})
361+
listener.interact(interact)
361362
if (!interact.call().triggered()) return InteractionResult.FAIL
362363
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand))
363364
return InteractionResult.SUCCESS
@@ -369,6 +370,7 @@ internal class HitBoxImpl(
369370
MAIN_HAND -> ModelInteractionHand.RIGHT
370371
OFF_HAND -> ModelInteractionHand.LEFT
371372
}, vec.toBukkit())
373+
listener.interactAt(interact)
372374
if (!interact.call().triggered()) return InteractionResult.FAIL
373375
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand, vec))
374376
return InteractionResult.SUCCESS

nms/v1_21_R4/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R4/HitBoxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ internal class HitBoxImpl(
364364
MAIN_HAND -> ModelInteractionHand.RIGHT
365365
OFF_HAND -> ModelInteractionHand.LEFT
366366
})
367+
listener.interact(interact)
367368
if (!interact.call().triggered()) return InteractionResult.FAIL
368369
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand))
369370
return InteractionResult.SUCCESS
@@ -375,6 +376,7 @@ internal class HitBoxImpl(
375376
MAIN_HAND -> ModelInteractionHand.RIGHT
376377
OFF_HAND -> ModelInteractionHand.LEFT
377378
}, vec.toBukkit())
379+
listener.interactAt(interact)
378380
if (!interact.call().triggered()) return InteractionResult.FAIL
379381
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand, vec))
380382
return InteractionResult.SUCCESS

nms/v1_21_R5/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R5/HitBoxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ internal class HitBoxImpl(
365365
MAIN_HAND -> ModelInteractionHand.RIGHT
366366
OFF_HAND -> ModelInteractionHand.LEFT
367367
})
368+
listener.interact(interact)
368369
if (!interact.call().triggered()) return InteractionResult.FAIL
369370
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand))
370371
return InteractionResult.SUCCESS
@@ -376,6 +377,7 @@ internal class HitBoxImpl(
376377
MAIN_HAND -> ModelInteractionHand.RIGHT
377378
OFF_HAND -> ModelInteractionHand.LEFT
378379
}, vec.toBukkit())
380+
listener.interactAt(interact)
379381
if (!interact.call().triggered()) return InteractionResult.FAIL
380382
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand, vec))
381383
return InteractionResult.SUCCESS

nms/v1_21_R6/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R6/HitBoxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ internal class HitBoxImpl(
365365
MAIN_HAND -> ModelInteractionHand.RIGHT
366366
OFF_HAND -> ModelInteractionHand.LEFT
367367
})
368+
listener.interact(interact)
368369
if (!interact.call().triggered()) return InteractionResult.FAIL
369370
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand))
370371
return InteractionResult.SUCCESS
@@ -376,6 +377,7 @@ internal class HitBoxImpl(
376377
MAIN_HAND -> ModelInteractionHand.RIGHT
377378
OFF_HAND -> ModelInteractionHand.LEFT
378379
}, vec.toBukkit())
380+
listener.interactAt(interact)
379381
if (!interact.call().triggered()) return InteractionResult.FAIL
380382
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand, vec))
381383
return InteractionResult.SUCCESS

nms/v1_21_R7/src/main/kotlin/kr/toxicity/model/bukkit/nms/v1_21_R7/HitBoxImpl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@ internal class HitBoxImpl(
365365
MAIN_HAND -> ModelInteractionHand.RIGHT
366366
OFF_HAND -> ModelInteractionHand.LEFT
367367
})
368+
listener.interact(interact)
368369
if (!interact.call().triggered()) return InteractionResult.FAIL
369370
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand))
370371
return InteractionResult.SUCCESS
@@ -376,6 +377,7 @@ internal class HitBoxImpl(
376377
MAIN_HAND -> ModelInteractionHand.RIGHT
377378
OFF_HAND -> ModelInteractionHand.LEFT
378379
}, vec.toBukkit())
380+
listener.interactAt(interact)
379381
if (!interact.call().triggered()) return InteractionResult.FAIL
380382
(player as ServerPlayer).connection.handleInteract(ServerboundInteractPacket.createInteractionPacket(delegate, player.isShiftKeyDown, hand, vec))
381383
return InteractionResult.SUCCESS

platform/fabric/src/main/kotlin/kr/toxicity/model/impl/fabric/entity/HitBoxEntityImpl.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -419,20 +419,22 @@ class HitBoxEntityImpl(
419419
if (player === delegate) {
420420
return InteractionResult.FAIL
421421
}
422+
val serverPlayer = player as ServerPlayer
422423

423424
val interact = ModelInteractEvent(
424-
(player as ServerPlayer).connection.wrap(),
425+
serverPlayer.connection.wrap(),
425426
this,
426427
when (hand) {
427428
InteractionHand.MAIN_HAND -> ModelInteractionHand.RIGHT
428429
InteractionHand.OFF_HAND -> ModelInteractionHand.LEFT
429430
}
430431
)
432+
listener.interact(interact)
431433
if (!interact.call().triggered()) {
432434
return InteractionResult.FAIL
433435
}
434436

435-
player.connection.handleInteract(
437+
serverPlayer.connection.handleInteract(
436438
ServerboundInteractPacket.createInteractionPacket(
437439
delegate,
438440
player.isShiftKeyDown,
@@ -446,22 +448,23 @@ class HitBoxEntityImpl(
446448
if (player === delegate) {
447449
return InteractionResult.FAIL
448450
}
451+
val serverPlayer = player as ServerPlayer
449452

450453
val interact = ModelInteractAtEvent(
451-
(player as ServerPlayer).connection.wrap(),
454+
serverPlayer.connection.wrap(),
452455
this,
453456
when (hand) {
454457
InteractionHand.MAIN_HAND -> ModelInteractionHand.RIGHT
455458
InteractionHand.OFF_HAND -> ModelInteractionHand.LEFT
456459
},
457460
vec.toVector3f()
458461
)
459-
462+
listener.interactAt(interact)
460463
if (!interact.call().triggered()) {
461464
return InteractionResult.FAIL
462465
}
463466

464-
player.connection.handleInteract(
467+
serverPlayer.connection.handleInteract(
465468
ServerboundInteractPacket.createInteractionPacket(
466469
delegate,
467470
player.isShiftKeyDown,

0 commit comments

Comments
 (0)