Skip to content

Commit 9f19425

Browse files
committed
More accurate model part location
1 parent 0585987 commit 9f19425

8 files changed

Lines changed: 45 additions & 20 deletions

File tree

‎api/src/main/java/kr/toxicity/model/api/data/renderer/RenderInstance.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,13 @@ public boolean addAnimationMovementModifier(@NotNull Predicate<RenderedEntity> p
136136
}
137137

138138
public double height() {
139-
return entityMap.values().stream().mapToDouble(RenderedEntity::height).max().orElse(0.0);
139+
var h = 0D;
140+
for (RenderedEntity renderer : renderers()) {
141+
var lt = renderer.lastTransform().y;
142+
if (renderer.getName().startsWith("h_")) return lt;
143+
if (h < lt) h = lt;
144+
}
145+
return h;
140146
}
141147

142148
public void tint(int rgb) {

‎api/src/main/java/kr/toxicity/model/api/data/renderer/RendererGroup.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public RendererGroup(
7878
.div(16));
7979
this.hitBox = box;
8080
rotation = group.rotation().toVector();
81-
center = hitBox != null ? new Vector3f(position).add(hitBox.centerVector()) : position;
81+
center = hitBox != null ? hitBox.centerVector() : new Vector3f();
8282
}
8383

8484
/**

‎api/src/main/java/kr/toxicity/model/api/entity/EntityMovement.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ public record EntityMovement(
1919
@NotNull Quaternionf rotation,
2020
@NotNull Vector3f rawRotation
2121
) {
22+
23+
public static final EntityMovement EMPTY = new EntityMovement(
24+
new Vector3f(),
25+
new Vector3f(1),
26+
new Quaternionf(),
27+
new Vector3f()
28+
);
29+
2230
/**
2331
* Animates this movement.
2432
* @param movement animation

‎api/src/main/java/kr/toxicity/model/api/entity/RenderedEntity.java‎

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import kr.toxicity.model.api.data.renderer.RendererGroup;
99
import kr.toxicity.model.api.nms.*;
1010
import kr.toxicity.model.api.tracker.ModelRotation;
11+
import kr.toxicity.model.api.util.MathUtil;
12+
import kr.toxicity.model.api.util.VectorUtil;
1113
import lombok.Getter;
1214
import lombok.RequiredArgsConstructor;
1315
import lombok.Setter;
@@ -210,8 +212,9 @@ private boolean updateKeyframe(Iterator<TreeIterator> iterator, TreeIterator nex
210212
}
211213

212214
private TrackerMovement lastMovement;
213-
private EntityMovement lastTransform;
215+
private EntityMovement beforeTransform, lastTransform;
214216
private Vector3f defaultPosition = new Vector3f();
217+
private ModelRotation rotation = ModelRotation.EMPTY;
215218

216219
public void lastMovement(@NotNull TrackerMovement movement) {
217220
lastMovement = movement;
@@ -222,10 +225,14 @@ public void lastMovement(@NotNull TrackerMovement movement) {
222225

223226
public void move(@NotNull ModelRotation rotation, @NotNull TrackerMovement movement, @NotNull PacketBundler bundler) {
224227
var d = display;
225-
if (d != null && delay % 5 == 0) d.rotate(rotation, bundler);
228+
this.rotation = rotation;
229+
if (d != null && delay % 5 == 0) {
230+
d.rotate(rotation, bundler);
231+
}
226232
if (delay <= 0) {
227233
var f = frame();
228234
delay = f;
235+
beforeTransform = lastTransform;
229236
var entityMovement = (lastTransform = (lastMovement = movement.copy()).plus(relativeOffset())).plus(defaultPosition);
230237
if (d != null) {
231238
d.frame(f <= 0 ? 0 : toInterpolationDuration(f));
@@ -243,6 +250,7 @@ public void forceUpdate(@NotNull PacketBundler bundler) {
243250
var speed = currentIterator != null ? currentIterator.modifier.speedValue() : 1F;
244251
delay = Math.round(speed * (double) delay);
245252
if (d != null && lastMovement != null && delay > 0) {
253+
beforeTransform = lastTransform;
246254
var entityMovement = (lastTransform = lastMovement.copy().plus(relativeOffset())).plus(defaultPosition);
247255
d.frame(toInterpolationDuration(delay));
248256
setup(entityMovement);
@@ -255,9 +263,18 @@ private static int toInterpolationDuration(long delay) {
255263
}
256264

257265
public @NotNull Vector3f lastTransform() {
258-
return lastTransform != null ? new Vector3f(lastTransform.transform())
259-
.add(defaultPosition)
260-
.mul(progress()): new Vector3f();
266+
if (lastTransform != null) {
267+
var progress = 1 - progress();
268+
var before = beforeTransform != null ? beforeTransform : EntityMovement.EMPTY;
269+
return VectorUtil.linear(before.transform(), lastTransform.transform(), progress)
270+
.mul(VectorUtil.linear(before.scale(), lastTransform.scale(), progress))
271+
.rotate(
272+
MathUtil.toQuaternion(MathUtil.blockBenchToDisplay(VectorUtil.linear(before.rawRotation(), lastTransform.rawRotation(), progress)))
273+
)
274+
.add(defaultPosition)
275+
.rotateY((float) -Math.toRadians(rotation.y()));
276+
}
277+
return new Vector3f();
261278
}
262279

263280
public void setup(@NotNull TrackerMovement movement) {
@@ -330,15 +347,6 @@ private EntityMovement relativeHitBoxOffset() {
330347
return def;
331348
}
332349

333-
public double height() {
334-
var d = (double) defaultPosition.y + (lastTransform != null ? new Vector3f(lastTransform.transform()).mul(progress()).y : 0);
335-
for (RenderedEntity value : children.values()) {
336-
var v = value.height();
337-
if (getGroup().getCenter().y < value.getGroup().getCenter().y) d = v;
338-
}
339-
return d;
340-
}
341-
342350
public void tint(int toggle, @NotNull PacketBundler bundler) {
343351
tint = toggle;
344352
if (applyItem()) forceUpdate(bundler);
@@ -533,7 +541,7 @@ public int hashCode() {
533541
@NotNull
534542
@Override
535543
public Vector3f supplyTransform() {
536-
return lastMovement != null ? lastMovement.plus(relativeHitBoxOffset().plus(defaultPosition)).transform() : relativeHitBoxOffset().plus(defaultPosition).transform();
544+
return lastMovement != null ? lastMovement.plus(relativeHitBoxOffset()).plus(defaultPosition).transform() : relativeHitBoxOffset().plus(defaultPosition).transform();
537545
}
538546

539547
@Override

‎api/src/main/java/kr/toxicity/model/api/tracker/EntityTracker.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class EntityTracker extends Tracker {
3333
private static final Map<UUID, EntityTracker> TRACKER_MAP = new ConcurrentHashMap<>();
3434

3535
private final @NotNull Entity entity;
36+
@Getter
3637
private final @NotNull EntityAdapter adapter;
3738
private final AtomicBoolean closed = new AtomicBoolean();
3839
private final AtomicBoolean forRemoval = new AtomicBoolean();
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
package kr.toxicity.model.api.tracker;
22

33
public record ModelRotation(float x, float y) {
4+
public static final ModelRotation EMPTY = new ModelRotation(0, 0);
45
}

‎build.gradle.kts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ plugins {
77
kotlin("jvm") version "2.1.10"
88
id("org.jetbrains.dokka") version "2.0.0"
99
id("io.github.goooler.shadow") version "8.1.8"
10-
id("io.papermc.paperweight.userdev") version "2.0.0-beta.14" apply false
10+
id("io.papermc.paperweight.userdev") version "2.0.0-beta.16" apply false
1111
id("xyz.jpenilla.run-paper") version "2.3.1"
1212
id("xyz.jpenilla.resource-factory-bukkit-convention") version "1.2.0"
1313
id("com.modrinth.minotaur") version "2.+"

‎core/src/main/kotlin/kr/toxicity/model/compatibility/mythicmobs/targeter/ModelPartTargeter.kt‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,11 @@ class ModelPartTargeter(mlc: MythicLineConfig) : ILocationTargeter {
1313
override fun getLocations(p0: SkillMetadata): Collection<AbstractLocation> {
1414
val entity = p0.caster.entity
1515
val bukkit = entity.bukkitEntity
16-
return EntityTracker.tracker(bukkit.uniqueId)?.entity(part)?.lastTransform()?.let {
16+
val tracker = EntityTracker.tracker(bukkit.uniqueId) ?: return emptyList()
17+
return tracker.entity(part)?.lastTransform()?.let {
1718
listOf(entity.location.add(
1819
it.x.toDouble(),
19-
it.y.toDouble(),
20+
it.y.toDouble() + tracker.adapter.passengerPosition().y(),
2021
it.z.toDouble()
2122
))
2223
} ?: emptyList()

0 commit comments

Comments
 (0)