EntityTrackers are the core controller for model instances in BetterModel. They manage the lifecycle, rendering, animation, and player interaction of a model attached to an entity.
import kr.toxicity.model.api.BetterModel;import kr.toxicity.model.api.bukkit.platform.BukkitAdapter;import kr.toxicity.model.api.tracker.EntityTracker;import org.bukkit.entity.Entity;Entity entity = // your entity// Get or create a trackerEntityTracker tracker = BetterModel.model("demon_knight") .map(r -> r.getOrCreate(BukkitAdapter.adapt(entity))) .orElse(null);if (tracker != null) { // Model is now attached to the entity System.out.println("Model spawned: " + tracker.name());}
getOrCreate() returns an existing tracker if the entity already has this model attached, preventing duplicates.
import kr.toxicity.model.api.tracker.TrackerModifier;TrackerModifier modifier = TrackerModifier.builder() .sightTrace(true) // Only show when player can see it .damageAnimation(true) // Play damage animation when hit .damageTint(true) // Apply red tint when damaged .build();EntityTracker tracker = BetterModel.model("demon_knight") .map(r -> r.create(BukkitAdapter.adapt(entity), modifier)) .orElse(null);
import kr.toxicity.model.api.platform.PlatformPlayer;EntityTracker tracker = // your trackerPlatformPlayer player = BukkitAdapter.adapt(bukkitPlayer);// Show to playertracker.show(player);// Hide from playertracker.hide(player);// Check if visible to playerboolean isVisible = !tracker.isHide(player);
EntityTracker tracker = // your tracker// Only spawn for specific playerstracker.markPlayerForSpawn(BukkitAdapter.adapt(player1));tracker.markPlayerForSpawn(BukkitAdapter.adapt(player2));// Check if can spawn for playerboolean canSpawn = tracker.canBeSpawnedAt(BukkitAdapter.adapt(player));
// Despawn the model (can be respawned)tracker.despawn();// Completely close and remove the trackertracker.close();// Check if closedif (tracker.isClosed()) { System.out.println("Tracker is closed");}
import kr.toxicity.model.api.tracker.ModelRotator;import kr.toxicity.model.api.tracker.ModelRotation;// Fixed rotationtracker.rotation(() -> new ModelRotation(0F, 90F)); // Face east// Dynamic rotation based on entitytracker.rotator(ModelRotator.YAW); // Follow entity yaw onlytracker.rotator(ModelRotator.PITCH_AND_YAW); // Follow both
import kr.toxicity.model.api.animation.AnimationModifier;// Shorthand for playing animations on playersboolean success = BetterModel.platform().modelManager().animate( BukkitAdapter.adapt(player), "custom_player_model", "wave", AnimationModifier.DEFAULT_WITH_PLAY_ONCE);
Player limb models are not saved when the server restarts. They must be recreated on player join.