8
8
import kr .toxicity .model .api .data .renderer .RendererGroup ;
9
9
import kr .toxicity .model .api .nms .*;
10
10
import lombok .Getter ;
11
+ import lombok .RequiredArgsConstructor ;
11
12
import lombok .Setter ;
12
13
import org .bukkit .Location ;
13
14
import org .bukkit .Material ;
14
- import org .bukkit .entity .Entity ;
15
15
import org .bukkit .entity .ItemDisplay ;
16
16
import org .bukkit .inventory .ItemStack ;
17
17
import org .bukkit .util .Transformation ;
@@ -97,7 +97,7 @@ public RenderedEntity(
97
97
* @param listener hit box listener
98
98
*/
99
99
@ ApiStatus .Internal
100
- public void createHitBox (@ NotNull Entity entity , @ NotNull Predicate <RenderedEntity > predicate , @ Nullable HitBoxListener listener ) {
100
+ public void createHitBox (@ NotNull EntityAdapter entity , @ NotNull Predicate <RenderedEntity > predicate , @ Nullable HitBoxListener listener ) {
101
101
var h = group .getHitBox ();
102
102
if (h != null && predicate .test (this )) {
103
103
var l = listener ;
@@ -206,13 +206,14 @@ public void lastMovement(@NotNull TrackerMovement movement) {
206
206
}
207
207
208
208
public void move (@ NotNull TrackerMovement movement , @ NotNull PacketBundler bundler ) {
209
+ updateAnimation ();
209
210
var d = display ;
210
211
if (delay <= 0 ) {
211
212
var f = frame ();
212
213
delay = f ;
213
214
var entityMovement = lastTransform = (lastMovement = movement .copy ()).plus (relativeOffset ().plus (defaultPosition ));
214
215
if (d != null ) {
215
- d .frame (Math .max (f , ANIMATION_THRESHOLD ));
216
+ d .frame (f <= 0 ? 0 : Math .max (f , ANIMATION_THRESHOLD ));
216
217
setup (entityMovement );
217
218
d .send (bundler );
218
219
}
@@ -221,7 +222,6 @@ public void move(@NotNull TrackerMovement movement, @NotNull PacketBundler bundl
221
222
for (RenderedEntity e : children .values ()) {
222
223
e .move (movement , bundler );
223
224
}
224
- updateAnimation ();
225
225
}
226
226
public void forceUpdate (@ NotNull PacketBundler bundler ) {
227
227
var d = display ;
@@ -263,11 +263,11 @@ public void defaultPosition(@NotNull Vector3f movement) {
263
263
}
264
264
265
265
private int frame () {
266
- return keyFrame != null ? (int ) keyFrame .time () : parent != null ? parent .frame () : ANIMATION_THRESHOLD ;
266
+ return keyFrame != null ? (int ) keyFrame .time () : parent != null ? parent .frame () : 1 ;
267
267
}
268
268
269
269
private EntityMovement defaultFrame () {
270
- var k = keyFrame != null ? keyFrame .copyNotNull () : new AnimationMovement (0 , new Vector3f (), new Vector3f (), new Vector3f ());
270
+ var k = keyFrame != null ? keyFrame .copyNotNull () : new AnimationMovement (1 , new Vector3f (), new Vector3f (), new Vector3f ());
271
271
for (Consumer <AnimationMovement > consumer : movementModifier ) {
272
272
consumer .accept (k );
273
273
}
@@ -368,7 +368,7 @@ public void replaceLoop(@NotNull Predicate<RenderedEntity> filter, @NotNull Stri
368
368
synchronized (animators ) {
369
369
var v = animators .get (target );
370
370
if (v != null ) animators .replace (target , get != null ? new TreeIterator (parent , get .loopIterator (), v .modifier , v .removeTask ) : new TreeIterator (parent , animator .emptyLoopIterator (), v .modifier , v .removeTask ));
371
- else animators .replace (target , get != null ? new TreeIterator (parent , get .loopIterator (), AnimationModifier .DEFAULT , () -> {}) : new TreeIterator (parent , animator .emptyLoopIterator (), AnimationModifier .DEFAULT , () -> {}));
371
+ else animators .replace (target , get != null ? new TreeIterator (parent , get .loopIterator (), AnimationModifier .DEFAULT_LOOP , () -> {}) : new TreeIterator (parent , animator .emptyLoopIterator (), AnimationModifier .DEFAULT_LOOP , () -> {}));
372
372
}
373
373
}
374
374
children .values ().forEach (c -> c .replaceLoop (filter , target , parent , animator ));
@@ -409,12 +409,20 @@ public void togglePart(@NotNull PacketBundler bundler, @NotNull Predicate<Render
409
409
}
410
410
}
411
411
412
- private record TreeIterator (
413
- String name ,
414
- BlueprintAnimator .AnimatorIterator iterator ,
415
- AnimationModifier modifier ,
416
- Runnable removeTask
417
- ) implements BlueprintAnimator .AnimatorIterator , Supplier <Boolean >, Runnable {
412
+ @ RequiredArgsConstructor
413
+ private static class TreeIterator implements BlueprintAnimator .AnimatorIterator , Supplier <Boolean >, Runnable {
414
+ private final String name ;
415
+ private final BlueprintAnimator .AnimatorIterator iterator ;
416
+ private final AnimationModifier modifier ;
417
+ private final Runnable removeTask ;
418
+ private boolean started = false ;
419
+ private boolean ended = false ;
420
+
421
+ @ NotNull
422
+ @ Override
423
+ public AnimationMovement first () {
424
+ return iterator .first ();
425
+ }
418
426
419
427
@ Override
420
428
public int index () {
@@ -438,21 +446,27 @@ public Boolean get() {
438
446
439
447
@ Override
440
448
public boolean hasNext () {
441
- return iterator .hasNext ();
449
+ return iterator .hasNext () || ( modifier . end () > 0 && ! ended ) ;
442
450
}
443
451
444
452
@ Override
445
453
public AnimationMovement next () {
446
- int i ;
447
- if (index () == 0 ) i = modifier ().start ();
448
- else if (index () == lastIndex ()) i = modifier ().end ();
449
- else i = 0 ;
454
+ if (!started ) {
455
+ started = true ;
456
+ return first ().time (modifier .start ());
457
+ }
458
+ if (!iterator .hasNext ()) {
459
+ ended = true ;
460
+ return new AnimationMovement (modifier .end (), null , null , null );
461
+ }
450
462
var nxt = iterator .next ();
451
- return i == 0 ? nxt : new AnimationMovement (i , null , null , null );
463
+ var spd = modifier .speed ((int ) nxt .time ());
464
+ return nxt .time (Math .max (spd , 1 ));
452
465
}
453
466
454
467
@ Override
455
468
public void clear () {
469
+ started = ended = false ;
456
470
iterator .clear ();
457
471
}
458
472
0 commit comments