Showing preview only (2,988K chars total). Download the full file or copy to clipboard to get everything.
Repository: toxicity188/BetterModel
Branch: v3
Commit: 37d7fae20bb1
Files: 608
Total size: 2.7 MB
Directory structure:
gitextract_aj8f7_rc/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ └── workflows/
│ ├── package.yml
│ ├── pr-test.yml
│ └── publish.yml
├── .gitignore
├── .idea/
│ └── codeStyles/
│ └── codeStyleConfig.xml
├── AGENTS.md
├── BANNER.md
├── LICENSE.md
├── LICENSE_HEADER
├── README.md
├── SECURITY.md
├── api/
│ ├── build.gradle.kts
│ ├── bukkit-api/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── api/
│ │ └── bukkit/
│ │ ├── BetterModelBukkit.java
│ │ ├── BukkitModelEventBus.java
│ │ ├── entity/
│ │ │ ├── BaseBukkitEntity.java
│ │ │ └── BaseBukkitPlayer.java
│ │ ├── event/
│ │ │ ├── BetterModelBukkitEvent.java
│ │ │ └── BukkitEventApplication.java
│ │ ├── platform/
│ │ │ ├── BukkitAdapter.java
│ │ │ ├── BukkitEntity.java
│ │ │ ├── BukkitItemStack.java
│ │ │ ├── BukkitLivingEntity.java
│ │ │ ├── BukkitLocation.java
│ │ │ ├── BukkitOfflinePlayer.java
│ │ │ ├── BukkitPlayer.java
│ │ │ └── BukkitWorld.java
│ │ └── scheduler/
│ │ └── BukkitModelScheduler.java
│ ├── mod-api/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── api/
│ │ └── mod/
│ │ ├── BetterModelMod.java
│ │ ├── entity/
│ │ │ ├── BaseModEntity.java
│ │ │ └── BaseModPlayer.java
│ │ ├── platform/
│ │ │ ├── ModAdapter.java
│ │ │ ├── ModEntity.java
│ │ │ ├── ModItemStack.java
│ │ │ ├── ModLivingEntity.java
│ │ │ ├── ModLocation.java
│ │ │ ├── ModOfflinePlayer.java
│ │ │ ├── ModPlayer.java
│ │ │ ├── ModRegionHolder.java
│ │ │ └── ModWorld.java
│ │ └── scheduler/
│ │ └── ModModelScheduler.java
│ └── src/
│ └── main/
│ └── java/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── api/
│ ├── BetterModel.java
│ ├── BetterModelConfig.java
│ ├── BetterModelEvaluator.java
│ ├── BetterModelEventBus.java
│ ├── BetterModelLogger.java
│ ├── BetterModelPlatform.java
│ ├── animation/
│ │ ├── AnimationIterator.java
│ │ ├── AnimationKeyframe.java
│ │ ├── AnimationModifier.java
│ │ ├── AnimationOverrideState.java
│ │ ├── AnimationProgress.java
│ │ ├── AnimationStateHandler.java
│ │ ├── RunningAnimation.java
│ │ ├── Timed.java
│ │ ├── TimedStorage.java
│ │ └── VectorPoint.java
│ ├── armor/
│ │ ├── ArmorItem.java
│ │ └── PlayerArmor.java
│ ├── bone/
│ │ ├── BoneEventDispatcher.java
│ │ ├── BoneEventHandler.java
│ │ ├── BoneIKSolver.java
│ │ ├── BoneItemMapper.java
│ │ ├── BoneMovement.java
│ │ ├── BoneName.java
│ │ ├── BonePosition.java
│ │ ├── BoneRenderContext.java
│ │ ├── BoneTag.java
│ │ ├── BoneTagRegistry.java
│ │ ├── BoneTags.java
│ │ └── RenderedBone.java
│ ├── config/
│ │ ├── DebugConfig.java
│ │ ├── IndicatorConfig.java
│ │ ├── ModuleConfig.java
│ │ └── PackConfig.java
│ ├── data/
│ │ ├── Float2.java
│ │ ├── Float3.java
│ │ ├── Float4.java
│ │ ├── ModelAsset.java
│ │ ├── blueprint/
│ │ │ ├── AnimationGenerator.java
│ │ │ ├── BlueprintAnimation.java
│ │ │ ├── BlueprintAnimator.java
│ │ │ ├── BlueprintElement.java
│ │ │ ├── BlueprintImage.java
│ │ │ ├── BlueprintJson.java
│ │ │ ├── BlueprintLoadContext.java
│ │ │ ├── BlueprintTexture.java
│ │ │ ├── ModelBlueprint.java
│ │ │ └── ModelBoundingBox.java
│ │ ├── raw/
│ │ │ ├── KeyframeChannel.java
│ │ │ ├── ModelAnimation.java
│ │ │ ├── ModelAnimator.java
│ │ │ ├── ModelData.java
│ │ │ ├── ModelDatapoint.java
│ │ │ ├── ModelElement.java
│ │ │ ├── ModelFace.java
│ │ │ ├── ModelGroup.java
│ │ │ ├── ModelKeyframe.java
│ │ │ ├── ModelLoadContext.java
│ │ │ ├── ModelLoadResult.java
│ │ │ ├── ModelMeta.java
│ │ │ ├── ModelOutliner.java
│ │ │ ├── ModelPlaceholder.java
│ │ │ ├── ModelResolution.java
│ │ │ ├── ModelTexture.java
│ │ │ └── ModelUV.java
│ │ └── renderer/
│ │ ├── ModelRenderer.java
│ │ ├── RenderPipeline.java
│ │ ├── RenderSource.java
│ │ └── RendererGroup.java
│ ├── entity/
│ │ ├── BaseEntity.java
│ │ └── BasePlayer.java
│ ├── event/
│ │ ├── AnimationSignalEvent.java
│ │ ├── CancellableEvent.java
│ │ ├── CloseTrackerEvent.java
│ │ ├── CreateDummyTrackerEvent.java
│ │ ├── CreateEntityTrackerEvent.java
│ │ ├── CreatePlayerSkinEvent.java
│ │ ├── DismountModelEvent.java
│ │ ├── ModelAssetsEvent.java
│ │ ├── ModelDamageSource.java
│ │ ├── ModelDespawnAtPlayerEvent.java
│ │ ├── ModelEvent.java
│ │ ├── ModelEventApplication.java
│ │ ├── ModelEventListener.java
│ │ ├── ModelImportedEvent.java
│ │ ├── ModelSpawnAtPlayerEvent.java
│ │ ├── MountModelEvent.java
│ │ ├── PlayerHideTrackerEvent.java
│ │ ├── PlayerPerAnimationEndEvent.java
│ │ ├── PlayerPerAnimationStartEvent.java
│ │ ├── PlayerShowTrackerEvent.java
│ │ ├── PluginEndReloadEvent.java
│ │ ├── PluginStartReloadEvent.java
│ │ ├── RemovePlayerSkinEvent.java
│ │ └── hitbox/
│ │ ├── HitBoxCreateEvent.java
│ │ ├── HitBoxDamagedEvent.java
│ │ ├── HitBoxDismountEvent.java
│ │ ├── HitBoxEvent.java
│ │ ├── HitBoxInteractAtEvent.java
│ │ ├── HitBoxMountEvent.java
│ │ └── HitBoxRemoveEvent.java
│ ├── manager/
│ │ ├── ModelManager.java
│ │ ├── PlayerManager.java
│ │ ├── ProfileManager.java
│ │ ├── ReloadInfo.java
│ │ ├── ScriptManager.java
│ │ └── SkinManager.java
│ ├── mount/
│ │ ├── MountController.java
│ │ └── MountControllers.java
│ ├── nms/
│ │ ├── AnimationBundler.java
│ │ ├── DisplayTransformer.java
│ │ ├── HitBox.java
│ │ ├── HitBoxListener.java
│ │ ├── Identifiable.java
│ │ ├── ModAnimationBundler.java
│ │ ├── ModelDisplay.java
│ │ ├── ModelInteractionHand.java
│ │ ├── ModelNametag.java
│ │ ├── NMS.java
│ │ ├── NMSVersion.java
│ │ ├── PacketBundler.java
│ │ ├── PlayerChannelHandler.java
│ │ └── Profiled.java
│ ├── pack/
│ │ ├── PackAssets.java
│ │ ├── PackBuilder.java
│ │ ├── PackBuiltInAssets.java
│ │ ├── PackByte.java
│ │ ├── PackMeta.java
│ │ ├── PackNamespace.java
│ │ ├── PackObfuscator.java
│ │ ├── PackOverlay.java
│ │ ├── PackPath.java
│ │ ├── PackResource.java
│ │ ├── PackResult.java
│ │ └── PackZipper.java
│ ├── platform/
│ │ ├── PlatformAdapter.java
│ │ ├── PlatformBillboard.java
│ │ ├── PlatformEntity.java
│ │ ├── PlatformItemStack.java
│ │ ├── PlatformItemTransform.java
│ │ ├── PlatformLivingEntity.java
│ │ ├── PlatformLocation.java
│ │ ├── PlatformNamespace.java
│ │ ├── PlatformOfflinePlayer.java
│ │ ├── PlatformPlayer.java
│ │ ├── PlatformRegionHolder.java
│ │ └── PlatformWorld.java
│ ├── player/
│ │ ├── PlayerLimb.java
│ │ └── PlayerSkinParts.java
│ ├── profile/
│ │ ├── ModelProfile.java
│ │ ├── ModelProfileInfo.java
│ │ ├── ModelProfileSkin.java
│ │ └── ModelProfileSupplier.java
│ ├── scheduler/
│ │ ├── ModelScheduler.java
│ │ └── ModelTask.java
│ ├── script/
│ │ ├── AnimationScript.java
│ │ ├── BlueprintScript.java
│ │ ├── ScriptBuilder.java
│ │ └── TimeScript.java
│ ├── skin/
│ │ └── SkinData.java
│ ├── tracker/
│ │ ├── DummyTracker.java
│ │ ├── EntityBodyRotator.java
│ │ ├── EntityHideOption.java
│ │ ├── EntityTracker.java
│ │ ├── EntityTrackerRegistry.java
│ │ ├── ModelRotation.java
│ │ ├── ModelRotator.java
│ │ ├── ModelScaler.java
│ │ ├── PlayerTracker.java
│ │ ├── Tracker.java
│ │ ├── TrackerAnimation.java
│ │ ├── TrackerBuiltInAnimation.java
│ │ ├── TrackerData.java
│ │ ├── TrackerExtraAnimation.java
│ │ ├── TrackerModifier.java
│ │ └── TrackerUpdateAction.java
│ ├── util/
│ │ ├── CollectionUtil.java
│ │ ├── EntityUtil.java
│ │ ├── EventUtil.java
│ │ ├── FunctionUtil.java
│ │ ├── HttpUtil.java
│ │ ├── InterpolationUtil.java
│ │ ├── LogUtil.java
│ │ ├── MathUtil.java
│ │ ├── PackUtil.java
│ │ ├── ReflectionUtil.java
│ │ ├── TransformedItemStack.java
│ │ ├── collection/
│ │ │ ├── PriorityMap.java
│ │ │ └── SingletonSequencedSet.java
│ │ ├── function/
│ │ │ ├── BonePredicate.java
│ │ │ ├── BooleanConstantSupplier.java
│ │ │ ├── Float2FloatConstantFunction.java
│ │ │ ├── Float2FloatFunction.java
│ │ │ ├── FloatConstantFunction.java
│ │ │ ├── FloatConstantSupplier.java
│ │ │ ├── FloatFunction.java
│ │ │ └── FloatSupplier.java
│ │ ├── interpolator/
│ │ │ └── VectorInterpolator.java
│ │ ├── json/
│ │ │ ├── JsonArrayBuilder.java
│ │ │ └── JsonObjectBuilder.java
│ │ ├── lazy/
│ │ │ └── LazyFloatProvider.java
│ │ └── lock/
│ │ ├── DuplexLock.java
│ │ └── SingleLock.java
│ └── version/
│ └── MinecraftVersion.java
├── build.gradle.kts
├── buildSrc/
│ ├── build.gradle.kts
│ ├── settings.gradle.kts
│ └── src/
│ └── main/
│ └── kotlin/
│ ├── Extensions.kt
│ ├── bukkit-conventions.gradle.kts
│ ├── modrinth-conventions.gradle.kts
│ ├── paperweight-conventions.gradle.kts
│ ├── plugin-conventions.gradle.kts
│ ├── publish-conventions.gradle.kts
│ └── standard-conventions.gradle.kts
├── changelog/
│ ├── 3.0.1.md
│ ├── 3.0.2.md
│ ├── v1/
│ │ ├── 1.10.0.md
│ │ ├── 1.10.1.md
│ │ ├── 1.10.2.md
│ │ ├── 1.10.3.md
│ │ ├── 1.11.0.md
│ │ ├── 1.11.1.md
│ │ ├── 1.11.2.md
│ │ ├── 1.11.3.md
│ │ ├── 1.11.4.md
│ │ ├── 1.12.0.md
│ │ ├── 1.12.1.md
│ │ ├── 1.13.0.md
│ │ ├── 1.13.1.md
│ │ ├── 1.13.2.md
│ │ ├── 1.13.3.md
│ │ ├── 1.13.4.md
│ │ ├── 1.14.0.md
│ │ ├── 1.14.1.md
│ │ ├── 1.14.2.md
│ │ ├── 1.15.0.md
│ │ ├── 1.15.1.md
│ │ ├── 1.15.2.md
│ │ ├── 1.3.2.md
│ │ ├── 1.3.3.md
│ │ ├── 1.4.1.md
│ │ ├── 1.4.2.md
│ │ ├── 1.4.3.md
│ │ ├── 1.4.md
│ │ ├── 1.5.1.md
│ │ ├── 1.5.2.md
│ │ ├── 1.5.3.md
│ │ ├── 1.5.4.md
│ │ ├── 1.5.5.md
│ │ ├── 1.5.md
│ │ ├── 1.6.0.md
│ │ ├── 1.6.1.md
│ │ ├── 1.7.0.md
│ │ ├── 1.8.0.md
│ │ ├── 1.8.1.md
│ │ ├── 1.9.0.md
│ │ ├── 1.9.1.md
│ │ ├── 1.9.2.md
│ │ └── 1.9.3.md
│ ├── v2/
│ │ ├── 2.0.0-pre1.md
│ │ ├── 2.0.0-pre2.md
│ │ ├── 2.0.0.md
│ │ ├── 2.0.1.md
│ │ ├── 2.1.0.md
│ │ └── 2.2.0.md
│ └── v3/
│ └── 3.0.0.md
├── core/
│ ├── build.gradle.kts
│ ├── bukkit-core/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ ├── AbstractBetterModelPlugin.java
│ │ │ ├── BetterModelLibrary.java
│ │ │ └── BetterModelLibraryManager.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ ├── BetterModelConfigImpl.kt
│ │ ├── BetterModelPlugin.kt
│ │ ├── BetterModelProperties.kt
│ │ ├── BukkitModelEventBusImpl.kt
│ │ ├── audience/
│ │ │ ├── AudiencePlayer.kt
│ │ │ ├── AudienceSender.kt
│ │ │ └── BukkitAudience.kt
│ │ ├── command/
│ │ │ └── Commands.kt
│ │ ├── compatibility/
│ │ │ ├── Compatibility.kt
│ │ │ ├── citizens/
│ │ │ │ ├── CitizensCompatibility.kt
│ │ │ │ ├── command/
│ │ │ │ │ ├── AnimateCommand.kt
│ │ │ │ │ ├── LimbCommand.kt
│ │ │ │ │ └── ModelCommand.kt
│ │ │ │ └── trait/
│ │ │ │ └── ModelTrait.kt
│ │ │ ├── mythicmobs/
│ │ │ │ ├── MythicMobsCompatibility.kt
│ │ │ │ ├── MythicMobsValue.kt
│ │ │ │ ├── condition/
│ │ │ │ │ └── ModelHasPassengerCondition.kt
│ │ │ │ ├── mechanic/
│ │ │ │ │ ├── AbstractSkillMechanic.kt
│ │ │ │ │ ├── BillboardMechanic.kt
│ │ │ │ │ ├── BindHitBoxMechanic.kt
│ │ │ │ │ ├── BodyRotationMechanic.kt
│ │ │ │ │ ├── BrightnessMechanic.kt
│ │ │ │ │ ├── ChangePartMechanic.kt
│ │ │ │ │ ├── DefaultStateMechanic.kt
│ │ │ │ │ ├── DismountAllModelMechanic.kt
│ │ │ │ │ ├── DismountModelMechanic.kt
│ │ │ │ │ ├── EnchantMechanic.kt
│ │ │ │ │ ├── GlowMechanic.kt
│ │ │ │ │ ├── LockModelMechanic.kt
│ │ │ │ │ ├── ModelMechanic.kt
│ │ │ │ │ ├── MountModelMechanic.kt
│ │ │ │ │ ├── PairModelMechanic.kt
│ │ │ │ │ ├── PartVisibilityMechanic.kt
│ │ │ │ │ ├── PlayLimbAnimMechanic.kt
│ │ │ │ │ ├── RemapModelMechanic.kt
│ │ │ │ │ ├── StateMechanic.kt
│ │ │ │ │ └── TintMechanic.kt
│ │ │ │ └── targeter/
│ │ │ │ └── ModelPartTargeter.kt
│ │ │ ├── nexo/
│ │ │ │ └── NexoCompatibility.kt
│ │ │ └── skinsrestorer/
│ │ │ └── SkinsRestorerCompatibility.kt
│ │ ├── configuration/
│ │ │ └── PluginConfiguration.kt
│ │ ├── manager/
│ │ │ ├── CompatibilityManager.kt
│ │ │ ├── EntityManager.kt
│ │ │ └── PlayerManagerImpl.kt
│ │ ├── scheduler/
│ │ │ ├── BukkitScheduler.kt
│ │ │ └── PaperScheduler.kt
│ │ └── util/
│ │ ├── BukkitWrappers.kt
│ │ ├── Entities.kt
│ │ ├── Events.kt
│ │ ├── Plugins.kt
│ │ ├── Senders.kt
│ │ └── Yamls.kt
│ └── src/
│ └── main/
│ ├── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── BetterModelPlatformImpl.java
│ ├── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ ├── BetterModelEvaluatorImpl.kt
│ │ ├── BetterModelEventBusImpl.kt
│ │ ├── command/
│ │ │ ├── CommandBuildContext.kt
│ │ │ ├── CommandBuilder.kt
│ │ │ ├── CommandExtensions.kt
│ │ │ └── CommandLike.kt
│ │ ├── manager/
│ │ │ ├── ArmorManager.kt
│ │ │ ├── GlobalManager.kt
│ │ │ ├── ModelManagerImpl.kt
│ │ │ ├── ProfileManagerImpl.kt
│ │ │ ├── ReloadPipeline.kt
│ │ │ ├── ScriptManagerImpl.kt
│ │ │ ├── SkinManagerImpl.kt
│ │ │ └── debug/
│ │ │ ├── BossBarIndicator.kt
│ │ │ └── ReloadIndicator.kt
│ │ ├── profile/
│ │ │ ├── DefaultHttpModelProfileSupplier.kt
│ │ │ └── HttpModelProfileSupplier.kt
│ │ ├── script/
│ │ │ ├── BrightnessScript.kt
│ │ │ ├── ChangePartScript.kt
│ │ │ ├── EnchantScript.kt
│ │ │ ├── PartVisibilityScript.kt
│ │ │ ├── RemapScript.kt
│ │ │ └── TintScript.kt
│ │ └── util/
│ │ ├── Buffers.kt
│ │ ├── Collections.kt
│ │ ├── Events.kt
│ │ ├── Files.kt
│ │ ├── Functions.kt
│ │ ├── Gsons.kt
│ │ ├── Indicators.kt
│ │ ├── Packs.kt
│ │ ├── Platforms.kt
│ │ ├── Scripts.kt
│ │ └── Senders.kt
│ └── resources/
│ ├── blue_wizard.bbmodel
│ ├── config.yml
│ ├── demon_knight.bbmodel
│ └── steve.bbmodel
├── gradle/
│ ├── libs.versions.toml
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── nms/
│ ├── v1_21_R3/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R3/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R3/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R4/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R4/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R4/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R5/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R5/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R5/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R6/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R6/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R6/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R7/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R7/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R7/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ └── v26_R1/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v26_R1/
│ │ └── AbstractHitBox.java
│ └── kotlin/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── bukkit/
│ └── nms/
│ └── v26_R1/
│ ├── BaseEntityImpl.kt
│ ├── BasePlayerImpl.kt
│ ├── BukkitWrappers.kt
│ ├── EntityData.kt
│ ├── Functions.kt
│ ├── HitBoxImpl.kt
│ ├── HitBoxInteraction.kt
│ ├── ModAnimationBundlerImpl.kt
│ ├── ModelDamageSourceImpl.kt
│ ├── ModelDisplayImpl.kt
│ ├── ModelGameProfile.kt
│ ├── ModelNametagImpl.kt
│ ├── NMSImpl.kt
│ ├── PacketBundlers.kt
│ ├── PlayerArmorImpl.kt
│ ├── ProfiledImpl.kt
│ └── TypeAliases.kt
├── platform/
│ ├── fabric/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── kr/
│ │ │ │ └── toxicity/
│ │ │ │ └── model/
│ │ │ │ ├── impl/
│ │ │ │ │ └── fabric/
│ │ │ │ │ ├── entity/
│ │ │ │ │ │ ├── AbstractArmorStand.java
│ │ │ │ │ │ └── EntityHook.java
│ │ │ │ │ └── network/
│ │ │ │ │ └── BetterModelBundlePacket.java
│ │ │ │ └── mixin/
│ │ │ │ ├── AvatarAccessor.java
│ │ │ │ ├── ClientboundBundlePacketMixin.java
│ │ │ │ ├── ConnectionAccessor.java
│ │ │ │ ├── DisplayAccessor.java
│ │ │ │ ├── EntityAccessor.java
│ │ │ │ ├── EntityMixin.java
│ │ │ │ ├── ItemDisplayAccessor.java
│ │ │ │ ├── LivingEntityMixin.java
│ │ │ │ ├── MobAccessor.java
│ │ │ │ ├── ServerCommonPacketListenerImplAccessor.java
│ │ │ │ ├── ServerLevelEntityCallbacksMixin.java
│ │ │ │ └── SynchedEntityDataAccessor.java
│ │ │ ├── kotlin/
│ │ │ │ └── kr/
│ │ │ │ └── toxicity/
│ │ │ │ └── model/
│ │ │ │ └── impl/
│ │ │ │ └── fabric/
│ │ │ │ ├── BetterModelFabricImpl.kt
│ │ │ │ ├── BetterModelLoggerImpl.kt
│ │ │ │ ├── BetterModelNMSImpl.kt
│ │ │ │ ├── Constants.kt
│ │ │ │ ├── Entities.kt
│ │ │ │ ├── FabricWrappers.kt
│ │ │ │ ├── Functions.kt
│ │ │ │ ├── armor/
│ │ │ │ │ └── PlayerArmorImpl.kt
│ │ │ │ ├── attachment/
│ │ │ │ │ └── BetterModelAttachments.kt
│ │ │ │ ├── audience/
│ │ │ │ │ ├── AudienceCommandSource.kt
│ │ │ │ │ ├── AudiencePlayer.kt
│ │ │ │ │ └── AudienceSourceStack.kt
│ │ │ │ ├── chat/
│ │ │ │ │ └── Components.kt
│ │ │ │ ├── command/
│ │ │ │ │ └── Commands.kt
│ │ │ │ ├── config/
│ │ │ │ │ └── BetterModelConfigImpl.kt
│ │ │ │ ├── entity/
│ │ │ │ │ ├── BaseFabricEntityImpl.kt
│ │ │ │ │ ├── BaseFabricPlayerImpl.kt
│ │ │ │ │ ├── DisplayTransformerImpl.kt
│ │ │ │ │ ├── HitBoxEntityImpl.kt
│ │ │ │ │ ├── InteractionEntityImpl.kt
│ │ │ │ │ ├── ModelDisplayEntityImpl.kt
│ │ │ │ │ ├── ModelNametagImpl.kt
│ │ │ │ │ ├── PlayerChannelHandlerImpl.kt
│ │ │ │ │ ├── ProfiledImpl.kt
│ │ │ │ │ └── TransformationData.kt
│ │ │ │ ├── events/
│ │ │ │ │ ├── ServerEntityDismountCallback.kt
│ │ │ │ │ ├── ServerLivingEntityJumpCallback.kt
│ │ │ │ │ ├── ServerMobEffectLoadCallback.kt
│ │ │ │ │ └── ServerMobEffectUnloadCallback.kt
│ │ │ │ ├── manager/
│ │ │ │ │ ├── EntityManager.kt
│ │ │ │ │ ├── PlayerManagerImpl.kt
│ │ │ │ │ └── Syncers.kt
│ │ │ │ ├── network/
│ │ │ │ │ ├── ModAnimationBundlerImpl.kt
│ │ │ │ │ ├── PacketBundlers.kt
│ │ │ │ │ └── Packets.kt
│ │ │ │ ├── profile/
│ │ │ │ │ └── ModelProfileImpl.kt
│ │ │ │ ├── scheduler/
│ │ │ │ │ └── FabricModelSchedulerImpl.kt
│ │ │ │ └── world/
│ │ │ │ ├── Chunks.kt
│ │ │ │ └── damagesource/
│ │ │ │ └── ModelDamageSourceImpl.kt
│ │ │ └── resources/
│ │ │ ├── bettermodel.accesswidener
│ │ │ └── bettermodel.mixins.json
│ │ └── testmod/
│ │ ├── kotlin/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── test/
│ │ │ └── RollTest.kt
│ │ └── resources/
│ │ ├── knight.bbmodel
│ │ ├── knight_line.json
│ │ └── knight_sword.json
│ ├── paper/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── paper/
│ │ │ └── BetterModelLoader.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── paper/
│ │ └── BetterModelPaper.kt
│ └── spigot/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ └── kotlin/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── spigot/
│ └── BetterModelSpigot.kt
├── purpur/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ └── kotlin/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── bukkit/
│ └── purpur/
│ └── PurpurHook.kt
├── renovate.json
├── settings.gradle.kts
└── test-plugin/
├── build.gradle.kts
└── src/
└── main/
├── java/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── test/
│ ├── BetterModelTest.java
│ ├── FightTester.java
│ ├── ModelTester.java
│ └── RollTester.java
└── resources/
├── knight.bbmodel
├── knight_line.json
└── knight_sword.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://editorconfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 4
insert_final_newline = true
max_line_length = off
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
================================================
FILE: .github/CONTRIBUTING.md
================================================
## Contributing
Thanks for considering contributing!
* **Step 1.** Forks BetterModel to your repository.
* **Step 2.** Commits your change.
* **Step 3.** Opens pull request at 'dev' branch.
* **Step 4.** Waits for merging or reviewing
## Rule
* I can't handle a huge change about API module.
* You should note that type of your PR. (e.g., `Bug fix` / `API update`)
* You should inform your features that what you want to merge by this way.
```
Document
Image
Video
```
## 📄 Commit Message Format
Use present tense: `fix:`, `feat:`, `docs:`, etc.
## 📜 License
Contributions are under the MIT License.
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: [toxicity188]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: toxicity188
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Report a bug to help us improve BetterModel
title: "[Bug] "
labels: bug
assignees: toxicity188
---
### ✔️ Pre-check
- [ ] Tested with the **latest snapshot** of BetterModel from [Modrinth](https://modrinth.com/plugin/bettermodel)
- [ ] Confirmed the issue occurs **without** other optional/experimental plugins or clients (see Disclaimer below)
---
### 🐞 Problem Description
Detailed information about your problem.
---
### 📜 Server Log
Your error log if exists.
---
### 🖼️ Screenshot / Video
Your in-game screenshot.
---
### 🧪 Test Model / Code
Upload the model, resource pack, or test code that can reproduce the issue if possible.
---
### 🌍 Environment
- OS: (Windows, Linux, etc.)
- Server software & version: (Paper 1.21.1, etc.)
---
```
Disclaimer
The following environments are not supported, and issues occurring under these conditions will not be handled:
- Informal / modified launchers (e.g., Feather client)
- Closed-source mods/plugins (Optifine, ItemsAdder, Nexo, etc.)
- Hybrid server platforms (e.g., Arclight)
```
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea or enhancement for BetterModel
title: "[Feature] "
labels: help wanted
assignees: toxicity188
---
### 🐞 Feature Description
Describe the feature you want to request.
Explain **what problem this feature solves**, **why it's needed**, and **how you expect it to work**.
---
### 🧪 Example / Mock-up (Optional)
Provide model files, resource packs, code snippets, or conceptual mock-ups that help illustrate the idea.
---
### 🌍 Environment (Optional but Helpful)
- Server software & version:
- BetterModel version:
- Java version:
---
```
Disclaimer
The following environments are not supported, and feature requests relying on these conditions will not be considered:
- Informal / modified launchers (e.g., Feather Client)
- Closed-source mods/plugins (Optifine, ItemsAdder, Nexo, etc.)
- Hybrid server platforms (e.g., Arclight)
- Legacy server versions (1.20.1 or lower)
- Bedrock Edition
- Extremely outdated CPU / hardware
- Features fundamentally **impossible on server-side** due to engine or protocol limitations
```
================================================
FILE: .github/workflows/package.yml
================================================
name: Package plugin
on:
push:
branches: [ "master", "v2", "v3" ]
permissions:
contents: read
packages: write
deployments: write
jobs:
build:
runs-on: ubuntu-latest
env:
SIGNING_KEY: ${{ secrets.SIGNING_KEY }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
PACKAGES_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BUILD_NUMBER: ${{ github.run_number }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
steps:
- uses: actions/checkout@v6
- name: Set up JDK 25
uses: actions/setup-java@v5
with:
java-version: '25'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Create Deployment
id: deployment
run: |
response=$(curl -s -X POST \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/${{ github.repository }}/deployments \
-d '{
"ref": "master",
"auto_merge": false,
"required_contexts": [],
"payload": "{ \"timestamp\": \"'$(date +%s)'\" }",
"environment": "github-packages",
"transient_environment": false,
"description": "Publishing to GitHub Packages"
}')
echo "$response"
deployment_id=$(echo "$response" | jq -r '.id')
echo "id=$deployment_id" >> $GITHUB_OUTPUT
shell: bash
- name: Publish package
run: ./gradlew publishAllPublicationToGitHubPackagesRepository --stacktrace
- name: Set Deployment Status (success)
if: success()
run: |
curl -X POST \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/${{ github.repository }}/deployments/${{ steps.deployment.outputs.id }}/statuses \
-d '{"state":"success","environment_url":"https://github.com/${{ github.repository }}/packages","description":"Deployment succeeded"}'
shell: bash
- name: Set Deployment Status (failure)
if: failure()
run: |
curl -X POST \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github+json" \
https://api.github.com/repos/${{ github.repository }}/deployments/${{ steps.deployment.outputs.id }}/statuses \
-d '{"state":"failure","environment_url":"https://github.com/${{ github.repository }}/packages","description":"Deployment failed"}'
shell: bash
================================================
FILE: .github/workflows/pr-test.yml
================================================
name: PR Test
on:
pull_request:
branches: [ "dev", "v2-dev", "v3-dev" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up JDK 25
uses: actions/setup-java@v5
with:
java-version: '25'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build --stacktrace
- name: Run Tests
run: ./gradlew test --stacktrace
================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish plugin
on:
push:
branches: [ "master", "v2", "v3" ]
permissions:
contents: read
jobs:
build:
if: "!contains(github.event.head_commit.message, '[publish skip]')"
runs-on: ubuntu-latest
env:
HANGAR_API_TOKEN: ${{ secrets.HANGAR_API_TOKEN }}
MODRINTH_API_TOKEN: ${{ secrets.MODRINTH_API_TOKEN }}
BUILD_NUMBER: ${{ github.run_number }}
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
steps:
- uses: actions/checkout@v6
- name: Set up JDK 25
uses: actions/setup-java@v5
with:
java-version: '25'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build all file
run: ./gradlew build --stacktrace
- name: Publish to Modrinth
run: ./gradlew modrinth --stacktrace
- name: Publish to Hangar
run: ./gradlew publishPluginPublicationToHangar --stacktrace
================================================
FILE: .gitignore
================================================
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
### IntelliJ IDEA ###
.idea/*
!.idea/codeStyles
!.idea/inspectionProfiles
!.idea/icon.png
### Kotlin ###
.kotlin
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
### Minecraft ###
run/
plugins/
================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>
================================================
FILE: AGENTS.md
================================================
# BetterModel AGENT GUIDE (for Codex, Gemini, and other LLM agents)
This document defines repository-wide operating rules for automated contributors.
Scope: entire repository unless a deeper AGENTS.md overrides this file.
## 0) Mission and Priorities
- Primary mission: act as a maintenance assistant for safe updates and long-term stability.
- Prioritize documentation quality, API clarity, and compatibility over refactoring.
- Do not introduce architectural churn or speculative abstractions.
- Prefer minimal, reversible changes that preserve current behavior.
---
## 1) Module Responsibilities
### MUST
- Respect module boundaries:
- `api`: architecture contracts, data definitions, pure logic, interfaces, domain exceptions.
- `core`: implementation of `api`, orchestration, external I/O integration.
- `platform/*`: platform packaging and platform-specific business integration using `core`.
- `nms/*`: Minecraft-version-specific low-level adapters only.
- Keep dependency direction one-way where possible: `api -> core -> platform/nms` usage semantics.
- If a feature needs cross-module changes, start from `api` contract, then implement in `core`, then bind in `platform`.
### FORBIDDEN
- Do not place platform/runtime-specific details in `api`.
- Do not move business logic into `nms` unless version coupling is unavoidable.
- Do not bypass module contracts with ad-hoc cross-module shortcuts.
---
## 2) Language and File Placement Rules
### MUST
- Use Modern Java (language level 25) and Kotlin.
- `api` module is Java-only for production code (Kotlin DSL build scripts are allowed).
- Non-`api` modules should be Kotlin-first unless existing local code is explicitly Java-bound (e.g., mixin/accessor interop).
- Follow existing package root `kr.toxicity.model...` and module-specific suffixes.
### FORBIDDEN
- Do not add Kotlin source files to `api/src/main`.
- Do not introduce new language stacks or code generators without explicit request.
---
## 3) Allowed vs Forbidden Change Rules
### MUST
- Preserve existing behavior unless the task explicitly requests behavior change.
- Match local style of touched files (imports, naming, nullability annotations, formatting).
- Keep diffs small and scoped to the requested issue.
- Update/extend Javadoc when touching public Java APIs.
### RECOMMENDED
- Prefer additive changes over invasive rewrites.
- Prefer extension/composition over inheritance.
### FORBIDDEN
- No drive-by refactors.
- No broad renaming/reformatting-only commits mixed with functional changes.
- No “cleanup” changes unrelated to the requested task.
---
## 4) Code Patterns and Conventions
### Java rules
#### MUST
- Add English Javadoc for public API types/methods.
- Use `var` for local variables where legal and clear.
- When using primitive-key/value collections, prefer fastutil specialized types over boxed `java.util` alternatives.
- Declare classes `final` when inheritance is not intended.
- Use `of(...)` for factory method naming.
- Prefer enum-based singleton pattern when a singleton is required.
#### RECOMMENDED
- Prefer `record` for immutable data carriers.
- Interface-based API should expose its own factory method where practical.
#### DISCOURAGED
- Inheritance-heavy designs.
#### FORBIDDEN
- Do not depend on Kotlin classes from Java in `api`.
### Kotlin rules
#### MUST
- For Boolean arguments in calls, use named arguments (`parameter = value`) where available.
- Keep Kotlin style concise and explicit; avoid hidden side effects.
#### RECOMMENDED
- Avoid `abstract class` when interface + default methods or delegation works.
#### FORBIDDEN
- No Kotlin production code in `api` module.
---
## 5) Javadoc Policy
### MUST
- English only.
- Use `@since` matching current `gradle.properties` project version policy.
- Include `@return` for non-void methods.
- For records, document all components using `@param` at type level.
- Include `@throws` for throw-capable public methods.
- Public API docs must include a usage example (`@example` or code block).
- Keep terminology consistent with project domain (Molang, item_display, packet-based rendering, etc.).
---
## 6) Exception Handling Policy
### MUST
- Domain exceptions must be declared in `api` and reused by `core/platform`.
- Use unchecked exceptions for domain errors (`RuntimeException` subclasses).
- Prefer explicit domain exception types over anonymous `RuntimeException` for new logic.
### FORBIDDEN
- No new checked exceptions in public API surface unless explicitly requested.
- No swallowing exceptions without logging/context.
---
## 7) Architectural Boundary Enforcement
### MUST
- Enforce separation of concerns:
- parsing/model contracts in `api`
- orchestration and state management in `core`
- runtime platform hooks in `platform`
- protocol/version internals in `nms`
- Keep NMS version modules behaviorally equivalent unless version-specific differences are required.
### FORBIDDEN
- Do not leak platform classes into generic API contracts.
- Do not duplicate core logic in multiple platform modules.
---
## 8) Change Management Principles
### MUST
- Before coding, identify smallest viable patch.
- Keep commits logically atomic.
- Use conventional commits (`docs:`, `fix:`, `refactor:`, `chore:`).
- Document why a change is necessary, not only what changed.
### RECOMMENDED
- Prefer one concern per PR.
- If migration is unavoidable, provide transitional compatibility notes.
---
## 9) Minimal Change Principle (Anti-Overengineering)
### MUST
- Solve the concrete problem only.
- Reuse existing utilities/conventions before introducing new abstractions.
- Avoid framework-like internal layers unless repeatedly justified by current code.
### FORBIDDEN
- No speculative extensibility.
- No premature optimization without evidence.
---
## 10) Backward Compatibility Policy
### MUST
- Preserve existing public API behavior by default.
- Treat changes to signatures, semantics, serialization shape, config keys, and command contracts as breaking.
- For unavoidable breaking changes: document impact, migration path, and versioning intent.
### RECOMMENDED
- Prefer deprecation + transition period over hard removal.
---
## 11) Dependency Introduction Policy
### MUST
- Prefer existing dependencies and in-repo utilities.
- Any new dependency requires clear justification: purpose, scope, size, and maintenance cost.
- Add dependency versions through central version catalog/patterns already in use.
### FORBIDDEN
- Do not add dependencies for trivial utilities already present in JDK/Kotlin stdlib/current stack.
- Do not introduce overlapping libraries providing the same capability.
---
## 12) Diff and PR Format Guidelines
### MUST
- Keep PRs reviewable: focused scope, clear title, concise rationale.
- Include:
- summary of changes
- impacted modules
- compatibility notes
- tests/checks run
- Separate mechanical formatting from logic changes whenever possible.
### RECOMMENDED
- Use checklist format for validation and risk points.
---
## 13) Test Policy
### MUST
- Run the most relevant checks for touched modules.
- Validate both compile-time and behavior-level impact where feasible.
- If tests are absent, run targeted build/lint/verification tasks and report limitations.
### RECOMMENDED
- Prefer adding focused tests only when directly related to changed behavior.
- Keep test fixtures lightweight; do not add broad test frameworks without request.
---
## 14) Existing Code Precedence Rule
### MUST
- Existing local code patterns take precedence over generic best practices when conflicts arise.
- Follow deeper-scope AGENTS.md if present.
- If repository reality conflicts with this guide, preserve behavior first and propose policy alignment separately.
### FORBIDDEN
- Do not force style unification across untouched files.
---
## 15) Final Operational Checklist
Before finishing, verify:
- Scope is minimal and task-aligned.
- Module boundaries are respected.
- Public API docs are updated (if touched).
- Exception policy and compatibility policy are respected.
- Changes are validated with relevant checks.
- PR description contains rationale, risks, and verification results.
================================================
FILE: BANNER.md
================================================
<div align="center">

# BetterModel
*- Modern Bedrock model engine for Minecraft Java Edition -*
[](https://modrinth.com/plugin/bettermodel)
[](https://hangar.papermc.io/toxicity188/BetterModel)
[](https://github.com/toxicity188/BetterModel)
</div>
* * *


* * *
<sub>(In BlockBench / In Minecraft)</sub>
# ✨ What is BetterModel?
**BetterModel** is a server-based engine that provides runtime BlockBench model rendering & animating for Minecraft Java Edition.
It implements **fully server-side 3D models** by using an item display entity packet.
- Importing Generic BlockBench model `.bbmodel`
- Auto-generating resource pack
- Playing animation
- Syncing with base entity
- Custom hit box
- 12-limb player animation
## 🚀 Comparison with ModelEngine
The main reason I created it is:
- To reduce network cost—MEG’s network optimization is outdated and insufficient for modern servers.
- To enable faster updates—We can’t afford to wait for MEG’s slow update cycle anymore.
- To provide a more flexible API—MEG is closed-source with a very limited API, which makes extending or integrating difficult.
- To restore vanilla behavior-MEG breaks several vanilla entity features and physics, which this project aims to fix.
Also, you can refer [my document](https://github.com/toxicity188/BetterModel/wiki/Compare-with-ModelEngine) to compare both ModelEngine and BetterModel.
## 🌎 Generic BlockBench model with animation

* * *
[](https://youtu.be/f3U7Lmo3aA8?si=SnglL0YKn20CrR7Y)
BetterModel supports Generic BlockBench models with full animation.
#### Custom hitbox
* * *

* * *
BetterModel provides **custom hitbox** both client and server. (tracking animation rotation)
#### MythicMobs support
* * *

* * *
Like MEG, BetterModel supports **MythicMobs**, you can use some MEG's mechanics in BetterModel too.
## 💡 Player model with animation


* * *
BetterModel supports **player model with using user's custom skin without textures**.
## 📚 Official wiki
[](https://github.com/toxicity188/BetterModel/wiki)
## 🏗️ Supported environment
[](https://www.minecraft.net/en-us/download/server)
[](https://adoptium.net/)
### Bukkit
[](https://papermc.io/downloads/folia)
[](https://papermc.io/downloads/paper)
[](https://purpurmc.org/download/purpur)
[](https://www.spigotmc.org/)
### Mod
[](https://fabricmc.net/)
## 🌈 My community
[](https://discord.com/invite/rePyFESDbk)
## 📊 Project Stats (plugin)
[](https://bstats.org/plugin/bukkit/BetterModel/24237)
## 💖 Support my project
[](https://buymeacoffee.com/toxicity188)
[](https://github.com/sponsors/toxicity188)
[](https://www.paypal.com/paypalme/toxicity188?country.x=KR&locale.x=en_US)
================================================
FILE: LICENSE.md
================================================
MIT License
Copyright (c) 2024–2026 toxicity188
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: LICENSE_HEADER
================================================
This source file is part of BetterModel.
Copyright (c) ${CREATION_YEAR} toxicity188
Licensed under the MIT License.
See LICENSE.md file for full license text.
#year_selection file
================================================
FILE: README.md
================================================
<div align="center">

# BetterModel
*- Modern Bedrock model engine for Minecraft Java Edition -*
[](https://central.sonatype.com/artifact/io.github.toxicity188/bettermodel-api)
[](https://modrinth.com/plugin/bettermodel/versions)
[](https://github.com/toxicity188/BetterModel/issues)
[](https://bstats.org/plugin/bukkit/BetterModel/24237)
</div>
* * *


* * *
<sub>(In BlockBench / In Minecraft)</sub>
# ✨ Introduction
**BetterModel** is a server-based engine that provides runtime BlockBench model rendering & animating for Minecraft Java Edition.
It implements **fully server-side 3D models** by using an item display entity packet.
- Importing Generic BlockBench model `.bbmodel`
- Auto-generating resource pack
- Playing animation
- Syncing with base entity
- Custom hit box
- 12-limb player animation
<details>
<summary>In-Game Screenshots</summary>




</details>
## 🚀 Key Features & Focus
BetterModel aims to be a reliable engine that provides stable, high-quality animations for Paper-based high-traffic servers.
- **Stability First**: We take a conservative approach to feature expansion. By avoiding the implementation of features that are difficult to maintain or have limited use cases, we focus on providing a stable API and ensuring overall operational safety.
- **Performance Optimized**: Our goal is to minimize runtime computation, memory footprint, and network overhead. Through asynchronous design and optimized packet handling, we ensure the engine runs efficiently even under heavy server loads.
- **Tailored for Large-scale Servers**: We provide essential features specifically designed for high-population servers and MMORPG content creation.
- **Per-player Animation**: Individual animation control tailored to each player's perspective.
- **Player Model Animation**: Support for sophisticated 12-limb animations based on player models.
## 📚 Wiki
[](https://github.com/toxicity188/BetterModel/wiki)
[](https://deepwiki.com/toxicity188/BetterModel)
## 🛠️ Build info
[](https://www.minecraft.net/en-us/download/server)
[](https://adoptium.net/)
#### Build
[](https://gradle.org/)
`./gradlew build`: Builds all jars
`./gradlew shadowJar`: Builds plugin jar
`./gradlew javadocJar`: Builds Javadoc jar
`./gradlew runServer`: Runs Paper test server with test plugin
#### Library
- [Kotlin stdlib](https://github.com/JetBrains/kotlin): modern functional programming
- [semver4j](https://github.com/semver4j/semver4j): semver parser
- [cloud](https://github.com/Incendo/cloud-minecraft): command
- [adventure](https://github.com/KyoriPowered/adventure): component
- [stable player display](https://github.com/bradleyq/stable_player_display): player animation
- [caffeine](https://github.com/ben-manes/caffeine): concurrent map cache
- [DynamicUV](https://github.com/toxicity188/DynamicUV): player model
- [ArmorModel](https://github.com/toxicity188/ArmorModel): armor in player model
- [java-mesh](https://github.com/toxicity188/java-mesh): mesh rendering
- [molang-compiler](https://github.com/Ocelot5836/molang-compiler): compiling and evaluating molang expression
- [libby](https://github.com/AlessioDP/libby): runtime library downloader
#### Tested Bukkit Server Platform
- [Paper](https://papermc.io/downloads/paper)
- [Purpur](https://purpurmc.org/download/purpur)
- [Spigot](https://www.spigotmc.org/)
- [Folia](https://papermc.io/downloads/folia)
- [Leaf](https://www.leafmc.one/download)
- [Canvas](https://canvasmc.io/downloads/canvas)
#### Tested Mod Server Platform
- [Fabric Loader](https://fabricmc.net/)
## 💻 API
[](https://central.sonatype.com/artifact/io.github.toxicity188/bettermodel)
> [!NOTE]\
> For more detailed API specifications, please refer to our [GitHub Wiki](https://github.com/toxicity188/BetterModel/wiki/API-example).
<details open>
<summary>Gradle (Kotlin)</summary>
#### Release
```kotlin
repositories {
mavenCentral()
maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}
dependencies {
compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION") // bukkit(spigot, paper, etc) api
//api("io.github.toxicity188:bettermodel-fabric:VERSION") // mod(fabric)
}
```
#### Snapshot
```kotlin
repositories {
maven("https://maven.pkg.github.com/toxicity188/BetterModel") {
credentials {
username = YOUR_GITHUB_USERNAME
password = YOUR_GITHUB_TOKEN
}
}
maven("https://maven.blamejared.com/") // For transitive dependency in bettermodel-fabric
maven("https://maven.nucleoid.xyz/") // For transitive dependency in bettermodel-fabric
}
dependencies {
compileOnly("io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT") // bukkit(spigot, paper, etc) api
//api("io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT") // mod(fabric)
}
```
</details>
<details>
<summary>Gradle (Groovy)</summary>
#### Release
```groovy
repositories {
mavenCentral()
maven 'https://maven.blamejared.com/' // For transitive dependency in bettermodel-fabric
maven 'https://maven.nucleoid.xyz/' // For transitive dependency in bettermodel-fabric
}
dependencies {
compileOnly 'io.github.toxicity188:bettermodel-bukkit-api:VERSION' // bukkit(spigot, paper, etc) api
//api 'io.github.toxicity188:bettermodel-fabric:VERSION' // mod(fabric)
}
```
#### Snapshot
```groovy
repositories {
maven {
url "https://maven.pkg.github.com/toxicity188/BetterModel"
credentials {
username = YOUR_GITHUB_USERNAME
password = YOUR_GITHUB_TOKEN
}
}
maven 'https://maven.blamejared.com/' // For transitive dependency in bettermodel-fabric
maven 'https://maven.nucleoid.xyz/' // For transitive dependency in bettermodel-fabric
}
dependencies {
compileOnly 'io.github.toxicity188:bettermodel-bukkit-api:VERSION-SNAPSHOT' // bukkit(spigot, paper, etc) api
//api 'io.github.toxicity188:bettermodel-fabric:VERSION-SNAPSHOT' // mod(fabric)
}
```
</details>
<details>
<summary>Maven</summary>
#### Release
```xml
<repositories>
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.github.toxicity188</groupId>
<artifactId>bettermodel-bukkit-api</artifactId>
<version>VERSION</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
#### Snapshot
```xml
<repositories>
<repository>
<id>github</id>
<url>https://maven.pkg.github.com/toxicity188/BetterModel</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.github.toxicity188</groupId>
<artifactId>bettermodel-api</artifactId>
<version>VERSION-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>io.github.toxicity188</groupId>
<artifactId>bettermodel-bukkit-api</artifactId>
<version>VERSION-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
</details>
<details>
<summary>Example code</summary>
#### Gets some model or limb
```java
BetterModel.model("demon_knight"); //A model file in BetterModel/models (for general model with saving)
BetterModel.limb("steve"); //A model file in BetterModel/players (for player model with no saveing)
BetterModel.modelOrNull("demon_knight"); //general model or null
BetterModel.limbOrNull("steve"); //player model or null
```
#### Creates model (entity)
```java
EntityTracker tracker = BetterModel.model("demon_knight")
.map(r -> r.getOrCreate(BukkitAdapter.adapt(entity))) //Gets or creates entity tracker by this renderer to some entity.
.orElse(null);
```
```java
EntityTracker tracker = BetterModel.model("demon_knight")
.map(r -> r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -> t.update(TrackerUpdateAction.tint(0x0026FF)))) //Creates entity tracker with pre-spawn task.
.orElse(null);
```
#### Creates model (dummy)
```java
DummyTracker tracker = BetterModel.model("demon_knight")
.map(r -> r.create(BukkitAdapter.adapt(location))) //Creates some dummy tracker to this location.
.orElse(null);
```
```java
DummyTracker tracker = BetterModel.limb("steve")
.map(r -> r.create(BukkitAdapter.adapt(location), ModelProfile.of(BukkitAdapter.adapt(player)))) //Creates some dummy tracker to this location and player's skin profile.
.orElse(null);
```
#### Update some tracker's display data
```java
BetterModel.model("demon_knight")
.map(r -> r.create(BukkitAdapter.adapt(entity), TrackerModifier.DEFAULT, t -> {
t.update(TrackerUpdateAction.tint(rgb)); //Tint
t.update(TrackerUpdateAction.enchant(true), bone -> true); //Enchant with predicate
}))
.ifPresent(tracker -> tracker.update(TrackerUpdateAction.composite( //Composite
TrackerUpdateAction.brightness(15, 15) //Brightness
TrackerUpdateAction.billboard(Display.Billboard.CENTER) //Billboard
)));
}
```
</details>
## 💬 Community
[](https://discord.com/invite/rePyFESDbk)
## 💖 Support
[](https://buymeacoffee.com/toxicity188)
[](https://github.com/sponsors/toxicity188)
[](https://www.paypal.com/paypalme/toxicity188?country.x=KR&locale.x=en_US)
================================================
FILE: SECURITY.md
================================================
## Security Policy
BetterModel is a server-side 3D model engine that operates in an isolated environment without direct connections to external clients. As such, the risk of traditional security vulnerabilities is minimal.
#### Key Points
- 🔒 **No Client Connection**
BetterModel does not expose any network interface or accept input from external clients.
- 📦 **No Data Leakage**
Animation and bone data are handled on the server and are never sent to the client directly. Only processed vector packets are transmitted, which do not include raw model data.
- 🧱 **Model Privacy**
Your model files are converted into a Minecraft-compatible resource pack. During this conversion process, most of the original model information is stripped or transformed, minimizing the risk of leakage.
================================================
FILE: api/build.gradle.kts
================================================
plugins {
alias(libs.plugins.convention.publish)
}
dependencies {
compileOnly(libs.bundles.minecraft)
}
================================================
FILE: api/bukkit-api/build.gradle.kts
================================================
plugins {
alias(libs.plugins.convention.publish)
alias(libs.plugins.convention.bukkit)
}
dependencies {
api(project(":bettermodel-api"))
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/BetterModelBukkit.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit;
import kr.toxicity.model.api.BetterModel;
import kr.toxicity.model.api.BetterModelPlatform;
import kr.toxicity.model.api.bukkit.platform.BukkitAdapter;
import kr.toxicity.model.api.bukkit.scheduler.BukkitModelScheduler;
import org.jetbrains.annotations.NotNull;
import static kr.toxicity.model.api.util.ReflectionUtil.classExists;
/**
* Represents the Bukkit-specific platform interface for BetterModel.
* <p>
* This interface extends {@link BetterModelPlatform} to provide Bukkit-specific implementations
* for scheduling and entity adaptation.
* </p>
*
* @since 2.0.0
*/
public interface BetterModelBukkit extends BetterModelPlatform {
/**
* Checks if the server is running on the Folia platform.
* @since 2.0.0
*/
boolean IS_FOLIA = classExists("io.papermc.paper.threadedregions.RegionizedServer");
/**
* Checks if the server is running on the Purpur platform.
* @since 2.0.0
*/
boolean IS_PURPUR = classExists("org.purpurmc.purpur.PurpurConfig");
/**
* Checks if the server is running on the Paper platform (or a fork like Purpur/Folia).
* @since 2.0.0
*/
boolean IS_PAPER = IS_PURPUR || IS_FOLIA || classExists("io.papermc.paper.configuration.PaperConfigurations");
/**
* Returns the current {@link BetterModelBukkit} instance.
*
* @return the current platform instance
* @since 2.0.0
*/
static @NotNull BetterModelBukkit platform() {
return (BetterModelBukkit) BetterModel.platform();
}
/**
* Returns the Bukkit-specific scheduler.
*
* @return the scheduler
* @since 2.0.0
*/
@Override
@NotNull BukkitModelScheduler scheduler();
/**
* Returns the Bukkit-specific adapter.
*
* @return the adapter
* @since 2.0.0
*/
@Override
@NotNull BukkitAdapter adapter();
/**
* Returns the Bukkit-specific event bus.
*
* @return the event bus
* @since 2.0.0
*/
@Override
@NotNull BukkitModelEventBus eventBus();
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/BukkitModelEventBus.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit;
import kr.toxicity.model.api.BetterModelEventBus;
import kr.toxicity.model.api.bukkit.event.BukkitEventApplication;
import kr.toxicity.model.api.event.ModelEvent;
import kr.toxicity.model.api.event.ModelEventListener;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
/**
* A Bukkit-specific extension of the {@link BetterModelEventBus}.
* <p>
* This interface provides convenience methods for subscribing to events using a Bukkit {@link Plugin} instance.
* </p>
*
* @since 2.0.0
*/
public interface BukkitModelEventBus extends BetterModelEventBus {
/**
* Subscribes a consumer to a specific event type, associated with a Bukkit plugin.
*
* @param plugin the plugin that subscribes to the event
* @param eventClass the class of the event to subscribe to
* @param consumer the consumer to handle the event
* @param <T> the type of the event
* @return a listener handle that can be used to unregister the subscription
* @since 2.0.0
*/
@NotNull
default <T extends ModelEvent> ModelEventListener subscribe(@NotNull Plugin plugin, @NotNull Class<T> eventClass, @NotNull Consumer<T> consumer) {
return subscribe(BukkitEventApplication.of(plugin), eventClass, consumer);
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/entity/BaseBukkitEntity.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.entity;
import kr.toxicity.model.api.bukkit.platform.BukkitAdapter;
import kr.toxicity.model.api.bukkit.platform.BukkitEntity;
import kr.toxicity.model.api.entity.BaseEntity;
import kr.toxicity.model.api.util.TransformedItemStack;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.persistence.PersistentDataHolder;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
/**
* Represents a Bukkit-specific entity adapter.
* <p>
* This interface extends {@link BaseEntity} and {@link PersistentDataHolder} to provide
* access to the underlying Bukkit entity and its persistent data container.
* </p>
*
* @since 2.0.0
*/
public interface BaseBukkitEntity extends BaseEntity, PersistentDataHolder {
/**
* The namespaced key used for storing tracker data in the entity's persistent data container.
* @since 2.0.0
*/
@NotNull
NamespacedKey TRACKING_ID = Objects.requireNonNull(NamespacedKey.fromString("bettermodel_tracker"));
/**
* Returns the underlying Bukkit entity.
*
* @return the Bukkit entity
* @since 2.0.0
*/
default @NotNull Entity entity() {
return ((BukkitEntity) platform()).source();
}
/**
* Returns the item in the entity's main hand.
*
* @return the main hand item
* @since 2.0.0
*/
@Override
default @NotNull TransformedItemStack mainHand() {
if (entity() instanceof LivingEntity livingEntity) {
var equipment = livingEntity.getEquipment();
if (equipment != null) return TransformedItemStack.of(BukkitAdapter.adapt(equipment.getItemInMainHand()));
}
return TransformedItemStack.empty();
}
/**
* Returns the item in the entity's offhand.
*
* @return the offhand item
* @since 2.0.0
*/
@Override
default @NotNull TransformedItemStack offHand() {
if (entity() instanceof LivingEntity livingEntity) {
var equipment = livingEntity.getEquipment();
if (equipment != null) return TransformedItemStack.of(BukkitAdapter.adapt(equipment.getItemInOffHand()));
}
return TransformedItemStack.empty();
}
/**
* Retrieves the model data stored in the entity's persistent data container.
*
* @return the model data string, or null if not present
* @since 2.0.0
*/
default @Nullable String modelData() {
return getPersistentDataContainer().get(TRACKING_ID, PersistentDataType.STRING);
}
/**
* Stores the model data in the entity's persistent data container.
*
* @param modelData the model data string, or null to remove it
* @since 2.0.0
*/
default void modelData(@Nullable String modelData) {
var container = getPersistentDataContainer();
if (modelData == null) container.remove(TRACKING_ID);
else container.set(TRACKING_ID, PersistentDataType.STRING, modelData);
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/entity/BaseBukkitPlayer.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.entity;
import kr.toxicity.model.api.bukkit.platform.BukkitPlayer;
import kr.toxicity.model.api.entity.BasePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Bukkit-specific player adapter.
* <p>
* This interface extends {@link BaseBukkitEntity} and {@link BasePlayer} to provide
* access to the underlying Bukkit player.
* </p>
*
* @since 2.0.0
*/
public interface BaseBukkitPlayer extends BaseBukkitEntity, BasePlayer {
/**
* Returns the underlying Bukkit player.
*
* @return the Bukkit player
* @since 2.0.0
*/
@Override
default @NotNull Player entity() {
return ((BukkitPlayer) platform()).source();
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/event/BetterModelBukkitEvent.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.event;
import kr.toxicity.model.api.event.ModelEvent;
import org.bukkit.Bukkit;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* A wrapper class that adapts {@link ModelEvent} to Bukkit's {@link Event} system.
* <p>
* This allows Bukkit plugins to listen for BetterModel events using the standard Bukkit event API.
* The underlying {@link ModelEvent} is lazily initialized when accessed.
* </p>
*
* @since 2.0.0
*/
public final class BetterModelBukkitEvent extends Event {
private static final HandlerList HANDLER_LIST = new HandlerList();
private final Class<? extends ModelEvent> eventClass;
private final @NotNull Supplier<? extends ModelEvent> supplier;
private volatile ModelEvent source;
/**
* Creates a new BetterModelBukkitEvent.
*
* @param eventClass the class of the model event
* @param supplier a supplier that creates the model event
* @since 2.0.0
*/
@ApiStatus.Internal
public BetterModelBukkitEvent(@NotNull Class<? extends ModelEvent> eventClass, @NotNull Supplier<? extends ModelEvent> supplier) {
super(!Bukkit.isPrimaryThread());
this.eventClass = eventClass;
this.supplier = supplier;
}
/**
* Checks if the wrapped event is an instance of the specified class.
*
* @param eventClass the class to check against
* @param <T> the type of the event
* @return true if the wrapped event is assignable to the class
* @since 2.0.0
*/
public <T extends ModelEvent> boolean is(@NotNull Class<T> eventClass) {
return eventClass.isAssignableFrom(this.eventClass);
}
/**
* Casts the wrapped event to the specified class if possible.
* <p>
* This method initializes the underlying event if it hasn't been created yet.
* </p>
*
* @param eventClass the class to cast to
* @param <T> the type of the event
* @return the cast event, or null if the cast is not possible
* @since 2.0.0
*/
public <T extends ModelEvent> @Nullable T as(@NotNull Class<T> eventClass) {
if (!is(eventClass)) return null;
var event = source;
if (event == null) {
synchronized (this) {
event = source;
if (event == null) event = source = supplier.get();
}
}
return eventClass.cast(event);
}
/**
* Executes a consumer if the wrapped event is of the specified type.
*
* @param eventClass the class to check against
* @param consumer the consumer to execute
* @param <T> the type of the event
* @since 2.0.0
*/
public <T extends ModelEvent> void as(@NotNull Class<T> eventClass, @NotNull Consumer<? super T> consumer) {
var get = as(eventClass);
if (get != null) consumer.accept(get);
}
/**
* Returns the underlying model event, if initialized.
*
* @return the model event, or null if not yet initialized
* @since 2.0.0
*/
@ApiStatus.Internal
public @Nullable ModelEvent source() {
return source;
}
@Override
public @NotNull HandlerList getHandlers() {
return HANDLER_LIST;
}
/**
* Returns the handler list for this event.
*
* @return the handler list
* @since 2.0.0
*/
public static HandlerList getHandlerList() {
return HANDLER_LIST;
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/event/BukkitEventApplication.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.event;
import kr.toxicity.model.api.event.ModelEventApplication;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.lang.ref.WeakReference;
/**
* An implementation of {@link ModelEventApplication} for Bukkit plugins.
* <p>
* This record holds a weak reference to a Bukkit plugin to prevent memory leaks
* and checks if the plugin is enabled.
* </p>
*
* @param name the name of the plugin
* @param pluginRef a weak reference to the plugin instance
* @since 2.0.0
*/
public record BukkitEventApplication(@NotNull String name, @NotNull WeakReference<Plugin> pluginRef) implements ModelEventApplication {
/**
* Creates a new BukkitEventApplication for the given plugin.
*
* @param plugin the Bukkit plugin
* @return the event application wrapper
* @since 2.0.0
*/
public static @NotNull BukkitEventApplication of(@NotNull Plugin plugin) {
return new BukkitEventApplication(plugin.getName(), new WeakReference<>(plugin));
}
@Override
public boolean isEnabled() {
var get = pluginRef().get();
return get != null && get.isEnabled();
}
@Override
public boolean equals(Object o) {
if (!(o instanceof BukkitEventApplication that)) return false;
return name.equals(that.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitAdapter.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.bukkit.BetterModelBukkit;
import kr.toxicity.model.api.platform.*;
import org.bukkit.*;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
/**
* Provides an adapter for converting Bukkit objects to BetterModel platform objects.
* <p>
* This class implements {@link PlatformAdapter} and offers static utility methods for adapting
* entities, players, items, locations, and worlds.
* </p>
*
* @since 2.0.0
*/
public final class BukkitAdapter implements PlatformAdapter {
/**
* Adapts a Bukkit entity to a {@link PlatformEntity}.
*
* @param entity the Bukkit entity
* @return the platform entity
* @since 2.0.0
*/
public static @NotNull PlatformEntity adapt(@NotNull Entity entity) {
return new BukkitEntity(entity);
}
/**
* Adapts a Bukkit living entity to a {@link PlatformLivingEntity}.
*
* @param livingEntity the Bukkit living entity
* @return the platform living entity
* @since 2.0.0
*/
public static @NotNull PlatformLivingEntity adapt(@NotNull LivingEntity livingEntity) {
return new BukkitLivingEntity(livingEntity);
}
/**
* Adapts a Bukkit offline player to a {@link PlatformOfflinePlayer}.
*
* @param player the Bukkit offline player
* @return the platform offline player
* @since 2.0.0
*/
public static @NotNull PlatformOfflinePlayer adapt(@NotNull OfflinePlayer player) {
return new BukkitOfflinePlayer(player);
}
/**
* Adapts a Bukkit player to a {@link PlatformPlayer}.
*
* @param player the Bukkit player
* @return the platform player
* @since 2.0.0
*/
public static @NotNull PlatformPlayer adapt(@NotNull Player player) {
return new BukkitPlayer(player);
}
/**
* Adapts a Bukkit item stack to a {@link PlatformItemStack}.
*
* @param itemStack the Bukkit item stack
* @return the platform item stack
* @since 2.0.0
*/
public static @NotNull PlatformItemStack adapt(@NotNull ItemStack itemStack) {
return new BukkitItemStack(itemStack);
}
/**
* Adapts a Bukkit location to a {@link PlatformLocation}.
*
* @param location the Bukkit location
* @return the platform location
* @since 2.0.0
*/
public static @NotNull PlatformLocation adapt(@NotNull Location location) {
return new BukkitLocation(location);
}
/**
* Adapts a Bukkit world to a {@link PlatformWorld}.
*
* @param world the Bukkit world
* @return the platform world
* @since 2.0.0
*/
public static @NotNull PlatformWorld adapt(@NotNull World world) {
return new BukkitWorld(world);
}
@Override
public @Nullable PlatformPlayer player(@NotNull UUID uuid) {
var bukkit = Bukkit.getPlayer(uuid);
return bukkit != null ? adapt(bukkit) : null;
}
@Override
public @NotNull PlatformOfflinePlayer offlinePlayer(@NotNull UUID uuid) {
return adapt(Bukkit.getOfflinePlayer(uuid));
}
@Override
public int serverViewDistance() {
return Bukkit.getViewDistance();
}
@Override
public boolean isTickThread() {
return Bukkit.isPrimaryThread();
}
@Override
public boolean isRegionSafe() {
return !BetterModelBukkit.IS_FOLIA || isTickThread();
}
@Override
public @NotNull PlatformItemStack air() {
return adapt(new ItemStack(Material.AIR));
}
@Override
public @NotNull PlatformLocation zero() {
return adapt(new Location(null, 0, 0, 0));
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitEntity.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.platform.PlatformEntity;
import kr.toxicity.model.api.platform.PlatformLocation;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
/**
* Represents a Bukkit entity wrapped as a {@link PlatformEntity}.
*
* @since 2.0.0
*/
@ToString
@EqualsAndHashCode
public class BukkitEntity implements PlatformEntity {
private final Entity source;
/**
* Creates a new BukkitEntity wrapper.
*
* @param source the source Bukkit entity
* @since 2.0.0
*/
public BukkitEntity(@NotNull Entity source) {
this.source = source;
}
/**
* Returns the underlying Bukkit entity.
*
* @return the source entity
* @since 2.0.0
*/
public Entity source() {
return source;
}
@Override
public @NotNull UUID uuid() {
return source.getUniqueId();
}
@Override
public @NotNull PlatformLocation location() {
return BukkitAdapter.adapt(source.getLocation());
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitItemStack.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.platform.PlatformItemStack;
import kr.toxicity.model.api.platform.PlatformNamespace;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a Bukkit item stack wrapped as a {@link PlatformItemStack}.
*
* @param source the source Bukkit item stack
* @since 2.0.0
*/
public record BukkitItemStack(@NotNull ItemStack source) implements PlatformItemStack {
@Override
public boolean isAir() {
return source.getType().isAir() || source.getAmount() <= 0;
}
@Override
public @NotNull PlatformItemStack enchant(boolean enchant) {
var meta = source.getItemMeta();
if (meta == null) return this;
meta.setEnchantmentGlintOverride(enchant);
source.setItemMeta(meta);
return this;
}
@SuppressWarnings("deprecation")
@Override
public @NotNull PlatformItemStack modelData(int customModelData, @Nullable PlatformNamespace namespace) {
var meta = source.getItemMeta();
if (meta == null) return this;
meta.setCustomModelData(customModelData);
meta.setItemModel(namespace == null ? null : new NamespacedKey(namespace.namespace(), namespace.path()));
source.setItemMeta(meta);
return this;
}
@Override
public @NotNull PlatformItemStack clone() {
return BukkitAdapter.adapt(source.clone());
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitLivingEntity.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.platform.PlatformLivingEntity;
import kr.toxicity.model.api.platform.PlatformLocation;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Bukkit living entity wrapped as a {@link PlatformLivingEntity}.
*
* @since 2.0.0
*/
public class BukkitLivingEntity extends BukkitEntity implements PlatformLivingEntity {
/**
* Creates a new BukkitLivingEntity wrapper.
*
* @param source the source Bukkit living entity
* @since 2.0.0
*/
public BukkitLivingEntity(@NotNull LivingEntity source) {
super(source);
}
/**
* Returns the underlying Bukkit living entity.
*
* @return the source living entity
* @since 2.0.0
*/
@Override
public LivingEntity source() {
return (LivingEntity) super.source();
}
@Override
public @NotNull PlatformLocation eyeLocation() {
return BukkitAdapter.adapt(source().getEyeLocation());
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitLocation.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.bukkit.BetterModelBukkit;
import kr.toxicity.model.api.platform.PlatformLocation;
import kr.toxicity.model.api.platform.PlatformWorld;
import kr.toxicity.model.api.scheduler.ModelTask;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a Bukkit location wrapped as a {@link PlatformLocation}.
*
* @param source the source Bukkit location
* @since 2.0.0
*/
public record BukkitLocation(@NotNull Location source) implements PlatformLocation {
@Override
public @NotNull PlatformWorld world() {
return BukkitAdapter.adapt(source.getWorld());
}
@Override
public double x() {
return source.getX();
}
@Override
public double y() {
return source.getY();
}
@Override
public double z() {
return source.getZ();
}
@Override
public float pitch() {
return source.getPitch();
}
@Override
public float yaw() {
return source.getYaw();
}
@Override
public @NotNull PlatformLocation add(double x, double y, double z) {
return BukkitAdapter.adapt(source.clone().add(x, y, z));
}
@Override
public @Nullable ModelTask task(@NotNull Runnable runnable) {
return BetterModelBukkit.platform().scheduler().task(source, runnable);
}
@Override
public @Nullable ModelTask taskLater(long delay, @NotNull Runnable runnable) {
return BetterModelBukkit.platform().scheduler().taskLater(source, delay, runnable);
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitOfflinePlayer.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.platform.PlatformOfflinePlayer;
import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
/**
* Represents a Bukkit offline player wrapped as a {@link PlatformOfflinePlayer}.
*
* @param source the source Bukkit offline player
* @since 2.0.0
*/
public record BukkitOfflinePlayer(@NotNull OfflinePlayer source) implements PlatformOfflinePlayer {
@Override
public @NotNull UUID uuid() {
return source.getUniqueId();
}
@Override
public @Nullable String name() {
return source.getName();
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitPlayer.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.platform.PlatformPlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Bukkit player wrapped as a {@link PlatformPlayer}.
*
* @since 2.0.0
*/
public final class BukkitPlayer extends BukkitLivingEntity implements PlatformPlayer {
/**
* Creates a new BukkitPlayer wrapper.
*
* @param source the source Bukkit player
* @since 2.0.0
*/
public BukkitPlayer(@NotNull Player source) {
super(source);
}
/**
* Returns the underlying Bukkit player.
*
* @return the source player
* @since 2.0.0
*/
public @NotNull Player source() {
return (Player) super.source();
}
@Override
public @NotNull String name() {
return source().getName();
}
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitWorld.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.platform;
import kr.toxicity.model.api.platform.PlatformWorld;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Bukkit world wrapped as a {@link PlatformWorld}.
*
* @param source the source Bukkit world
* @since 2.0.0
*/
public record BukkitWorld(@NotNull World source) implements PlatformWorld {
}
================================================
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/scheduler/BukkitModelScheduler.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bukkit.scheduler;
import kr.toxicity.model.api.scheduler.ModelScheduler;
import kr.toxicity.model.api.scheduler.ModelTask;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a Bukkit-specific scheduler for model tasks.
* <p>
* This interface extends {@link ModelScheduler} to provide methods for scheduling tasks
* that are synchronized with specific locations (e.g., for Folia compatibility).
* </p>
*
* @since 2.0.0
*/
public interface BukkitModelScheduler extends ModelScheduler {
/**
* Schedules a task to run on the next tick, synchronized with the given location.
*
* @param location the location to synchronize with
* @param runnable the task to run
* @return the scheduled task, or null if scheduling failed
* @since 2.0.0
*/
@Nullable ModelTask task(@NotNull Location location, @NotNull Runnable runnable);
/**
* Schedules a task to run after a delay, synchronized with the given location.
*
* @param location the location to synchronize with
* @param delay the delay in ticks
* @param runnable the task to run
* @return the scheduled task, or null if scheduling failed
* @since 2.0.0
*/
@Nullable ModelTask taskLater(@NotNull Location location, long delay, @NotNull Runnable runnable);
}
================================================
FILE: api/mod-api/build.gradle.kts
================================================
plugins {
alias(libs.plugins.convention.publish)
id("net.neoforged.moddev")
}
dependencies {
api(project(":bettermodel-api"))
}
neoForge {
enable {
neoFormVersion = libs.versions.neoform.get()
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/BetterModelMod.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod;
import kr.toxicity.model.api.BetterModel;
import kr.toxicity.model.api.BetterModelPlatform;
import kr.toxicity.model.api.mod.scheduler.ModModelScheduler;
import net.minecraft.server.MinecraftServer;
import org.jetbrains.annotations.NotNull;
/**
* Represents the Mod-specific platform interface for BetterModel.
* <p>
* This interface extends {@link BetterModelPlatform} to provide access to the underlying
* Minecraft server instance and region holder for thread-safe operations.
* </p>
*
* @since 2.0.0
*/
public interface BetterModelMod extends BetterModelPlatform {
/**
* Returns the current {@link BetterModelMod} instance.
*
* @return the current platform instance
* @since 2.0.0
*/
static @NotNull BetterModelMod platform() {
return (BetterModelMod) BetterModel.platform();
}
/**
* Returns the underlying Minecraft server instance.
*
* @return the Minecraft server
* @since 2.0.0
*/
@NotNull MinecraftServer server();
/**
* Returns the Mod-specific scheduler.
*
* @return the scheduler
* @since 2.0.0
*/
@Override
@NotNull ModModelScheduler scheduler();
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/entity/BaseModEntity.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.entity;
import kr.toxicity.model.api.entity.BaseEntity;
import net.minecraft.world.entity.Entity;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Mod-specific entity adapter.
* <p>
* This interface extends {@link BaseEntity} to provide access to the underlying NMS entity.
* </p>
*
* @since 2.0.0
*/
public interface BaseModEntity extends BaseEntity {
/**
* Returns the underlying NMS entity.
*
* @return the NMS entity
* @since 2.0.0
*/
default @NotNull Entity entity() {
return (Entity) handle();
}
/**
* Sets the underlying NMS entity.
*
* @param entity the NMS entity
* @since 2.0.0
*/
void entity(@NotNull Entity entity);
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/entity/BaseModPlayer.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.entity;
import kr.toxicity.model.api.entity.BasePlayer;
import net.minecraft.server.level.ServerPlayer;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Mod-specific player adapter.
* <p>
* This interface extends {@link BaseModEntity} and {@link BasePlayer} to provide
* access to the underlying NMS server player.
* </p>
*
* @since 2.0.0
*/
public interface BaseModPlayer extends BaseModEntity, BasePlayer {
/**
* Returns the underlying NMS server player.
*
* @return the server player
* @since 2.0.0
*/
@Override
default @NotNull ServerPlayer entity() {
return (ServerPlayer) handle();
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModAdapter.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import com.mojang.authlib.GameProfile;
import kr.toxicity.model.api.mod.BetterModelMod;
import kr.toxicity.model.api.platform.*;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
/**
* Provides an adapter for converting Mod/NMS objects to BetterModel platform objects.
* <p>
* This class implements {@link PlatformAdapter} and offers static utility methods for adapting
* entities, players, items, and worlds.
* </p>
*
* @since 2.0.0
*/
public final class ModAdapter implements PlatformAdapter {
/**
* Adapts an NMS entity to a {@link PlatformEntity}.
*
* @param entity the NMS entity
* @return the platform entity
* @since 2.0.0
*/
public static @NotNull PlatformEntity adapt(@NotNull Entity entity) {
return ModEntity.of(entity);
}
/**
* Adapts an NMS living entity to a {@link PlatformLivingEntity}.
*
* @param livingEntity the NMS living entity
* @return the platform living entity
* @since 2.0.0
*/
public static @NotNull PlatformLivingEntity adapt(@NotNull LivingEntity livingEntity) {
return ModLivingEntity.of(livingEntity);
}
/**
* Adapts an NMS player connection to a {@link PlatformPlayer}.
*
* @param connection the NMS player connection
* @return the platform player
* @since 2.0.0
*/
public static @NotNull PlatformPlayer adapt(@NotNull ServerPlayerConnection connection) {
return ModPlayer.of(connection);
}
/**
* Adapts an NMS server player to a {@link PlatformPlayer}.
*
* @param player the NMS server player
* @return the platform player
* @since 2.0.0
*/
public static @NotNull PlatformPlayer adapt(@NotNull ServerPlayer player) {
return adapt(player.connection);
}
/**
* Adapts a UUID to a {@link PlatformOfflinePlayer}.
*
* @param uuid the player UUID
* @return the platform offline player
* @since 2.0.0
*/
public static @NotNull PlatformOfflinePlayer adapt(@NotNull UUID uuid) {
return ModOfflinePlayer.of(uuid, null);
}
/**
* Adapts a GameProfile to a {@link PlatformOfflinePlayer}.
*
* @param profile the game profile
* @return the platform offline player
* @since 2.0.0
*/
public static @NotNull PlatformOfflinePlayer adapt(@NotNull GameProfile profile) {
return ModOfflinePlayer.of(profile.id(), profile.name());
}
/**
* Adapts an NMS item stack to a {@link PlatformItemStack}.
*
* @param itemStack the NMS item stack
* @return the platform item stack
* @since 2.0.0
*/
public static @NotNull PlatformItemStack adapt(@NotNull ItemStack itemStack) {
return ModItemStack.of(itemStack);
}
/**
* Adapts an NMS level to a {@link PlatformWorld}.
*
* @param world the NMS level
* @return the platform world
* @since 2.0.0
*/
public static @NotNull PlatformWorld adapt(@NotNull Level world) {
return ModWorld.of(world);
}
@Override
public int serverViewDistance() {
return server().getPlayerList().getViewDistance();
}
@Override
public boolean isTickThread() {
return server().isSameThread();
}
@Override
public boolean isRegionSafe() {
return true;
}
@Override
public @Nullable PlatformPlayer player(@NotNull UUID uuid) {
var player = server().getPlayerList().getPlayer(uuid);
return player == null ? null : adapt(player);
}
@Override
public @NotNull PlatformOfflinePlayer offlinePlayer(@NotNull UUID uuid) {
var profile = server().services().profileResolver().fetchById(uuid).orElse(null);
return profile == null ? adapt(uuid) : adapt(profile);
}
@Override
public @NotNull PlatformItemStack air() {
return adapt(ItemStack.EMPTY);
}
@Override
public @NotNull PlatformLocation zero() {
return ModLocation.of(null, 0, 0, 0);
}
private @NotNull MinecraftServer server() {
return BetterModelMod.platform().server();
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModEntity.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformEntity;
import kr.toxicity.model.api.platform.PlatformLocation;
import net.minecraft.world.entity.Entity;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
/**
* Represents a Mod entity wrapped as a {@link PlatformEntity}.
*
* @param source the source NMS entity
* @since 2.0.0
*/
public record ModEntity(@NotNull Entity source) implements PlatformEntity {
@ApiStatus.Internal
public ModEntity {
}
/**
* Creates a ModEntity from the source.
*
* @param source the source entity
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModEntity of(@NotNull Entity source) {
return new ModEntity(source);
}
@Override
public @NotNull UUID uuid() {
return source.getUUID();
}
@Override
public @NotNull PlatformLocation location() {
return ModLocation.of(source);
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModItemStack.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformItemStack;
import kr.toxicity.model.api.platform.PlatformNamespace;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.Identifier;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.CustomModelData;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* Represents a Mod item stack wrapped as a {@link PlatformItemStack}.
*
* @param source the source NMS item stack
* @since 2.0.0
*/
public record ModItemStack(@NotNull ItemStack source) implements PlatformItemStack {
@ApiStatus.Internal
public ModItemStack {
}
/**
* Creates a ModItemStack from the source.
*
* @param source the source item stack
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModItemStack of(@NotNull ItemStack source) {
return new ModItemStack(source);
}
@Override
public boolean isAir() {
return source.isEmpty();
}
@Override
public @NotNull PlatformItemStack enchant(boolean enchant) {
source.set(DataComponents.ENCHANTMENT_GLINT_OVERRIDE, enchant);
return this;
}
@Override
public @NotNull PlatformItemStack modelData(int customModelData, @Nullable PlatformNamespace namespace) {
source.set(
DataComponents.CUSTOM_MODEL_DATA,
new CustomModelData(List.of((float) customModelData), List.of(), List.of(), List.of())
);
source.set(
DataComponents.ITEM_MODEL,
namespace == null ? null : Identifier.fromNamespaceAndPath(namespace.namespace(), namespace.path())
);
return this;
}
@Override
public @NotNull PlatformItemStack clone() {
return ModAdapter.adapt(source.copy());
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModLivingEntity.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformLivingEntity;
import kr.toxicity.model.api.platform.PlatformLocation;
import net.minecraft.world.entity.LivingEntity;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
/**
* Represents a Mod living entity wrapped as a {@link PlatformLivingEntity}.
*
* @param source the source NMS living entity
* @since 2.0.0
*/
public record ModLivingEntity(@NotNull LivingEntity source) implements PlatformLivingEntity {
@ApiStatus.Internal
public ModLivingEntity {
}
/**
* Creates a ModLivingEntity from the source.
*
* @param source the source living entity
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModLivingEntity of(@NotNull LivingEntity source) {
return new ModLivingEntity(source);
}
@Override
public @NotNull UUID uuid() {
return source.getUUID();
}
@Override
public @NotNull PlatformLocation location() {
return ModLocation.of(source);
}
@Override
public @NotNull PlatformLocation eyeLocation() {
return ModLocation.ofEye(source);
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModLocation.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.mod.BetterModelMod;
import kr.toxicity.model.api.mod.scheduler.ModModelScheduler;
import kr.toxicity.model.api.platform.PlatformLocation;
import kr.toxicity.model.api.platform.PlatformWorld;
import kr.toxicity.model.api.scheduler.ModelTask;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a Mod location wrapped as a {@link PlatformLocation}.
*
* @param level the NMS level
* @param x the x coordinate
* @param y the y coordinate
* @param z the z coordinate
* @param pitch the pitch
* @param yaw the yaw
* @since 2.0.0
*/
public record ModLocation(@Nullable Level level, double x, double y, double z, float pitch, float yaw) implements PlatformLocation {
@ApiStatus.Internal
public ModLocation {
}
/**
* Creates a ModLocation from the coordinates.
*
* @param level the NMS level
* @param x the x coordinate
* @param y the y coordinate
* @param z the z coordinate
* @param pitch the pitch
* @param yaw the yaw
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModLocation of(@Nullable Level level, double x, double y, double z, float pitch, float yaw) {
return new ModLocation(
level,
x,
y,
z,
pitch,
yaw
);
}
/**
* Creates a ModLocation from the coordinates with zero pitch and yaw.
*
* @param level the NMS level
* @param x the x coordinate
* @param y the y coordinate
* @param z the z coordinate
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModLocation of(@Nullable Level level, double x, double y, double z) {
return new ModLocation(
level,
x,
y,
z,
0.0f,
0.0f
);
}
/**
* Creates a ModLocation from the position vector.
*
* @param level the NMS level
* @param position the position vector
* @param pitch the pitch
* @param yaw the yaw
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModLocation of(@Nullable Level level, Vec3 position, float pitch, float yaw) {
return new ModLocation(
level,
position.x,
position.y,
position.z,
pitch,
yaw
);
}
/**
* Creates a ModLocation from the position vector with zero pitch and yaw.
*
* @param level the NMS level
* @param position the position vector
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModLocation of(@Nullable Level level, Vec3 position) {
return new ModLocation(
level,
position.x,
position.y,
position.z,
0.0f,
0.0f
);
}
/**
* Creates a ModLocation from an entity's position.
*
* @param entity the entity
* @return the location
* @since 2.0.0
*/
public static @NotNull ModLocation of(@NotNull Entity entity) {
return new ModLocation(
entity.level(),
entity.getX(),
entity.getY(),
entity.getZ(),
entity.getXRot(),
entity.getYRot()
);
}
/**
* Creates a ModLocation from an entity's eye position.
*
* @param entity the entity
* @return the eye location
* @since 2.0.0
*/
public static @NotNull ModLocation ofEye(@NotNull Entity entity) {
return new ModLocation(
entity.level(),
entity.getX(),
entity.getEyeY(),
entity.getZ(),
entity.getXRot(),
entity.getYRot()
);
}
@Override
public @NotNull PlatformWorld world() {
if (level == null) {
throw new IllegalStateException("level is not set");
}
return ModAdapter.adapt(level);
}
@Override
public @NotNull PlatformLocation add(double x, double y, double z) {
return new ModLocation(
this.level,
this.x + x,
this.y + y,
this.z + z,
this.pitch,
this.yaw
);
}
@Override
public @Nullable ModelTask task(@NotNull Runnable runnable) {
return scheduler().task(runnable);
}
@Override
public @Nullable ModelTask taskLater(long delay, @NotNull Runnable runnable) {
return scheduler().taskLater(delay, runnable);
}
private @NotNull ModModelScheduler scheduler() {
return BetterModelMod.platform().scheduler();
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModOfflinePlayer.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformOfflinePlayer;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
/**
* Represents a Mod offline player wrapped as a {@link PlatformOfflinePlayer}.
*
* @param uuid the player UUID
* @param name the player name, or null if unknown
* @since 2.0.0
*/
public record ModOfflinePlayer(@NotNull UUID uuid, @Nullable String name) implements PlatformOfflinePlayer {
@ApiStatus.Internal
public ModOfflinePlayer {
}
/**
* Creates a ModOfflinePlayer from the UUID and name.
*
* @param uuid the player uuid
* @param name the player name
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModOfflinePlayer of(@NotNull UUID uuid, @Nullable String name) {
return new ModOfflinePlayer(uuid, name);
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModPlayer.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformLocation;
import kr.toxicity.model.api.platform.PlatformPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
/**
* Represents a Mod player wrapped as a {@link PlatformPlayer}.
*
* @param source the source NMS player connection
* @since 2.0.0
*/
public record ModPlayer(@NotNull ServerPlayerConnection source) implements PlatformPlayer {
@ApiStatus.Internal
public ModPlayer {
}
/**
* Creates a ModPlayer from the source.
*
* @param source the source player connection
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModPlayer of(@NotNull ServerPlayerConnection source) {
return new ModPlayer(source);
}
@Override
public @NotNull UUID uuid() {
return source.getPlayer().getUUID();
}
@Override
public @NotNull PlatformLocation location() {
return ModLocation.of(source.getPlayer());
}
@Override
public @NotNull PlatformLocation eyeLocation() {
return ModLocation.ofEye(source.getPlayer());
}
@Override
public @NotNull String name() {
return source.getPlayer().getPlainTextName();
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModRegionHolder.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformRegionHolder;
/**
* Represents a Mod-specific region holder for managing thread-safe operations.
* <p>
* This interface extends {@link PlatformRegionHolder} to provide Mod-specific functionality
* for scheduling tasks within specific regions or contexts.
* </p>
*
* @since 2.0.0
*/
public interface ModRegionHolder extends PlatformRegionHolder {
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModWorld.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.platform;
import kr.toxicity.model.api.platform.PlatformWorld;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
/**
* Represents a Fabric world wrapped as a {@link PlatformWorld}.
*
* @param level the source NMS level
* @since 2.0.0
*/
public record ModWorld(@NotNull Level level) implements PlatformWorld {
@ApiStatus.Internal
public ModWorld {
}
/**
* Creates a FabricWorld from the level.
*
* @param level the source level
* @return the instance
* @since 2.0.0
*/
public static @NotNull ModWorld of(@NotNull Level level) {
return new ModWorld(level);
}
}
================================================
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/scheduler/ModModelScheduler.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.mod.scheduler;
import kr.toxicity.model.api.scheduler.ModelScheduler;
import kr.toxicity.model.api.scheduler.ModelTask;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Represents a Mod-specific scheduler for model tasks.
* <p>
* This interface extends {@link ModelScheduler} to provide methods for scheduling tasks
* within the Mod environment.
* </p>
*
* @since 2.0.0
*/
public interface ModModelScheduler extends ModelScheduler {
/**
* Schedules a task to run on the next tick.
*
* @param runnable the task to run
* @return the scheduled task, or null if scheduling failed
* @since 2.0.0
*/
@Nullable ModelTask task(@NotNull Runnable runnable);
/**
* Schedules a task to run after a delay.
*
* @param delay the delay in ticks
* @param runnable the task to run
* @return the scheduled task, or null if scheduling failed
* @since 2.0.0
*/
@Nullable ModelTask taskLater(long delay, @NotNull Runnable runnable);
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/BetterModel.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2024 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api;
import kr.toxicity.model.api.data.renderer.ModelRenderer;
import kr.toxicity.model.api.entity.BaseEntity;
import kr.toxicity.model.api.nms.NMS;
import kr.toxicity.model.api.nms.PlayerChannelHandler;
import kr.toxicity.model.api.platform.PlatformEntity;
import kr.toxicity.model.api.tracker.EntityTrackerRegistry;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.util.*;
/**
* The main entry point for the BetterModel API.
* <p>
* This class provides static access to the platform instance, configuration, model managers,
* NMS handlers, and entity registries. It serves as a service provider for interacting with the BetterModel engine.
* </p>
*
* @since 1.15.2
*/
public final class BetterModel {
/**
* Private initializer to prevent instantiation.
*/
private BetterModel() {
throw new RuntimeException();
}
/**
* The singleton platform instance.
*/
private static BetterModelPlatform instance;
/**
* Returns the platform configuration manager.
*
* @return the configuration manager
* @since 1.15.2
*/
public static @NotNull BetterModelConfig config() {
return platform().config();
}
/**
* Retrieves a model renderer by its name, wrapped in an Optional.
*
* @param name the name of the model
* @return an optional containing the renderer if found
* @since 1.15.2
*/
public static @NotNull Optional<ModelRenderer> model(@NotNull String name) {
return Optional.ofNullable(modelOrNull(name));
}
/**
* Retrieves a model renderer by its name, or null if not found.
*
* @param name the name of the model
* @return the renderer, or null
* @since 1.15.2
*/
public static @Nullable ModelRenderer modelOrNull(@NotNull String name) {
return platform().modelManager().model(name);
}
/**
* Retrieves a player limb renderer by its name, wrapped in an Optional.
*
* @param name the name of the limb model
* @return an optional containing the renderer if found
* @since 1.15.2
*/
public static @NotNull Optional<ModelRenderer> limb(@NotNull String name) {
return Optional.ofNullable(limbOrNull(name));
}
/**
* Retrieves a player limb renderer by its name, or null if not found.
*
* @param name the name of the limb model
* @return the renderer, or null
* @since 1.15.2
*/
public static @Nullable ModelRenderer limbOrNull(@NotNull String name) {
return platform().modelManager().limb(name);
}
/**
* Retrieves a player channel handler by the player's UUID.
*
* @param uuid the player's UUID
* @return an optional containing the channel handler if found
* @since 1.15.2
*/
public static @NotNull Optional<PlayerChannelHandler> player(@NotNull UUID uuid) {
return Optional.ofNullable(platform().playerManager().player(uuid));
}
/**
* Retrieves an entity tracker registry by the entity's UUID.
*
* @param uuid the entity's UUID
* @return an optional containing the registry if found
* @since 1.15.2
*/
public static @NotNull Optional<EntityTrackerRegistry> registry(@NotNull UUID uuid) {
return Optional.ofNullable(registryOrNull(uuid));
}
/**
* Retrieves an entity tracker registry for a Bukkit entity.
*
* @param entity the Bukkit entity
* @return an optional containing the registry if found
* @since 1.15.2
*/
public static @NotNull Optional<EntityTrackerRegistry> registry(@NotNull PlatformEntity entity) {
return Optional.ofNullable(registryOrNull(entity));
}
/**
* Retrieves an entity tracker registry for a base entity.
*
* @param entity the base entity
* @return an optional containing the registry if found
* @since 1.15.2
*/
public static @NotNull Optional<EntityTrackerRegistry> registry(@NotNull BaseEntity entity) {
return Optional.ofNullable(registryOrNull(entity));
}
/**
* Retrieves an entity tracker registry by the entity's UUID, or null if not found.
*
* @param uuid the entity's UUID
* @return the registry, or null
* @since 1.15.2
*/
public static @Nullable EntityTrackerRegistry registryOrNull(@NotNull UUID uuid) {
return EntityTrackerRegistry.registry(uuid);
}
/**
* Retrieves an entity tracker registry for a Bukkit entity, or null if not found.
*
* @param entity the Bukkit entity
* @return the registry, or null
* @since 1.15.2
*/
public static @Nullable EntityTrackerRegistry registryOrNull(@NotNull PlatformEntity entity) {
return registryOrNull(nms().adapt(entity));
}
/**
* Retrieves an entity tracker registry for a base entity, or null if not found.
*
* @param entity the base entity
* @return the registry, or null
* @since 1.15.2
*/
public static @Nullable EntityTrackerRegistry registryOrNull(@NotNull BaseEntity entity) {
return EntityTrackerRegistry.registry(entity);
}
/**
* Returns a collection of all loaded model renderers.
*
* @return an unmodifiable collection of models
* @since 1.15.2
*/
public static @NotNull @Unmodifiable Collection<ModelRenderer> models() {
return platform().modelManager().models();
}
/**
* Returns a collection of all loaded player limb renderers.
*
* @return an unmodifiable collection of limb models
* @since 1.15.2
*/
public static @NotNull @Unmodifiable Collection<ModelRenderer> limbs() {
return platform().modelManager().limbs();
}
/**
* Returns a set of all loaded model names.
*
* @return an unmodifiable set of model keys
* @since 1.15.2
*/
public static @NotNull @Unmodifiable Set<String> modelKeys() {
return platform().modelManager().modelKeys();
}
/**
* Returns a set of all loaded player limb model names.
*
* @return an unmodifiable set of limb keys
* @since 1.15.2
*/
public static @NotNull @Unmodifiable Set<String> limbKeys() {
return platform().modelManager().limbKeys();
}
/**
* Returns the singleton instance of the BetterModel platform.
*
* @return the platform instance
* @throws NullPointerException if the platform has not been initialized
* @since 2.0.0
*/
public static @NotNull BetterModelPlatform platform() {
return Objects.requireNonNull(instance, "BetterModel hasn't been initialized yet!");
}
/**
* Returns the NMS handler instance.
*
* @return the NMS handler
* @since 1.15.2
*/
public static @NotNull NMS nms() {
return platform().nms();
}
/**
* Returns the event bus.
*
* @return the event bus
* @since 2.0.0
*/
public static @NotNull BetterModelEventBus eventBus() {
return platform().eventBus();
}
/**
* Registers the platform instance.
* <p>
* This method is intended for internal use only during platform initialization.
* </p>
*
* @param instance the platform instance
* @throws RuntimeException if an instance is already registered
* @since 1.15.2
*/
@ApiStatus.Internal
public static void register(@NotNull BetterModelPlatform instance) {
Objects.requireNonNull(instance, "instance cannot be null.");
if (BetterModel.instance == instance) throw new RuntimeException("Duplicated instance.");
BetterModel.instance = instance;
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelConfig.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2024 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api;
import kr.toxicity.model.api.config.DebugConfig;
import kr.toxicity.model.api.config.IndicatorConfig;
import kr.toxicity.model.api.config.ModuleConfig;
import kr.toxicity.model.api.config.PackConfig;
import kr.toxicity.model.api.mount.MountController;
import kr.toxicity.model.api.platform.PlatformItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.function.Supplier;
/**
* Represents the main configuration interface for BetterModel.
* <p>
* This interface provides access to various configuration settings, including debug options,
* pack generation settings, module toggles, and runtime behaviors.
* </p>
*
* @since 1.15.2
*/
public interface BetterModelConfig {
/**
* Returns the debug configuration.
*
* @return the debug config
* @since 1.15.2
*/
@NotNull DebugConfig debug();
/**
* Returns the indicator configuration.
*
* @return the indicator config
* @since 1.15.2
*/
@NotNull IndicatorConfig indicator();
/**
* Returns the module configuration.
*
* @return the module config
* @since 1.15.2
*/
@NotNull ModuleConfig module();
/**
* Returns the resource pack configuration.
*
* @return the pack config
* @since 1.15.2
*/
@NotNull PackConfig pack();
/**
* Checks if metrics collection is enabled.
*
* @return true if enabled, false otherwise
* @since 1.15.2
*/
boolean metrics();
/**
* Checks if sight tracing (visibility checking) is enabled.
*
* @return true if enabled, false otherwise
* @since 1.15.2
*/
boolean sightTrace();
/**
* Checks if BetterModel should attempt to merge its resource pack with external plugins/mods.
*
* @return true to merge, false otherwise
* @since 1.15.2
*/
boolean mergeWithExternalResources();
/**
* Returns a supplier for the platform item stack used as the base for model items.
*
* @return a supplier providing the target item stack
* @since 2.0.0
*/
@NotNull Supplier<PlatformItemStack> item();
/**
* Returns the item model string identifier used for the resource pack target item.
*
* @return the item model string
* @since 2.0.0
*/
@NotNull String itemModel();
/**
* Returns the namespace used for the target item.
*
* @return the item namespace
* @since 1.15.2
*/
@NotNull String itemNamespace();
/**
* Returns the maximum range for sight tracing.
*
* @return the max range
* @since 1.15.2
*/
double maxSight();
/**
* Returns the minimum range for sight tracing.
*
* @return the min range
* @since 1.15.2
*/
double minSight();
/**
* Returns the namespace used for the generated resource pack.
*
* @return the namespace
* @since 1.15.2
*/
@NotNull String namespace();
/**
* Returns the type of resource pack generation (Folder, Zip, or None).
*
* @return the pack type
* @since 1.15.2
*/
@NotNull PackType packType();
/**
* Returns the location of the build folder for resource packs.
*
* @return the build folder path
* @since 1.15.2
*/
@NotNull String buildFolderLocation();
/**
* Checks if model trackers should follow the source entity's invisibility status.
*
* @return true to follow invisibility, false otherwise
* @since 1.15.2
*/
boolean followMobInvisibility();
/**
* Checks if Purpur's AFK API should be used.
*
* @return true to use Purpur AFK, false otherwise
* @since 1.15.2
*/
boolean usePurpurAfk();
/**
* Checks if version update notifications should be sent to OPs on join.
*
* @return true to send notifications, false otherwise
* @since 1.15.2
*/
boolean versionCheck();
/**
* Returns the default mount controller used for entities.
*
* @return the default mount controller
* @see kr.toxicity.model.api.mount.MountControllers
* @since 1.15.2
*/
@NotNull MountController defaultMountController();
/**
* Returns the interpolation frame time (lerp) in milliseconds.
*
* @return the lerp frame time
* @since 1.15.2
*/
int lerpFrameTime();
/**
* Checks if inventory swap packets should be cancelled for players with active models.
*
* @return true to cancel, false otherwise
* @since 1.15.2
*/
boolean cancelPlayerModelInventory();
/**
* Returns the delay in ticks before hiding a player's model after they become invisible.
*
* @return the hide delay
* @since 1.15.2
*/
long playerHideDelay();
/**
* Returns the threshold size for packet bundling.
*
* @return the packet bundling size
* @since 1.15.2
*/
int packetBundlingSize();
/**
* Checks if strict loading mode is enabled.
* <p>
* Strict loading causes the platform to fail fast on model loading errors.
* </p>
*
* @return true if strict loading is enabled, false otherwise
* @since 1.15.2
*/
boolean enableStrictLoading();
/**
* Enumerates the types of resource pack generation.
*
* @since 1.15.2
*/
enum PackType {
/**
* Generate the resource pack as a folder structure.
* @since 1.15.2
*/
FOLDER,
/**
* Generate the resource pack as a ZIP archive.
* @since 1.15.2
*/
ZIP,
/**
* Do not generate a resource pack.
* @since 1.15.2
*/
NONE
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelEvaluator.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api;
import kr.toxicity.model.api.util.function.Float2FloatFunction;
import org.jetbrains.annotations.NotNull;
/**
* Evaluator
*/
public interface BetterModelEvaluator {
/**
* Compiles molang expression
* @param expression expression
* @return compiled function
*/
@NotNull Float2FloatFunction compile(@NotNull String expression);
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelEventBus.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api;
import kr.toxicity.model.api.event.ModelEvent;
import kr.toxicity.model.api.event.ModelEventApplication;
import kr.toxicity.model.api.event.ModelEventListener;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* A central event bus for handling model-related events.
* <p>
* This interface allows subscribing to and publishing {@link ModelEvent}s.
* It serves as a decoupling mechanism between different parts of the engine.
* </p>
*
* @since 2.0.0
*/
public interface BetterModelEventBus {
/**
* Subscribes a consumer to a specific event type.
*
* @param application the application that subscribes to the event
* @param eventClass the class of the event to subscribe to
* @param consumer the consumer to handle the event
* @param <T> the type of the event
* @return a listener handle that can be used to unregister the subscription
* @since 2.0.0
*/
@NotNull
<T extends ModelEvent> ModelEventListener subscribe(@NotNull ModelEventApplication application, @NotNull Class<T> eventClass, @NotNull Consumer<T> consumer);
/**
* Publishes an event to all registered subscribers.
* <p>
* The event is created lazily using the provided supplier if there are subscribers.
* </p>
*
* @param eventClass the class of the event
* @param eventSupplier a supplier that creates the event
* @param <T> the type of the event
* @return the result of the event call
* @since 2.0.0
*/
<T extends ModelEvent> @NotNull Result call(@NotNull Class<? extends T> eventClass, @NotNull Supplier<T> eventSupplier);
/**
* Publishes an event to all registered subscribers.
*
* @param event the event to publish
* @return the result of the event call
* @since 2.0.0
*/
default @NotNull Result call(@NotNull ModelEvent event) {
return call(event.getClass(), () -> event);
}
/**
* Represents the outcome of an event publication.
*
* @since 2.0.0
*/
@RequiredArgsConstructor
enum Result {
/**
* The event was successfully processed by at least one subscriber.
* @since 2.0.0
*/
SUCCESS(true),
/**
* The event processing failed or was canceled.
* @since 2.0.0
*/
FAIL(false),
/**
* No handlers were registered for this event type.
* @since 2.0.0
*/
NO_EVENT_HANDLER(true)
;
private final boolean triggered;
/**
* Checks if the event was considered "triggered" (i.e., not canceled or failed).
* <p>
* Note that {@link #NO_EVENT_HANDLER} is considered triggered as the operation wasn't blocked.
* </p>
*
* @return true if triggered, false otherwise
* @since 2.0.0
*/
public boolean triggered() {
return triggered;
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelLogger.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api;
import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.NotNull;
/**
* BetterModel's logger
*/
public interface BetterModelLogger {
/**
* Infos messages
* @param message message
*/
void info(@NotNull Component... message);
/**
* Warns message
* @param message message
*/
void warn(@NotNull Component... message);
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelPlatform.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api;
import kr.toxicity.model.api.event.ModelEventApplication;
import kr.toxicity.model.api.manager.*;
import kr.toxicity.model.api.nms.NMS;
import kr.toxicity.model.api.pack.PackResult;
import kr.toxicity.model.api.pack.PackZipper;
import kr.toxicity.model.api.platform.PlatformAdapter;
import kr.toxicity.model.api.scheduler.ModelScheduler;
import kr.toxicity.model.api.version.MinecraftVersion;
import lombok.RequiredArgsConstructor;
import net.kyori.adventure.audience.Audience;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.semver4j.Semver;
import java.io.File;
import java.io.InputStream;
import java.util.function.Consumer;
/**
* Represents the main platform interface for BetterModel.
*
* @see BetterModel
* @since 1.15.2
*/
public interface BetterModelPlatform extends ModelEventApplication {
/**
* Returns the data folder for the BetterModel plugin.
* This is where configuration files, data files, and other plugin-specific resources are stored.
*
* @return the data folder as a {@link File} object.
* @since 2.0.0
*/
@NotNull File dataFolder();
/**
* Returns the type of JAR file this platform is running on (e.g., SPIGOT, PAPER, FABRIC).
*
* @return the {@link JarType} enum representing the platform's JAR type.
* @since 2.0.0
*/
@NotNull JarType jarType();
/**
* Reloads the platform with default settings (console sender).
*
* @return the result of the reload operation
* @since 2.0.0
*/
default @NotNull ReloadResult reload() {
return reload(ReloadInfo.DEFAULT);
}
/**
* Reloads the platform, specifying the command sender who initiated it.
*
* @param sender the command sender
* @return the result of the reload operation
* @since 1.15.2
*/
default @NotNull ReloadResult reload(@NotNull Audience sender) {
return reload(ReloadInfo.builder().sender(sender).build());
}
/**
* Reloads the platform with specific reload information.
*
* @param info the reload configuration
* @return the result of the reload operation
* @since 1.15.2
*/
@NotNull ReloadResult reload(@NotNull ReloadInfo info);
/**
* Checks if the running version of BetterModel is a snapshot build.
*
* @return true if snapshot, false otherwise
* @since 1.15.2
*/
boolean isSnapshot();
/**
* Returns the platform's configuration manager.
*
* @return the configuration
* @since 1.15.2
*/
@NotNull BetterModelConfig config();
/**
* Returns the Minecraft version of the running server.
*
* @return the Minecraft version
* @since 1.15.2
*/
@NotNull MinecraftVersion version();
/**
* Returns the semantic version of the platform.
*
* @return the semantic version
* @since 1.15.2
*/
@NotNull Semver semver();
/**
* Returns the NMS (Net.Minecraft.Server) handler for version-specific operations.
*
* @return the NMS handler
* @since 1.15.2
*/
@NotNull NMS nms();
/**
* Returns the model manager.
*
* @return the model manager
* @since 1.15.2
*/
@NotNull ModelManager modelManager();
/**
* Returns the player manager.
*
* @return the player manager
* @since 1.15.2
*/
@NotNull PlayerManager playerManager();
/**
* Returns the script manager.
*
* @return the script manager
* @since 1.15.2
*/
@NotNull ScriptManager scriptManager();
/**
* Returns the skin manager.
*
* @return the skin manager
* @since 1.15.2
*/
@NotNull SkinManager skinManager();
/**
* Returns the profile manager.
*
* @return the profile manager
* @since 1.15.2
*/
@NotNull ProfileManager profileManager();
/**
* Returns the platform's scheduler.
*
* @return the scheduler
* @since 1.15.2
*/
@NotNull ModelScheduler scheduler();
/**
* Return the platform's adapter
* @return the adapter
*/
@NotNull PlatformAdapter adapter();
/**
* Registers a handler to be executed when a reload starts.
*
* @param consumer the handler, receiving the {@link PackZipper}
* @since 1.15.2
*/
void addReloadStartHandler(@NotNull Consumer<PackZipper> consumer);
/**
* Registers a handler to be executed when a reload ends.
*
* @param consumer the handler, receiving the {@link ReloadResult}
* @since 1.15.2
*/
void addReloadEndHandler(@NotNull Consumer<ReloadResult> consumer);
/**
* Returns the platform's logger.
*
* @return the logger
* @since 1.15.2
*/
@NotNull BetterModelLogger logger();
/**
* Returns the expression evaluator.
*
* @return the evaluator
* @since 1.15.2
*/
@NotNull BetterModelEvaluator evaluator();
/**
* Returns the event bus.
*
* @return the event bus
* @since 2.0.0
*/
@NotNull BetterModelEventBus eventBus();
/**
* Retrieves a resource from the platform's JAR file.
*
* @param path the path to the resource
* @return an input stream for the resource, or null if not found
* @since 1.15.2
*/
@Nullable InputStream getResource(@NotNull String path);
/**
* Represents the outcome of a platform reload operation.
*
* @since 1.15.2
*/
sealed interface ReloadResult {
/**
* Indicates a successful reload.
*
* @param firstLoad true if this is the first load (startup), false otherwise
* @param assetsTime the time taken to reload assets in milliseconds
* @param packResult the result of the resource pack generation
* @since 1.15.2
*/
record Success(boolean firstLoad, long assetsTime, @NotNull PackResult packResult) implements ReloadResult {
/**
* Returns the time taken to generate the resource pack.
*
* @return the packing time in milliseconds
* @since 1.15.2
*/
public long packingTime() {
return packResult().time();
}
/**
* Returns the total time taken for the reload operation.
*
* @return the total time in milliseconds
* @since 1.15.2
*/
public long totalTime() {
return assetsTime + packingTime();
}
/**
* Returns the size of the generated resource pack.
*
* @return the size in bytes
* @since 1.15.2
*/
public long length() {
var dir = packResult.directory();
return dir != null && dir.isFile() ? dir.length() : packResult.stream().mapToLong(b -> b.bytes().length).sum();
}
}
/**
* Indicates that a reload is currently in progress.
* @since 1.15.2
*/
enum OnReload implements ReloadResult {
/**
* Singleton instance.
* @since 1.15.2
*/
INSTANCE
}
/**
* Indicates a failed reload.
*
* @param throwable the exception that caused the failure
* @since 1.15.2
*/
record Failure(@NotNull Throwable throwable) implements ReloadResult {
}
}
/**
* Represents the type of JAR file the platform is running on.
* This enum helps identify the specific server implementation (e.g., Spigot, Paper, Fabric).
*
* @since 2.0.0
*/
@RequiredArgsConstructor
enum JarType {
/**
* Indicates a Spigot-based server.
* @since 2.0.0
*/
SPIGOT("spigot"),
/**
* Indicates a Paper-based server.
* @since 2.0.0
*/
PAPER("paper"),
/**
* Indicates a Fabric-based server.
* @since 2.0.0
*/
FABRIC("fabric");
private final String raw;
/**
* Returns the raw string representation of the JAR type.
*
* @return the raw string (e.g., "spigot", "paper", "fabric")
* @since 2.0.0
*/
public String raw() {
return raw;
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationIterator.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import com.google.gson.annotations.SerializedName;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import java.util.Iterator;
/**
* An iterator for traversing animation keyframes.
* <p>
* This interface supports different looping modes (play once, loop, hold on last)
* and allows resetting the iteration state.
* </p>
*
* @param <T> the type of keyframe (must implement {@link Timed})
* @since 1.15.2
*/
public sealed interface AnimationIterator<T extends Timed> extends Iterator<T> {
/**
* Resets the iterator to its initial state.
* @since 1.15.2
*/
void clear();
/**
* Returns the type of this animation iterator.
*
* @return the animation type
* @since 1.15.2
*/
@NotNull Type type();
/**
* Defines the behavior of the animation iterator.
* @since 1.15.2
*/
@RequiredArgsConstructor
enum Type {
/**
* Plays the animation once and then stops.
* @since 1.15.2
*/
@SerializedName("once")
PLAY_ONCE {
@Override
public @NotNull <T extends Timed> AnimationIterator<T> create(@NotNull TimedStorage<T> keyframes) {
return new PlayOnce<>(keyframes);
}
},
/**
* Loops the animation continuously.
* @since 1.15.2
*/
@SerializedName("loop")
LOOP {
@Override
public @NotNull <T extends Timed> AnimationIterator<T> create(@NotNull TimedStorage<T> keyframes) {
return new Loop<>(keyframes);
}
},
/**
* Plays the animation once and holds the last frame.
* @since 1.15.2
*/
@SerializedName("hold")
HOLD_ON_LAST {
@Override
public @NotNull <T extends Timed> AnimationIterator<T> create(@NotNull TimedStorage<T> keyframes) {
return new HoldOnLast<>(keyframes);
}
}
;
/**
* Creates a new iterator for the given keyframes based on this type.
*
* @param keyframes the keyframes to iterate over
* @param <T> the type of keyframe
* @return a new animation iterator
* @since 1.15.2
*/
public abstract <T extends Timed> @NotNull AnimationIterator<T> create(@NotNull TimedStorage<T> keyframes);
}
/**
* Implementation for {@link Type#PLAY_ONCE}.
*
* @param <T> the type of keyframe
* @since 1.15.2
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
final class PlayOnce<T extends Timed> implements AnimationIterator<T> {
private final TimedStorage<T> keyframe;
private int index = 0;
@Override
public void clear() {
index = Integer.MAX_VALUE;
}
@Override
public boolean hasNext() {
return index < keyframe.size();
}
@Override
@NotNull
public T next() {
return keyframe.get(index++);
}
@NotNull
@Override
public Type type() {
return Type.PLAY_ONCE;
}
}
/**
* Implementation for {@link Type#HOLD_ON_LAST}.
*
* @param <T> the type of keyframe
* @since 1.15.2
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
final class HoldOnLast<T extends Timed> implements AnimationIterator<T> {
private final TimedStorage<T> keyframe;
private int index = 0;
@Override
public void clear() {
index = 0;
}
@Override
public boolean hasNext() {
return true;
}
@Override
@NotNull
public T next() {
if (index >= keyframe.size()) return keyframe.getLast();
return keyframe.get(index++);
}
@NotNull
@Override
public Type type() {
return Type.HOLD_ON_LAST;
}
}
/**
* Implementation for {@link Type#LOOP}.
*
* @param <T> the type of keyframe
* @since 1.15.2
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
final class Loop<T extends Timed> implements AnimationIterator<T> {
private final TimedStorage<T> keyframe;
private int index = 0;
@Override
public void clear() {
index = 0;
}
@Override
public boolean hasNext() {
return true;
}
@Override
@NotNull
public T next() {
if (index >= keyframe.size()) index = 0;
return keyframe.get(index++);
}
@NotNull
@Override
public Type type() {
return Type.LOOP;
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationKeyframe.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import kr.toxicity.model.api.bone.BoneMovement;
import kr.toxicity.model.api.util.MathUtil;
import org.jetbrains.annotations.NotNull;
import org.joml.Vector3f;
import java.util.Arrays;
import static kr.toxicity.model.api.util.MathUtil.isNotZero;
/**
* Represents a collection of animation keyframes, optimized for efficient storage and access.
* <p>
* This record stores an array of {@link AnimationProgress} objects, which define the state of a bone
* at specific time intervals. It implements {@link TimedStorage} for indexed access.
* </p>
*
* @param progresses the array of animation progresses
* @since 2.0.0
*/
public record AnimationKeyframe(
@NotNull AnimationProgress[] progresses
) implements TimedStorage<AnimationProgress> {
/**
* Creates a new builder for constructing an AnimationKeyframe.
*
* @param size the number of keyframes
* @param rotateGlobal whether rotation should be applied globally
* @return a new builder instance
* @since 2.0.0
*/
public static @NotNull Builder builder(int size, boolean rotateGlobal) {
return new Builder(size, rotateGlobal);
}
private record AnimationArray(
boolean rotateGlobal,
boolean[] skipInterpolation,
float[] times,
float[] position,
float[] scale,
float[] rotation
) {
AnimationArray(int size, boolean rotateGlobal) {
this(
rotateGlobal,
new boolean[size],
new float[size],
new float[size * 3],
new float[size * 3],
new float[size * 3]
);
}
}
/**
* Builder for {@link AnimationKeyframe}.
* <p>
* This builder allows for efficient population of keyframe data using primitive arrays.
* </p>
*
* @since 2.0.0
*/
public static final class Builder {
private final AnimationArray set;
private final AnimationProgress[] progresses;
private int index = 0;
private Builder(int size, boolean rotateGlobal) {
set = new AnimationArray(size, rotateGlobal);
progresses = new AnimationProgress[size];
}
/**
* Writes a keyframe data point.
*
* @param time the time of the keyframe
* @param position the position vector
* @param scale the scale vector
* @param rotation the rotation vector
* @param skipInterpolation whether to skip interpolation for this keyframe
* @since 2.0.0
*/
public void write(
float time,
@NotNull Vector3f position,
@NotNull Vector3f scale,
@NotNull Vector3f rotation,
boolean skipInterpolation
) {
var i = index++;
var x = i * 3;
var y = x + 1;
var z = x + 2;
set.times[i] = time;
set.position[x] = position.x;
set.position[y] = position.y;
set.position[z] = position.z;
set.scale[x] = scale.x + 1;
set.scale[y] = scale.y + 1;
set.scale[z] = scale.z + 1;
set.rotation[x] = rotation.x;
set.rotation[y] = rotation.y;
set.rotation[z] = rotation.z;
set.skipInterpolation[i] = skipInterpolation;
this.progresses[i] = isNotZero(position) || isNotZero(scale) || isNotZero(rotation) ? new ArrayProgress(set, i) : AnimationProgress.empty(time);
}
/**
* Builds the {@link AnimationKeyframe}.
*
* @return the created keyframe collection
* @since 2.0.0
*/
public @NotNull AnimationKeyframe build() {
return new AnimationKeyframe(progresses);
}
}
private record ArrayProgress(@NotNull AnimationArray array, int index) implements AnimationProgress {
@Override
public @NotNull BoneMovement animate(@NotNull BoneMovement movement, @NotNull BoneMovement dest) {
var destPos = movement.position().get(dest.position());
var destScl = movement.scale().get(dest.scale());
var destRot = movement.rotation().get(dest.rotation());
var destRawRot = movement.rawRotation().get(dest.rawRotation());
var position = array.position;
var scale = array.scale;
var rotation = array.rotation;
var x = index * 3;
var y = x + 1;
var z = x + 2;
destPos.add(position[x], position[y], position[z]);
destScl.mul(scale[x], scale[y], scale[z]);
MathUtil.toQuaternion(destRawRot.add(rotation[x], rotation[y], rotation[z]), destRot);
return dest;
}
@Override
public boolean skipInterpolation() {
return array.skipInterpolation[index];
}
@Override
public boolean globalRotation() {
return array.rotateGlobal;
}
@Override
public float time() {
return array.times[index];
}
}
@Override
public @NotNull AnimationProgress get(int i) {
return progresses[i];
}
@Override
public @NotNull AnimationProgress getLast() {
return get(progresses.length - 1);
}
@Override
public int size() {
return progresses.length;
}
/**
* Converts this keyframe collection to a storage of empty progresses.
*
* @return a new timed storage with empty progresses
* @since 2.0.0
*/
public @NotNull TimedStorage<AnimationProgress> toEmpty() {
return TimedStorage.listOf(Arrays.stream(progresses)
.map(AnimationProgress::toEmpty)
.toList());
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationModifier.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import kr.toxicity.model.api.platform.PlatformPlayer;
import kr.toxicity.model.api.util.FunctionUtil;
import kr.toxicity.model.api.util.MathUtil;
import kr.toxicity.model.api.util.function.FloatSupplier;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.function.BooleanSupplier;
/**
* A modifier of animation.
* @param predicate predicate
* @param start start lerp
* @param end end lerp
* @param priority priority
* @param type animation type
* @param speed speed modifier
* @param override override
* @param player player
*/
public record AnimationModifier(
@Nullable BooleanSupplier predicate,
int start,
int end,
int priority,
@Nullable AnimationIterator.Type type,
@Nullable FloatSupplier speed,
@Nullable Boolean override,
@Nullable PlatformPlayer player
) {
/**
* Default modifier
*/
@NotNull
public static final AnimationModifier DEFAULT = builder().build();
/**
* Default with play once modifier
*/
public static final AnimationModifier DEFAULT_WITH_PLAY_ONCE = builder().type(AnimationIterator.Type.PLAY_ONCE).build();
/**
* Creates builder
* @return builder
*/
public static @NotNull Builder builder() {
return new Builder();
}
/**
* Makes this modifier as builder
* @return builder
*/
public @NotNull Builder toBuilder() {
return builder()
.predicate(predicate)
.start(start)
.end(end)
.type(type)
.speed(speed)
.override(override)
.player(player);
}
/**
* Builder
*/
public static final class Builder {
private BooleanSupplier predicate = null;
private int start = 1;
private int end = 0;
private int priority = 0;
private AnimationIterator.Type type = null;
private FloatSupplier speed = null;
private Boolean override = null;
private PlatformPlayer player = null;
/**
* Private initializer
*/
private Builder() {
}
/**
* Sets the predicate of this modifier
* @param predicate predicate
* @return self
*/
public @NotNull Builder predicate(@Nullable BooleanSupplier predicate) {
this.predicate = predicate == null ? null : FunctionUtil.throttleTickBoolean(predicate);
return this;
}
/**
* Sets the lerp-in time of this modifier
* @param start lerp-in time
* @return self
*/
public @NotNull Builder start(int start) {
this.start = start;
return this;
}
/**
* Sets the lerp-out time of this modifier
* @param end lerp-out time
* @return self
*/
public @NotNull Builder end(int end) {
this.end = end;
return this;
}
/**
* Sets the priority of this modifier
* @param priority priority
* @return self
*/
public @NotNull Builder priority(int priority) {
this.priority = priority;
return this;
}
/**
* Sets the animation type of this modifier
* @param type animation type
* @return self
*/
public @NotNull Builder type(@Nullable AnimationIterator.Type type) {
this.type = type;
return this;
}
/**
* Sets the speed modifier of this modifier
* @param speed speed
* @return self
*/
public @NotNull Builder speed(float speed) {
this.speed = toSupplier(speed);
return this;
}
/**
* Sets the speed modifier of this modifier
* @param speed speed modifier
* @return self
*/
public @NotNull Builder speed(@Nullable FloatSupplier speed) {
this.speed = speed == null ? null : FunctionUtil.throttleTickFloat(speed);
return this;
}
/**
* Sets the override flag of this modifier
* @param override override flag
* @return self
*/
public @NotNull Builder override(@Nullable Boolean override) {
this.override = override;
return this;
}
/**
* Sets the target player of this modifier
* @param player target player
* @return self
*/
public @NotNull Builder player(@Nullable PlatformPlayer player) {
this.player = player;
return this;
}
/**
* Merges non-default value with other modifier
* @param modifier modifier
* @return self
*/
public @NotNull Builder mergeNotDefault(@NotNull AnimationModifier modifier) {
if (modifier.predicate != null) predicate(modifier.predicate);
if (modifier.start >= 0) start(modifier.start);
if (modifier.end >= 0) end(modifier.end);
if (modifier.type != null) type(modifier.type);
if (modifier.speed != null) speed(modifier.speed);
if (modifier.override != null) override(modifier.override);
if (modifier.player != null) player(modifier.player);
return this;
}
/**
* Builds animation modifier
* @return build
*/
public @NotNull AnimationModifier build() {
return new AnimationModifier(
predicate,
start,
end,
priority,
type,
speed,
override,
player
);
}
}
/**
* Creates modifier
*
* @param start start time
* @param end end time
*/
public AnimationModifier(int start, int end) {
this(start, end, null, null);
}
/**
* Creates modifier
*
* @param start start time
* @param end end time
* @param speedValue speed value
*/
public AnimationModifier(int start, int end, float speedValue) {
this(start, end, null, FloatSupplier.of(speedValue));
}
/**
* Creates modifier
*
* @param start start time
* @param end end time
* @param supplier speed supplier
*/
public AnimationModifier(int start, int end, @Nullable FloatSupplier supplier) {
this(start, end, null, supplier);
}
/**
* Creates modifier
*
* @param start start time
* @param end end time
* @param type type
*/
public AnimationModifier(int start, int end, @Nullable AnimationIterator.Type type) {
this(start, end, type, null);
}
/**
* Creates modifier
*
* @param start start time
* @param end end time
* @param type type
* @param speed speed
*/
public AnimationModifier(int start, int end, @Nullable AnimationIterator.Type type, @Nullable FloatSupplier speed) {
this(null, start, end, type, speed);
}
/**
* Creates modifier
*
* @param predicate animation predicate
* @param start start time
* @param end end time
* @param type type
* @param speed speed
*/
public AnimationModifier(@Nullable BooleanSupplier predicate, int start, int end, @Nullable AnimationIterator.Type type, @Nullable FloatSupplier speed) {
this(predicate, start, end, 0, type, speed, null, null);
}
/**
* Gets modifier's type or default value
* @param defaultType default value
* @return modifier's type or default value
*/
public @NotNull AnimationIterator.Type type(@NotNull AnimationIterator.Type defaultType) {
return type != null ? type : defaultType;
}
/**
* Gets speed value
* @return speed value
*/
public float speedValue() {
return speed != null ? speed.getAsFloat() : 1F;
}
/**
* Gets predicate value
* @return predicate value
*/
public boolean predicateValue() {
return predicate == null || predicate.getAsBoolean();
}
/**
* Gets override
* @param original original value
* @return override
*/
public boolean override(boolean original) {
return override != null ? override : original;
}
private static @Nullable FloatSupplier toSupplier(float speed) {
return MathUtil.isSimilar(speed, 1F) ? null : FloatSupplier.of(speed);
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationOverrideState.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
public enum AnimationOverrideState {
NOT_MATCHED,
MATCHED
;
public boolean shouldSkip() {
return this == NOT_MATCHED;
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationProgress.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import kr.toxicity.model.api.bone.BoneMovement;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* Represents the state of an animation at a specific keyframe.
* <p>
* This interface defines how to apply the keyframe's transformation to a bone's movement.
* </p>
*
* @since 2.0.0
*/
public interface AnimationProgress extends Timed {
/**
* An empty animation progress that applies no transformation.
* @since 2.0.0
*/
AnimationProgress EMPTY = empty(0);
/**
* Checks if interpolation should be skipped after this keyframe.
*
* @return true to skip interpolation, false otherwise
* @since 2.0.0
*/
boolean skipInterpolation();
/**
* Checks if the rotation in this keyframe should be applied globally.
*
* @return true for global rotation, false for local
* @since 2.0.0
*/
boolean globalRotation();
/**
* Creates an empty animation progress at a specific time.
*
* @param time the time of the keyframe
* @return an empty progress
* @since 2.0.0
*/
static @NotNull AnimationProgress empty(float time) {
return new EmptyProgress(time);
}
/**
* Converts this progress to empty progress at the same time.
*
* @return an empty progress
* @since 2.0.0
*/
default @NotNull AnimationProgress toEmpty() {
var time = time();
return time <= 0 ? EMPTY : empty(time);
}
/**
* Creates an empty timed storage with a start and end keyframe.
*
* @param time the duration of the empty animation
* @return the timed storage
* @since 2.0.0
*/
static @NotNull TimedStorage<AnimationProgress> emptyStorage(float time) {
return TimedStorage.listOf(List.of(
EMPTY,
empty(time)
));
}
/**
* Applies this keyframe's animation to a bone's movement.
*
* @param movement the current bone movement
* @param dest the destination object to store the result
* @return the resulting bone movement
* @since 2.0.0
*/
@NotNull BoneMovement animate(@NotNull BoneMovement movement, @NotNull BoneMovement dest);
/**
* An implementation of {@link AnimationProgress} that represents an empty keyframe.
*
* @param time the time of the keyframe
* @since 2.0.0
*/
record EmptyProgress(float time) implements AnimationProgress {
@Override
public @NotNull BoneMovement animate(@NotNull BoneMovement movement, @NotNull BoneMovement dest) {
return dest.set(movement);
}
@Override
public @NotNull AnimationProgress toEmpty() {
return this;
}
@Override
public boolean skipInterpolation() {
return false;
}
@Override
public boolean globalRotation() {
return false;
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationStateHandler.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import kr.toxicity.model.api.tracker.Tracker;
import kr.toxicity.model.api.util.MathUtil;
import kr.toxicity.model.api.util.collection.PriorityMap;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Iterator;
import java.util.function.BiConsumer;
import java.util.function.BooleanSupplier;
/**
* Animation state handler
* @param <T> timed value
*/
@RequiredArgsConstructor
@ApiStatus.Internal
public final class AnimationStateHandler<T extends Timed> {
private final T initialValue;
private final BiConsumer<T, T> setConsumer;
private final PriorityMap<String, TreeIterator> animators = new PriorityMap<>();
@Getter
private int delay;
private volatile TreeIterator currentIterator = null;
private volatile T beforeKeyframe = null, afterKeyframe = null;
/**
* Checks this keyframe has been finished
* @return finished
*/
public boolean keyframeFinished() {
return delay <= 0;
}
/**
* Gets before keyframe
* @return before keyframe
*/
public T beforeKeyframe() {
return beforeKeyframe;
}
/**
* Gets after keyframe
* @return after keyframe
*/
public T afterKeyframe() {
return afterKeyframe;
}
/**
* Gets before keyframe
* @param defaultValue default value
* @return before keyframe
*/
@NotNull
public T beforeKeyframe(@NotNull T defaultValue) {
var value = beforeKeyframe;
return value != null ? value : defaultValue;
}
/**
* Gets after keyframe
* @param defaultValue default value
* @return after keyframe
*/
@NotNull
public T afterKeyframe(@NotNull T defaultValue) {
var value = afterKeyframe;
return value != null ? value : defaultValue;
}
/**
* Gets running animation
* @return animation
*/
public @Nullable RunningAnimation runningAnimation() {
var iterator = currentIterator;
return iterator != null ? iterator.animation : null;
}
/**
* Ticks this state handler
* @return keyframe has been shifted or not
*/
public boolean tick() {
return tick(() -> {});
}
/**
* Ticks this state handler
* @param ifEmpty callback if animator is empty
* @return keyframe has been shifted or not
*/
public boolean tick(@NotNull Runnable ifEmpty) {
delay--;
if (animators.isEmpty()) {
ifEmpty.run();
return false;
}
return shouldUpdateAnimation() && updateAnimation();
}
/**
* Gets the progress of current keyframe
* @return progress
*/
public float progress() {
var frame = frame();
return frame == 0 ? 0 : Math.clamp((float) delay / frame, 0F, 1F);
}
private boolean shouldUpdateAnimation() {
return (afterKeyframe != null && keyframeFinished()) || delay % Tracker.MINECRAFT_TICK_MULTIPLIER == 0;
}
private boolean updateAnimation() {
synchronized (animators) {
var iterator = animators.valueIterator();
while (iterator.hasNext()) {
var next = iterator.next();
if (!next.getAsBoolean()) continue;
if (currentIterator == null) {
if (updateKeyframe(iterator, next)) {
currentIterator = next;
return setAfterKeyframe(next.next());
}
} else if (currentIterator != next) {
if (updateKeyframe(iterator, next)) {
currentIterator.clear();
currentIterator = next;
return setAfterKeyframe(next.next());
}
} else if (keyframeFinished()) {
if (updateKeyframe(iterator, next)) {
return setAfterKeyframe(next.next());
}
} else {
return false;
}
}
}
return setAfterKeyframe(null);
}
private boolean updateKeyframe(@NotNull Iterator<TreeIterator> iterator, @NotNull TreeIterator next) {
if (!next.hasNext()) {
next.removeTask.run();
iterator.remove();
return false;
} else {
return true;
}
}
private boolean setAfterKeyframe(@Nullable T next) {
if (afterKeyframe == next) return false;
setConsumer.accept(
beforeKeyframe = afterKeyframe,
afterKeyframe = next
);
delay = Math.round(frame());
return true;
}
/**
* Adds animation
* @param name name
* @param iterator iterator
* @param modifier modifier
* @param removeTask remove task
*/
public void addAnimation(@NotNull String name, @NotNull AnimationIterator<T> iterator, @NotNull AnimationModifier modifier, @NotNull Runnable removeTask) {
synchronized (animators) {
animators.put(name, new TreeIterator(name, iterator, modifier, removeTask), modifier.priority());
}
}
/**
* Replaces animation
* @param name name
* @param iterator iterator
* @param modifier modifier
*/
public void replaceAnimation(@NotNull String name, @NotNull AnimationIterator<T> iterator, @NotNull AnimationModifier modifier) {
synchronized (animators) {
animators.replace(name, v -> new TreeIterator(name, iterator, v.modifier.toBuilder()
.mergeNotDefault(modifier)
.build(), v.removeTask));
}
}
/**
* Remove animation
* @param name name
* @return success
*/
public boolean stopAnimation(@NotNull String name) {
synchronized (animators) {
if (animators.remove(name) != null) {
return true;
}
}
return false;
}
/**
* Gets ticking frame of current keyframe
* @return ticking frame
*/
public float frame() {
return afterKeyframe != null ? 20 * Tracker.MINECRAFT_TICK_MULTIPLIER * (currentIterator.time + MathUtil.FRAME_EPSILON) : 0F;
}
private class TreeIterator implements BooleanSupplier {
private final RunningAnimation animation;
private final AnimationIterator<T> iterator;
private final AnimationModifier modifier;
private final Runnable removeTask;
private final T previous;
private boolean started = false;
private boolean ended = false;
private float time = 0;
public TreeIterator(String name, AnimationIterator<T> iterator, AnimationModifier modifier, Runnable removeTask) {
animation = new RunningAnimation(name, iterator.type());
this.iterator = iterator;
this.modifier = modifier;
this.removeTask = removeTask;
previous = afterKeyframe != null ? afterKeyframe : initialValue;
}
@Override
public boolean getAsBoolean() {
return modifier.predicateValue();
}
public boolean hasNext() {
return iterator.hasNext() || (modifier.end() > 0 && !ended);
}
public @NotNull T next() {
if (!started) {
started = true;
time = (float) modifier.start() / 20;
return iterator.next();
}
if (!iterator.hasNext()) {
ended = true;
time = (float) modifier.end() / 20;
return previous;
}
var nxt = iterator.next();
time = nxt.time() / modifier.speedValue();
return nxt;
}
public void clear() {
iterator.clear();
started = ended = !iterator.hasNext();
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/RunningAnimation.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import org.jetbrains.annotations.NotNull;
/**
* Running animation
* @param name name
* @param type type
*/
public record RunningAnimation(@NotNull String name, @NotNull AnimationIterator.Type type) {
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/Timed.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import kr.toxicity.model.api.util.MathUtil;
import org.jetbrains.annotations.NotNull;
/**
* Object with keyframe time
*/
public interface Timed extends Comparable<Timed> {
default int compareTo(@NotNull Timed o) {
return MathUtil.FRAME_COMPARATOR.compare(time(), o.time());
}
/**
* Gets time
* @return time
*/
float time();
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/TimedStorage.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.NonNull;
import java.util.List;
/**
* A read-only storage for timed elements (keyframes), allowing indexed access.
* <p>
* This interface abstracts the underlying data structure (e.g., List, Array) used to store animation frames.
* </p>
*
* @param <T> the type of timed element
* @since 2.0.0
*/
public interface TimedStorage<T extends Timed> {
/**
* Creates a TimedStorage backed by a List.
*
* @param list the list of elements
* @param <T> the type of element
* @return a new TimedStorage
* @since 2.0.0
*/
@NotNull
static <T extends Timed> TimedStorage<T> listOf(@NotNull List<T> list) {
return new ListDelegate<>(list);
}
/**
* Retrieves the element at the specified index.
*
* @param index the index of the element
* @return the element
* @throws IndexOutOfBoundsException if the index is out of range
* @since 2.0.0
*/
@NotNull T get(int index);
/**
* Returns the number of elements in the storage.
*
* @return the size
* @since 2.0.0
*/
int size();
/**
* Retrieves the last element in the storage.
*
* @return the last element
* @throws java.util.NoSuchElementException if the storage is empty
* @since 2.0.0
*/
@NotNull T getLast();
/**
* A {@link TimedStorage} implementation that delegates to a {@link List}.
*
* @param list the backing list
* @param <T> the type of element
* @since 2.0.0
*/
record ListDelegate<T extends Timed>(@NotNull List<T> list) implements TimedStorage<T> {
@Override
public @NonNull T get(int index) {
return list.get(index);
}
@Override
public int size() {
return list.size();
}
@Override
public @NonNull T getLast() {
return list.getLast();
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/animation/VectorPoint.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.animation;
import kr.toxicity.model.api.util.function.FloatFunction;
import kr.toxicity.model.api.util.interpolator.VectorInterpolator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
/**
* Represents a keyframe point in an animation timeline.
* <p>
* This record holds the value of a vector (position, rotation, or scale) at a specific time,
* along with interpolation information to create smooth transitions between keyframes.
* </p>
*
* @param function a function to get the vector value, which may be dynamic (e.g., based on Molang expressions)
* @param time the time of this keyframe in seconds
* @param bezier the bezier curve configuration for interpolation, if applicable
* @param interpolator the interpolation method to use (e.g., linear, bezier, catmull-rom)
* @since 1.15.2
*/
public record VectorPoint(@NotNull FloatFunction<Vector3f> function, float time, @NotNull BezierConfig bezier, @NotNull VectorInterpolator interpolator) implements Timed {
private static final Vector3f ZERO = new Vector3f();
/**
* An empty, default vector point at time 0 with linear interpolation.
* @since 1.15.2
*/
public static final VectorPoint EMPTY = new VectorPoint(
FloatFunction.of(ZERO),
0F,
new BezierConfig(null, null, null, null),
VectorInterpolator.LINEAR
);
/**
* Gets the vector value at this keyframe's specific time.
*
* @return the vector value
* @since 1.15.2
*/
public @NotNull Vector3f vector() {
return vector(time);
}
/**
* Gets the vector value at a specific time, evaluating the function if necessary.
*
* @param time the time to evaluate at
* @return the calculated vector
* @since 1.15.2
*/
public @NotNull Vector3f vector(float time) {
return function.apply(time);
}
/**
* Checks if the interpolation method for this point is continuous.
*
* @return true if continuous (e.g., linear), false if stepped
* @since 1.15.2
*/
public boolean isContinuous() {
return interpolator.isContinuous();
}
/**
* Configuration for bezier curve interpolation.
*
* @param leftTime the time offset for the incoming (left) handle
* @param leftValue the value offset for the incoming (left) handle
* @param rightTime the time offset for the outgoing (right) handle
* @param rightValue the value offset for the outgoing (right) handle
* @since 1.15.2
*/
public record BezierConfig(@Nullable Vector3f leftTime, @Nullable Vector3f leftValue, @Nullable Vector3f rightTime, @Nullable Vector3f rightValue) {
/**
* Gets the time offset for the incoming (left) handle.
* If null, returns a zero vector.
* @return the left time offset vector
* @since 1.15.2
*/
@Override
public @NotNull Vector3f leftTime() {
return leftTime != null ? leftTime : ZERO;
}
/**
* Gets the value offset for the incoming (left) handle.
* If null, returns a zero vector.
* @return the left value offset vector
* @since 1.15.2
*/
@Override
public @NotNull Vector3f leftValue() {
return leftValue != null ? leftValue : ZERO;
}
/**
* Gets the time offset for the outgoing (right) handle.
* If null, returns a zero vector.
* @return the right time offset vector
* @since 1.15.2
*/
@Override
public @NotNull Vector3f rightTime() {
return rightTime != null ? rightTime : ZERO;
}
/**
* Gets the value offset for the outgoing (right) handle.
* If null, returns a zero vector.
* @return the right value offset vector
* @since 1.15.2
*/
@Override
public @NotNull Vector3f rightValue() {
return rightValue != null ? rightValue : ZERO;
}
}
@Override
public boolean equals(Object o) {
if (!(o instanceof VectorPoint that)) return false;
return Float.compare(time, that.time) == 0;
}
@Override
public int hashCode() {
return Float.hashCode(time);
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/armor/ArmorItem.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.armor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Armor item
* @param tint tint value
* @param type armor type
* @param trim trim
* @param palette palette
*/
public record ArmorItem(int tint, @NotNull String type, @Nullable String trim, @Nullable String palette) {
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/armor/PlayerArmor.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.armor;
import org.jetbrains.annotations.Nullable;
/**
* Player armor
*/
public interface PlayerArmor {
/**
* Empty armor
*/
PlayerArmor EMPTY = new PlayerArmor() {
@Override
public @Nullable ArmorItem helmet() {
return null;
}
@Override
public @Nullable ArmorItem chestplate() {
return null;
}
@Override
public @Nullable ArmorItem leggings() {
return null;
}
@Override
public @Nullable ArmorItem boots() {
return null;
}
};
/**
* Gets helmet
* @return helmet
*/
@Nullable ArmorItem helmet();
/**
* Gets chestplate
* @return chestplate
*/
@Nullable ArmorItem chestplate();
/**
* Gets leggings
* @return leggings
*/
@Nullable ArmorItem leggings();
/**
* Gets boots
* @return boots
*/
@Nullable ArmorItem boots();
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneEventDispatcher.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import kr.toxicity.model.api.nms.HitBoxListener;
import lombok.AllArgsConstructor;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
/**
* Dispatches events related to bone lifecycle and interaction.
* <p>
* This class manages handlers for hitbox creation, state creation, and state removal.
* It allows for extending behavior by chaining dispatchers.
* </p>
*
* @since 1.15.2
*/
public final class BoneEventDispatcher {
private final EventFunction builder = new EventFunction();
private EventFunction applier = builder;
/**
* Extends this dispatcher with another dispatcher's handlers.
* <p>
* The handlers from the provided dispatcher will be executed before the handlers in this dispatcher.
* </p>
*
* @param dispatcher the dispatcher to extend
* @throws UnsupportedOperationException if attempting to extend self
* @since 1.15.2
*/
public synchronized void extend(@NotNull BoneEventDispatcher dispatcher) {
if (dispatcher == this) throw new UnsupportedOperationException("cannot extend self");
applier = EventFunction.concat(dispatcher.applier, builder);
}
/**
* Registers a handler for hitbox creation.
*
* @param function the function to modify the hitbox listener builder
* @since 1.15.2
*/
public synchronized void handleCreateHitBox(@NotNull BiFunction<RenderedBone, HitBoxListener.Builder, HitBoxListener.Builder> function) {
var before = builder.createHitBox;
builder.createHitBox = (b, l) -> function.apply(b, before.apply(b, l));
}
/**
* Registers a handler for state creation (e.g., when a bone is initialized for a player).
*
* @param function the consumer to handle state creation
* @since 1.15.2
*/
public synchronized void handleStateCreate(@NotNull BiConsumer<RenderedBone, UUID> function) {
builder.stateCreate = builder.stateCreate.andThen(function);
}
/**
* Registers a handler for state removal (e.g., when a bone is removed for a player).
*
* @param function the consumer to handle state removal
* @since 1.15.2
*/
public synchronized void handleStateRemove(@NotNull BiConsumer<RenderedBone, UUID> function) {
builder.stateRemove = builder.stateRemove.andThen(function);
}
@NotNull HitBoxListener.Builder onCreateHitBox(@NotNull RenderedBone bone, @NotNull HitBoxListener.Builder builder) {
return applier.createHitBox.apply(bone, builder);
}
void onStateCreated(@NotNull RenderedBone bone, @NotNull UUID uuid) {
applier.stateCreate.accept(bone, uuid);
}
void onStateRemoved(@NotNull RenderedBone bone, @NotNull UUID uuid) {
applier.stateRemove.accept(bone, uuid);
}
@AllArgsConstructor
private static class EventFunction {
private BiFunction<RenderedBone, HitBoxListener.Builder, HitBoxListener.Builder> createHitBox;
private BiConsumer<RenderedBone, UUID> stateCreate;
private BiConsumer<RenderedBone, UUID> stateRemove;
EventFunction() {
this(
(_, l) -> l,
(_, _) -> {},
(_, _) -> {}
);
}
static @NotNull EventFunction concat(@NotNull EventFunction first, @NotNull EventFunction second) {
return new EventFunction(
(b, l) -> second.createHitBox.apply(b, first.createHitBox.apply(b, l)),
(b, u) -> {
first.stateCreate.accept(b, u);
second.stateCreate.accept(b, u);
},
(b, u) -> {
first.stateRemove.accept(b, u);
second.stateRemove.accept(b, u);
}
);
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneEventHandler.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import org.jetbrains.annotations.NotNull;
public interface BoneEventHandler {
@NotNull BoneEventDispatcher eventDispatcher();
default void extend(@NotNull BoneEventHandler eventHandler) {
eventDispatcher().extend(eventHandler.eventDispatcher());
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneIKSolver.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
import kr.toxicity.model.api.util.InterpolationUtil;
import kr.toxicity.model.api.util.MathUtil;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import java.util.Map;
import java.util.UUID;
import static kr.toxicity.model.api.util.CollectionUtil.newSequencedAddressingMap;
/**
* Bone IK solver
*/
@ApiStatus.Internal
@RequiredArgsConstructor
public final class BoneIKSolver {
private static final int MAX_IK_ITERATION = 20;
private static final Vector3f FROM_VECTOR = new Vector3f(0, -1, 0).normalize();
private final Map<UUID, RenderedBone> boneMap;
private final Object2ObjectLinkedOpenHashMap<RenderedBone, IKChain> locators = newSequencedAddressingMap();
/**
* Adds some external locator to this solver
* @param ikSource nullable source
* @param ikTarget target bone
* @param locator locator bone
*/
public void addLocator(@Nullable UUID ikSource, @NotNull UUID ikTarget, @NotNull RenderedBone locator) {
var target = boneMap.get(ikTarget);
if (target == null) return;
var source = ikSource == null ? target.root : boneMap.getOrDefault(ikSource, target.root);
var chainArray = source.flatten()
.filter(bone -> !bone.flattenBones().contains(locator) && bone.flattenBones().contains(target))
.toArray(RenderedBone[]::new);
if (chainArray.length < 2) return;
locators.put(locator, new IKChain(chainArray));
}
/**
* Solves ik
*/
public void solve() {
solve(null);
}
/**
* Solves ik
* @param uuid player uuid
*/
public void solve(@Nullable UUID uuid) {
if (locators.isEmpty()) return;
locators.object2ObjectEntrySet().fastForEach(entry -> {
var locator = entry.getKey();
var value = entry.getValue();
fabrik(
value.movements(uuid),
value.invertedFirstRotation(uuid),
value.cache.lengths,
locator.state(uuid).after().position().get(value.cache.destination)
.add(locator.root.group.getPosition())
.sub(value.first().root.group.getPosition())
);
});
}
private record IKChain(@NotNull RenderedBone[] bones, @NotNull IKCache cache) {
private IKChain(@NotNull RenderedBone[] bones) {
this(bones, new IKCache(bones.length));
}
private @NotNull RenderedBone first() {
return bones[0];
}
private @NotNull Quaternionf invertedFirstRotation(@Nullable UUID uuid) {
return first().state(uuid).after().rotation().invert(cache.rotation);
}
private @NotNull BoneMovement[] movements(@Nullable UUID uuid) {
var movements = cache.movements;
for (int i = 0; i < bones.length; i++) {
movements[i] = bones[i].state(uuid).after();
}
return movements;
}
}
private record IKCache(@NotNull BoneMovement[] movements, float[] lengths, @NotNull Vector3f destination, @NotNull Quaternionf rotation) {
private IKCache(int length) {
this(new BoneMovement[length], new float[length - 1], new Vector3f(), new Quaternionf());
}
}
private static void fabrik(@NotNull BoneMovement[] bones, @NotNull Quaternionf firstRot, float[] lengths, @NotNull Vector3f target) {
var first = bones[0].position();
var last = bones[bones.length - 1].position();
var vecCache = new Vector3f();
var rootPos = first.get(vecCache);
for (int i = 0; i < bones.length - 1; i++) {
var before = bones[i];
var after = bones[i + 1];
lengths[i] = before.position().distance(after.position());
}
for (int iter = 0; iter < MAX_IK_ITERATION; iter++) {
// Forward
last.set(target);
for (int i = bones.length - 2; i >= 0; i--) {
var current = bones[i].position();
var next = bones[i + 1].position();
var dist = current.distanceSquared(next);
if (dist < MathUtil.VECTOR_COMPARISON_EPSILON_SQ) continue;
InterpolationUtil.lerp(next, current, lengths[i] / (float) Math.sqrt(dist), current);
}
// Backward
first.set(rootPos);
for (int i = 0; i < bones.length - 1; i++) {
var current = bones[i].position();
var next = bones[i + 1].position();
var dist = current.distanceSquared(next);
if (dist < MathUtil.VECTOR_COMPARISON_EPSILON_SQ) continue;
InterpolationUtil.lerp(current, next, lengths[i] / (float) Math.sqrt(dist), next);
}
// Check
if (last.distanceSquared(target) < MathUtil.VECTOR_COMPARISON_EPSILON_SQ) break;
}
var rotCache = new Quaternionf();
for (int i = 0; i < bones.length - 1; i++) {
var current = bones[i];
var next = bones[i + 1];
var dir = next.position().sub(current.position(), vecCache);
current.rotation().set(rotCache.identity().rotateTo(FROM_VECTOR, dir.normalize()).mul(firstRot).mul(current.rotation()));
}
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneItemMapper.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import kr.toxicity.model.api.data.renderer.RenderSource;
import kr.toxicity.model.api.entity.BaseEntity;
import kr.toxicity.model.api.platform.PlatformItemTransform;
import kr.toxicity.model.api.platform.PlatformPlayer;
import kr.toxicity.model.api.util.TransformedItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.function.BiFunction;
import java.util.function.Function;
/**
* Item-mapper of bone
*/
public interface BoneItemMapper extends BiFunction<BoneRenderContext, TransformedItemStack, TransformedItemStack> {
@Override
@NotNull TransformedItemStack apply(@NotNull BoneRenderContext context, @NotNull TransformedItemStack transformedItemStack);
/**
* Empty
*/
BoneItemMapper EMPTY = new BoneItemMapper() {
@NotNull
@Override
public PlatformItemTransform transform() {
return PlatformItemTransform.FIXED;
}
@Override
@NotNull
public TransformedItemStack apply(@NotNull BoneRenderContext context, @NotNull TransformedItemStack transformedItemStack) {
return transformedItemStack;
}
};
/**
* Mapped if a render source is player
* @param transform transformation
* @param mapper mapper
* @return bone item mapper
*/
static @NotNull BoneItemMapper player(@NotNull PlatformItemTransform transform, @NotNull Function<PlatformPlayer, TransformedItemStack> mapper) {
return new BoneItemMapper() {
private static final TransformedItemStack AIR = TransformedItemStack.empty();
@NotNull
@Override
public PlatformItemTransform transform() {
return transform;
}
@Override
public @NotNull TransformedItemStack apply(@NotNull BoneRenderContext context, @NotNull TransformedItemStack transformedItemStack) {
if (context.source() instanceof RenderSource.BasePlayer(PlatformPlayer player)) {
var get = mapper.apply(player);
return get == null ? AIR : get;
}
return transformedItemStack;
}
};
}
/**
* Mapped if a render source is entity
* @param transform transformation
* @param mapper mapper
* @return bone item mapper
*/
static @NotNull BoneItemMapper entity(@NotNull PlatformItemTransform transform, @NotNull Function<BaseEntity, TransformedItemStack> mapper) {
return new BoneItemMapper() {
private static final TransformedItemStack AIR = TransformedItemStack.empty();
@NotNull
@Override
public PlatformItemTransform transform() {
return transform;
}
@Override
public @NotNull TransformedItemStack apply(@NotNull BoneRenderContext context, @NotNull TransformedItemStack transformedItemStack) {
if (context.source() instanceof RenderSource.Entity entity) {
var get = mapper.apply(entity.entity());
return get == null ? AIR : get;
}
return transformedItemStack;
}
};
}
/**
* Gets this mapper's display is fixed
* @return fixed
*/
default boolean fixed() {
return transform() == PlatformItemTransform.FIXED;
}
/**
* Gets item display transformation
* @return transformation
*/
@NotNull PlatformItemTransform transform();
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneMovement.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import kr.toxicity.model.api.util.InterpolationUtil;
import kr.toxicity.model.api.util.MathUtil;
import org.jetbrains.annotations.NotNull;
import org.joml.Quaternionf;
import org.joml.Vector3f;
/**
* Represents the transformation state of a single bone, including its position, scale, and rotation.
* <p>
* This record is used to calculate the final transformation of a bone after applying animations.
* </p>
*
* @param position the local position of the bone
* @param scale the local scale of the bone
* @param rotation the final local rotation of the bone as a quaternion
* @param rawRotation the local rotation of the bone in Euler angles (degrees) before being converted to a quaternion
* @since 1.15.2
*/
public record BoneMovement(
@NotNull Vector3f position,
@NotNull Vector3f scale,
@NotNull Quaternionf rotation,
@NotNull Vector3f rawRotation
) {
/**
* Creates a new BoneMovement with default (identity) transformations.
* @since 1.15.2
*/
public BoneMovement() {
this(
new Vector3f(),
new Vector3f(1),
new Quaternionf(),
new Vector3f()
);
}
/**
* Copies the values from another BoneMovement into this one.
*
* @param movement the source movement
* @return this movement instance
* @since 1.15.2
*/
public @NotNull BoneMovement set(@NotNull BoneMovement movement) {
position.set(movement.position);
scale.set(movement.scale);
rotation.set(movement.rotation);
rawRotation.set(movement.rawRotation);
return this;
}
/**
* Linearly interpolates between this movement and another movement.
*
* @param to the target movement
* @param alpha the interpolation factor (0.0 to 1.0)
* @param dest the destination movement to store the result
* @return the destination movement
* @since 2.1.0
*/
public @NotNull BoneMovement lerp(@NotNull BoneMovement to, float alpha, @NotNull BoneMovement dest) {
InterpolationUtil.lerp(position, to.position, alpha, dest.position);
InterpolationUtil.lerp(scale, to.scale, alpha, dest.scale);
MathUtil.toQuaternion(InterpolationUtil.lerp(rawRotation, to.rawRotation, alpha, dest.rawRotation), dest.rotation);
return dest;
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneName.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import com.google.gson.JsonDeserializer;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Unmodifiable;
import java.util.Objects;
import java.util.Set;
/**
* A tagged name of some bone
* @param tags tags
* @param name name
* @param rawName original name
*/
public record BoneName(@NotNull @Unmodifiable Set<BoneTag> tags, @NotNull String name, @NotNull String rawName) {
/**
* A JSON deserializer for parsing BoneName from a string.
* @since 2.0.1
*/
public static final JsonDeserializer<BoneName> PARSER = (json, _, _) -> BoneName.of(json.getAsString());
/**
* Internal constructor for BoneName.
*/
@ApiStatus.Internal
public BoneName {
}
/**
* Creates a new BoneName by parsing the raw name string.
* @param rawName the raw string to parse
* @since 2.0.1
* @return a parsed BoneName instance
*/
public static @NotNull BoneName of(@NotNull String rawName) {
return BoneTag.REGISTRY.parse(rawName);
}
/**
* Checks this name has some tags
* @param tags tags
* @return any match
*/
public boolean tagged(@NotNull BoneTag... tags) {
for (BoneTag boneTag : tags) {
if (this.tags.contains(boneTag)) return true;
}
return false;
}
/**
* Gets an item mapper of this bone name.
* @return item mapper
*/
public @NotNull BoneItemMapper toItemMapper() {
return tags.isEmpty() ? BoneItemMapper.EMPTY : tags.stream().map(BoneTag::itemMapper).filter(Objects::nonNull).findFirst().orElse(BoneItemMapper.EMPTY);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BoneName boneName)) return false;
return rawName.equals(boneName.rawName);
}
@Override
public int hashCode() {
return rawName.hashCode();
}
@Override
public @NotNull String toString() {
return rawName;
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BonePosition.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2026 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
import java.util.UUID;
/**
* Represents the position and state of a bone in a model.
*
* @param globalOffset the global offset vector
* @param localOffset the local offset vector
* @param state the unique identifier of the current state, or null if none
* @since 2.1.0
*/
public record BonePosition(
@NotNull Vector3f globalOffset,
@NotNull Vector3f localOffset,
@Nullable UUID state
) {
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneRenderContext.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import kr.toxicity.model.api.BetterModel;
import kr.toxicity.model.api.data.renderer.RenderSource;
import kr.toxicity.model.api.skin.SkinData;
import org.jetbrains.annotations.NotNull;
/**
* Render item context
* @param source source
* @param skin skin
*/
public record BoneRenderContext(@NotNull RenderSource<?> source, @NotNull SkinData skin) {
/**
* Creates default context
* @param source source
*/
public BoneRenderContext(@NotNull RenderSource<?> source) {
this(source, BetterModel.platform().skinManager().fallback());
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneTag.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.util.List;
/**
* A tag of bone
*/
public interface BoneTag {
/**
* The default registry for bone tags.
* @since 2.0.1
*/
BoneTagRegistry REGISTRY = new BoneTagRegistry();
/**
* Gets tag name
* @return tag name
*/
@NotNull String name();
/**
* Gets an item mapper
* @return item mapper
*/
@Nullable BoneItemMapper itemMapper();
/**
* Gets a tag list like 'h', 'hi', 'b'
* @since 2.0.1
* @return tags
*/
@NotNull @Unmodifiable
List<String> tags();
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneTagRegistry.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import it.unimi.dsi.fastutil.objects.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import static kr.toxicity.model.api.util.CollectionUtil.newAddressingMap;
/**
* Bone tag registry
*/
public final class BoneTagRegistry {
private static final String TAG_SPLITTER = "_";
private final Object2ObjectMap<String, BoneTag> byName = newAddressingMap();
BoneTagRegistry() {
for (BoneTags value : BoneTags.values()) {
addTag(value);
}
}
/**
* Adds some tag to this registry
* @param tag tag
*/
public void addTag(@NotNull BoneTag tag) {
BoneTag checkDuplicate;
for (String s : tag.tags()) {
if ((checkDuplicate = byName.put(s, tag)) != null) throw new RuntimeException("Duplicated tags: " + tag.name() + " between " + checkDuplicate.name());
}
}
/**
* Gets a bone tag by its name wrapped in an Optional.
* @param tag tag name
* @return bone tag
* @since 1.15.2
*/
public @NotNull Optional<BoneTag> byTagName(@NotNull String tag) {
return Optional.ofNullable(byTagNameOrNull(tag));
}
/**
* Gets a bone tag by its name.
* @param tag tag name
* @return bone tag or null
* @since 2.1.0
*/
public @Nullable BoneTag byTagNameOrNull(@NotNull String tag) {
return byName.get(tag);
}
/**
* Parses bone name by raw group name
* @param rawName raw name
* @return bone name
*/
public @NotNull BoneName parse(@NotNull String rawName) {
rawName = rawName.toLowerCase(Locale.ROOT);
var tagArray = rawName.split(TAG_SPLITTER);
if (tagArray.length < 2) return new BoneName(ObjectSets.emptySet(), rawName, rawName);
var tagList = List.of(tagArray);
var maxSize = tagList.size() - 1;
ObjectSet<BoneTag> set = maxSize <= 4 ? new ObjectArraySet<>(maxSize) : new ObjectOpenHashSet<>(maxSize);
for (String s : tagList) {
var tag = byTagNameOrNull(s);
if (tag != null && set.size() < maxSize) set.add(tag);
else return new BoneName(
set.isEmpty() ? ObjectSets.emptySet() : ObjectSets.unmodifiable(set),
set.isEmpty() ? rawName : String.join(TAG_SPLITTER, tagList.subList(set.size(), tagList.size())),
rawName
);
}
return new BoneName(
ObjectSets.unmodifiable(set),
String.join(TAG_SPLITTER, tagList.subList(set.size(), tagList.size())),
rawName
);
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneTags.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import kr.toxicity.model.api.entity.BaseEntity;
import kr.toxicity.model.api.nms.Profiled;
import kr.toxicity.model.api.platform.PlatformItemTransform;
import kr.toxicity.model.api.player.PlayerLimb;
import kr.toxicity.model.api.util.TransformedItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.util.List;
/**
* Builtin tags
*/
public enum BoneTags implements BoneTag {
/**
* Follows entity's head rotation
*/
HEAD("h"),
/**
* Follows entity's head rotation
*/
HEAD_WITH_CHILDREN("hi"),
/**
* Creates a hitbox following this bone
*/
HITBOX("b", "ob"),
/**
* It can be used as a seat
*/
SEAT("p"),
/**
* It can be used as a seat but not controllable
*/
SUB_SEAT("sp"),
/**
* Nametag
*/
TAG("tag"),
/**
* Mob's nametag
*/
MOB_TAG("mtag"),
/**
* Player's nametag
*/
PLAYER_TAG("ptag"),
/**
* Glow
*/
GLOW("glow"),
/**
* Entity's item in left hand
*/
LEFT_ITEM(BoneItemMapper.entity(
PlatformItemTransform.THIRDPERSON_LEFTHAND,
BaseEntity::offHand
), "pli", "li"),
/**
* Entity's item in right hand
*/
RIGHT_ITEM(BoneItemMapper.entity(
PlatformItemTransform.THIRDPERSON_RIGHTHAND,
BaseEntity::mainHand
), "pri", "ri"),
/**
* Player head
*/
PLAYER_HEAD(PlayerLimb.HEAD.getItemMapper(), "ph"),
/**
* Player right arm
*/
PLAYER_RIGHT_ARM(PlayerLimb.RIGHT_ARM.getItemMapper(), "pra"),
/**
* Player right forearm
*/
PLAYER_RIGHT_FOREARM(PlayerLimb.RIGHT_FOREARM.getItemMapper(), "prfa"),
/**
* Player left arm
*/
PLAYER_LEFT_ARM(PlayerLimb.LEFT_ARM.getItemMapper(), "pla"),
/**
* Player left forearm
*/
PLAYER_LEFT_FOREARM(PlayerLimb.LEFT_FOREARM.getItemMapper(), "plfa"),
/**
* Player left hip
*/
PLAYER_HIP(PlayerLimb.HIP.getItemMapper(), "phip"),
/**
* Player left waist
*/
PLAYER_WAIST(PlayerLimb.WAIST.getItemMapper(), "pw"),
/**
* Player left chest
*/
PLAYER_CHEST(PlayerLimb.CHEST.getItemMapper(), "pc"),
/**
* Player right leg
*/
PLAYER_RIGHT_LEG(PlayerLimb.RIGHT_LEG.getItemMapper(), "prl"),
/**
* Player right foreleg
*/
PLAYER_RIGHT_FORELEG(PlayerLimb.RIGHT_FORELEG.getItemMapper(), "prfl"),
/**
* Player left leg
*/
PLAYER_LEFT_LEG(PlayerLimb.LEFT_LEG.getItemMapper(), "pll"),
/**
* Player left foreleg
*/
PLAYER_LEFT_FORELEG(PlayerLimb.LEFT_FORELEG.getItemMapper(), "plfl"),
/**
* Cape
*/
CAPE(new BoneItemMapper() {
@Override
public @NotNull TransformedItemStack apply(@NotNull BoneRenderContext context, @NotNull TransformedItemStack transformedItemStack) {
TransformedItemStack cape = null;
if (context.source() instanceof Profiled profiled && profiled.skinParts().isCapeEnabled()) {
cape = context.skin().cape(profiled.armors());
}
return cape != null ? cape : TransformedItemStack.empty();
}
@Override
public @NotNull PlatformItemTransform transform() {
return PlatformItemTransform.FIXED;
}
}, "cape")
;
BoneTags(@NotNull String... tags) {
this(null, tags);
}
BoneTags(@Nullable BoneItemMapper itemMapper, @NotNull String... tags) {
this.itemMapper = itemMapper;
this.tags = List.of(tags);
}
@Nullable
private final BoneItemMapper itemMapper;
@NotNull
private final List<String> tags;
@Nullable
@Override
public BoneItemMapper itemMapper() {
return itemMapper;
}
@NotNull
@Unmodifiable
@Override
public List<String> tags() {
return tags;
}
}
================================================
FILE: api/src/main/java/kr/toxicity/model/api/bone/RenderedBone.java
================================================
/*
* This source file is part of BetterModel.
* Copyright (c) 2025 toxicity188
* Licensed under the MIT License.
* See LICENSE.md file for full license text.
*/
package kr.toxicity.model.api.bone;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet;
import it.unimi.dsi.fastutil.objects.ObjectSortedSets;
import kr.toxicity.model.api.BetterModel;
import kr.toxicity.model.api.animation.*;
import kr.toxicity.model.api.data.blueprint.BlueprintAnimation;
import kr.toxicity.model.api.data.blueprint.BlueprintElement;
import kr.toxicity.model.api.data.blueprint.ModelBoundingBox;
import kr.toxicity.model.api.data.renderer.RenderSource;
import kr.toxicity.model.api.data.renderer.RendererGroup;
import kr.toxicity.model.api.entity.BaseEntity;
import kr.toxicity.model.api.nms.*;
import kr.toxicity.model.api.platform.PlatformItemStack;
import kr.toxicity.model.api.platform.PlatformLocation;
import kr.toxicity.model.api.platform.PlatformPlayer;
import kr.toxicity.model.api.tracker.ModelRotation;
import kr.toxicity.model.api.tracker.Tracker;
import kr.toxicity.model.api.util.*;
import kr.toxicity.model.api.util.collection.SingletonSequencedSet;
import kr.toxicity.model.api.util.function.BonePredicate;
import kr.toxicity.model.api.util.function.FloatConstantSupplier;
import kr.toxicity.model.api.util.function.FloatSupplier;
import kr.toxicity.model.api.util.lock.DuplexLock;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* A rendered item-display.
*/
public final class RenderedBone implements BoneEventHandler {
private static final int INITIAL_TINT_VALUE = 0xFFFFFF;
private static final Vector3f EMPTY_VECTOR = new Vector3f();
private static final BonePosition EMPTY_POSITION = new BonePosition(EMPTY_VECTOR, EMPTY_VECTOR, null);
@Getter
@NotNull
final RendererGroup group;
private final BoneMovement defaultFrame;
private volatile BoneRenderContext renderContext;
private final BoneEventDispatcher eventDispatcher = new BoneEventDispatcher();
@NotNull
@Getter
final RenderedBone root;
@Nullable
@Getter
final RenderedBone parent;
final RenderedBone[] children;
private volatile SequencedSet<RenderedBone> flattenBones;
private final Int2ObjectMap<PlatformItemStack> tintCacheMap = new Int2ObjectOpenHashMap<>();
@Getter
private final boolean dummyBone;
private final Object itemLock = new Object();
//Resource
@Getter
@Nullable
private final ModelDisplay display;
@Getter
@Nullable
private HitBox hitBox;
@Getter
@Nullable
private ModelNametag nametag;
//Item
@Getter
@Setter
private BoneItemMapper itemMapper;
private volatile int previousTint = INITIAL_TINT_VALUE, tint = INITIAL_TINT_VALUE;
private volatile TransformedItemStack itemStack;
//Animation
private final BoneStateHandler globalState;
private final Map<UUID, BoneStateHandler> perPlayerState = new ConcurrentHashMap<>();
private vo
gitextract_aj8f7_rc/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ └── workflows/
│ ├── package.yml
│ ├── pr-test.yml
│ └── publish.yml
├── .gitignore
├── .idea/
│ └── codeStyles/
│ └── codeStyleConfig.xml
├── AGENTS.md
├── BANNER.md
├── LICENSE.md
├── LICENSE_HEADER
├── README.md
├── SECURITY.md
├── api/
│ ├── build.gradle.kts
│ ├── bukkit-api/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── api/
│ │ └── bukkit/
│ │ ├── BetterModelBukkit.java
│ │ ├── BukkitModelEventBus.java
│ │ ├── entity/
│ │ │ ├── BaseBukkitEntity.java
│ │ │ └── BaseBukkitPlayer.java
│ │ ├── event/
│ │ │ ├── BetterModelBukkitEvent.java
│ │ │ └── BukkitEventApplication.java
│ │ ├── platform/
│ │ │ ├── BukkitAdapter.java
│ │ │ ├── BukkitEntity.java
│ │ │ ├── BukkitItemStack.java
│ │ │ ├── BukkitLivingEntity.java
│ │ │ ├── BukkitLocation.java
│ │ │ ├── BukkitOfflinePlayer.java
│ │ │ ├── BukkitPlayer.java
│ │ │ └── BukkitWorld.java
│ │ └── scheduler/
│ │ └── BukkitModelScheduler.java
│ ├── mod-api/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── api/
│ │ └── mod/
│ │ ├── BetterModelMod.java
│ │ ├── entity/
│ │ │ ├── BaseModEntity.java
│ │ │ └── BaseModPlayer.java
│ │ ├── platform/
│ │ │ ├── ModAdapter.java
│ │ │ ├── ModEntity.java
│ │ │ ├── ModItemStack.java
│ │ │ ├── ModLivingEntity.java
│ │ │ ├── ModLocation.java
│ │ │ ├── ModOfflinePlayer.java
│ │ │ ├── ModPlayer.java
│ │ │ ├── ModRegionHolder.java
│ │ │ └── ModWorld.java
│ │ └── scheduler/
│ │ └── ModModelScheduler.java
│ └── src/
│ └── main/
│ └── java/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── api/
│ ├── BetterModel.java
│ ├── BetterModelConfig.java
│ ├── BetterModelEvaluator.java
│ ├── BetterModelEventBus.java
│ ├── BetterModelLogger.java
│ ├── BetterModelPlatform.java
│ ├── animation/
│ │ ├── AnimationIterator.java
│ │ ├── AnimationKeyframe.java
│ │ ├── AnimationModifier.java
│ │ ├── AnimationOverrideState.java
│ │ ├── AnimationProgress.java
│ │ ├── AnimationStateHandler.java
│ │ ├── RunningAnimation.java
│ │ ├── Timed.java
│ │ ├── TimedStorage.java
│ │ └── VectorPoint.java
│ ├── armor/
│ │ ├── ArmorItem.java
│ │ └── PlayerArmor.java
│ ├── bone/
│ │ ├── BoneEventDispatcher.java
│ │ ├── BoneEventHandler.java
│ │ ├── BoneIKSolver.java
│ │ ├── BoneItemMapper.java
│ │ ├── BoneMovement.java
│ │ ├── BoneName.java
│ │ ├── BonePosition.java
│ │ ├── BoneRenderContext.java
│ │ ├── BoneTag.java
│ │ ├── BoneTagRegistry.java
│ │ ├── BoneTags.java
│ │ └── RenderedBone.java
│ ├── config/
│ │ ├── DebugConfig.java
│ │ ├── IndicatorConfig.java
│ │ ├── ModuleConfig.java
│ │ └── PackConfig.java
│ ├── data/
│ │ ├── Float2.java
│ │ ├── Float3.java
│ │ ├── Float4.java
│ │ ├── ModelAsset.java
│ │ ├── blueprint/
│ │ │ ├── AnimationGenerator.java
│ │ │ ├── BlueprintAnimation.java
│ │ │ ├── BlueprintAnimator.java
│ │ │ ├── BlueprintElement.java
│ │ │ ├── BlueprintImage.java
│ │ │ ├── BlueprintJson.java
│ │ │ ├── BlueprintLoadContext.java
│ │ │ ├── BlueprintTexture.java
│ │ │ ├── ModelBlueprint.java
│ │ │ └── ModelBoundingBox.java
│ │ ├── raw/
│ │ │ ├── KeyframeChannel.java
│ │ │ ├── ModelAnimation.java
│ │ │ ├── ModelAnimator.java
│ │ │ ├── ModelData.java
│ │ │ ├── ModelDatapoint.java
│ │ │ ├── ModelElement.java
│ │ │ ├── ModelFace.java
│ │ │ ├── ModelGroup.java
│ │ │ ├── ModelKeyframe.java
│ │ │ ├── ModelLoadContext.java
│ │ │ ├── ModelLoadResult.java
│ │ │ ├── ModelMeta.java
│ │ │ ├── ModelOutliner.java
│ │ │ ├── ModelPlaceholder.java
│ │ │ ├── ModelResolution.java
│ │ │ ├── ModelTexture.java
│ │ │ └── ModelUV.java
│ │ └── renderer/
│ │ ├── ModelRenderer.java
│ │ ├── RenderPipeline.java
│ │ ├── RenderSource.java
│ │ └── RendererGroup.java
│ ├── entity/
│ │ ├── BaseEntity.java
│ │ └── BasePlayer.java
│ ├── event/
│ │ ├── AnimationSignalEvent.java
│ │ ├── CancellableEvent.java
│ │ ├── CloseTrackerEvent.java
│ │ ├── CreateDummyTrackerEvent.java
│ │ ├── CreateEntityTrackerEvent.java
│ │ ├── CreatePlayerSkinEvent.java
│ │ ├── DismountModelEvent.java
│ │ ├── ModelAssetsEvent.java
│ │ ├── ModelDamageSource.java
│ │ ├── ModelDespawnAtPlayerEvent.java
│ │ ├── ModelEvent.java
│ │ ├── ModelEventApplication.java
│ │ ├── ModelEventListener.java
│ │ ├── ModelImportedEvent.java
│ │ ├── ModelSpawnAtPlayerEvent.java
│ │ ├── MountModelEvent.java
│ │ ├── PlayerHideTrackerEvent.java
│ │ ├── PlayerPerAnimationEndEvent.java
│ │ ├── PlayerPerAnimationStartEvent.java
│ │ ├── PlayerShowTrackerEvent.java
│ │ ├── PluginEndReloadEvent.java
│ │ ├── PluginStartReloadEvent.java
│ │ ├── RemovePlayerSkinEvent.java
│ │ └── hitbox/
│ │ ├── HitBoxCreateEvent.java
│ │ ├── HitBoxDamagedEvent.java
│ │ ├── HitBoxDismountEvent.java
│ │ ├── HitBoxEvent.java
│ │ ├── HitBoxInteractAtEvent.java
│ │ ├── HitBoxMountEvent.java
│ │ └── HitBoxRemoveEvent.java
│ ├── manager/
│ │ ├── ModelManager.java
│ │ ├── PlayerManager.java
│ │ ├── ProfileManager.java
│ │ ├── ReloadInfo.java
│ │ ├── ScriptManager.java
│ │ └── SkinManager.java
│ ├── mount/
│ │ ├── MountController.java
│ │ └── MountControllers.java
│ ├── nms/
│ │ ├── AnimationBundler.java
│ │ ├── DisplayTransformer.java
│ │ ├── HitBox.java
│ │ ├── HitBoxListener.java
│ │ ├── Identifiable.java
│ │ ├── ModAnimationBundler.java
│ │ ├── ModelDisplay.java
│ │ ├── ModelInteractionHand.java
│ │ ├── ModelNametag.java
│ │ ├── NMS.java
│ │ ├── NMSVersion.java
│ │ ├── PacketBundler.java
│ │ ├── PlayerChannelHandler.java
│ │ └── Profiled.java
│ ├── pack/
│ │ ├── PackAssets.java
│ │ ├── PackBuilder.java
│ │ ├── PackBuiltInAssets.java
│ │ ├── PackByte.java
│ │ ├── PackMeta.java
│ │ ├── PackNamespace.java
│ │ ├── PackObfuscator.java
│ │ ├── PackOverlay.java
│ │ ├── PackPath.java
│ │ ├── PackResource.java
│ │ ├── PackResult.java
│ │ └── PackZipper.java
│ ├── platform/
│ │ ├── PlatformAdapter.java
│ │ ├── PlatformBillboard.java
│ │ ├── PlatformEntity.java
│ │ ├── PlatformItemStack.java
│ │ ├── PlatformItemTransform.java
│ │ ├── PlatformLivingEntity.java
│ │ ├── PlatformLocation.java
│ │ ├── PlatformNamespace.java
│ │ ├── PlatformOfflinePlayer.java
│ │ ├── PlatformPlayer.java
│ │ ├── PlatformRegionHolder.java
│ │ └── PlatformWorld.java
│ ├── player/
│ │ ├── PlayerLimb.java
│ │ └── PlayerSkinParts.java
│ ├── profile/
│ │ ├── ModelProfile.java
│ │ ├── ModelProfileInfo.java
│ │ ├── ModelProfileSkin.java
│ │ └── ModelProfileSupplier.java
│ ├── scheduler/
│ │ ├── ModelScheduler.java
│ │ └── ModelTask.java
│ ├── script/
│ │ ├── AnimationScript.java
│ │ ├── BlueprintScript.java
│ │ ├── ScriptBuilder.java
│ │ └── TimeScript.java
│ ├── skin/
│ │ └── SkinData.java
│ ├── tracker/
│ │ ├── DummyTracker.java
│ │ ├── EntityBodyRotator.java
│ │ ├── EntityHideOption.java
│ │ ├── EntityTracker.java
│ │ ├── EntityTrackerRegistry.java
│ │ ├── ModelRotation.java
│ │ ├── ModelRotator.java
│ │ ├── ModelScaler.java
│ │ ├── PlayerTracker.java
│ │ ├── Tracker.java
│ │ ├── TrackerAnimation.java
│ │ ├── TrackerBuiltInAnimation.java
│ │ ├── TrackerData.java
│ │ ├── TrackerExtraAnimation.java
│ │ ├── TrackerModifier.java
│ │ └── TrackerUpdateAction.java
│ ├── util/
│ │ ├── CollectionUtil.java
│ │ ├── EntityUtil.java
│ │ ├── EventUtil.java
│ │ ├── FunctionUtil.java
│ │ ├── HttpUtil.java
│ │ ├── InterpolationUtil.java
│ │ ├── LogUtil.java
│ │ ├── MathUtil.java
│ │ ├── PackUtil.java
│ │ ├── ReflectionUtil.java
│ │ ├── TransformedItemStack.java
│ │ ├── collection/
│ │ │ ├── PriorityMap.java
│ │ │ └── SingletonSequencedSet.java
│ │ ├── function/
│ │ │ ├── BonePredicate.java
│ │ │ ├── BooleanConstantSupplier.java
│ │ │ ├── Float2FloatConstantFunction.java
│ │ │ ├── Float2FloatFunction.java
│ │ │ ├── FloatConstantFunction.java
│ │ │ ├── FloatConstantSupplier.java
│ │ │ ├── FloatFunction.java
│ │ │ └── FloatSupplier.java
│ │ ├── interpolator/
│ │ │ └── VectorInterpolator.java
│ │ ├── json/
│ │ │ ├── JsonArrayBuilder.java
│ │ │ └── JsonObjectBuilder.java
│ │ ├── lazy/
│ │ │ └── LazyFloatProvider.java
│ │ └── lock/
│ │ ├── DuplexLock.java
│ │ └── SingleLock.java
│ └── version/
│ └── MinecraftVersion.java
├── build.gradle.kts
├── buildSrc/
│ ├── build.gradle.kts
│ ├── settings.gradle.kts
│ └── src/
│ └── main/
│ └── kotlin/
│ ├── Extensions.kt
│ ├── bukkit-conventions.gradle.kts
│ ├── modrinth-conventions.gradle.kts
│ ├── paperweight-conventions.gradle.kts
│ ├── plugin-conventions.gradle.kts
│ ├── publish-conventions.gradle.kts
│ └── standard-conventions.gradle.kts
├── changelog/
│ ├── 3.0.1.md
│ ├── 3.0.2.md
│ ├── v1/
│ │ ├── 1.10.0.md
│ │ ├── 1.10.1.md
│ │ ├── 1.10.2.md
│ │ ├── 1.10.3.md
│ │ ├── 1.11.0.md
│ │ ├── 1.11.1.md
│ │ ├── 1.11.2.md
│ │ ├── 1.11.3.md
│ │ ├── 1.11.4.md
│ │ ├── 1.12.0.md
│ │ ├── 1.12.1.md
│ │ ├── 1.13.0.md
│ │ ├── 1.13.1.md
│ │ ├── 1.13.2.md
│ │ ├── 1.13.3.md
│ │ ├── 1.13.4.md
│ │ ├── 1.14.0.md
│ │ ├── 1.14.1.md
│ │ ├── 1.14.2.md
│ │ ├── 1.15.0.md
│ │ ├── 1.15.1.md
│ │ ├── 1.15.2.md
│ │ ├── 1.3.2.md
│ │ ├── 1.3.3.md
│ │ ├── 1.4.1.md
│ │ ├── 1.4.2.md
│ │ ├── 1.4.3.md
│ │ ├── 1.4.md
│ │ ├── 1.5.1.md
│ │ ├── 1.5.2.md
│ │ ├── 1.5.3.md
│ │ ├── 1.5.4.md
│ │ ├── 1.5.5.md
│ │ ├── 1.5.md
│ │ ├── 1.6.0.md
│ │ ├── 1.6.1.md
│ │ ├── 1.7.0.md
│ │ ├── 1.8.0.md
│ │ ├── 1.8.1.md
│ │ ├── 1.9.0.md
│ │ ├── 1.9.1.md
│ │ ├── 1.9.2.md
│ │ └── 1.9.3.md
│ ├── v2/
│ │ ├── 2.0.0-pre1.md
│ │ ├── 2.0.0-pre2.md
│ │ ├── 2.0.0.md
│ │ ├── 2.0.1.md
│ │ ├── 2.1.0.md
│ │ └── 2.2.0.md
│ └── v3/
│ └── 3.0.0.md
├── core/
│ ├── build.gradle.kts
│ ├── bukkit-core/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ ├── AbstractBetterModelPlugin.java
│ │ │ ├── BetterModelLibrary.java
│ │ │ └── BetterModelLibraryManager.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ ├── BetterModelConfigImpl.kt
│ │ ├── BetterModelPlugin.kt
│ │ ├── BetterModelProperties.kt
│ │ ├── BukkitModelEventBusImpl.kt
│ │ ├── audience/
│ │ │ ├── AudiencePlayer.kt
│ │ │ ├── AudienceSender.kt
│ │ │ └── BukkitAudience.kt
│ │ ├── command/
│ │ │ └── Commands.kt
│ │ ├── compatibility/
│ │ │ ├── Compatibility.kt
│ │ │ ├── citizens/
│ │ │ │ ├── CitizensCompatibility.kt
│ │ │ │ ├── command/
│ │ │ │ │ ├── AnimateCommand.kt
│ │ │ │ │ ├── LimbCommand.kt
│ │ │ │ │ └── ModelCommand.kt
│ │ │ │ └── trait/
│ │ │ │ └── ModelTrait.kt
│ │ │ ├── mythicmobs/
│ │ │ │ ├── MythicMobsCompatibility.kt
│ │ │ │ ├── MythicMobsValue.kt
│ │ │ │ ├── condition/
│ │ │ │ │ └── ModelHasPassengerCondition.kt
│ │ │ │ ├── mechanic/
│ │ │ │ │ ├── AbstractSkillMechanic.kt
│ │ │ │ │ ├── BillboardMechanic.kt
│ │ │ │ │ ├── BindHitBoxMechanic.kt
│ │ │ │ │ ├── BodyRotationMechanic.kt
│ │ │ │ │ ├── BrightnessMechanic.kt
│ │ │ │ │ ├── ChangePartMechanic.kt
│ │ │ │ │ ├── DefaultStateMechanic.kt
│ │ │ │ │ ├── DismountAllModelMechanic.kt
│ │ │ │ │ ├── DismountModelMechanic.kt
│ │ │ │ │ ├── EnchantMechanic.kt
│ │ │ │ │ ├── GlowMechanic.kt
│ │ │ │ │ ├── LockModelMechanic.kt
│ │ │ │ │ ├── ModelMechanic.kt
│ │ │ │ │ ├── MountModelMechanic.kt
│ │ │ │ │ ├── PairModelMechanic.kt
│ │ │ │ │ ├── PartVisibilityMechanic.kt
│ │ │ │ │ ├── PlayLimbAnimMechanic.kt
│ │ │ │ │ ├── RemapModelMechanic.kt
│ │ │ │ │ ├── StateMechanic.kt
│ │ │ │ │ └── TintMechanic.kt
│ │ │ │ └── targeter/
│ │ │ │ └── ModelPartTargeter.kt
│ │ │ ├── nexo/
│ │ │ │ └── NexoCompatibility.kt
│ │ │ └── skinsrestorer/
│ │ │ └── SkinsRestorerCompatibility.kt
│ │ ├── configuration/
│ │ │ └── PluginConfiguration.kt
│ │ ├── manager/
│ │ │ ├── CompatibilityManager.kt
│ │ │ ├── EntityManager.kt
│ │ │ └── PlayerManagerImpl.kt
│ │ ├── scheduler/
│ │ │ ├── BukkitScheduler.kt
│ │ │ └── PaperScheduler.kt
│ │ └── util/
│ │ ├── BukkitWrappers.kt
│ │ ├── Entities.kt
│ │ ├── Events.kt
│ │ ├── Plugins.kt
│ │ ├── Senders.kt
│ │ └── Yamls.kt
│ └── src/
│ └── main/
│ ├── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── BetterModelPlatformImpl.java
│ ├── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ ├── BetterModelEvaluatorImpl.kt
│ │ ├── BetterModelEventBusImpl.kt
│ │ ├── command/
│ │ │ ├── CommandBuildContext.kt
│ │ │ ├── CommandBuilder.kt
│ │ │ ├── CommandExtensions.kt
│ │ │ └── CommandLike.kt
│ │ ├── manager/
│ │ │ ├── ArmorManager.kt
│ │ │ ├── GlobalManager.kt
│ │ │ ├── ModelManagerImpl.kt
│ │ │ ├── ProfileManagerImpl.kt
│ │ │ ├── ReloadPipeline.kt
│ │ │ ├── ScriptManagerImpl.kt
│ │ │ ├── SkinManagerImpl.kt
│ │ │ └── debug/
│ │ │ ├── BossBarIndicator.kt
│ │ │ └── ReloadIndicator.kt
│ │ ├── profile/
│ │ │ ├── DefaultHttpModelProfileSupplier.kt
│ │ │ └── HttpModelProfileSupplier.kt
│ │ ├── script/
│ │ │ ├── BrightnessScript.kt
│ │ │ ├── ChangePartScript.kt
│ │ │ ├── EnchantScript.kt
│ │ │ ├── PartVisibilityScript.kt
│ │ │ ├── RemapScript.kt
│ │ │ └── TintScript.kt
│ │ └── util/
│ │ ├── Buffers.kt
│ │ ├── Collections.kt
│ │ ├── Events.kt
│ │ ├── Files.kt
│ │ ├── Functions.kt
│ │ ├── Gsons.kt
│ │ ├── Indicators.kt
│ │ ├── Packs.kt
│ │ ├── Platforms.kt
│ │ ├── Scripts.kt
│ │ └── Senders.kt
│ └── resources/
│ ├── blue_wizard.bbmodel
│ ├── config.yml
│ ├── demon_knight.bbmodel
│ └── steve.bbmodel
├── gradle/
│ ├── libs.versions.toml
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── nms/
│ ├── v1_21_R3/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R3/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R3/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R4/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R4/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R4/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R5/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R5/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R5/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R6/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R6/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R6/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ ├── v1_21_R7/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── bukkit/
│ │ │ └── nms/
│ │ │ └── v1_21_R7/
│ │ │ └── AbstractHitBox.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v1_21_R7/
│ │ ├── BaseEntityImpl.kt
│ │ ├── BasePlayerImpl.kt
│ │ ├── BukkitWrappers.kt
│ │ ├── EntityData.kt
│ │ ├── Functions.kt
│ │ ├── HitBoxImpl.kt
│ │ ├── HitBoxInteraction.kt
│ │ ├── ModAnimationBundlerImpl.kt
│ │ ├── ModelDamageSourceImpl.kt
│ │ ├── ModelDisplayImpl.kt
│ │ ├── ModelGameProfile.kt
│ │ ├── ModelNametagImpl.kt
│ │ ├── NMSImpl.kt
│ │ ├── PacketBundlers.kt
│ │ ├── PlayerArmorImpl.kt
│ │ ├── ProfiledImpl.kt
│ │ └── TypeAliases.kt
│ └── v26_R1/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── java/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── bukkit/
│ │ └── nms/
│ │ └── v26_R1/
│ │ └── AbstractHitBox.java
│ └── kotlin/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── bukkit/
│ └── nms/
│ └── v26_R1/
│ ├── BaseEntityImpl.kt
│ ├── BasePlayerImpl.kt
│ ├── BukkitWrappers.kt
│ ├── EntityData.kt
│ ├── Functions.kt
│ ├── HitBoxImpl.kt
│ ├── HitBoxInteraction.kt
│ ├── ModAnimationBundlerImpl.kt
│ ├── ModelDamageSourceImpl.kt
│ ├── ModelDisplayImpl.kt
│ ├── ModelGameProfile.kt
│ ├── ModelNametagImpl.kt
│ ├── NMSImpl.kt
│ ├── PacketBundlers.kt
│ ├── PlayerArmorImpl.kt
│ ├── ProfiledImpl.kt
│ └── TypeAliases.kt
├── platform/
│ ├── fabric/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── kr/
│ │ │ │ └── toxicity/
│ │ │ │ └── model/
│ │ │ │ ├── impl/
│ │ │ │ │ └── fabric/
│ │ │ │ │ ├── entity/
│ │ │ │ │ │ ├── AbstractArmorStand.java
│ │ │ │ │ │ └── EntityHook.java
│ │ │ │ │ └── network/
│ │ │ │ │ └── BetterModelBundlePacket.java
│ │ │ │ └── mixin/
│ │ │ │ ├── AvatarAccessor.java
│ │ │ │ ├── ClientboundBundlePacketMixin.java
│ │ │ │ ├── ConnectionAccessor.java
│ │ │ │ ├── DisplayAccessor.java
│ │ │ │ ├── EntityAccessor.java
│ │ │ │ ├── EntityMixin.java
│ │ │ │ ├── ItemDisplayAccessor.java
│ │ │ │ ├── LivingEntityMixin.java
│ │ │ │ ├── MobAccessor.java
│ │ │ │ ├── ServerCommonPacketListenerImplAccessor.java
│ │ │ │ ├── ServerLevelEntityCallbacksMixin.java
│ │ │ │ └── SynchedEntityDataAccessor.java
│ │ │ ├── kotlin/
│ │ │ │ └── kr/
│ │ │ │ └── toxicity/
│ │ │ │ └── model/
│ │ │ │ └── impl/
│ │ │ │ └── fabric/
│ │ │ │ ├── BetterModelFabricImpl.kt
│ │ │ │ ├── BetterModelLoggerImpl.kt
│ │ │ │ ├── BetterModelNMSImpl.kt
│ │ │ │ ├── Constants.kt
│ │ │ │ ├── Entities.kt
│ │ │ │ ├── FabricWrappers.kt
│ │ │ │ ├── Functions.kt
│ │ │ │ ├── armor/
│ │ │ │ │ └── PlayerArmorImpl.kt
│ │ │ │ ├── attachment/
│ │ │ │ │ └── BetterModelAttachments.kt
│ │ │ │ ├── audience/
│ │ │ │ │ ├── AudienceCommandSource.kt
│ │ │ │ │ ├── AudiencePlayer.kt
│ │ │ │ │ └── AudienceSourceStack.kt
│ │ │ │ ├── chat/
│ │ │ │ │ └── Components.kt
│ │ │ │ ├── command/
│ │ │ │ │ └── Commands.kt
│ │ │ │ ├── config/
│ │ │ │ │ └── BetterModelConfigImpl.kt
│ │ │ │ ├── entity/
│ │ │ │ │ ├── BaseFabricEntityImpl.kt
│ │ │ │ │ ├── BaseFabricPlayerImpl.kt
│ │ │ │ │ ├── DisplayTransformerImpl.kt
│ │ │ │ │ ├── HitBoxEntityImpl.kt
│ │ │ │ │ ├── InteractionEntityImpl.kt
│ │ │ │ │ ├── ModelDisplayEntityImpl.kt
│ │ │ │ │ ├── ModelNametagImpl.kt
│ │ │ │ │ ├── PlayerChannelHandlerImpl.kt
│ │ │ │ │ ├── ProfiledImpl.kt
│ │ │ │ │ └── TransformationData.kt
│ │ │ │ ├── events/
│ │ │ │ │ ├── ServerEntityDismountCallback.kt
│ │ │ │ │ ├── ServerLivingEntityJumpCallback.kt
│ │ │ │ │ ├── ServerMobEffectLoadCallback.kt
│ │ │ │ │ └── ServerMobEffectUnloadCallback.kt
│ │ │ │ ├── manager/
│ │ │ │ │ ├── EntityManager.kt
│ │ │ │ │ ├── PlayerManagerImpl.kt
│ │ │ │ │ └── Syncers.kt
│ │ │ │ ├── network/
│ │ │ │ │ ├── ModAnimationBundlerImpl.kt
│ │ │ │ │ ├── PacketBundlers.kt
│ │ │ │ │ └── Packets.kt
│ │ │ │ ├── profile/
│ │ │ │ │ └── ModelProfileImpl.kt
│ │ │ │ ├── scheduler/
│ │ │ │ │ └── FabricModelSchedulerImpl.kt
│ │ │ │ └── world/
│ │ │ │ ├── Chunks.kt
│ │ │ │ └── damagesource/
│ │ │ │ └── ModelDamageSourceImpl.kt
│ │ │ └── resources/
│ │ │ ├── bettermodel.accesswidener
│ │ │ └── bettermodel.mixins.json
│ │ └── testmod/
│ │ ├── kotlin/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── test/
│ │ │ └── RollTest.kt
│ │ └── resources/
│ │ ├── knight.bbmodel
│ │ ├── knight_line.json
│ │ └── knight_sword.json
│ ├── paper/
│ │ ├── build.gradle.kts
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── kr/
│ │ │ └── toxicity/
│ │ │ └── model/
│ │ │ └── paper/
│ │ │ └── BetterModelLoader.java
│ │ └── kotlin/
│ │ └── kr/
│ │ └── toxicity/
│ │ └── model/
│ │ └── paper/
│ │ └── BetterModelPaper.kt
│ └── spigot/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ └── kotlin/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── spigot/
│ └── BetterModelSpigot.kt
├── purpur/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ └── kotlin/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── bukkit/
│ └── purpur/
│ └── PurpurHook.kt
├── renovate.json
├── settings.gradle.kts
└── test-plugin/
├── build.gradle.kts
└── src/
└── main/
├── java/
│ └── kr/
│ └── toxicity/
│ └── model/
│ └── test/
│ ├── BetterModelTest.java
│ ├── FightTester.java
│ ├── ModelTester.java
│ └── RollTester.java
└── resources/
├── knight.bbmodel
├── knight_line.json
└── knight_sword.json
SYMBOL INDEX (2077 symbols across 242 files)
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/BetterModelBukkit.java
type BetterModelBukkit (line 27) | public interface BetterModelBukkit extends BetterModelPlatform {
method platform (line 51) | static @NotNull BetterModelBukkit platform() {
method scheduler (line 61) | @Override
method adapter (line 70) | @Override
method eventBus (line 79) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/BukkitModelEventBus.java
type BukkitModelEventBus (line 27) | public interface BukkitModelEventBus extends BetterModelEventBus {
method subscribe (line 39) | @NotNull
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/entity/BaseBukkitEntity.java
type BaseBukkitEntity (line 33) | public interface BaseBukkitEntity extends BaseEntity, PersistentDataHold...
method entity (line 48) | default @NotNull Entity entity() {
method mainHand (line 58) | @Override
method offHand (line 73) | @Override
method modelData (line 88) | default @Nullable String modelData() {
method modelData (line 98) | default void modelData(@Nullable String modelData) {
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/entity/BaseBukkitPlayer.java
type BaseBukkitPlayer (line 24) | public interface BaseBukkitPlayer extends BaseBukkitEntity, BasePlayer {
method entity (line 31) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/event/BetterModelBukkitEvent.java
class BetterModelBukkitEvent (line 30) | public final class BetterModelBukkitEvent extends Event {
method BetterModelBukkitEvent (line 45) | @ApiStatus.Internal
method is (line 60) | public <T extends ModelEvent> boolean is(@NotNull Class<T> eventClass) {
method as (line 75) | public <T extends ModelEvent> @Nullable T as(@NotNull Class<T> eventCl...
method as (line 95) | public <T extends ModelEvent> void as(@NotNull Class<T> eventClass, @N...
method source (line 106) | @ApiStatus.Internal
method getHandlers (line 111) | @Override
method getHandlerList (line 122) | public static HandlerList getHandlerList() {
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/event/BukkitEventApplication.java
method of (line 36) | public static @NotNull BukkitEventApplication of(@NotNull Plugin plugin) {
method isEnabled (line 40) | @Override
method equals (line 46) | @Override
method hashCode (line 52) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitAdapter.java
class BukkitAdapter (line 31) | public final class BukkitAdapter implements PlatformAdapter {
method adapt (line 40) | public static @NotNull PlatformEntity adapt(@NotNull Entity entity) {
method adapt (line 51) | public static @NotNull PlatformLivingEntity adapt(@NotNull LivingEntit...
method adapt (line 62) | public static @NotNull PlatformOfflinePlayer adapt(@NotNull OfflinePla...
method adapt (line 73) | public static @NotNull PlatformPlayer adapt(@NotNull Player player) {
method adapt (line 84) | public static @NotNull PlatformItemStack adapt(@NotNull ItemStack item...
method adapt (line 95) | public static @NotNull PlatformLocation adapt(@NotNull Location locati...
method adapt (line 106) | public static @NotNull PlatformWorld adapt(@NotNull World world) {
method player (line 110) | @Override
method offlinePlayer (line 116) | @Override
method serverViewDistance (line 121) | @Override
method isTickThread (line 126) | @Override
method isRegionSafe (line 131) | @Override
method air (line 136) | @Override
method zero (line 141) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitEntity.java
class BukkitEntity (line 24) | @ToString
method BukkitEntity (line 36) | public BukkitEntity(@NotNull Entity source) {
method source (line 46) | public Entity source() {
method uuid (line 50) | @Override
method location (line 55) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitItemStack.java
method isAir (line 24) | @Override
method enchant (line 29) | @Override
method modelData (line 38) | @SuppressWarnings("deprecation")
method clone (line 49) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitLivingEntity.java
class BukkitLivingEntity (line 20) | public class BukkitLivingEntity extends BukkitEntity implements Platform...
method BukkitLivingEntity (line 28) | public BukkitLivingEntity(@NotNull LivingEntity source) {
method source (line 38) | @Override
method eyeLocation (line 43) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitLocation.java
method world (line 26) | @Override
method x (line 31) | @Override
method y (line 36) | @Override
method z (line 41) | @Override
method pitch (line 46) | @Override
method yaw (line 51) | @Override
method add (line 56) | @Override
method task (line 61) | @Override
method taskLater (line 66) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitOfflinePlayer.java
method uuid (line 24) | @Override
method name (line 29) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitPlayer.java
class BukkitPlayer (line 20) | public final class BukkitPlayer extends BukkitLivingEntity implements Pl...
method BukkitPlayer (line 28) | public BukkitPlayer(@NotNull Player source) {
method source (line 38) | public @NotNull Player source() {
method name (line 42) | @Override
FILE: api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/scheduler/BukkitModelScheduler.java
type BukkitModelScheduler (line 25) | public interface BukkitModelScheduler extends ModelScheduler {
method task (line 35) | @Nullable ModelTask task(@NotNull Location location, @NotNull Runnable...
method taskLater (line 46) | @Nullable ModelTask taskLater(@NotNull Location location, long delay, ...
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/BetterModelMod.java
type BetterModelMod (line 25) | public interface BetterModelMod extends BetterModelPlatform {
method platform (line 33) | static @NotNull BetterModelMod platform() {
method server (line 43) | @NotNull MinecraftServer server();
method scheduler (line 51) | @Override
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/entity/BaseModEntity.java
type BaseModEntity (line 22) | public interface BaseModEntity extends BaseEntity {
method entity (line 30) | default @NotNull Entity entity() {
method entity (line 40) | void entity(@NotNull Entity entity);
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/entity/BaseModPlayer.java
type BaseModPlayer (line 23) | public interface BaseModPlayer extends BaseModEntity, BasePlayer {
method entity (line 31) | @Override
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModAdapter.java
class ModAdapter (line 34) | public final class ModAdapter implements PlatformAdapter {
method adapt (line 43) | public static @NotNull PlatformEntity adapt(@NotNull Entity entity) {
method adapt (line 54) | public static @NotNull PlatformLivingEntity adapt(@NotNull LivingEntit...
method adapt (line 65) | public static @NotNull PlatformPlayer adapt(@NotNull ServerPlayerConne...
method adapt (line 76) | public static @NotNull PlatformPlayer adapt(@NotNull ServerPlayer play...
method adapt (line 87) | public static @NotNull PlatformOfflinePlayer adapt(@NotNull UUID uuid) {
method adapt (line 98) | public static @NotNull PlatformOfflinePlayer adapt(@NotNull GameProfil...
method adapt (line 109) | public static @NotNull PlatformItemStack adapt(@NotNull ItemStack item...
method adapt (line 120) | public static @NotNull PlatformWorld adapt(@NotNull Level world) {
method serverViewDistance (line 124) | @Override
method isTickThread (line 129) | @Override
method isRegionSafe (line 134) | @Override
method player (line 139) | @Override
method offlinePlayer (line 145) | @Override
method air (line 151) | @Override
method zero (line 156) | @Override
method server (line 161) | private @NotNull MinecraftServer server() {
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModEntity.java
method of (line 36) | public static @NotNull ModEntity of(@NotNull Entity source) {
method uuid (line 40) | @Override
method location (line 45) | @Override
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModItemStack.java
method of (line 40) | public static @NotNull ModItemStack of(@NotNull ItemStack source) {
method isAir (line 44) | @Override
method enchant (line 49) | @Override
method modelData (line 55) | @Override
method clone (line 68) | @Override
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModLivingEntity.java
method of (line 36) | public static @NotNull ModLivingEntity of(@NotNull LivingEntity source) {
method uuid (line 40) | @Override
method location (line 45) | @Override
method eyeLocation (line 50) | @Override
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModLocation.java
method of (line 50) | public static @NotNull ModLocation of(@Nullable Level level, double x, d...
method of (line 71) | public static @NotNull ModLocation of(@Nullable Level level, double x, d...
method of (line 92) | public static @NotNull ModLocation of(@Nullable Level level, Vec3 positi...
method of (line 111) | public static @NotNull ModLocation of(@Nullable Level level, Vec3 positi...
method of (line 129) | public static @NotNull ModLocation of(@NotNull Entity entity) {
method ofEye (line 147) | public static @NotNull ModLocation ofEye(@NotNull Entity entity) {
method world (line 158) | @Override
method add (line 167) | @Override
method task (line 179) | @Override
method taskLater (line 184) | @Override
method scheduler (line 189) | private @NotNull ModModelScheduler scheduler() {
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModOfflinePlayer.java
method of (line 37) | public static @NotNull ModOfflinePlayer of(@NotNull UUID uuid, @Nullable...
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModPlayer.java
method of (line 36) | public static @NotNull ModPlayer of(@NotNull ServerPlayerConnection sour...
method uuid (line 40) | @Override
method location (line 45) | @Override
method eyeLocation (line 50) | @Override
method name (line 55) | @Override
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModRegionHolder.java
type ModRegionHolder (line 21) | public interface ModRegionHolder extends PlatformRegionHolder {
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModWorld.java
method of (line 33) | public static @NotNull ModWorld of(@NotNull Level level) {
FILE: api/mod-api/src/main/java/kr/toxicity/model/api/mod/scheduler/ModModelScheduler.java
type ModModelScheduler (line 24) | public interface ModModelScheduler extends ModelScheduler {
method task (line 33) | @Nullable ModelTask task(@NotNull Runnable runnable);
method taskLater (line 43) | @Nullable ModelTask taskLater(long delay, @NotNull Runnable runnable);
FILE: api/src/main/java/kr/toxicity/model/api/BetterModel.java
class BetterModel (line 32) | public final class BetterModel {
method BetterModel (line 37) | private BetterModel() {
method config (line 52) | public static @NotNull BetterModelConfig config() {
method model (line 63) | public static @NotNull Optional<ModelRenderer> model(@NotNull String n...
method modelOrNull (line 74) | public static @Nullable ModelRenderer modelOrNull(@NotNull String name) {
method limb (line 85) | public static @NotNull Optional<ModelRenderer> limb(@NotNull String na...
method limbOrNull (line 96) | public static @Nullable ModelRenderer limbOrNull(@NotNull String name) {
method player (line 107) | public static @NotNull Optional<PlayerChannelHandler> player(@NotNull ...
method registry (line 118) | public static @NotNull Optional<EntityTrackerRegistry> registry(@NotNu...
method registry (line 129) | public static @NotNull Optional<EntityTrackerRegistry> registry(@NotNu...
method registry (line 140) | public static @NotNull Optional<EntityTrackerRegistry> registry(@NotNu...
method registryOrNull (line 151) | public static @Nullable EntityTrackerRegistry registryOrNull(@NotNull ...
method registryOrNull (line 162) | public static @Nullable EntityTrackerRegistry registryOrNull(@NotNull ...
method registryOrNull (line 173) | public static @Nullable EntityTrackerRegistry registryOrNull(@NotNull ...
method models (line 183) | public static @NotNull @Unmodifiable Collection<ModelRenderer> models() {
method limbs (line 193) | public static @NotNull @Unmodifiable Collection<ModelRenderer> limbs() {
method modelKeys (line 203) | public static @NotNull @Unmodifiable Set<String> modelKeys() {
method limbKeys (line 213) | public static @NotNull @Unmodifiable Set<String> limbKeys() {
method platform (line 224) | public static @NotNull BetterModelPlatform platform() {
method nms (line 234) | public static @NotNull NMS nms() {
method eventBus (line 244) | public static @NotNull BetterModelEventBus eventBus() {
method register (line 258) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelConfig.java
type BetterModelConfig (line 29) | public interface BetterModelConfig {
method debug (line 37) | @NotNull DebugConfig debug();
method indicator (line 45) | @NotNull IndicatorConfig indicator();
method module (line 53) | @NotNull ModuleConfig module();
method pack (line 61) | @NotNull PackConfig pack();
method metrics (line 69) | boolean metrics();
method sightTrace (line 77) | boolean sightTrace();
method mergeWithExternalResources (line 85) | boolean mergeWithExternalResources();
method item (line 93) | @NotNull Supplier<PlatformItemStack> item();
method itemModel (line 101) | @NotNull String itemModel();
method itemNamespace (line 109) | @NotNull String itemNamespace();
method maxSight (line 117) | double maxSight();
method minSight (line 125) | double minSight();
method namespace (line 133) | @NotNull String namespace();
method packType (line 141) | @NotNull PackType packType();
method buildFolderLocation (line 149) | @NotNull String buildFolderLocation();
method followMobInvisibility (line 157) | boolean followMobInvisibility();
method usePurpurAfk (line 165) | boolean usePurpurAfk();
method versionCheck (line 173) | boolean versionCheck();
method defaultMountController (line 182) | @NotNull MountController defaultMountController();
method lerpFrameTime (line 190) | int lerpFrameTime();
method cancelPlayerModelInventory (line 198) | boolean cancelPlayerModelInventory();
method playerHideDelay (line 206) | long playerHideDelay();
method packetBundlingSize (line 214) | int packetBundlingSize();
method enableStrictLoading (line 225) | boolean enableStrictLoading();
type PackType (line 232) | enum PackType {
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelEvaluator.java
type BetterModelEvaluator (line 16) | public interface BetterModelEvaluator {
method compile (line 22) | @NotNull Float2FloatFunction compile(@NotNull String expression);
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelEventBus.java
type BetterModelEventBus (line 28) | public interface BetterModelEventBus {
method subscribe (line 40) | @NotNull
method call (line 55) | <T extends ModelEvent> @NotNull Result call(@NotNull Class<? extends T...
method call (line 64) | default @NotNull Result call(@NotNull ModelEvent event) {
type Result (line 73) | @RequiredArgsConstructor
method triggered (line 103) | public boolean triggered() {
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelLogger.java
type BetterModelLogger (line 16) | public interface BetterModelLogger {
method info (line 21) | void info(@NotNull Component... message);
method warn (line 27) | void warn(@NotNull Component... message);
FILE: api/src/main/java/kr/toxicity/model/api/BetterModelPlatform.java
type BetterModelPlatform (line 34) | public interface BetterModelPlatform extends ModelEventApplication {
method dataFolder (line 43) | @NotNull File dataFolder();
method jarType (line 51) | @NotNull JarType jarType();
method reload (line 59) | default @NotNull ReloadResult reload() {
method reload (line 70) | default @NotNull ReloadResult reload(@NotNull Audience sender) {
method reload (line 81) | @NotNull ReloadResult reload(@NotNull ReloadInfo info);
method isSnapshot (line 90) | boolean isSnapshot();
method config (line 98) | @NotNull BetterModelConfig config();
method version (line 106) | @NotNull MinecraftVersion version();
method semver (line 114) | @NotNull Semver semver();
method nms (line 122) | @NotNull NMS nms();
method modelManager (line 130) | @NotNull ModelManager modelManager();
method playerManager (line 138) | @NotNull PlayerManager playerManager();
method scriptManager (line 146) | @NotNull ScriptManager scriptManager();
method skinManager (line 154) | @NotNull SkinManager skinManager();
method profileManager (line 161) | @NotNull ProfileManager profileManager();
method scheduler (line 169) | @NotNull ModelScheduler scheduler();
method adapter (line 175) | @NotNull PlatformAdapter adapter();
method addReloadStartHandler (line 183) | void addReloadStartHandler(@NotNull Consumer<PackZipper> consumer);
method addReloadEndHandler (line 191) | void addReloadEndHandler(@NotNull Consumer<ReloadResult> consumer);
method logger (line 199) | @NotNull BetterModelLogger logger();
method evaluator (line 207) | @NotNull BetterModelEvaluator evaluator();
method eventBus (line 215) | @NotNull BetterModelEventBus eventBus();
method getResource (line 224) | @Nullable InputStream getResource(@NotNull String path);
type ReloadResult (line 231) | sealed interface ReloadResult {
method packingTime (line 249) | public long packingTime() {
method totalTime (line 259) | public long totalTime() {
method length (line 269) | public long length() {
type OnReload (line 279) | enum OnReload implements ReloadResult {
type JarType (line 303) | @RequiredArgsConstructor
method raw (line 329) | public String raw() {
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationIterator.java
type AnimationIterator (line 27) | public sealed interface AnimationIterator<T extends Timed> extends Itera...
method clear (line 33) | void clear();
method type (line 41) | @NotNull Type type();
type Type (line 47) | @RequiredArgsConstructor
method create (line 55) | @Override
method create (line 66) | @Override
method create (line 77) | @Override
method create (line 92) | public abstract <T extends Timed> @NotNull AnimationIterator<T> crea...
class PlayOnce (line 101) | @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
method clear (line 106) | @Override
method hasNext (line 111) | @Override
method next (line 116) | @Override
method type (line 122) | @NotNull
class HoldOnLast (line 135) | @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
method clear (line 140) | @Override
method hasNext (line 145) | @Override
method next (line 150) | @Override
method type (line 157) | @NotNull
class Loop (line 170) | @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
method clear (line 175) | @Override
method hasNext (line 180) | @Override
method next (line 185) | @Override
method type (line 192) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationKeyframe.java
method builder (line 41) | public static @NotNull Builder builder(int size, boolean rotateGlobal) {
method AnimationArray (line 53) | AnimationArray(int size, boolean rotateGlobal) {
class Builder (line 73) | public static final class Builder {
method Builder (line 79) | private Builder(int size, boolean rotateGlobal) {
method write (line 94) | public void write(
method build (line 128) | public @NotNull AnimationKeyframe build() {
method animate (line 135) | @Override
method skipInterpolation (line 158) | @Override
method globalRotation (line 163) | @Override
method time (line 168) | @Override
method get (line 174) | @Override
method getLast (line 179) | @Override
method size (line 184) | @Override
method toEmpty (line 195) | public @NotNull TimedStorage<AnimationProgress> toEmpty() {
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationModifier.java
method builder (line 56) | public static @NotNull Builder builder() {
method toBuilder (line 64) | public @NotNull Builder toBuilder() {
class Builder (line 78) | public static final class Builder {
method Builder (line 91) | private Builder() {
method predicate (line 99) | public @NotNull Builder predicate(@Nullable BooleanSupplier predicate) {
method start (line 109) | public @NotNull Builder start(int start) {
method end (line 119) | public @NotNull Builder end(int end) {
method priority (line 129) | public @NotNull Builder priority(int priority) {
method type (line 139) | public @NotNull Builder type(@Nullable AnimationIterator.Type type) {
method speed (line 149) | public @NotNull Builder speed(float speed) {
method speed (line 159) | public @NotNull Builder speed(@Nullable FloatSupplier speed) {
method override (line 169) | public @NotNull Builder override(@Nullable Boolean override) {
method player (line 179) | public @NotNull Builder player(@Nullable PlatformPlayer player) {
method mergeNotDefault (line 189) | public @NotNull Builder mergeNotDefault(@NotNull AnimationModifier mod...
method build (line 204) | public @NotNull AnimationModifier build() {
method AnimationModifier (line 225) | public AnimationModifier(int start, int end) {
method AnimationModifier (line 236) | public AnimationModifier(int start, int end, float speedValue) {
method AnimationModifier (line 247) | public AnimationModifier(int start, int end, @Nullable FloatSupplier sup...
method AnimationModifier (line 258) | public AnimationModifier(int start, int end, @Nullable AnimationIterator...
method AnimationModifier (line 270) | public AnimationModifier(int start, int end, @Nullable AnimationIterator...
method AnimationModifier (line 283) | public AnimationModifier(@Nullable BooleanSupplier predicate, int start,...
method type (line 292) | public @NotNull AnimationIterator.Type type(@NotNull AnimationIterator.T...
method speedValue (line 300) | public float speedValue() {
method predicateValue (line 308) | public boolean predicateValue() {
method override (line 317) | public boolean override(boolean original) {
method toSupplier (line 321) | private static @Nullable FloatSupplier toSupplier(float speed) {
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationOverrideState.java
type AnimationOverrideState (line 10) | public enum AnimationOverrideState {
method shouldSkip (line 15) | public boolean shouldSkip() {
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationProgress.java
type AnimationProgress (line 23) | public interface AnimationProgress extends Timed {
method skipInterpolation (line 36) | boolean skipInterpolation();
method globalRotation (line 44) | boolean globalRotation();
method empty (line 53) | static @NotNull AnimationProgress empty(float time) {
method toEmpty (line 63) | default @NotNull AnimationProgress toEmpty() {
method emptyStorage (line 75) | static @NotNull TimedStorage<AnimationProgress> emptyStorage(float tim...
method animate (line 90) | @NotNull BoneMovement animate(@NotNull BoneMovement movement, @NotNull...
method animate (line 100) | @Override
method toEmpty (line 105) | @Override
method skipInterpolation (line 110) | @Override
method globalRotation (line 115) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/animation/AnimationStateHandler.java
class AnimationStateHandler (line 27) | @RequiredArgsConstructor
method keyframeFinished (line 45) | public boolean keyframeFinished() {
method beforeKeyframe (line 53) | public T beforeKeyframe() {
method afterKeyframe (line 61) | public T afterKeyframe() {
method beforeKeyframe (line 70) | @NotNull
method afterKeyframe (line 81) | @NotNull
method runningAnimation (line 91) | public @Nullable RunningAnimation runningAnimation() {
method tick (line 100) | public boolean tick() {
method tick (line 109) | public boolean tick(@NotNull Runnable ifEmpty) {
method progress (line 122) | public float progress() {
method shouldUpdateAnimation (line 127) | private boolean shouldUpdateAnimation() {
method updateAnimation (line 131) | private boolean updateAnimation() {
method updateKeyframe (line 160) | private boolean updateKeyframe(@NotNull Iterator<TreeIterator> iterato...
method setAfterKeyframe (line 170) | private boolean setAfterKeyframe(@Nullable T next) {
method addAnimation (line 187) | public void addAnimation(@NotNull String name, @NotNull AnimationItera...
method replaceAnimation (line 199) | public void replaceAnimation(@NotNull String name, @NotNull AnimationI...
method stopAnimation (line 212) | public boolean stopAnimation(@NotNull String name) {
method frame (line 225) | public float frame() {
class TreeIterator (line 229) | private class TreeIterator implements BooleanSupplier {
method TreeIterator (line 242) | public TreeIterator(String name, AnimationIterator<T> iterator, Anim...
method getAsBoolean (line 251) | @Override
method hasNext (line 256) | public boolean hasNext() {
method next (line 260) | public @NotNull T next() {
method clear (line 276) | public void clear() {
FILE: api/src/main/java/kr/toxicity/model/api/animation/Timed.java
type Timed (line 16) | public interface Timed extends Comparable<Timed> {
method compareTo (line 18) | default int compareTo(@NotNull Timed o) {
method time (line 26) | float time();
FILE: api/src/main/java/kr/toxicity/model/api/animation/TimedStorage.java
type TimedStorage (line 24) | public interface TimedStorage<T extends Timed> {
method listOf (line 34) | @NotNull
method get (line 47) | @NotNull T get(int index);
method size (line 55) | int size();
method getLast (line 64) | @NotNull T getLast();
method get (line 74) | @Override
method size (line 79) | @Override
method getLast (line 84) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/animation/VectorPoint.java
method vector (line 50) | public @NotNull Vector3f vector() {
method vector (line 61) | public @NotNull Vector3f vector(float time) {
method isContinuous (line 71) | public boolean isContinuous() {
method leftTime (line 92) | @Override
method leftValue (line 103) | @Override
method rightTime (line 114) | @Override
method rightValue (line 125) | @Override
method equals (line 131) | @Override
method hashCode (line 137) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/armor/PlayerArmor.java
type PlayerArmor (line 15) | public interface PlayerArmor {
method helmet (line 21) | @Override
method chestplate (line 26) | @Override
method leggings (line 31) | @Override
method boots (line 36) | @Override
method helmet (line 46) | @Nullable ArmorItem helmet();
method chestplate (line 52) | @Nullable ArmorItem chestplate();
method leggings (line 58) | @Nullable ArmorItem leggings();
method boots (line 64) | @Nullable ArmorItem boots();
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneEventDispatcher.java
class BoneEventDispatcher (line 27) | public final class BoneEventDispatcher {
method extend (line 41) | public synchronized void extend(@NotNull BoneEventDispatcher dispatche...
method handleCreateHitBox (line 52) | public synchronized void handleCreateHitBox(@NotNull BiFunction<Render...
method handleStateCreate (line 63) | public synchronized void handleStateCreate(@NotNull BiConsumer<Rendere...
method handleStateRemove (line 73) | public synchronized void handleStateRemove(@NotNull BiConsumer<Rendere...
method onCreateHitBox (line 77) | @NotNull HitBoxListener.Builder onCreateHitBox(@NotNull RenderedBone b...
method onStateCreated (line 81) | void onStateCreated(@NotNull RenderedBone bone, @NotNull UUID uuid) {
method onStateRemoved (line 85) | void onStateRemoved(@NotNull RenderedBone bone, @NotNull UUID uuid) {
class EventFunction (line 89) | @AllArgsConstructor
method EventFunction (line 95) | EventFunction() {
method concat (line 103) | static @NotNull EventFunction concat(@NotNull EventFunction first, @...
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneEventHandler.java
type BoneEventHandler (line 12) | public interface BoneEventHandler {
method eventDispatcher (line 13) | @NotNull BoneEventDispatcher eventDispatcher();
method extend (line 15) | default void extend(@NotNull BoneEventHandler eventHandler) {
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneIKSolver.java
class BoneIKSolver (line 28) | @ApiStatus.Internal
method addLocator (line 44) | public void addLocator(@Nullable UUID ikSource, @NotNull UUID ikTarget...
method solve (line 58) | public void solve() {
method solve (line 66) | public void solve(@Nullable UUID uuid) {
method IKChain (line 84) | private IKChain(@NotNull RenderedBone[] bones) {
method first (line 88) | private @NotNull RenderedBone first() {
method invertedFirstRotation (line 92) | private @NotNull Quaternionf invertedFirstRotation(@Nullable UUID uuid) {
method movements (line 96) | private @NotNull BoneMovement[] movements(@Nullable UUID uuid) {
method IKCache (line 106) | private IKCache(int length) {
method fabrik (line 111) | private static void fabrik(@NotNull BoneMovement[] bones, @NotNull Qua...
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneItemMapper.java
type BoneItemMapper (line 23) | public interface BoneItemMapper extends BiFunction<BoneRenderContext, Tr...
method apply (line 25) | @Override
method transform (line 32) | @NotNull
method apply (line 38) | @Override
method player (line 51) | static @NotNull BoneItemMapper player(@NotNull PlatformItemTransform t...
method entity (line 79) | static @NotNull BoneItemMapper entity(@NotNull PlatformItemTransform t...
method fixed (line 105) | default boolean fixed() {
method transform (line 113) | @NotNull PlatformItemTransform transform();
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneMovement.java
method BoneMovement (line 39) | public BoneMovement() {
method set (line 55) | public @NotNull BoneMovement set(@NotNull BoneMovement movement) {
method lerp (line 72) | public @NotNull BoneMovement lerp(@NotNull BoneMovement to, float alpha,...
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneName.java
method of (line 45) | public static @NotNull BoneName of(@NotNull String rawName) {
method tagged (line 54) | public boolean tagged(@NotNull BoneTag... tags) {
method toItemMapper (line 65) | public @NotNull BoneItemMapper toItemMapper() {
method equals (line 69) | @Override
method hashCode (line 76) | @Override
method toString (line 81) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneRenderContext.java
method BoneRenderContext (line 26) | public BoneRenderContext(@NotNull RenderSource<?> source) {
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneTag.java
type BoneTag (line 19) | public interface BoneTag {
method name (line 31) | @NotNull String name();
method itemMapper (line 37) | @Nullable BoneItemMapper itemMapper();
method tags (line 44) | @NotNull @Unmodifiable
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneTagRegistry.java
class BoneTagRegistry (line 23) | public final class BoneTagRegistry {
method BoneTagRegistry (line 28) | BoneTagRegistry() {
method addTag (line 38) | public void addTag(@NotNull BoneTag tag) {
method byTagName (line 51) | public @NotNull Optional<BoneTag> byTagName(@NotNull String tag) {
method byTagNameOrNull (line 61) | public @Nullable BoneTag byTagNameOrNull(@NotNull String tag) {
method parse (line 70) | public @NotNull BoneName parse(@NotNull String rawName) {
FILE: api/src/main/java/kr/toxicity/model/api/bone/BoneTags.java
type BoneTags (line 24) | public enum BoneTags implements BoneTag {
method apply (line 127) | @Override
method transform (line 136) | @Override
method BoneTags (line 143) | BoneTags(@NotNull String... tags) {
method BoneTags (line 147) | BoneTags(@Nullable BoneItemMapper itemMapper, @NotNull String... tags) {
method itemMapper (line 157) | @Nullable
method tags (line 163) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/bone/RenderedBone.java
class RenderedBone (line 53) | public final class RenderedBone implements BoneEventHandler {
method RenderedBone (line 120) | @ApiStatus.Internal
method locator (line 148) | public void locator(@NotNull BoneIKSolver solver) {
method state (line 156) | private @NotNull BoneStateHandler state(@Nullable PlatformPlayer playe...
method state (line 160) | @NotNull BoneStateHandler state(@Nullable UUID uuid) {
method getOrCreateState (line 164) | private @NotNull BoneStateHandler getOrCreateState(@Nullable PlatformP...
method getOrCreateState (line 168) | private @NotNull BoneStateHandler getOrCreateState(@Nullable UUID uuid) {
method runningAnimation (line 175) | public @Nullable RunningAnimation runningAnimation() {
method eventDispatcher (line 179) | @Override
method updateItem (line 184) | public boolean updateItem(@NotNull Predicate<RenderedBone> predicate) {
method updateItem (line 188) | public boolean updateItem(@NotNull BoneRenderContext context) {
method createHitBox (line 202) | public boolean createHitBox(@NotNull BaseEntity entity, @NotNull Predi...
method createNametag (line 224) | public boolean createNametag(@NotNull Predicate<RenderedBone> predicat...
method enchant (line 241) | public boolean enchant(@NotNull Predicate<RenderedBone> predicate, boo...
method scale (line 249) | public void scale(@NotNull FloatSupplier scale) {
method applyAtDisplay (line 259) | public boolean applyAtDisplay(@NotNull Predicate<RenderedBone> predica...
method itemStack (line 273) | public boolean itemStack(@NotNull Predicate<RenderedBone> predicate, @...
method addLocalRotModifier (line 292) | public synchronized boolean addLocalRotModifier(@NotNull Predicate<Ren...
method addGlobalRotModifier (line 306) | public synchronized boolean addGlobalRotModifier(@NotNull Predicate<Re...
method addPositionModifier (line 320) | public synchronized boolean addPositionModifier(@NotNull Predicate<Ren...
method rotate (line 328) | public boolean rotate(@NotNull ModelRotation rotation, @NotNull Packet...
method tick (line 337) | public boolean tick() {
method tick (line 341) | public boolean tick(@NotNull UUID uuid) {
method dirtyUpdate (line 346) | public void dirtyUpdate(@NotNull PacketBundler bundler) {
method forceUpdate (line 351) | public void forceUpdate(boolean showItem, @NotNull PacketBundler bundl...
method forceUpdate (line 356) | public void forceUpdate(@NotNull PacketBundler bundler) {
method sendTransformation (line 361) | public void sendTransformation(@Nullable UUID uuid, @NotNull Animation...
method forceTransformation (line 365) | public void forceTransformation(@NotNull PacketBundler bundler) {
method interpolationDuration (line 370) | public int interpolationDuration() {
method worldPosition (line 374) | public @NotNull Vector3f worldPosition() {
method worldPosition (line 378) | public @NotNull Vector3f worldPosition(@NotNull BonePosition position) {
method worldPosition (line 382) | public @NotNull Vector3f worldPosition(@NotNull BoneMovement cache) {
method worldPosition (line 386) | public @NotNull Vector3f worldPosition(@NotNull BonePosition position,...
method worldRotation (line 390) | public @NotNull Vector3f worldRotation() {
method worldRotation (line 394) | public @NotNull Vector3f worldRotation(@Nullable UUID uuid) {
method defaultPosition (line 398) | public void defaultPosition(@NotNull Supplier<Vector3f> movement) {
method modifiedPosition (line 402) | private @NotNull Vector3f modifiedPosition(boolean preventModifierUpda...
method modifiedLocalRot (line 406) | private @NotNull Quaternionf modifiedLocalRot(boolean preventModifierU...
method modifiedGlobalRot (line 410) | private @NotNull Quaternionf modifiedGlobalRot(boolean preventModifier...
method tint (line 414) | public boolean tint(@NotNull Predicate<RenderedBone> predicate) {
method tint (line 418) | public boolean tint(@NotNull Predicate<RenderedBone> predicate, int ti...
method applyItem (line 430) | private boolean applyItem() {
method applyItem (line 438) | private void applyItem(@NotNull ModelDisplay targetDisplay) {
method teleport (line 442) | public void teleport(@NotNull PlatformLocation location, @NotNull Pack...
method spawn (line 446) | public void spawn(boolean hide, @NotNull PacketBundler bundler) {
method addAnimation (line 452) | public boolean addAnimation(@NotNull AnimationOverrideState overrideSt...
method replaceAnimation (line 461) | public boolean replaceAnimation(@NotNull AnimationOverrideState overri...
method stopAnimation (line 476) | public boolean stopAnimation(@NotNull Predicate<RenderedBone> filter, ...
method remove (line 484) | public void remove(@NotNull PacketBundler bundler) {
method flatten (line 489) | public @NotNull Stream<RenderedBone> flatten() {
method flattenBones (line 493) | @Unmodifiable
method matchTree (line 510) | public boolean matchTree(@NotNull BonePredicate predicate, @NotNull Bi...
method matchAnimation (line 519) | public boolean matchAnimation(@NotNull AnimationOverrideState override...
method hitBoxPosition (line 528) | @NotNull
method hitBoxPosition (line 533) | @NotNull
method hitBoxScale (line 540) | public float hitBoxScale() {
method rotation (line 544) | @NotNull
class BoneStateHandler (line 549) | final class BoneStateHandler {
method BoneStateHandler (line 572) | private BoneStateHandler(@Nullable UUID uuid, @NotNull Consumer<UUID...
method after (line 581) | @NotNull BoneMovement after() {
method tick (line 609) | private boolean tick() {
method progress (line 624) | private float progress() {
method interpolationDuration (line 628) | private int interpolationDuration() {
method sendTransformation (line 634) | private void sendTransformation(@NotNull AnimationBundler bundler) {
method worldPosition (line 658) | private @NotNull Vector3f worldPosition(@NotNull BonePosition positi...
method worldRotation (line 675) | private @NotNull Vector3f worldRotation() {
method name (line 681) | public @NotNull BoneName name() {
method uuid (line 685) | public @NotNull UUID uuid() {
method equals (line 689) | @Override
method hashCode (line 696) | @Override
method toString (line 701) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/config/DebugConfig.java
type DebugOption (line 29) | @RequiredArgsConstructor
method has (line 56) | public boolean has(@NotNull DebugOption option) {
method from (line 70) | public static @NotNull DebugConfig from(@NotNull Predicate<String> predi...
FILE: api/src/main/java/kr/toxicity/model/api/config/IndicatorConfig.java
type IndicatorOption (line 29) | @RequiredArgsConstructor
method from (line 49) | public static @NotNull IndicatorConfig from(@NotNull Predicate<String> p...
FILE: api/src/main/java/kr/toxicity/model/api/config/ModuleConfig.java
method from (line 36) | public static @NotNull ModuleConfig from(@NotNull Predicate<String> pred...
FILE: api/src/main/java/kr/toxicity/model/api/config/PackConfig.java
method from (line 35) | public static @NotNull PackConfig from(@NotNull Predicate<String> predic...
FILE: api/src/main/java/kr/toxicity/model/api/data/Float2.java
method toVector (line 43) | public @NotNull Vector2f toVector() {
FILE: api/src/main/java/kr/toxicity/model/api/data/Float3.java
method Float3 (line 35) | public Float3(float value) {
method plus (line 68) | public @NotNull Float3 plus(@NotNull Float3 other) {
method convertToMinecraftDegree (line 80) | public @NotNull Float3 convertToMinecraftDegree() {
method rotate (line 90) | public @NotNull Float3 rotate(@NotNull Quaternionf quaternionf) {
method minus (line 101) | public @NotNull Float3 minus(@NotNull Float3 other) {
method toBlockScale (line 113) | public @NotNull Float3 toBlockScale() {
method times (line 122) | public @NotNull Float3 times(float value) {
method div (line 134) | public @NotNull Float3 div(float value) {
method invertXZ (line 146) | public @NotNull Float3 invertXZ() {
method toJson (line 158) | public @NotNull JsonArray toJson() {
method toQuaternionZYX (line 166) | public @NotNull Quaternionf toQuaternionZYX() {
method toQuaternionXYZ (line 175) | public @NotNull Quaternionf toQuaternionXYZ() {
method toVector (line 188) | public @NotNull Vector3f toVector() {
method hashCode (line 192) | @Override
method equals (line 202) | @Override
method toString (line 211) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/Float4.java
method div (line 52) | public @NotNull Float4 div(@NotNull ModelResolution resolution) {
method div (line 62) | public @NotNull Float4 div(float width, float height) {
method isValid (line 75) | public boolean isValid() {
method toJson (line 86) | public @NotNull JsonArray toJson() {
method hashCode (line 95) | @Override
method equals (line 106) | @Override
method toString (line 116) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/ModelAsset.java
method of (line 57) | public static @NotNull ModelAsset of(@NotNull String name, byte[] bytes) {
method of (line 69) | public static @NotNull ModelAsset of(@NotNull String name, @NotNull Stre...
method of (line 82) | public static @NotNull ModelAsset of(@NotNull String name, long sizeAssu...
method of (line 94) | public static @NotNull ModelAsset of(@NotNull File file) {
method of (line 106) | public static @NotNull ModelAsset of(@NotNull Path path) {
method nameWithoutExtension (line 114) | private static @NotNull String nameWithoutExtension(@NotNull String name) {
method toResult (line 126) | public @NotNull ModelLoadResult toResult() {
method compareTo (line 141) | @Override
method equals (line 146) | @Override
method hashCode (line 152) | @Override
method toString (line 157) | @Override
type StreamSupplier (line 167) | public interface StreamSupplier {
method get (line 175) | @NotNull InputStream get() throws IOException;
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/AnimationGenerator.java
class AnimationGenerator (line 38) | @ApiStatus.Internal
method createMovements (line 57) | public static @NotNull Map<BoneName, BlueprintAnimator> createMovements(
method AnimationGenerator (line 83) | private AnimationGenerator(
method interpolateRotation (line 106) | public void interpolateRotation(@NotNull FloatSortedSet floats) {
method interpolateStep (line 136) | public void interpolateStep(@NotNull FloatSortedSet floats) {
method interpolateStep (line 147) | private void interpolateStep(@NotNull FloatSortedSet floats, @NotNull ...
class AnimationTree (line 158) | private class AnimationTree {
method AnimationTree (line 165) | AnimationTree(@NotNull BlueprintElement.Group group, @Nullable Bluep...
method AnimationTree (line 168) | AnimationTree(
method flatten (line 180) | @NotNull
method tree (line 188) | private float tree(float first, float second, @NotNull Function<Blue...
method findTree (line 193) | private @NotNull Vector3f findTree(float first, float second, @NotNu...
method find (line 197) | private @NotNull Vector3f find(float first, float second, @NotNull L...
method find (line 200) | private @NotNull Vector3f find(float time, @NotNull List<VectorPoint...
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintAnimation.java
method script (line 58) | public @Nullable BlueprintScript script(@NotNull AnimationModifier modif...
method emptyIterator (line 69) | public @NotNull AnimationIterator<AnimationProgress> emptyIterator(@NotN...
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintAnimator.java
method allPoints (line 58) | public @NotNull Stream<VectorPoint> allPoints() {
method iterator (line 76) | public @NotNull AnimationIterator<AnimationProgress> iterator(@NotNull A...
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintElement.java
type BlueprintElement (line 41) | public sealed interface BlueprintElement {
type Bone (line 54) | sealed interface Bone extends BlueprintElement {
method uuid (line 62) | @NotNull UUID uuid();
method name (line 70) | @NotNull BoneName name();
method origin (line 78) | @NotNull Float3 origin();
method rotation (line 87) | default @NotNull Float3 rotation() {
method visibility (line 97) | default boolean visibility() {
method origin (line 127) | @Override
method jsonName (line 133) | private @NotNull String jsonName(@NotNull BlueprintLoadContext context) {
method buildLegacyJson (line 145) | public @Nullable BlueprintJson buildLegacyJson(
method buildModernJson (line 160) | @Nullable
method buildMeshItemModel (line 185) | public @Nullable JsonObject buildMeshItemModel(
method buildJson (line 198) | private @Nullable BlueprintJson buildJson(
method scale (line 236) | public float scale() {
method hitBox (line 249) | public @Nullable ModelBoundingBox hitBox() {
method origin (line 291) | @Override
method origin (line 332) | @Override
method identifierDegree (line 365) | private @NotNull Float3 identifierDegree() {
method centralize (line 369) | private static @NotNull Float3 centralize(@NotNull Float3 target, @Not...
method deltaPosition (line 373) | private static @NotNull Float3 deltaPosition(@NotNull Float3 target, @...
method buildJson (line 377) | private @NotNull JsonObject buildJson(
method max (line 422) | public float max(@NotNull Float3 origin) {
method faces (line 435) | @Override
method hasTexture (line 446) | public boolean hasTexture() {
method getRotation (line 450) | private @NotNull JsonObject getRotation(@NotNull Float3 rot) {
method toShape (line 489) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintImage.java
method estimatedSize (line 32) | public long estimatedSize() {
method pngName (line 42) | public @NotNull String pngName() {
method mcmetaName (line 52) | public @NotNull String mcmetaName() {
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintJson.java
method jsonName (line 36) | public @NotNull String jsonName() {
method buildJson (line 46) | public @NotNull JsonElement buildJson() {
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintLoadContext.java
class BlueprintLoadContext (line 33) | @ApiStatus.Internal
method BlueprintLoadContext (line 48) | BlueprintLoadContext(
method name (line 71) | public @NotNull String name() {
method triangleName (line 81) | public @NotNull MeshTriangleName triangleName() {
method resolution (line 91) | public @NotNull ModelResolution resolution() {
method texture (line 102) | public @NotNull BlueprintTexture texture(int index) {
method imageByIndex (line 106) | @NotNull
method canBeRendered (line 137) | public boolean canBeRendered() {
method buildImage (line 148) | @NotNull
class TextureRef (line 160) | private static final class TextureRef {
method TextureRef (line 166) | private TextureRef(BlueprintTexture texture) {
method canBeRendered (line 170) | public boolean canBeRendered() {
method texture (line 174) | public @NotNull BlueprintTexture texture() {
method image (line 179) | public @NotNull MeshImage image() {
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintTexture.java
method isAnimatedTexture (line 51) | public boolean isAnimatedTexture() {
method toMcmeta (line 67) | public @NotNull JsonObject toMcmeta() {
method packName (line 83) | public @NotNull String packName(@NotNull PackObfuscator obfuscator) {
method packNamespace (line 94) | public @NotNull String packNamespace(@NotNull PackObfuscator obfuscator) {
method hasUVSize (line 104) | public boolean hasUVSize() {
method resolution (line 115) | public @NotNull ModelResolution resolution(@NotNull ModelResolution reso...
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/ModelBlueprint.java
method context (line 46) | public @NotNull BlueprintLoadContext context() {
FILE: api/src/main/java/kr/toxicity/model/api/data/blueprint/ModelBoundingBox.java
method of (line 51) | public static @NotNull ModelBoundingBox of(@NotNull Vector3d min, @NotNu...
method of (line 71) | public static @NotNull ModelBoundingBox of(double x, double y, double z) {
method of (line 97) | public static @NotNull ModelBoundingBox of(
method x (line 121) | public double x() {
method y (line 131) | public double y() {
method centerY (line 141) | public double centerY() {
method z (line 151) | public double z() {
method centerPoint (line 161) | public @NotNull Vector3f centerPoint() {
method times (line 176) | public @NotNull ModelBoundingBox times(double scale) {
method center (line 193) | public @NotNull ModelBoundingBox center() {
method invert (line 211) | public @NotNull ModelBoundingBox invert() {
method rotate (line 229) | public @NotNull ModelBoundingBox rotate(@NotNull Quaterniond quaterniond) {
method min (line 243) | public @NotNull Vector3d min() {
method max (line 253) | public @NotNull Vector3d max() {
method lengthZX (line 263) | public double lengthZX() {
method length (line 273) | public double length() {
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/KeyframeChannel.java
type KeyframeChannel (line 18) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelAnimation.java
method toBlueprint (line 63) | public @NotNull BlueprintAnimation toBlueprint(
method toScript (line 93) | private @NotNull BlueprintScript toScript(@NotNull ModelAnimator animato...
method loop (line 127) | @Override
method animators (line 138) | @Override
method buildAnimationData (line 144) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelAnimator.java
method rotationGlobal (line 42) | public boolean rotationGlobal() {
method isAvailable (line 52) | public boolean isAvailable() {
method isNotEmpty (line 62) | public boolean isNotEmpty() {
method name (line 71) | @Override
method keyframes (line 81) | @Override
method stream (line 92) | public @NotNull Stream<ModelKeyframe> stream() {
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelData.java
method loadBlueprint (line 79) | public @NotNull ModelLoadResult loadBlueprint(@NotNull String name) {
method loadBlueprint (line 91) | public @NotNull ModelLoadResult loadBlueprint(@NotNull String name, bool...
method assertSupported (line 120) | public void assertSupported() {
method placeholder (line 135) | @Override
method animations (line 146) | @Override
method groups (line 158) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelDatapoint.java
method hasScript (line 48) | public boolean hasScript() {
method script (line 59) | @Override
method toFunction (line 75) | public @NotNull FloatFunction<Vector3f> toFunction(@NotNull ModelLoadCon...
method build (line 93) | private static @NotNull Float2FloatFunction build(@Nullable JsonPrimitiv...
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelElement.java
type ModelElement (line 31) | @ApiStatus.Internal
method uuid (line 83) | @NotNull String uuid();
method type (line 91) | @NotNull String type();
method toBlueprint (line 99) | @NotNull BlueprintElement toBlueprint();
method isSupported (line 107) | default boolean isSupported() {
method type (line 124) | @Override
method position (line 134) | @Override
method toBlueprint (line 139) | @Override
method type (line 158) | @Override
method toBlueprint (line 163) | @Override
method type (line 188) | @Override
method position (line 199) | @Override
method toBlueprint (line 204) | @Override
method uuid (line 230) | @Override
method isSupported (line 235) | @Override
method toBlueprint (line 240) | @Override
method type (line 274) | @Override
method from (line 285) | @Override
method to (line 296) | @Override
method visibility (line 307) | public boolean visibility() {
method rotation (line 317) | @Override
method lightEmission (line 328) | @Override
method toBlueprint (line 333) | @Override
method origin (line 374) | @Override
method rotation (line 385) | @Override
method type (line 396) | @Override
method visibility (line 401) | public boolean visibility() {
method toBlueprint (line 405) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelFace.java
method toJson (line 48) | public @NotNull JsonObject toJson(@NotNull BlueprintLoadContext parent, ...
method hasTexture (line 66) | public boolean hasTexture() {
method textureIndex (line 75) | public @NotNull IntStream textureIndex() {
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelGroup.java
method origin (line 44) | @Override
method rotation (line 56) | @Override
method visibility (line 68) | public boolean visibility() {
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelKeyframe.java
method hasPoint (line 59) | public boolean hasPoint() {
method point (line 70) | public @NotNull ModelDatapoint point() {
method point (line 82) | public @NotNull VectorPoint point(@NotNull ModelLoadContext context, @No...
method interpolation (line 102) | @Override
method channel (line 113) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelLoadContext.java
class ModelLoadContext (line 27) | @RequiredArgsConstructor
method trySupply (line 49) | @NotNull <T> T trySupply(@NotNull Supplier<T> supplier, @NotNull Funct...
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelMeta.java
type FormatVersion (line 44) | @RequiredArgsConstructor
method convertAnimationRotation (line 51) | @Override
method convertAnimationPosition (line 58) | @Override
method convertAnimationRotation (line 70) | @Override
method convertAnimationPosition (line 77) | @Override
method find (line 95) | public static @NotNull FormatVersion find(int major) {
method convertAnimationRotation (line 109) | public abstract @NotNull Vector3f convertAnimationRotation(@NotNull Ve...
method convertAnimationPosition (line 118) | public abstract @NotNull Vector3f convertAnimationPosition(@NotNull Ve...
method convertAnimationScale (line 127) | public @NotNull Vector3f convertAnimationScale(@NotNull Vector3f vecto...
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelOutliner.java
type ModelOutliner (line 34) | @ApiStatus.Internal
method toBlueprint (line 66) | @NotNull BlueprintElement toBlueprint(@NotNull ModelLoadContext context);
method flatten (line 74) | @NotNull Stream<ModelOutliner> flatten();
method uuid (line 82) | @NotNull String uuid();
method toBlueprint (line 91) | @Override
method flatten (line 96) | @Override
method toBlueprint (line 114) | @Override
method flatten (line 129) | @Override
method uuid (line 137) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelPlaceholder.java
method parseVariable (line 57) | public @NotNull String parseVariable(@NotNull String expression) {
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelTexture.java
method toBlueprint (line 56) | public @NotNull BlueprintTexture toBlueprint(@NotNull ModelLoadContext c...
method nameWithoutExtension (line 77) | public @NotNull String nameWithoutExtension() {
FILE: api/src/main/java/kr/toxicity/model/api/data/raw/ModelUV.java
method hasTexture (line 42) | public boolean hasTexture() {
method textureIndex (line 53) | public int textureIndex() {
method toJson (line 65) | public @Nullable JsonObject toJson(@NotNull BlueprintLoadContext context...
FILE: api/src/main/java/kr/toxicity/model/api/data/renderer/ModelRenderer.java
method groupByTree (line 53) | public @Nullable RendererGroup groupByTree(@NotNull BoneName name) {
method groupByTree0 (line 57) | private static @Nullable RendererGroup groupByTree0(@NotNull Map<BoneNam...
method flatten (line 73) | public @NotNull Stream<RendererGroup> flatten() {
method animation (line 83) | public @NotNull Optional<BlueprintAnimation> animation(@NotNull String n...
method create (line 95) | public @NotNull DummyTracker create(@NotNull PlatformLocation location) {
method create (line 106) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 119) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 135) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 147) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 160) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 171) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 183) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 197) | public @NotNull DummyTracker create(@NotNull PlatformLocation location, ...
method create (line 214) | public @NotNull EntityTracker create(@NotNull PlatformEntity entity) {
method create (line 225) | public @NotNull EntityTracker create(@NotNull PlatformEntity entity, @No...
method create (line 237) | public @NotNull EntityTracker create(@NotNull PlatformEntity entity, @No...
method create (line 248) | public @NotNull EntityTracker create(@NotNull PlatformEntity entity, @No...
method create (line 260) | public @NotNull EntityTracker create(@NotNull PlatformEntity entity, @No...
method create (line 273) | public @NotNull EntityTracker create(@NotNull PlatformEntity entity, @No...
method getOrCreate (line 283) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity) {
method getOrCreate (line 294) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 306) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 317) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 329) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 342) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 353) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 365) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method getOrCreate (line 378) | public @NotNull EntityTracker getOrCreate(@NotNull PlatformEntity entity...
method create (line 388) | public @NotNull EntityTracker create(@NotNull BaseEntity entity) {
method create (line 398) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 411) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 427) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 439) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 452) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 463) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 475) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method create (line 489) | public @NotNull EntityTracker create(@NotNull BaseEntity entity, @NotNul...
method getOrCreate (line 504) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity) {
method getOrCreate (line 515) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, @N...
method getOrCreate (line 528) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, @N...
method getOrCreate (line 545) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, @N...
method getOrCreate (line 558) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, Mo...
method getOrCreate (line 571) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, @N...
method getOrCreate (line 582) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, @N...
method getOrCreate (line 595) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, Mo...
method getOrCreate (line 609) | public @NotNull EntityTracker getOrCreate(@NotNull BaseEntity entity, @N...
method pipeline (line 619) | private @NotNull RenderPipeline pipeline(@NotNull RenderSource<?> source) {
type Type (line 630) | @RequiredArgsConstructor
FILE: api/src/main/java/kr/toxicity/model/api/data/renderer/RenderPipeline.java
class RenderPipeline (line 52) | public final class RenderPipeline implements BoneEventHandler, Iterable<...
method RenderPipeline (line 89) | public RenderPipeline(
method createBundler (line 115) | public @NotNull PacketBundler createBundler() {
method channel (line 126) | public @Nullable PlayerChannelHandler channel(@NotNull UUID uuid) {
method createAnimationBundler (line 137) | public @NotNull AnimationBundler createAnimationBundler() {
method eventDispatcher (line 146) | @Override
method viewFilter (line 157) | public void viewFilter(@NotNull Predicate<PlatformPlayer> filter) {
method hideFilter (line 167) | public void hideFilter(@NotNull Predicate<PlatformPlayer> filter) {
method spawnPacketHandler (line 177) | public void spawnPacketHandler(@NotNull Consumer<PacketBundler> spawnP...
method despawnPacketHandler (line 187) | public void despawnPacketHandler(@NotNull Consumer<PacketBundler> desp...
method hidePacketHandler (line 197) | public void hidePacketHandler(@NotNull Consumer<PacketBundler> despawn...
method showPacketHandler (line 207) | public void showPacketHandler(@NotNull Consumer<PacketBundler> despawn...
method isSpawned (line 218) | public boolean isSpawned(@NotNull UUID uuid) {
method runningAnimation (line 228) | public @Nullable RunningAnimation runningAnimation() {
method name (line 238) | public @NotNull String name() {
method despawn (line 247) | public void despawn() {
method rotate (line 263) | public boolean rotate(@NotNull ModelRotation rotation, @NotNull Packet...
method tick (line 276) | public boolean tick(@NotNull AnimationBundler bundler) {
method tick (line 293) | public boolean tick(@NotNull UUID uuid, @NotNull AnimationBundler bund...
method defaultPosition (line 308) | public void defaultPosition(@NotNull Function<Vector3f, Vector3f> move...
method scale (line 320) | public void scale(@NotNull FloatSupplier scale) {
method addLocalRotModifier (line 332) | public boolean addLocalRotModifier(@NotNull BonePredicate predicate, @...
method addGlobalRotModifier (line 344) | public boolean addGlobalRotModifier(@NotNull BonePredicate predicate, ...
method addPositionModifier (line 356) | public boolean addPositionModifier(@NotNull BonePredicate predicate, @...
method bones (line 366) | public @NotNull @Unmodifiable Collection<RenderedBone> bones() {
method hitboxes (line 376) | public @NotNull Stream<HitBox> hitboxes() {
method boneOf (line 389) | public @Nullable RenderedBone boneOf(@NotNull BoneName name) {
method spawn (line 402) | @ApiStatus.Internal
method remove (line 422) | @ApiStatus.Internal
method remove0 (line 431) | @ApiStatus.Internal
method matchTree (line 445) | public boolean matchTree(@NotNull BonePredicate predicate, BiPredicate...
method matchAnimation (line 464) | public boolean matchAnimation(@NotNull BiPredicate<RenderedBone, Anima...
method matchTree (line 480) | public boolean matchTree(@NotNull Predicate<RenderedBone> predicate) {
method firstNotNull (line 497) | public <T> @Nullable T firstNotNull(@NotNull Function<RenderedBone, T>...
method playerCount (line 512) | public int playerCount() {
method allPlayer (line 522) | public @NotNull Stream<PlayerChannelHandler> allPlayer() {
method nonHidePlayer (line 534) | public @NotNull Stream<PlayerChannelHandler> nonHidePlayer() {
method viewedPlayer (line 548) | public @NotNull Stream<PlayerChannelHandler> viewedPlayer() {
method hide (line 559) | public boolean hide(@NotNull PlatformPlayer player) {
method isHide (line 578) | public boolean isHide(@NotNull PlatformPlayer player) {
method show (line 589) | public boolean show(@NotNull PlatformPlayer player) {
method forEach (line 601) | @Override
method iterator (line 608) | @Override
method spliterator (line 614) | @Override
method stream (line 626) | public @NotNull Stream<RenderedBone> stream() {
class SpawnedPlayer (line 635) | @RequiredArgsConstructor
method load (line 645) | public void load() {
FILE: api/src/main/java/kr/toxicity/model/api/data/renderer/RenderSource.java
type RenderSource (line 35) | public sealed interface RenderSource<T extends Tracker> {
method of (line 44) | @ApiStatus.Internal
method of (line 57) | @ApiStatus.Internal
method of (line 70) | @ApiStatus.Internal
method of (line 82) | @ApiStatus.Internal
method location (line 93) | @NotNull PlatformLocation location();
method create (line 104) | T create(@NotNull RenderPipeline pipeline, @NotNull TrackerModifier mo...
method completeContext (line 115) | @NotNull CompletableFuture<BoneRenderContext> completeContext();
method fallbackContext (line 126) | default BoneRenderContext fallbackContext() {
type Entity (line 135) | sealed interface Entity extends RenderSource<EntityTracker> {
method entity (line 142) | @NotNull kr.toxicity.model.api.entity.BaseEntity entity();
method getOrCreate (line 154) | @NotNull
type Dummy (line 163) | sealed interface Dummy extends RenderSource<DummyTracker> {
method create (line 174) | @NotNull
method completeContext (line 180) | @Override
method create (line 194) | @NotNull
method completeContext (line 200) | @Override
method create (line 214) | @NotNull
method getOrCreate (line 220) | @Override
method location (line 225) | @Override
method completeContext (line 231) | @Override
method create (line 246) | @NotNull
method getOrCreate (line 252) | @Override
method location (line 257) | @Override
method completeContext (line 262) | @Override
method create (line 276) | @NotNull
method getOrCreate (line 282) | @Override
method location (line 287) | @Override
method completeContext (line 292) | @Override
method profile (line 297) | @Override
method armors (line 302) | @Override
method skinParts (line 307) | @Override
method create (line 321) | @NotNull
method getOrCreate (line 327) | @Override
method location (line 332) | @Override
method completeContext (line 337) | @Override
method profile (line 342) | @Override
method armors (line 347) | @Override
method skinParts (line 352) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/data/renderer/RendererGroup.java
class RendererGroup (line 33) | @RequiredArgsConstructor
method RendererGroup (line 65) | public RendererGroup(
method flatten (line 92) | public @NotNull Stream<RendererGroup> flatten() {
method name (line 103) | public @NotNull BoneName name() {
method uuid (line 111) | public @NotNull UUID uuid() {
method create (line 120) | public @NotNull RenderedBone create(@NotNull RenderSource<?> source) {
method create (line 124) | private @NotNull RenderedBone create(@NotNull BoneRenderContext contex...
method getItemStack (line 143) | public @NotNull TransformedItemStack getItemStack() {
method equals (line 147) | @Override
method hashCode (line 154) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/entity/BaseEntity.java
type BaseEntity (line 28) | public interface BaseEntity extends Identifiable {
method of (line 35) | static @NotNull BaseEntity of(@NotNull PlatformEntity entity) {
method platform (line 48) | @NotNull PlatformEntity platform();
method location (line 55) | default @NotNull PlatformLocation location() {
method customName (line 63) | @Nullable Component customName();
method handle (line 69) | @NotNull Object handle();
method id (line 75) | int id();
method dead (line 81) | boolean dead();
method ground (line 87) | boolean ground();
method invisible (line 93) | boolean invisible();
method glow (line 99) | boolean glow();
method onWalk (line 105) | boolean onWalk();
method fly (line 111) | boolean fly();
method scale (line 117) | double scale();
method pitch (line 123) | float pitch();
method bodyYaw (line 129) | float bodyYaw();
method yaw (line 135) | float yaw();
method headYaw (line 141) | float headYaw();
method damageTick (line 147) | float damageTick();
method walkSpeed (line 153) | float walkSpeed();
method passengerPosition (line 160) | @NotNull Vector3f passengerPosition(@NotNull Vector3f dest);
method trackedBy (line 166) | @NotNull Stream<PlatformPlayer> trackedBy();
method mainHand (line 172) | @NotNull TransformedItemStack mainHand();
method offHand (line 178) | @NotNull TransformedItemStack offHand();
method registry (line 184) | default @NotNull Optional<EntityTrackerRegistry> registry() {
method hasControllingPassenger (line 192) | default boolean hasControllingPassenger() {
method hasModelData (line 201) | default boolean hasModelData() {
method modelData (line 209) | @Nullable String modelData();
method modelData (line 215) | void modelData(@Nullable String modelData);
FILE: api/src/main/java/kr/toxicity/model/api/entity/BasePlayer.java
type BasePlayer (line 17) | public interface BasePlayer extends BaseEntity, Profiled {
method updateInventory (line 22) | void updateInventory();
method platform (line 24) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/event/CancellableEvent.java
type CancellableEvent (line 18) | public interface CancellableEvent extends ModelEvent {
method isCancelled (line 26) | boolean isCancelled();
method setCancelled (line 34) | void setCancelled(boolean cancel);
method call (line 36) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/event/CreatePlayerSkinEvent.java
class CreatePlayerSkinEvent (line 24) | @Getter
method CreatePlayerSkinEvent (line 36) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/event/DismountModelEvent.java
class DismountModelEvent (line 27) | public final class DismountModelEvent implements CancellableEvent {
method DismountModelEvent (line 46) | @ApiStatus.Internal
method tracker (line 60) | public @NotNull EntityTracker tracker() {
method bone (line 70) | public @NotNull RenderedBone bone() {
method hitbox (line 80) | public @NotNull HitBox hitbox() {
method entity (line 90) | public PlatformEntity entity() {
FILE: api/src/main/java/kr/toxicity/model/api/event/ModelAssetsEvent.java
method addAsset (line 34) | public void addAsset(@NotNull ModelAsset asset) {
FILE: api/src/main/java/kr/toxicity/model/api/event/ModelDamageSource.java
type ModelDamageSource (line 22) | public interface ModelDamageSource {
method getCausingEntity (line 31) | @Nullable PlatformEntity getCausingEntity();
method getDirectEntity (line 39) | @Nullable PlatformEntity getDirectEntity();
method getDamageLocation (line 47) | @Nullable PlatformLocation getDamageLocation();
method getSourceLocation (line 55) | @Nullable PlatformLocation getSourceLocation();
method isIndirect (line 63) | boolean isIndirect();
method getFoodExhaustion (line 71) | float getFoodExhaustion();
method scalesWithDifficulty (line 79) | boolean scalesWithDifficulty();
FILE: api/src/main/java/kr/toxicity/model/api/event/ModelEvent.java
type ModelEvent (line 21) | public interface ModelEvent {
method call (line 29) | default boolean call() {
FILE: api/src/main/java/kr/toxicity/model/api/event/ModelEventApplication.java
type ModelEventApplication (line 19) | public interface ModelEventApplication {
method isEnabled (line 26) | boolean isEnabled();
FILE: api/src/main/java/kr/toxicity/model/api/event/ModelEventListener.java
type ModelEventListener (line 18) | public interface ModelEventListener {
method unregister (line 31) | void unregister();
FILE: api/src/main/java/kr/toxicity/model/api/event/ModelSpawnAtPlayerEvent.java
class ModelSpawnAtPlayerEvent (line 25) | @Getter
method ModelSpawnAtPlayerEvent (line 40) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/event/MountModelEvent.java
class MountModelEvent (line 27) | public final class MountModelEvent implements CancellableEvent {
method MountModelEvent (line 46) | @ApiStatus.Internal
method tracker (line 60) | public @NotNull EntityTracker tracker() {
method bone (line 70) | public @NotNull RenderedBone bone() {
method hitbox (line 80) | public @NotNull HitBox hitbox() {
method entity (line 90) | public PlatformEntity entity() {
FILE: api/src/main/java/kr/toxicity/model/api/event/PlayerHideTrackerEvent.java
class PlayerHideTrackerEvent (line 25) | @Getter
method PlayerHideTrackerEvent (line 40) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/event/PlayerShowTrackerEvent.java
class PlayerShowTrackerEvent (line 25) | @Getter
method PlayerShowTrackerEvent (line 41) | @ApiStatus.Internal
method tracker (line 53) | public @NotNull Tracker tracker() {
FILE: api/src/main/java/kr/toxicity/model/api/event/RemovePlayerSkinEvent.java
class RemovePlayerSkinEvent (line 23) | @Getter
method RemovePlayerSkinEvent (line 35) | public RemovePlayerSkinEvent(@NotNull ModelProfile modelProfile) {
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxCreateEvent.java
method getHitBox (line 27) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxDamagedEvent.java
class HitBoxDamagedEvent (line 26) | @Getter
method HitBoxDamagedEvent (line 44) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxDismountEvent.java
method getHitBox (line 22) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxEvent.java
type HitBoxEvent (line 19) | public interface HitBoxEvent extends ModelEvent {
method getHitBox (line 27) | @NotNull HitBox getHitBox();
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxInteractAtEvent.java
class HitBoxInteractAtEvent (line 28) | @Getter
method HitBoxInteractAtEvent (line 47) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxMountEvent.java
method getHitBox (line 22) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxRemoveEvent.java
method getHitBox (line 27) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/manager/ModelManager.java
type ModelManager (line 32) | public interface ModelManager {
method model (line 41) | @Nullable ModelRenderer model(@NotNull String name);
method renderer (line 50) | @Deprecated
method models (line 62) | @NotNull @Unmodifiable
method modelKeys (line 71) | @NotNull @Unmodifiable
method limbs (line 80) | @NotNull @Unmodifiable
method limb (line 90) | @Nullable ModelRenderer limb(@NotNull String name);
method limbKeys (line 98) | @NotNull @Unmodifiable
method animate (line 111) | default boolean animate(@NotNull PlatformPlayer player, @NotNull Strin...
method animate (line 125) | default boolean animate(@NotNull PlatformPlayer player, @NotNull Strin...
method animate (line 140) | default boolean animate(@NotNull PlatformPlayer player, @NotNull Strin...
FILE: api/src/main/java/kr/toxicity/model/api/manager/PlayerManager.java
type PlayerManager (line 26) | public interface PlayerManager {
method player (line 34) | @Nullable PlayerChannelHandler player(@NotNull UUID uuid);
method player (line 46) | @NotNull PlayerChannelHandler player(@NotNull PlatformPlayer player);
FILE: api/src/main/java/kr/toxicity/model/api/manager/ProfileManager.java
type ProfileManager (line 23) | public interface ProfileManager {
method supplier (line 31) | @NotNull ModelProfileSupplier supplier();
method skin (line 40) | @NotNull ModelProfileSkin skin(@NotNull String rawTextures);
method supplier (line 48) | void supplier(@NotNull ModelProfileSupplier supplier);
FILE: api/src/main/java/kr/toxicity/model/api/manager/ScriptManager.java
type ScriptManager (line 23) | public interface ScriptManager {
method build (line 31) | @Nullable AnimationScript build(@NotNull String script);
method addBuilder (line 40) | void addBuilder(@NotNull String name, @NotNull ScriptBuilder script);
FILE: api/src/main/java/kr/toxicity/model/api/manager/SkinManager.java
type SkinManager (line 25) | public interface SkinManager {
method fallback (line 33) | @NotNull SkinData fallback();
method complete (line 42) | @NotNull CompletableFuture<? extends SkinData> complete(@NotNull Model...
method removeCache (line 50) | void removeCache(@NotNull ModelProfile profile);
FILE: api/src/main/java/kr/toxicity/model/api/mount/MountController.java
type MountController (line 18) | public interface MountController {
method move (line 28) | @NotNull Vector3f move(@NotNull PlatformPlayer player, @NotNull Platfo...
method moveOnFly (line 38) | default @NotNull Vector3f moveOnFly(@NotNull PlatformPlayer player, @N...
method move (line 51) | default Vector3f move(@NotNull MoveType type, @NotNull PlatformPlayer ...
method canMount (line 62) | default boolean canMount() {
method canDismountBySelf (line 70) | default boolean canDismountBySelf() {
method canControl (line 79) | default boolean canControl() {
method canJump (line 87) | default boolean canJump() {
method canFly (line 95) | default boolean canFly() {
method canBeDamagedByRider (line 103) | default boolean canBeDamagedByRider() {
type MoveType (line 110) | enum MoveType {
method modifier (line 125) | default @NotNull Modifier modifier() {
class Modifier (line 132) | class Modifier {
method Modifier (line 147) | private Modifier(@NotNull MountController controller) {
method canDismountBySelf (line 161) | public @NotNull Modifier canDismountBySelf(boolean canDismountBySelf) {
method canMount (line 171) | public @NotNull Modifier canMount(boolean canMount) {
method canControl (line 181) | public @NotNull Modifier canControl(boolean canControl) {
method canFly (line 191) | public @NotNull Modifier canFly(boolean canFly) {
method canJump (line 201) | public @NotNull Modifier canJump(boolean canJump) {
method canBeDamagedByRider (line 211) | public @NotNull Modifier canBeDamagedByRider(boolean canBeDamagedByR...
method build (line 220) | public @NotNull MountController build() {
FILE: api/src/main/java/kr/toxicity/model/api/mount/MountControllers.java
type MountControllers (line 18) | public enum MountControllers implements MountController {
method move (line 23) | @NotNull
method canMount (line 29) | @Override
method move (line 38) | @NotNull
method canControl (line 44) | @Override
method move (line 53) | @NotNull
method move (line 69) | @NotNull
method canFly (line 80) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/nms/AnimationBundler.java
method isNotEmpty (line 30) | public boolean isNotEmpty() {
method send (line 40) | public void send(@NotNull PlayerChannelHandler handler) {
FILE: api/src/main/java/kr/toxicity/model/api/nms/DisplayTransformer.java
type DisplayTransformer (line 22) | public interface DisplayTransformer {
method transform (line 34) | void transform(int duration, @NotNull Vector3f position, @NotNull Vect...
method sendTransformation (line 42) | void sendTransformation(@NotNull PacketBundler bundler);
FILE: api/src/main/java/kr/toxicity/model/api/nms/HitBox.java
type HitBox (line 33) | public interface HitBox extends Identifiable {
method hide (line 41) | @ApiStatus.Internal
method show (line 50) | @ApiStatus.Internal
method groupName (line 59) | default @NotNull BoneName groupName() {
method mountController (line 69) | @NotNull MountController mountController();
method mountController (line 77) | void mountController(@NotNull MountController controller);
method onWalk (line 85) | boolean onWalk();
method source (line 93) | @NotNull PlatformEntity source();
method mount (line 101) | void mount(@NotNull PlatformEntity entity);
method hasMountDriver (line 109) | boolean hasMountDriver();
method hasBeenControlled (line 117) | default boolean hasBeenControlled() {
method dismount (line 127) | void dismount(@NotNull PlatformEntity entity);
method dismountAll (line 134) | void dismountAll();
method forceDismount (line 142) | boolean forceDismount();
method relativePosition (line 150) | @NotNull Vector3f relativePosition();
method removeHitBox (line 157) | void removeHitBox();
method listener (line 165) | @NotNull HitBoxListener listener();
method listener (line 173) | @ApiStatus.Internal
method listener (line 186) | default void listener(@NotNull Function<HitBoxListener.Builder, HitBox...
method positionSource (line 196) | @NotNull RenderedBone positionSource();
method registry (line 204) | default @NotNull Optional<EntityTrackerRegistry> registry() {
FILE: api/src/main/java/kr/toxicity/model/api/nms/HitBoxListener.java
type HitBoxListener (line 32) | public interface HitBoxListener {
method builder (line 46) | static @NotNull Builder builder() {
class Builder (line 55) | final class Builder {
method Builder (line 63) | private Builder(
method listen (line 80) | @SuppressWarnings("unchecked")
method sync (line 93) | public @NotNull Builder sync(@NotNull Consumer<HitBox> sync) {
method damage (line 106) | public @NotNull Builder damage(@NotNull Consumer<HitBoxDamagedEvent>...
method interactAt (line 117) | public @NotNull Builder interactAt(@NotNull Consumer<HitBoxInteractA...
method remove (line 128) | public @NotNull Builder remove(@NotNull Consumer<HitBox> remove) {
method create (line 139) | public @NotNull Builder create(@NotNull Consumer<HitBox> create) {
method mount (line 150) | public @NotNull Builder mount(@NotNull BiConsumer<HitBox, PlatformEn...
method dismount (line 161) | public @NotNull Builder dismount(@NotNull BiConsumer<HitBox, Platfor...
method build (line 171) | @SuppressWarnings("unchecked")
method handle (line 206) | @ApiStatus.Internal
method sync (line 215) | @ApiStatus.Internal
method toBuilder (line 224) | @NotNull Builder toBuilder();
FILE: api/src/main/java/kr/toxicity/model/api/nms/Identifiable.java
type Identifiable (line 22) | public interface Identifiable {
method id (line 30) | int id();
method uuid (line 38) | @NotNull UUID uuid();
FILE: api/src/main/java/kr/toxicity/model/api/nms/ModAnimationBundler.java
type ModAnimationBundler (line 17) | public interface ModAnimationBundler {
method send (line 24) | void send(@NotNull PlatformPlayer player);
FILE: api/src/main/java/kr/toxicity/model/api/nms/ModelDisplay.java
type ModelDisplay (line 27) | public interface ModelDisplay extends Identifiable {
method invisible (line 35) | boolean invisible();
method invisible (line 43) | void invisible(boolean invisible);
method rotate (line 52) | void rotate(@NotNull ModelRotation rotation, @NotNull PacketBundler bu...
method syncPotionEffect (line 60) | void syncPotionEffect(@NotNull BaseEntity entity);
method syncPosition (line 68) | void syncPosition(@NotNull PlatformLocation location);
method moveDuration (line 76) | void moveDuration(int duration);
method display (line 84) | void display(@NotNull PlatformItemTransform transform);
method spawn (line 92) | default void spawn(@NotNull PacketBundler bundler) {
method spawnWithEntityData (line 102) | default void spawnWithEntityData(@NotNull PacketBundler bundler) {
method spawn (line 115) | void spawn(boolean showItem, @NotNull PacketBundler bundler);
method remove (line 123) | void remove(@NotNull PacketBundler bundler);
method teleport (line 132) | void teleport(@NotNull PlatformLocation location, @NotNull PacketBundl...
method item (line 140) | void item(@NotNull PlatformItemStack itemStack);
method createTransformer (line 148) | @NotNull DisplayTransformer createTransformer();
method sendDirtyEntityData (line 156) | void sendDirtyEntityData(@NotNull PacketBundler bundler);
method sendEntityData (line 165) | void sendEntityData(boolean showItem, @NotNull PacketBundler bundler);
method brightness (line 174) | void brightness(int block, int sky);
method viewRange (line 182) | void viewRange(float range);
method shadowRadius (line 190) | void shadowRadius(float radius);
method sendPosition (line 199) | void sendPosition(@NotNull BaseEntity adapter, @NotNull PacketBundler ...
method glow (line 207) | void glow(boolean glow);
method glowColor (line 215) | void glowColor(int glowColor);
method billboard (line 223) | void billboard(@NotNull PlatformBillboard billboard);
FILE: api/src/main/java/kr/toxicity/model/api/nms/ModelInteractionHand.java
type ModelInteractionHand (line 15) | public enum ModelInteractionHand {
FILE: api/src/main/java/kr/toxicity/model/api/nms/ModelNametag.java
type ModelNametag (line 25) | public interface ModelNametag {
method alwaysVisible (line 33) | void alwaysVisible(boolean alwaysVisible);
method component (line 41) | void component(@Nullable Component component);
method teleport (line 49) | void teleport(@NotNull PlatformLocation location);
method send (line 57) | void send(@NotNull PlatformPlayer player);
method remove (line 65) | void remove(@NotNull PacketBundler bundler);
FILE: api/src/main/java/kr/toxicity/model/api/nms/NMS.java
type NMS (line 39) | public interface NMS {
method create (line 48) | default @NotNull ModelDisplay create(@NotNull PlatformLocation locatio...
method create (line 60) | default @NotNull ModelDisplay create(@NotNull PlatformLocation locatio...
method create (line 73) | @NotNull ModelDisplay create(@NotNull PlatformLocation location, doubl...
method createNametag (line 82) | @NotNull ModelNametag createNametag(@NotNull RenderedBone bone);
method createNametag (line 92) | default @NotNull ModelNametag createNametag(@NotNull RenderedBone bone...
method inject (line 105) | @NotNull PlayerChannelHandler inject(@NotNull PlatformPlayer player);
method createBundler (line 114) | @NotNull PacketBundler createBundler(int initialCapacity);
method createParallelBundler (line 123) | @NotNull PacketBundler createParallelBundler(int threshold);
method createModAnimationBuilder (line 132) | @NotNull ModAnimationBundler createModAnimationBuilder(int initialCapa...
method tint (line 142) | @NotNull PlatformItemStack tint(@NotNull PlatformItemStack itemStack, ...
method mount (line 151) | void mount(@NotNull EntityTrackerRegistry registry, @NotNull PacketBun...
method hide (line 160) | void hide(@NotNull PlayerChannelHandler channel, @NotNull EntityTracke...
method hide (line 173) | default void hide(@NotNull PlayerChannelHandler channel, @NotNull Enti...
method createHitBox (line 193) | @Nullable HitBox createHitBox(@NotNull BaseEntity entity, @NotNull Ren...
method version (line 201) | @NotNull NMSVersion version();
method adapt (line 210) | @NotNull BaseEntity adapt(@NotNull PlatformEntity entity);
method adapt (line 219) | @NotNull BasePlayer adapt(@NotNull PlatformPlayer player);
method profile (line 228) | @NotNull ModelProfile profile(@NotNull PlatformPlayer player);
method createSkinItem (line 241) | default @NotNull TransformedItemStack createSkinItem(@NotNull String m...
method isProxyOnlineMode (line 251) | boolean isProxyOnlineMode();
FILE: api/src/main/java/kr/toxicity/model/api/nms/NMSVersion.java
type NMSVersion (line 22) | @RequiredArgsConstructor
method first (line 67) | public static @NotNull NMSVersion first() {
method latest (line 77) | public static @NotNull NMSVersion latest() {
FILE: api/src/main/java/kr/toxicity/model/api/nms/PacketBundler.java
type PacketBundler (line 22) | public interface PacketBundler {
method isEmpty (line 30) | boolean isEmpty();
method isNotEmpty (line 38) | default boolean isNotEmpty() {
method size (line 48) | int size();
method send (line 56) | default void send(@NotNull PlatformPlayer player) {
method send (line 67) | void send(@NotNull PlatformPlayer player, @NotNull Runnable onSuccess);
FILE: api/src/main/java/kr/toxicity/model/api/nms/PlayerChannelHandler.java
type PlayerChannelHandler (line 25) | public interface PlayerChannelHandler extends Identifiable, AutoCloseable {
method player (line 33) | default @NotNull PlatformPlayer player() {
method uuid (line 37) | @Override
method id (line 42) | @Override
method base (line 53) | @NotNull BasePlayer base();
method sendEntityData (line 61) | void sendEntityData(@NotNull EntityTrackerRegistry registry);
method close (line 68) | @Override
method isModEnabled (line 75) | boolean isModEnabled();
FILE: api/src/main/java/kr/toxicity/model/api/nms/Profiled.java
type Profiled (line 23) | public interface Profiled {
method profile (line 31) | @NotNull ModelProfile profile();
method armors (line 39) | @NotNull PlayerArmor armors();
method skinParts (line 47) | @NotNull PlayerSkinParts skinParts();
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackAssets.java
class PackAssets (line 25) | public final class PackAssets {
method PackAssets (line 32) | PackAssets(@NotNull PackOverlay overlay) {
method bettermodel (line 45) | public @NotNull PackNamespace bettermodel() {
method minecraft (line 55) | public @NotNull PackNamespace minecraft() {
method size (line 59) | int size() {
method dirty (line 63) | boolean dirty() {
method add (line 75) | public void add(@NotNull String path, long size, @NotNull Supplier<byt...
method add (line 87) | public void add(@NotNull String[] paths, long size, @NotNull Supplier<...
method add (line 99) | public void add(@NotNull String path, @NotNull Supplier<byte[]> suppli...
method add (line 110) | public void add(@NotNull String[] paths, @NotNull Supplier<byte[]> sup...
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackBuilder.java
class PackBuilder (line 25) | @RequiredArgsConstructor(access = AccessLevel.PACKAGE)
method resolve (line 38) | public @NotNull PackBuilder resolve(@NotNull String... paths) {
method add (line 50) | public void add(@NotNull String path, long estimatedSize, @NotNull Sup...
method add (line 62) | public void add(@NotNull String[] paths, long size, @NotNull Supplier<...
method obfuscator (line 73) | public @NotNull PackObfuscator obfuscator() {
method add (line 84) | public void add(@NotNull String path, @NotNull Supplier<byte[]> suppli...
method add (line 95) | public void add(@NotNull String[] paths, @NotNull Supplier<byte[]> sup...
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackBuiltInAssets.java
method applyAs (line 80) | static void applyAs(@NotNull PackZipper zipper) {
method meshTriangle (line 86) | private static @NotNull JsonObject meshTriangle(@NotNull Function<JsonOb...
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackByte.java
method equals (line 24) | @Override
method hashCode (line 30) | @Override
method compareTo (line 35) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackMeta.java
method builder (line 76) | public static @NotNull Builder builder() {
method toJson (line 86) | public @NotNull JsonElement toJson() {
method toResource (line 96) | public @NotNull PackResource toResource() {
method PackVersion (line 137) | public PackVersion(int major) {
method toJson (line 147) | public @NotNull JsonElement toJson() {
method OverlayEntry (line 190) | public OverlayEntry(
method VersionRange (line 221) | public VersionRange(int value) {
method toJson (line 231) | public @NotNull JsonElement toJson() {
class Builder (line 245) | @NoArgsConstructor(access = AccessLevel.PRIVATE)
method description (line 264) | public @NotNull Builder description(@NotNull String description) {
method format (line 276) | public @NotNull Builder format(int format) {
method overlayEntry (line 288) | public @NotNull Builder overlayEntry(@NotNull OverlayEntry overlayEntr...
method supportedFormats (line 300) | public @NotNull Builder supportedFormats(@NotNull VersionRange range) {
method minFormat (line 312) | public @NotNull Builder minFormat(@NotNull PackVersion version) {
method maxFormat (line 324) | public @NotNull Builder maxFormat(@NotNull PackVersion version) {
method build (line 335) | public @NotNull PackMeta build() {
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackNamespace.java
class PackNamespace (line 20) | public final class PackNamespace {
method PackNamespace (line 24) | PackNamespace(@NotNull PackAssets assets, @NotNull String namespace) {
method items (line 37) | public @NotNull PackBuilder items() {
method models (line 47) | public @NotNull PackBuilder models() {
method textures (line 57) | public @NotNull PackBuilder textures() {
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackObfuscator.java
type PackObfuscator (line 24) | public interface PackObfuscator {
method obfuscate (line 39) | @NotNull String obfuscate(@NotNull String rawName);
method order (line 47) | static @NotNull PackObfuscator order() {
method withModels (line 58) | default @NotNull Pair withModels(@NotNull PackObfuscator models) {
method pair (line 70) | static @NotNull Pair pair(@NotNull PackObfuscator models, @NotNull Pac...
class Order (line 79) | final class Order implements PackObfuscator {
method Order (line 96) | private Order() {
method obfuscate (line 99) | public @NotNull String obfuscate(@NotNull String rawName) {
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackOverlay.java
method path (line 71) | public @NotNull PackPath path(@NotNull String namespace) {
method test (line 81) | public boolean test() {
method equals (line 85) | @Override
method hashCode (line 92) | @Override
method compareTo (line 97) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackPath.java
method resolve (line 45) | public @NotNull PackPath resolve(@NotNull String... subPaths) {
method toString (line 50) | @Override
method compareTo (line 55) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackResource.java
type PackResource (line 24) | public interface PackResource extends Supplier<byte[]> {
method overlay (line 32) | @Nullable
method path (line 41) | @NotNull
method estimatedSize (line 50) | long estimatedSize();
method of (line 61) | static @NotNull PackResource of(@NotNull PackPath path, long size, @No...
method of (line 75) | static @NotNull PackResource of(@Nullable PackOverlay overlay, @NotNul...
method get (line 96) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackResult.java
class PackResult (line 30) | @RequiredArgsConstructor
method set (line 51) | @ApiStatus.Internal
method freeze (line 70) | public void freeze() {
method changed (line 80) | public boolean changed() {
method freeze (line 91) | public void freeze(boolean changed) {
method meta (line 103) | @NotNull
method directory (line 114) | public @Nullable File directory() {
method hash (line 124) | public @NotNull UUID hash() {
method size (line 144) | public int size() {
method time (line 154) | public long time() {
method overlays (line 165) | @NotNull
method stream (line 178) | public @NotNull Stream<PackByte> stream() {
method assets (line 191) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/pack/PackZipper.java
class PackZipper (line 31) | public final class PackZipper {
method PackZipper (line 33) | private PackZipper() {
method zipper (line 45) | public static @NotNull PackZipper zipper() {
method assets (line 58) | public @NotNull PackAssets assets() {
method legacy (line 68) | public @NotNull PackAssets legacy() {
method modern (line 78) | public @NotNull PackAssets modern() {
method overlay (line 89) | public @NotNull PackAssets overlay(@NotNull PackOverlay overlay) {
method metaBuilder (line 99) | public @NotNull PackMeta.Builder metaBuilder() {
method build (line 109) | @ApiStatus.Internal
method size (line 134) | public int size() {
method loadIcon (line 138) | private static @Nullable PackResource loadIcon() {
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformAdapter.java
type PlatformAdapter (line 24) | public interface PlatformAdapter {
method serverViewDistance (line 32) | int serverViewDistance();
method isTickThread (line 40) | boolean isTickThread();
method isRegionSafe (line 48) | boolean isRegionSafe();
method player (line 57) | @Nullable PlatformPlayer player(@NotNull UUID uuid);
method offlinePlayer (line 66) | @NotNull PlatformOfflinePlayer offlinePlayer(@NotNull UUID uuid);
method air (line 74) | @NotNull PlatformItemStack air();
method zero (line 82) | @NotNull PlatformLocation zero();
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformBillboard.java
type PlatformBillboard (line 18) | public enum PlatformBillboard {
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformEntity.java
type PlatformEntity (line 29) | public interface PlatformEntity extends PlatformRegionHolder {
method uuid (line 37) | @NotNull UUID uuid();
method location (line 45) | @NotNull PlatformLocation location();
method task (line 47) | @Override
method taskLater (line 52) | @Override
method registry (line 63) | default @NotNull Optional<EntityTrackerRegistry> registry() {
method tracker (line 74) | default @NotNull Optional<EntityTracker> tracker(@NotNull String name) {
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformItemStack.java
type PlatformItemStack (line 22) | public interface PlatformItemStack {
method isAir (line 30) | boolean isAir();
method enchant (line 39) | @NotNull PlatformItemStack enchant(boolean enchant);
method modelData (line 49) | @NotNull PlatformItemStack modelData(int customModelData, @Nullable Pl...
method clone (line 57) | @NotNull PlatformItemStack clone();
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformItemTransform.java
type PlatformItemTransform (line 18) | public enum PlatformItemTransform {
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformLivingEntity.java
type PlatformLivingEntity (line 21) | public interface PlatformLivingEntity extends PlatformEntity {
method eyeLocation (line 29) | @NotNull PlatformLocation eyeLocation();
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformLocation.java
type PlatformLocation (line 24) | public interface PlatformLocation extends PlatformRegionHolder {
method world (line 32) | PlatformWorld world();
method x (line 40) | double x();
method y (line 48) | double y();
method z (line 56) | double z();
method pitch (line 64) | float pitch();
method yaw (line 72) | float yaw();
method add (line 83) | @NotNull PlatformLocation add(double x, double y, double z);
method distance (line 92) | default double distance(@NotNull PlatformLocation other) {
method distanceSquared (line 103) | default double distanceSquared(@NotNull PlatformLocation other) {
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformOfflinePlayer.java
type PlatformOfflinePlayer (line 24) | public interface PlatformOfflinePlayer {
method uuid (line 32) | @NotNull UUID uuid();
method name (line 40) | @Nullable String name();
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformPlayer.java
type PlatformPlayer (line 21) | public interface PlatformPlayer extends PlatformLivingEntity, PlatformOf...
method name (line 29) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformRegionHolder.java
type PlatformRegionHolder (line 22) | public interface PlatformRegionHolder {
method task (line 30) | @Nullable ModelTask task(@NotNull Runnable runnable);
method taskLater (line 40) | @Nullable ModelTask taskLater(long delay, @NotNull Runnable runnable);
FILE: api/src/main/java/kr/toxicity/model/api/platform/PlatformWorld.java
type PlatformWorld (line 19) | public interface PlatformWorld {
FILE: api/src/main/java/kr/toxicity/model/api/player/PlayerLimb.java
type PlayerLimb (line 27) | @RequiredArgsConstructor
method createItem (line 127) | public @NotNull TransformedItemStack createItem(@NotNull BoneRenderCon...
class LimbItemMapper (line 134) | @RequiredArgsConstructor
method transform (line 139) | @NotNull
method apply (line 145) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/player/PlayerSkinParts.java
method isCapeEnabled (line 25) | public boolean isCapeEnabled() {
method isJacketEnabled (line 34) | public boolean isJacketEnabled() {
method isLeftSleeveEnabled (line 43) | public boolean isLeftSleeveEnabled() {
method isRightSleeveEnabled (line 52) | public boolean isRightSleeveEnabled() {
method isLeftPantsEnabled (line 61) | public boolean isLeftPantsEnabled() {
method isRightPantsEnabled (line 70) | public boolean isRightPantsEnabled() {
method isHatEnabled (line 79) | public boolean isHatEnabled() {
FILE: api/src/main/java/kr/toxicity/model/api/profile/ModelProfile.java
type ModelProfile (line 22) | public interface ModelProfile {
method of (line 34) | static @NotNull ModelProfile of(@NotNull ModelProfileInfo info) {
method of (line 44) | static @NotNull ModelProfile of(@NotNull ModelProfileInfo info, @NotNu...
method of (line 53) | static @NotNull ModelProfile of(@NotNull PlatformPlayer player) {
method of (line 63) | static @NotNull Uncompleted of(@NotNull PlatformOfflinePlayer offlineP...
method of (line 72) | static @NotNull Uncompleted of(@NotNull UUID uuid) {
method info (line 80) | @NotNull ModelProfileInfo info();
method skin (line 86) | @NotNull ModelProfileSkin skin();
method asUncompleted (line 93) | default @NotNull Uncompleted asUncompleted() {
method player (line 111) | default @Nullable PlatformPlayer player() {
type Uncompleted (line 126) | interface Uncompleted {
method info (line 132) | @NotNull ModelProfileInfo info();
method complete (line 138) | @NotNull CompletableFuture<ModelProfile> complete();
method fallback (line 144) | default @NotNull ModelProfile fallback() {
FILE: api/src/main/java/kr/toxicity/model/api/profile/ModelProfileSupplier.java
type ModelProfileSupplier (line 16) | public interface ModelProfileSupplier {
method supply (line 23) | @NotNull ModelProfile.Uncompleted supply(@NotNull ModelProfileInfo info);
method supply (line 30) | default @NotNull ModelProfile.Uncompleted supply(@NotNull PlatformOffl...
FILE: api/src/main/java/kr/toxicity/model/api/scheduler/ModelScheduler.java
type ModelScheduler (line 15) | public interface ModelScheduler {
method asyncTask (line 22) | @NotNull ModelTask asyncTask(@NotNull Runnable runnable);
method asyncTaskLater (line 30) | @NotNull ModelTask asyncTaskLater(long delay, @NotNull Runnable runnab...
method asyncTaskTimer (line 39) | @NotNull ModelTask asyncTaskTimer(long delay, long period, @NotNull Ru...
FILE: api/src/main/java/kr/toxicity/model/api/scheduler/ModelTask.java
type ModelTask (line 13) | public interface ModelTask {
method isCancelled (line 19) | boolean isCancelled();
method cancel (line 24) | void cancel();
FILE: api/src/main/java/kr/toxicity/model/api/script/AnimationScript.java
type AnimationScript (line 20) | public interface AnimationScript extends Consumer<Tracker> {
method accept (line 27) | @Override
method isSync (line 34) | boolean isSync();
method time (line 41) | default @NotNull TimeScript time(float time) {
method of (line 50) | static @NotNull AnimationScript of(@NotNull Consumer<Tracker> source) {
method of (line 60) | static @NotNull AnimationScript of(boolean isSync, @NotNull Consumer<T...
method of (line 80) | static @NotNull AnimationScript of(@NotNull List<AnimationScript> scri...
FILE: api/src/main/java/kr/toxicity/model/api/script/BlueprintScript.java
method fromEmpty (line 34) | public static @NotNull BlueprintScript fromEmpty(@NotNull ModelAnimation...
method iterator (line 48) | public @NotNull AnimationIterator<TimeScript> iterator(@NotNull Animatio...
FILE: api/src/main/java/kr/toxicity/model/api/script/ScriptBuilder.java
type ScriptBuilder (line 20) | @FunctionalInterface
method build (line 27) | @NotNull AnimationScript build(@NotNull ScriptData data);
type ScriptMetaData (line 34) | interface ScriptMetaData {
method toMap (line 36) | @NotNull @Unmodifiable
method asBoolean (line 39) | default @Nullable Boolean asBoolean(@NotNull String key) {
method asNumber (line 49) | default @Nullable Number asNumber(@NotNull String key) {
method asString (line 59) | default @Nullable String asString(@NotNull String key) {
FILE: api/src/main/java/kr/toxicity/model/api/script/TimeScript.java
method isSync (line 23) | @Override
method accept (line 28) | @Override
method time (line 33) | public @NotNull TimeScript time(float newTime) {
FILE: api/src/main/java/kr/toxicity/model/api/skin/SkinData.java
type SkinData (line 19) | public interface SkinData {
method profile (line 25) | @NotNull ModelProfile profile();
method head (line 32) | @NotNull TransformedItemStack head(@NotNull PlayerArmor armor);
method hip (line 39) | @NotNull TransformedItemStack hip(@NotNull PlayerArmor armor);
method waist (line 46) | @NotNull TransformedItemStack waist(@NotNull PlayerArmor armor);
method chest (line 53) | @NotNull TransformedItemStack chest(@NotNull PlayerArmor armor);
method leftArm (line 60) | @NotNull TransformedItemStack leftArm(@NotNull PlayerArmor armor);
method leftForeArm (line 66) | @NotNull TransformedItemStack leftForeArm();
method rightArm (line 73) | @NotNull TransformedItemStack rightArm(@NotNull PlayerArmor armor);
method rightForeArm (line 79) | @NotNull TransformedItemStack rightForeArm();
method leftLeg (line 86) | @NotNull TransformedItemStack leftLeg(@NotNull PlayerArmor armor);
method leftForeLeg (line 93) | @NotNull TransformedItemStack leftForeLeg(@NotNull PlayerArmor armor);
method rightLeg (line 100) | @NotNull TransformedItemStack rightLeg(@NotNull PlayerArmor armor);
method rightForeLeg (line 107) | @NotNull TransformedItemStack rightForeLeg(@NotNull PlayerArmor armor);
method cape (line 114) | @Nullable TransformedItemStack cape(@NotNull PlayerArmor armor);
FILE: api/src/main/java/kr/toxicity/model/api/tracker/DummyTracker.java
class DummyTracker (line 31) | public final class DummyTracker extends Tracker {
method DummyTracker (line 44) | public DummyTracker(@NotNull PlatformLocation location, @NotNull Rende...
method location (line 60) | public void location(@NotNull PlatformLocation location) {
method location (line 77) | @Override
method spawn (line 88) | public void spawn(@NotNull PlatformPlayer player) {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/EntityBodyRotator.java
class EntityBodyRotator (line 35) | public final class EntityBodyRotator {
method defaultData (line 59) | static @NotNull RotatorData defaultData() {
method EntityBodyRotator (line 74) | EntityBodyRotator(@NotNull EntityTrackerRegistry registry) {
method clampHead (line 96) | private float clampHead(float value) {
method clampBody (line 100) | private float clampBody(float value, float compare) {
method lockRotation (line 111) | public boolean lockRotation(boolean lock) {
method bodyRotation (line 115) | @NotNull ModelRotation bodyRotation() {
method bodyRotation0 (line 119) | private float bodyRotation0() {
method stableBodyYaw (line 137) | private float stableBodyYaw() {
method wrapDegrees (line 145) | private static float wrapDegrees(float value) {
method headRotation (line 152) | @NotNull Quaternionf headRotation() {
method setValue (line 162) | public void setValue(@NotNull Consumer<RotatorData> consumer) {
method setValue (line 169) | synchronized void setValue(@NotNull RotatorData data) {
method reset (line 178) | public void reset() {
method createData (line 182) | synchronized @NotNull RotatorData createData() {
class RotatorData (line 202) | @Setter
method set (line 227) | private void set(@NotNull EntityBodyRotator rotator) {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/EntityHideOption.java
method composite (line 56) | public static @NotNull EntityHideOption composite(@NotNull Stream<Entity...
method deserialize (line 69) | public static @NotNull EntityHideOption deserialize(@NotNull JsonArray a...
method serialize (line 84) | public @NotNull JsonArray serialize() {
method builder (line 99) | public static @NotNull Builder builder() {
class Builder (line 108) | public static final class Builder {
method Builder (line 117) | private Builder() {
method composite (line 128) | public @NotNull Builder composite(@NotNull Stream<EntityHideOption> op...
method or (line 140) | public @NotNull Builder or(@NotNull EntityHideOption option) {
method build (line 154) | public @NotNull EntityHideOption build() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/EntityTracker.java
class EntityTracker (line 53) | public class EntityTracker extends Tracker {
method EntityTracker (line 85) | @ApiStatus.Internal
method rotation (line 158) | @Override
method updateBaseEntity (line 168) | public void updateBaseEntity() {
method updateLocation (line 178) | private void updateLocation() {
method registry (line 193) | public @NotNull EntityTrackerRegistry registry() {
method createHitBox (line 205) | public boolean createHitBox(@Nullable HitBoxListener listener, @NotNul...
method hitbox (line 217) | public @Nullable HitBox hitbox(@Nullable HitBoxListener listener, @Not...
method damageTintValue (line 227) | public int damageTintValue() {
method damageTintValue (line 237) | public void damageTintValue(int tint) {
method damageTint (line 246) | public void damageTint() {
method despawn (line 252) | @Override
method location (line 261) | @Override
method sourceEntity (line 272) | public @NotNull BaseEntity sourceEntity() {
method cancelDamageTint (line 281) | public void cancelDamageTint() {
method refresh (line 290) | @ApiStatus.Internal
method markPlayerForSpawn (line 303) | public boolean markPlayerForSpawn(@NotNull PlatformPlayer player) {
method markPlayerForSpawn (line 314) | public boolean markPlayerForSpawn(@NotNull Set<UUID> uuids) {
method unmarkPlayerForSpawn (line 325) | public boolean unmarkPlayerForSpawn(@NotNull PlatformPlayer player) {
method asTrackerData (line 335) | public @NotNull TrackerData asTrackerData() {
method bodyRotator (line 353) | public @NotNull EntityBodyRotator bodyRotator() {
method canBeSpawnedAt (line 364) | public boolean canBeSpawnedAt(@NotNull PlatformPlayer player) {
method hideOption (line 374) | public @NotNull EntityHideOption hideOption() {
method hideOption (line 384) | public void hideOption(@NotNull EntityHideOption hideOption) {
method canBeSaved (line 394) | public boolean canBeSaved() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/EntityTrackerRegistry.java
class EntityTrackerRegistry (line 59) | @ToString(onlyExplicitlyIncluded = true)
method registry (line 92) | public static @Nullable EntityTrackerRegistry registry(@NotNull UUID u...
method registry (line 103) | public static @Nullable EntityTrackerRegistry registry(int id) {
method registry (line 114) | public static @Nullable EntityTrackerRegistry registry(@NotNull BaseEn...
method registries (line 126) | public static void registries(@NotNull Consumer<EntityTrackerRegistry>...
method registries (line 138) | public static @NotNull @Unmodifiable List<EntityTrackerRegistry> regis...
method getOrCreate (line 149) | @ApiStatus.Internal
method create (line 155) | private static @NotNull EntityTrackerRegistry create(@NotNull BaseEnti...
method deserialize (line 172) | private static @NotNull Collection<JsonElement> deserialize(@Nullable ...
method EntityTrackerRegistry (line 178) | private EntityTrackerRegistry(@NotNull BaseEntity entity) {
method entity (line 191) | public @NotNull BaseEntity entity() {
method uuid (line 201) | public @NotNull UUID uuid() {
method id (line 211) | public int id() {
method trackers (line 221) | public @NotNull @Unmodifiable Collection<EntityTracker> trackers() {
method tracker (line 232) | public @Nullable EntityTracker tracker(@Nullable String key) {
method first (line 242) | public @Nullable EntityTracker first() {
method create (line 255) | @ApiStatus.Internal
method getOrCreate (line 273) | @ApiStatus.Internal
method putTracker (line 279) | private boolean putTracker(@NotNull String key, @NotNull EntityTracker...
method refreshSpawn (line 294) | private void refreshSpawn() {
method refreshRemove (line 298) | private void refreshRemove() {
method initialLoad (line 304) | private void initialLoad() {
method refreshPlayer (line 311) | private void refreshPlayer() {
method remove (line 325) | public boolean remove(@NotNull String key) {
method isClosed (line 338) | public boolean isClosed() {
method close (line 348) | public boolean close() {
method close (line 359) | public boolean close(@NotNull Tracker.CloseReason reason) {
method reload (line 382) | public void reload() {
method refresh (line 399) | public void refresh() {
method despawn (line 413) | public void despawn() {
method load (line 426) | public void load(@NotNull Stream<TrackerData> stream) {
method load (line 436) | public void load() {
method save (line 447) | public void save() {
method runSync (line 452) | private void runSync(@NotNull Runnable runnable) {
method displays (line 464) | public @NotNull Stream<ModelDisplay> displays() {
method serialize (line 476) | public @NotNull JsonArray serialize() {
method isSpawned (line 487) | public boolean isSpawned(@NotNull PlatformPlayer player) {
method isSpawned (line 497) | public boolean isSpawned(@NotNull UUID uuid) {
method spawn (line 510) | public boolean spawn(@NotNull PlatformPlayer player) {
method spawnIfNotSpawned (line 521) | public boolean spawnIfNotSpawned(@NotNull PlatformPlayer player) {
method spawn (line 525) | private boolean spawn(@NotNull PlatformPlayer player, boolean shouldNo...
method registerPlayer (line 543) | private @NotNull PlayerChannelCache registerPlayer(@NotNull PlayerChan...
method viewedPlayer (line 553) | public @NotNull Stream<PlayerChannelHandler> viewedPlayer() {
method remove (line 564) | public boolean remove(@NotNull PlatformPlayer player) {
method hideOption (line 582) | public @NotNull EntityHideOption hideOption(@NotNull UUID uuid) {
method mountedHitBox (line 593) | @NotNull
method hitBoxes (line 605) | @NotNull
method hasPassenger (line 617) | public boolean hasPassenger() {
method hasControllingPassenger (line 627) | public boolean hasControllingPassenger() {
method dismount (line 647) | public void dismount() {
method dismountAll (line 654) | public void dismountAll() {
class AnimationProperty (line 659) | final class AnimationProperty {
class PlayerChannelCache (line 666) | @RequiredArgsConstructor
method hide (line 671) | private void hide() {
method spawn (line 676) | private void spawn(@NotNull PacketBundler bundler) {
method reapplyHideOption (line 681) | private synchronized void reapplyHideOption() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/ModelRotation.java
method equals (line 35) | @Override
method hashCode (line 41) | @Override
method pitch (line 52) | public @NotNull ModelRotation pitch() {
method yaw (line 62) | public @NotNull ModelRotation yaw() {
method radianX (line 72) | public float radianX() {
method radianY (line 82) | public float radianY() {
method packedX (line 92) | public byte packedX() {
method packedY (line 102) | public byte packedY() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/ModelRotator.java
type ModelRotator (line 34) | public sealed interface ModelRotator extends BiFunction<Tracker, ModelRo...
method deserialize (line 72) | static @NotNull ModelRotator deserialize(@NotNull JsonObject object) {
method lazy (line 84) | static @NotNull ModelRotator lazy(long mills) {
method name (line 94) | @NotNull String name();
method source (line 102) | @Nullable ModelRotator source();
method data (line 110) | @Nullable JsonElement data();
method root (line 118) | default @NotNull ModelRotator root() {
method serialize (line 129) | default @NotNull JsonObject serialize() {
method apply (line 146) | default @NotNull ModelRotation apply(@NotNull Tracker tracker) {
method apply (line 158) | @Override
method then (line 169) | default @NotNull ModelRotator then(@NotNull ModelRotator rotator) {
method name (line 181) | @Override
method data (line 186) | @Override
method apply (line 191) | @Override
type Getter (line 202) | interface Getter {
method apply (line 216) | @NotNull
method of (line 226) | static @NotNull Getter of(@NotNull ModelRotation rotator) {
method of (line 236) | static @NotNull Getter of(@NotNull Supplier<ModelRotation> rotator) {
method of (line 246) | static @NotNull Getter of(@NotNull Function<ModelRotation, ModelRota...
type Builder (line 256) | interface Builder {
method build (line 264) | @Nullable Getter build(@NotNull JsonElement element);
type BuiltInDeserializer (line 272) | interface BuiltInDeserializer extends Function<JsonElement, ModelRotat...
method apply (line 273) | @Override
method apply (line 283) | default @Nullable ModelRotator apply() {
method apply (line 294) | default @Nullable ModelRotator apply(long value) {
class Deserializer (line 304) | final class Deserializer {
method Deserializer (line 320) | private Deserializer() {
method register (line 331) | public @NotNull BuiltInDeserializer register(@NotNull String name, @...
method deserialize (line 348) | public @Nullable ModelRotator deserialize(@NotNull JsonObject object) {
method pack (line 365) | private @NotNull Pack pack(@NotNull String name, @Nullable ModelRota...
method apply (line 371) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/tracker/ModelScaler.java
type ModelScaler (line 29) | public sealed interface ModelScaler {
method name (line 43) | @NotNull String name();
method scale (line 52) | float scale(@NotNull Tracker tracker);
method data (line 60) | @Nullable JsonElement data();
method deserialize (line 69) | static @NotNull ModelScaler deserialize(@NotNull JsonObject element) {
method defaultScaler (line 80) | static @NotNull ModelScaler defaultScaler() {
method entity (line 90) | static @NotNull ModelScaler entity() {
method value (line 101) | static @NotNull ModelScaler value(float value) {
method composite (line 112) | static @NotNull ModelScaler composite(@NotNull ModelScaler... scalers) {
method multiply (line 123) | default @NotNull ModelScaler multiply(float value) {
method composite (line 134) | default @NotNull ModelScaler composite(@NotNull ModelScaler scaler) {
method serialize (line 151) | default @NotNull JsonObject serialize() {
type Getter (line 164) | interface Getter {
method get (line 183) | float get(@NotNull Tracker tracker);
method value (line 192) | static @NotNull Getter value(float value) {
type Builder (line 202) | interface Builder {
method build (line 210) | @Nullable Getter build(@NotNull JsonElement data);
class Composite (line 218) | @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
method get (line 224) | @Override
method name (line 234) | @NotNull
method scale (line 240) | @Override
method add (line 245) | private void add(@NotNull JsonArray array, @NotNull ModelScaler scal...
method data (line 253) | @Override
type BuiltInDeserializer (line 268) | interface BuiltInDeserializer extends Function<JsonElement, ModelScale...
method deserialize (line 276) | default @NotNull ModelScaler deserialize(float value) {
method deserialize (line 285) | default @NotNull ModelScaler deserialize() {
class Deserializer (line 295) | final class Deserializer {
method Deserializer (line 303) | private Deserializer() {
method defaultScaler (line 317) | private @NotNull ModelScaler defaultScaler() {
method addScaler (line 329) | public @NotNull BuiltInDeserializer addScaler(@NotNull String name, ...
method buildScaler (line 342) | public @Nullable ModelScaler buildScaler(@NotNull JsonObject rawData) {
method pack (line 352) | private @NotNull ModelScaler pack(@NotNull String name, @NotNull Bui...
method scale (line 359) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/tracker/PlayerTracker.java
class PlayerTracker (line 25) | public final class PlayerTracker extends EntityTracker {
method PlayerTracker (line 36) | @ApiStatus.Internal
FILE: api/src/main/java/kr/toxicity/model/api/tracker/Tracker.java
class Tracker (line 54) | public abstract class Tracker implements AutoCloseable {
method newThread (line 60) | @Override
method getAsFloat (line 96) | @Override
method Tracker (line 136) | public Tracker(@NotNull RenderPipeline pipeline, @NotNull TrackerModif...
method isScheduled (line 184) | public boolean isScheduled() {
method start (line 189) | private void start() {
method shutdown (line 209) | private void shutdown() {
method rotation (line 226) | public @NotNull ModelRotation rotation() {
method rotation (line 236) | public final void rotation(@NotNull Supplier<ModelRotation> supplier) {
method rotator (line 246) | public final void rotator(@NotNull ModelRotator rotator) {
method scaler (line 256) | public @NotNull ModelScaler scaler() {
method scaler (line 266) | public void scaler(@NotNull ModelScaler scaler) {
method task (line 276) | public void task(@NotNull Runnable runnable) {
method frame (line 286) | public synchronized void frame(@NotNull ScheduledPacketHandler handler) {
method tick (line 295) | public void tick(@NotNull ScheduledPacketHandler handler) {
method tick (line 305) | public void tick(long tick, @NotNull ScheduledPacketHandler handler) {
method perPlayerTick (line 315) | public synchronized void perPlayerTick(@NotNull BiConsumer<Tracker, Pl...
method schedule (line 327) | public void schedule(long period, @NotNull ScheduledPacketHandler hand...
method name (line 341) | public @NotNull String name() {
method height (line 351) | public double height() {
method isClosed (line 361) | public boolean isClosed() {
method close (line 365) | @Override
method close (line 370) | protected void close(@NotNull CloseReason reason) {
method despawn (line 384) | public void despawn() {
method modifier (line 397) | public @NotNull TrackerModifier modifier() {
method pause (line 408) | public boolean pause(boolean pause) {
method forceUpdate (line 419) | public boolean forceUpdate(boolean force) {
method spawn (line 431) | protected boolean spawn(@NotNull PlatformPlayer player, @NotNull Packe...
method remove (line 447) | public boolean remove(@NotNull PlatformPlayer player) {
method playerCount (line 461) | public int playerCount() {
method location (line 471) | public abstract @NotNull PlatformLocation location();
method animate (line 480) | public boolean animate(@NotNull String animation) {
method animate (line 492) | public boolean animate(@NotNull String animation, @NotNull AnimationMo...
method animate (line 505) | public boolean animate(@NotNull String animation, @NotNull AnimationMo...
method animate (line 519) | public boolean animate(@NotNull BlueprintAnimation animation, @NotNull...
method animate (line 523) | public boolean animate(@NotNull TrackerAnimation<?> animation) {
method animate (line 527) | public boolean animate(@NotNull TrackerAnimation<?> animation, @NotNul...
method animate (line 541) | public boolean animate(@NotNull BlueprintAnimation animation, @NotNull...
method stopAnimation (line 554) | public boolean stopAnimation(@NotNull String animation) {
method stopAnimation (line 566) | public boolean stopAnimation(@NotNull Predicate<RenderedBone> filter, ...
method stopAnimation (line 579) | public boolean stopAnimation(@NotNull Predicate<RenderedBone> filter, ...
method replace (line 593) | public boolean replace(@NotNull String target, @NotNull String animati...
method replace (line 608) | public boolean replace(@NotNull String target, @NotNull BlueprintAnima...
method listenHitBox (line 632) | public void listenHitBox(@NotNull BiFunction<RenderedBone, HitBoxListe...
method listenHitBox (line 657) | public <T extends HitBoxEvent> void listenHitBox(@NotNull Class<T> eve...
method createHitBox (line 670) | public boolean createHitBox(@NotNull BaseEntity entity, @Nullable HitB...
method hitbox (line 683) | public @Nullable HitBox hitbox(@NotNull BaseEntity entity, @Nullable H...
method createNametag (line 700) | public boolean createNametag(@NotNull BonePredicate predicate, @NotNul...
method update (line 720) | public <T extends TrackerUpdateAction> void update(@NotNull T action) {
method update (line 732) | public <T extends TrackerUpdateAction> void update(@NotNull T action, ...
method update (line 744) | public <T extends TrackerUpdateAction> void update(@NotNull T action, ...
method tryUpdate (line 756) | public boolean tryUpdate(@NotNull BiPredicate<RenderedBone, BonePredic...
method bone (line 767) | public @Nullable RenderedBone bone(@NotNull BoneName name) {
method bone (line 778) | public @Nullable RenderedBone bone(@NotNull String name) {
method bone (line 789) | public @Nullable RenderedBone bone(@NotNull Predicate<RenderedBone> pr...
method bones (line 802) | public @NotNull @Unmodifiable Collection<RenderedBone> bones() {
method displays (line 812) | public @NotNull Stream<ModelDisplay> displays() {
method hide (line 825) | public boolean hide(@NotNull PlatformPlayer player) {
method isHide (line 836) | public boolean isHide(@NotNull PlatformPlayer player) {
method show (line 847) | public boolean show(@NotNull PlatformPlayer player) {
method handleCloseEvent (line 857) | public void handleCloseEvent(@NotNull BiConsumer<Tracker, CloseReason>...
method isSpawned (line 868) | public boolean isSpawned(@NotNull UUID uuid) {
method isSpawned (line 879) | public boolean isSpawned(@NotNull PlatformPlayer player) {
method renderer (line 889) | public @NotNull ModelRenderer renderer() {
method forRemoval (line 899) | @ApiStatus.Internal
method forRemoval (line 910) | @ApiStatus.Internal
method equals (line 915) | @Override
method hashCode (line 922) | @Override
type ScheduledPacketHandler (line 932) | @FunctionalInterface
method handle (line 941) | void handle(@NotNull Tracker tracker, @NotNull BundlerSet bundlerSet);
method then (line 950) | default @NotNull ScheduledPacketHandler then(@NotNull ScheduledPacke...
class BundlerSet (line 963) | public final class BundlerSet {
method BundlerSet (line 976) | private BundlerSet() {
method send (line 979) | private void send() {
method perPlayerSend (line 984) | private void perPlayerSend() {
method globalSend (line 989) | private void globalSend() {
class PerPlayerCache (line 1005) | @RequiredArgsConstructor
method channel (line 1011) | private @NotNull Optional<PlayerChannelHandler> channel() {
method add (line 1015) | public void add() {
method remove (line 1021) | public void remove() {
method send (line 1033) | private void send() {
method toString (line 1041) | @Override
type CloseReason (line 1051) | @RequiredArgsConstructor
method shouldBeSave (line 1077) | public boolean shouldBeSave() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/TrackerAnimation.java
method builder (line 61) | public static @NotNull Builder<Tracker> builder(@NotNull String name) {
method compareTo (line 69) | @Override
method play (line 74) | boolean play(@NotNull Tracker tracker) {
method play (line 78) | boolean play(@NotNull Tracker tracker, @NotNull Runnable removeTask) {
class Builder (line 101) | @RequiredArgsConstructor(access = AccessLevel.PACKAGE)
method type (line 121) | public <R extends T> Builder<R> type(@NotNull Class<R> newTargetClass) {
method priority (line 138) | public @NotNull Builder<T> priority(int priority) {
method check (line 150) | public @NotNull Builder<T> check(@NotNull Predicate<? super T> applyCo...
method modifier (line 162) | public @NotNull Builder<T> modifier(@NotNull Function<? super T, Anima...
method onRemove (line 174) | public @NotNull Builder<T> onRemove(@NotNull Consumer<? super T> remov...
method onSuccess (line 186) | public @NotNull Builder<T> onSuccess(@NotNull Consumer<? super T> succ...
method onFallback (line 198) | public @NotNull Builder<T> onFallback(@NotNull Consumer<? super T> fal...
method build (line 209) | public @NotNull TrackerAnimation<T> build() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/TrackerBuiltInAnimation.java
class TrackerBuiltInAnimation (line 26) | public final class TrackerBuiltInAnimation {
method register (line 39) | public static <T extends Tracker> @NotNull TrackerAnimation<T> registe...
method register (line 45) | private static void register(@NotNull TrackerAnimation<?> animation) {
method play (line 52) | static void play(@NotNull Tracker tracker) {
method TrackerBuiltInAnimation (line 121) | private TrackerBuiltInAnimation() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/TrackerData.java
method applyAs (line 65) | public void applyAs(@NotNull EntityTracker tracker) {
method serialize (line 79) | public @NotNull JsonElement serialize() {
method deserialize (line 90) | public static @NotNull TrackerData deserialize(@NotNull JsonElement elem...
method scaler (line 108) | @Override
method rotator (line 119) | @Override
method hideOption (line 130) | @Override
method markForSpawn (line 141) | @Override
method bodyRotator (line 152) | @Override
method toString (line 163) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/tracker/TrackerExtraAnimation.java
class TrackerExtraAnimation (line 17) | public final class TrackerExtraAnimation {
method TrackerExtraAnimation (line 52) | private TrackerExtraAnimation() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/TrackerModifier.java
method builder (line 46) | public static @NotNull Builder builder() {
method toBuilder (line 56) | public @NotNull Builder toBuilder() {
class Builder (line 65) | public static final class Builder {
method Builder (line 74) | private Builder(@NotNull TrackerModifier modifier) {
method sightTrace (line 87) | public @NotNull Builder sightTrace(boolean sightTrace) {
method damageAnimation (line 99) | public @NotNull Builder damageAnimation(boolean damageAnimation) {
method damageTint (line 111) | public @NotNull Builder damageTint(boolean damageTint) {
method build (line 122) | public @NotNull TrackerModifier build() {
FILE: api/src/main/java/kr/toxicity/model/api/tracker/TrackerUpdateAction.java
type TrackerUpdateAction (line 34) | public sealed interface TrackerUpdateAction extends BiPredicate<Rendered...
method brightness (line 44) | static @NotNull Brightness brightness(int block, int sky) {
method glow (line 55) | static @NotNull Glow glow(boolean glow) {
method glowColor (line 66) | static @NotNull GlowColor glowColor(int glowColor) {
method viewRange (line 77) | static @NotNull ViewRange viewRange(float viewRange) {
method tint (line 88) | static @NotNull Tint tint(int rgb) {
method previousTint (line 98) | static @NotNull PreviousTint previousTint() {
method enchant (line 109) | static @NotNull Enchant enchant(boolean enchant) {
method togglePart (line 120) | static @NotNull TogglePart togglePart(boolean toggle) {
method itemStack (line 131) | static @NotNull ItemStack itemStack(@NotNull TransformedItemStack item...
method billboard (line 143) | static @NotNull Billboard billboard(@NotNull PlatformBillboard billboa...
method itemMapping (line 154) | static @NotNull ItemMapping itemMapping() {
method moveDuration (line 165) | static @NotNull MoveDuration moveDuration(int moveDuration) {
method composite (line 176) | static @NotNull TrackerUpdateAction composite(@NotNull TrackerUpdateAc...
method perBone (line 191) | static @NotNull PerBone perBone(@NotNull Function<RenderedBone, Tracke...
method none (line 201) | static @NotNull None none() {
method test (line 213) | @Override
method then (line 223) | default @NotNull TrackerUpdateAction then(@NotNull TrackerUpdateAction...
method stream (line 233) | default @NotNull Stream<TrackerUpdateAction> stream() {
method test (line 244) | @Override
type Glow (line 254) | @RequiredArgsConstructor
method test (line 269) | @Override
method test (line 281) | @Override
method test (line 293) | @Override
type Enchant (line 303) | @RequiredArgsConstructor
method test (line 318) | @Override
method test (line 330) | @Override
type PreviousTint (line 340) | enum PreviousTint implements TrackerUpdateAction {
method test (line 347) | @Override
type TogglePart (line 357) | @RequiredArgsConstructor
method test (line 372) | @Override
method test (line 384) | @Override
method test (line 396) | @Override
type ItemMapping (line 406) | enum ItemMapping implements TrackerUpdateAction {
method test (line 414) | @Override
method test (line 426) | @Override
method test (line 438) | @Override
method stream (line 447) | @Override
method test (line 459) | @Override
type None (line 469) | enum None implements TrackerUpdateAction {
method test (line 477) | @Override
method stream (line 482) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/CollectionUtil.java
class CollectionUtil (line 32) | @ApiStatus.Internal
method CollectionUtil (line 37) | private CollectionUtil() {
method newAddressingMap (line 48) | @NotNull
method newSequencedChainingMap (line 60) | @NotNull
method newSequencedAddressingMap (line 72) | @NotNull
method newChainingMap (line 85) | @NotNull
method newAddressingMap (line 98) | @NotNull
method newSequencedChainingMap (line 111) | @NotNull
method newSequencedAddressingMap (line 124) | @NotNull
method filterIsInstance (line 137) | @NotNull
method mapToList (line 150) | @NotNull
method mapToList (line 164) | @NotNull
method mapToSet (line 178) | @NotNull
method mapToSet (line 192) | @NotNull
method mapToJson (line 206) | @NotNull
method mapToJson (line 219) | @NotNull
method mapToJson (line 233) | @NotNull
method filterIsInstance (line 248) | @NotNull
method group (line 262) | @NotNull
method mapIndexed (line 277) | @NotNull
method mapIndexed (line 290) | @NotNull
method mapIndexed (line 303) | @NotNull
method mapFloat (line 318) | @NotNull
method mapValue (line 334) | @NotNull
method filterWithWarning (line 347) | @NotNull
method associate (line 367) | @NotNull
method associate (line 381) | @NotNull
method associate (line 395) | @NotNull
method associate (line 409) | @NotNull
method associate (line 425) | @NotNull
method associateSequenced (line 439) | @NotNull
method associateSequenced (line 455) | @NotNull
method associateSequenced (line 469) | @NotNull
method associateSequenced (line 485) | @NotNull
method associateSequenced (line 501) | @NotNull
method associateSequenced (line 518) | @NotNull
type IndexedFunction (line 537) | @FunctionalInterface
method apply (line 545) | R apply(int index, T t);
type FloatFunction (line 552) | @FunctionalInterface
method apply (line 559) | float apply(T t);
FILE: api/src/main/java/kr/toxicity/model/api/util/EntityUtil.java
class EntityUtil (line 26) | @ApiStatus.Internal
method EntityUtil (line 32) | private EntityUtil() {
method renderDistance (line 56) | public static double renderDistance() {
method entityModelViewRadius (line 66) | public static float entityModelViewRadius() {
method canSee (line 78) | public static boolean canSee(@NotNull PlatformLocation player, @NotNul...
method isCustomNameVisible (line 101) | public static boolean isCustomNameVisible(@NotNull PlatformLocation pl...
method isInPoint (line 115) | public static boolean isInPoint(@NotNull PlatformLocation player, @Not...
method isInDegree (line 119) | private static boolean isInDegree(@NotNull PlatformLocation player, @N...
FILE: api/src/main/java/kr/toxicity/model/api/util/EventUtil.java
class EventUtil (line 27) | @ApiStatus.Internal
method EventUtil (line 32) | private EventUtil() {
method call (line 45) | @NotNull
FILE: api/src/main/java/kr/toxicity/model/api/util/FunctionUtil.java
class FunctionUtil (line 26) | @ApiStatus.Internal
method FunctionUtil (line 31) | private FunctionUtil() {
method asSupplier (line 41) | public static <T> @NotNull Supplier<T> asSupplier(@NotNull T t) {
method throttleTick (line 51) | public static <T> @NotNull Supplier<T> throttleTick(@NotNull Supplier<...
method throttleTick (line 62) | public static <T> @NotNull Supplier<T> throttleTick(long tick, @NotNul...
method throttleTickFloat (line 71) | public static @NotNull FloatSupplier throttleTickFloat(@NotNull FloatS...
method throttleTickFloat (line 81) | public static @NotNull FloatSupplier throttleTickFloat(long tick, @Not...
method throttleTickBoolean (line 94) | public static @NotNull BooleanSupplier throttleTickBoolean(@NotNull Bo...
method throttleTick (line 108) | public static <T> @NotNull Predicate<T> throttleTick(@NotNull Predicat...
method throttleTick (line 119) | public static <T, R> @NotNull Function<T, R> throttleTick(@NotNull Fun...
method throttleTick (line 131) | public static <T, R> @NotNull Function<T, R> throttleTick(long tick, @...
class TickThrottledSupplier (line 135) | private static class TickThrottledSupplier<T> implements Supplier<T> {
method TickThrottledSupplier (line 141) | public TickThrottledSupplier(long tick, @NotNull Supplier<T> delegat...
method get (line 147) | @Override
class TickThrottledFloatSupplier (line 156) | @RequiredArgsConstructor
method TickThrottledFloatSupplier (line 163) | public TickThrottledFloatSupplier(long tick, @NotNull FloatSupplier ...
method getAsFloat (line 169) | @Override
class TickThrottledBooleanSupplier (line 178) | @RequiredArgsConstructor
method getAsBoolean (line 184) | @Override
class TickThrottledPredicate (line 193) | @RequiredArgsConstructor
method test (line 199) | @Override
class TickThrottledFunction (line 208) | @RequiredArgsConstructor
method TickThrottledFunction (line 215) | public TickThrottledFunction(long tick, @NotNull Function<T, R> dele...
method apply (line 221) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/HttpUtil.java
class HttpUtil (line 43) | @ApiStatus.Internal
method HttpUtil (line 58) | private HttpUtil() {
method versionList (line 66) | public static @NotNull LatestVersion versionList() {
method versionList (line 75) | public static @NotNull LatestVersion versionList(@NotNull MinecraftVer...
method latestOf (line 105) | public static @NotNull LatestVersion latestOf(@NotNull List<PluginVers...
method toURLComponent (line 142) | public @NotNull Component toURLComponent() {
method isSamePlatform (line 161) | public boolean isSamePlatform() {
method client (line 172) | public static <T> @NotNull Result<T> client(@NotNull HttpClientConsume...
type Result (line 184) | public sealed interface Result<T> {
method orElse (line 191) | default @NotNull T orElse(@NotNull Function<Exception, T> function) {
type HttpClientConsumer (line 217) | @FunctionalInterface
method accept (line 225) | @NotNull T accept(@NotNull HttpClient client) throws Exception;
FILE: api/src/main/java/kr/toxicity/model/api/util/InterpolationUtil.java
class InterpolationUtil (line 27) | @ApiStatus.Internal
method InterpolationUtil (line 33) | private InterpolationUtil() {
method buildAnimation (line 49) | @NotNull
method interpolatorFor (line 85) | public static @NotNull VectorPointBuilder interpolatorFor(@NotNull Lis...
method roundTime (line 110) | public static float roundTime(float time) {
method insertLerpFrame (line 118) | public static void insertLerpFrame(@NotNull FloatSortedSet frames) {
method insertLerpFrame (line 127) | public static void insertLerpFrame(@NotNull FloatSortedSet frames, flo...
method alpha (line 151) | public static float alpha(float p0, float p1, float alpha) {
method lerp (line 163) | public static @NotNull Vector3f lerp(@NotNull Vector3f p0, @NotNull Ve...
method lerp (line 175) | public static @NotNull Vector3f lerp(@NotNull Vector3f p0, @NotNull Ve...
method lerp (line 189) | public static float lerp(float p0, float p1, float alpha) {
method cubicBezier (line 193) | private static float cubicBezier(float p0, float p1, float p2, float p...
method derivativeBezier (line 204) | private static float derivativeBezier(float p1, float p2, float t) {
method solveBezierTForTime (line 212) | private static float solveBezierTForTime(float time, float h1, float h...
method bezier (line 242) | public static @NotNull Vector3f bezier(
method catmull_rom (line 279) | public static @NotNull Vector3f catmull_rom(@NotNull Vector3f p0, @Not...
type VectorPointBuilder (line 292) | @FunctionalInterface
method build (line 299) | @NotNull VectorResult build(float nextFloat);
method VectorResult (line 312) | public VectorResult(@NotNull Vector3f vector) {
FILE: api/src/main/java/kr/toxicity/model/api/util/LogUtil.java
class LogUtil (line 28) | @ApiStatus.Internal
method LogUtil (line 33) | private LogUtil() {
method handleException (line 42) | public static void handleException(@NotNull String message, @NotNull T...
method toLog (line 67) | public static @NotNull Component toLog(@NotNull String message, @NotNu...
method debug (line 76) | public static void debug(@NotNull DebugConfig.DebugOption option, @Not...
method debug (line 89) | public static void debug(@NotNull DebugConfig.DebugOption option, @Not...
FILE: api/src/main/java/kr/toxicity/model/api/util/MathUtil.java
class MathUtil (line 25) | @ApiStatus.Internal
method MathUtil (line 31) | private MathUtil() {
method isSimilar (line 106) | public static boolean isSimilar(float a, float b) {
method isSimilar (line 117) | public static boolean isSimilar(float a, float b, float epsilon) {
method isSimilar (line 127) | public static boolean isSimilar(@NotNull Vector3fc a, @NotNull Vector3...
method isSimilar (line 138) | public static boolean isSimilar(@NotNull Vector3fc a, @NotNull Vector3...
method isSimilar (line 148) | public static boolean isSimilar(@NotNull Quaternionf a, @NotNull Quate...
method isSimilar (line 159) | public static boolean isSimilar(@NotNull Quaternionf a, @NotNull Quate...
method similarHashCode (line 168) | public static int similarHashCode(float value) {
method checkValidDegree (line 177) | public static boolean checkValidDegree(@NotNull Float3 rotation) {
method checkValidDegree (line 190) | public static boolean checkValidDegree(float rotation) {
method identifier (line 199) | public static @NotNull Float3 identifier(@NotNull Float3 rotation) {
method toQuaternion (line 209) | public static @NotNull Quaternionf toQuaternion(@NotNull Vector3f vect...
method toQuaternion (line 219) | public static @NotNull Quaternionf toQuaternion(@NotNull Vector3f vect...
method toXYZEuler (line 234) | public static @NotNull Vector3f toXYZEuler(@NotNull Vector3f vec) {
method fma (line 247) | public static @NotNull Vector3f fma(@NotNull Vector3f a, @NotNull Vect...
method fma (line 261) | public static @NotNull Vector3f fma(@NotNull Vector3f a, float b, @Not...
method fma (line 275) | public static float fma(float a, float b, float c) {
method fma (line 286) | public static double fma(double a, double b, double c) {
method isNotZero (line 295) | public static boolean isNotZero(@NotNull Vector3f vector3f) {
method isZero (line 304) | public static boolean isZero(@NotNull Vector3f vector) {
method floatToHalf (line 314) | public static short floatToHalf(float value) {
FILE: api/src/main/java/kr/toxicity/model/api/util/PackUtil.java
class PackUtil (line 18) | @ApiStatus.Internal
method PackUtil (line 23) | private PackUtil() {
method assertPackName (line 34) | public static void assertPackName(@NotNull String raw) {
method toPackName (line 43) | public static @NotNull String toPackName(@NotNull String raw) {
FILE: api/src/main/java/kr/toxicity/model/api/util/ReflectionUtil.java
class ReflectionUtil (line 16) | @ApiStatus.Internal
method ReflectionUtil (line 21) | private ReflectionUtil() {
method classExists (line 30) | public static boolean classExists(@NotNull String clazz) {
FILE: api/src/main/java/kr/toxicity/model/api/util/TransformedItemStack.java
method empty (line 31) | public static @NotNull TransformedItemStack empty() {
method of (line 40) | public static @NotNull TransformedItemStack of(@NotNull PlatformItemStac...
method of (line 52) | public static @NotNull TransformedItemStack of(@NotNull Vector3f positio...
method asAir (line 60) | public @NotNull TransformedItemStack asAir() {
method offset (line 69) | public @NotNull TransformedItemStack offset(@NotNull Vector3f offset) {
method modify (line 78) | public @NotNull TransformedItemStack modify(@NotNull Function<PlatformIt...
method isAir (line 86) | public boolean isAir() {
method copy (line 94) | public @NotNull TransformedItemStack copy() {
FILE: api/src/main/java/kr/toxicity/model/api/util/collection/PriorityMap.java
class PriorityMap (line 23) | public final class PriorityMap<K extends Comparable<K>, V> {
method isEmpty (line 34) | public boolean isEmpty() {
method compareTo (line 55) | @Override
method put (line 72) | public @Nullable V put(@NotNull K key, @NotNull V value, int priority) {
method get (line 86) | public @Nullable V get(@NotNull K key) {
method remove (line 97) | public @Nullable V remove(@NotNull K key) {
method replace (line 109) | public @Nullable V replace(@NotNull K Key, @NotNull Function<V, V> fun...
method valueIterator (line 121) | public @NotNull Iterator<V> valueIterator() {
class ValueIterator (line 125) | private class ValueIterator implements Iterator<V> {
method hasNext (line 130) | @Override
method next (line 135) | @Override
method remove (line 142) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/collection/SingletonSequencedSet.java
class SingletonSequencedSet (line 19) | @Unmodifiable
method of (line 26) | public static <E> @NotNull SingletonSequencedSet<E> of(@NotNull E elem...
method SingletonSequencedSet (line 30) | private SingletonSequencedSet(@NotNull E element) {
method size (line 35) | public int size() {
method contains (line 39) | public boolean contains(Object o) {
method hashCode (line 43) | @Override
method iterator (line 48) | @NotNull
method spliterator (line 55) | @Override
method forEach (line 61) | @Override
method removeIf (line 66) | @Override
method stream (line 71) | @Override
method parallelStream (line 76) | @Override
method getFirst (line 82) | @Override
method getLast (line 87) | @Override
method removeFirst (line 92) | @Override
method removeLast (line 97) | @Override
method reversed (line 102) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/function/BonePredicate.java
type BonePredicate (line 21) | public interface BonePredicate extends Predicate<RenderedBone> {
method name (line 38) | static @NotNull Builder name(@NotNull String name) {
method tag (line 47) | static @NotNull Builder tag(@NotNull BoneTag... tags) {
method test (line 52) | @Override
method and (line 55) | @Override
method or (line 59) | @Override
method negate (line 63) | @Override
method applyAtChildren (line 71) | @NotNull State applyAtChildren();
method from (line 78) | static @NotNull BonePredicate from(@NotNull Predicate<RenderedBone> pr...
method of (line 88) | static @NotNull BonePredicate of(@NotNull State applyAtChildren, @NotN...
method test (line 99) | @Override
method and (line 104) | @Override
method or (line 111) | @Override
method negate (line 118) | @Override
type State (line 128) | enum State {
method children (line 148) | @ApiStatus.Internal
type Builder (line 160) | @FunctionalInterface
method notSet (line 167) | default @NotNull BonePredicate notSet() {
method withChildren (line 175) | default @NotNull BonePredicate withChildren() {
method withoutChildren (line 183) | default @NotNull BonePredicate withoutChildren() {
method build (line 192) | default @NotNull BonePredicate build(@NotNull State state) {
method and (line 196) | @Override
method or (line 202) | @Override
method negate (line 208) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/function/BooleanConstantSupplier.java
type BooleanConstantSupplier (line 18) | @RequiredArgsConstructor
method of (line 32) | public static @NotNull BooleanConstantSupplier of(boolean value) {
method getAsBoolean (line 36) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/function/Float2FloatConstantFunction.java
method applyAsFloat (line 15) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/function/Float2FloatFunction.java
type Float2FloatFunction (line 15) | @FunctionalInterface
method applyAsFloat (line 27) | float applyAsFloat(float value);
method of (line 34) | static @NotNull Float2FloatConstantFunction of(float value) {
FILE: api/src/main/java/kr/toxicity/model/api/util/function/FloatConstantFunction.java
method apply (line 20) | @Override
method map (line 25) | @Override
method memoize (line 30) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/function/FloatConstantSupplier.java
method getAsFloat (line 21) | @Override
FILE: api/src/main/java/kr/toxicity/model/api/util/function/FloatFunction.java
type FloatFunction (line 21) | @FunctionalInterface
method apply (line 29) | @NotNull T apply(float value);
method of (line 37) | static <T> @NotNull FloatConstantFunction<T> of(@NotNull T t) {
method map (line 47) | default <R> @NotNull FloatFunction<R> map(@NotNull Function<T, R> mapp...
method memoize (line 55) | default @NotNull FloatFunction<T> memoize() {
FILE: api/src/main/java/kr/toxicity/model/api/util/function/FloatSupplier.java
type FloatSupplier (line 15) | @FunctionalInterface
method getAsFloat (line 21) | float getAsFloat();
method of (line 28) | static @NotNull FloatConstantSupplier of(float value) {
FILE: api/src/main/java/kr/toxicity/model/api/util/interpolator/VectorInterpolator.java
type VectorInterpolator (line 23) | @ApiStatus.Internal
method interpolate (line 30) | @NotNull
method indexOf (line 50) | private static @NotNull VectorPoint indexOf(@NotNull List<VectorPoint>...
method interpolate (line 56) | @NotNull
method interpolate (line 82) | @NotNull
method interpolate (line 108) | @NotNull
method isContinuous (line 114) | @Override
method interpolate (line 128) | @NotNull
method isContinuous (line 135) | public boolean isContinuous() {
FILE: api/src/main/java/kr/toxicity/model/api/util/json/JsonArrayBuilder.java
class JsonArrayBuilder (line 16) | public final class JsonArrayBuilder {
method builder (line 24) | public static @NotNull JsonArrayBuilder builder() {
method jsonObject (line 28) | public @NotNull JsonArrayBuilder jsonObject(@NotNull Consumer<JsonObje...
method build (line 36) | public @NotNull JsonArray build() {
FILE: api/src/main/java/kr/toxicity/model/api/util/json/JsonObjectBuilder.java
class JsonObjectBuilder (line 23) | @ApiStatus.Internal
method JsonObjectBuilder (line 30) | private JsonObjectBuilder() {
method builder (line 37) | public static @NotNull JsonObjectBuilder builder() {
method build (line 45) | public @NotNull JsonObject build() {
method jsonObject (line 55) | public @NotNull JsonObjectBuilder jsonObject(@NotNull String name, @No...
method jsonObject (line 69) | public @NotNull JsonObjectBuilder jsonObject(@NotNull String name, @Nu...
method jsonArray (line 80) | public @NotNull JsonObjectBuilder jsonArray(@NotNull String name, @Nul...
method jsonArray (line 91) | public @NotNull JsonObjectBuilder jsonArray(@NotNull String name, @Not...
method property (line 105) | public @NotNull JsonObjectBuilder property(@NotNull String name, @NotN...
method property (line 116) | public @NotNull JsonObjectBuilder property(@NotNull String name, @NotN...
method property (line 127) | public @NotNull JsonObjectBuilder property(@NotNull String name, @Null...
method stringProperties (line 137) | public @NotNull JsonObjectBuilder stringProperties(@NotNull Iterable<M...
method booleanProperties (line 149) | public @NotNull JsonObjectBuilder booleanProperties(@NotNull Iterable<...
method numberProperties (line 161) | public @NotNull JsonObjectBuilder numberProperties(@NotNull Iterable<M...
FILE: api/src/main/java/kr/toxicity/model/api/util/lazy/LazyFloatProvider.java
class LazyFloatProvider (line 22) | @ApiStatus.Internal
method LazyFloatProvider (line 33) | public LazyFloatProvider(long requiredTime) {
method LazyFloatProvider (line 40) | public LazyFloatProvider(float requiredTime) {
method LazyFloatProvider (line 47) | public LazyFloatProvider(@NotNull FloatSupplier requiredTime) {
method LazyFloatProvider (line 56) | public LazyFloatProvider(float initialValue, @NotNull FloatSupplier re...
method updateAndGet (line 66) | public float updateAndGet(float updateValue) {
method storedValue (line 86) | public void storedValue(float storedValue) {
method ofVector (line 97) | public static @NotNull Supplier<Vector3f> ofVector(@NotNull FloatSuppl...
FILE: api/src/main/java/kr/toxicity/model/api/util/lock/DuplexLock.java
class DuplexLock (line 19) | @ApiStatus.Internal
method accessToReadLock (line 29) | public <T> T accessToReadLock(@NotNull Supplier<T> supplier) {
method accessToWriteLock (line 45) | public <T> T accessToWriteLock(@NotNull Supplier<T> supplier) {
FILE: api/src/main/java/kr/toxicity/model/api/util/lock/SingleLock.java
class SingleLock (line 16) | @ApiStatus.Internal
method SingleLock (line 21) | public SingleLock() {
method SingleLock (line 25) | public SingleLock(@Nullable Object lock) {
method accessToLock (line 29) | public <T> T accessToLock(@NotNull Supplier<T> supplier) {
FILE: api/src/main/java/kr/toxicity/model/api/version/MinecraftVersion.java
method parse (line 80) | public static @NotNull MinecraftVersion parse(@NotNull String version) {
method of (line 92) | public static @NotNull MinecraftVersion of(int major, int minor, int pat...
method compareTo (line 96) | @Override
method toString (line 101) | @NotNull
FILE: core/bukkit-core/src/main/java/kr/toxicity/model/bukkit/AbstractBetterModelPlugin.java
class AbstractBetterModelPlugin (line 27) | public abstract class AbstractBetterModelPlugin extends JavaPlugin imple...
method logger (line 37) | private @NotNull ComponentLogger logger() {
method info (line 46) | @Override
method warn (line 56) | @Override
method onLoad (line 68) | public void onLoad() {
method skipInitialReload (line 73) | public void skipInitialReload() {
method saveResource (line 77) | @Override
method adapter (line 82) | @Override
method attributes (line 88) | public @NotNull Attributes attributes() {
FILE: core/bukkit-core/src/main/java/kr/toxicity/model/bukkit/BetterModelLibrary.java
class BetterModelLibrary (line 23) | @SuppressWarnings("unused")
method load (line 119) | public void load(@NotNull AbstractBetterModelPlugin plugin) {
method register (line 130) | private static @NotNull LibraryData register(@NotNull String group, @N...
class Builder (line 145) | private static class Builder {
method Builder (line 153) | Builder(@NotNull String group, @NotNull String artifact) {
method predicate (line 158) | @NotNull Builder predicate(@NotNull BooleanSupplier predicate) {
method subModules (line 163) | @NotNull Builder subModules(@NotNull String... subModules) {
method relocation (line 168) | @NotNull Builder relocation(@Nullable String relocation) {
method versionRef (line 173) | @NotNull Builder versionRef(@NotNull String versionRef) {
method build (line 178) | @NotNull LibraryData build() {
method isLoaded (line 190) | public boolean isLoaded() {
method toLibby (line 194) | private @NotNull Stream<Library> toLibby(@NotNull AbstractBetterModelP...
FILE: core/bukkit-core/src/main/java/kr/toxicity/model/bukkit/BetterModelLibraryManager.java
class BetterModelLibraryManager (line 19) | final class BetterModelLibraryManager extends LibraryManager {
method BetterModelLibraryManager (line 23) | BetterModelLibraryManager(Plugin plugin) {
method addToClasspath (line 37) | protected void addToClasspath(Path file) {
FILE: core/src/main/java/kr/toxicity/model/BetterModelPlatformImpl.java
type BetterModelPlatformImpl (line 17) | public interface BetterModelPlatformImpl extends BetterModelPlatform {
method saveResource (line 19) | void saveResource(@NotNull String resourcePath);
method loadAssets (line 21) | void loadAssets(@NotNull ReloadPipeline pipeline, @NotNull String pref...
FILE: nms/v1_21_R3/src/main/java/kr/toxicity/model/bukkit/nms/v1_21_R3/AbstractHitBox.java
class AbstractHitBox (line 17) | public abstract class AbstractHitBox extends ArmorStand implements HitBox {
method AbstractHitBox (line 19) | AbstractHitBox(@NotNull Level level) {
method equals (line 23) | @Override //Only for provide compiler hint for Kotlin jvm
method hashCode (line 28) | @Override //Only for provide compiler hint for Kotlin jvm
method remove (line 33) | @Override
FILE: nms/v1_21_R4/src/main/java/kr/toxicity/model/bukkit/nms/v1_21_R4/AbstractHitBox.java
class AbstractHitBox (line 17) | public abstract class AbstractHitBox extends ArmorStand implements HitBox {
method AbstractHitBox (line 19) | AbstractHitBox(@NotNull Level level) {
method equals (line 23) | @Override //Only for provide compiler hint for Kotlin jvm
method hashCode (line 28) | @Override //Only for provide compiler hint for Kotlin jvm
FILE: nms/v1_21_R5/src/main/java/kr/toxicity/model/bukkit/nms/v1_21_R5/AbstractHitBox.java
class AbstractHitBox (line 17) | public abstract class AbstractHitBox extends ArmorStand implements HitBox {
method AbstractHitBox (line 19) | AbstractHitBox(@NotNull Level level) {
method equals (line 23) | @Override //Only for provide compiler hint for Kotlin jvm
method hashCode (line 28) | @Override //Only for provide compiler hint for Kotlin jvm
FILE: nms/v1_21_R6/src/main/java/kr/toxicity/model/bukkit/nms/v1_21_R6/AbstractHitBox.java
class AbstractHitBox (line 17) | public abstract class AbstractHitBox extends ArmorStand implements HitBox {
method AbstractHitBox (line 19) | AbstractHitBox(@NotNull Level level) {
method equals (line 23) | @Override //Only for provide compiler hint for Kotlin jvm
method hashCode (line 28) | @Override //Only for provide compiler hint for Kotlin jvm
FILE: nms/v1_21_R7/src/main/java/kr/toxicity/model/bukkit/nms/v1_21_R7/AbstractHitBox.java
class AbstractHitBox (line 17) | public abstract class AbstractHitBox extends ArmorStand implements HitBox {
method AbstractHitBox (line 19) | AbstractHitBox(@NotNull Level level) {
method equals (line 23) | @Override //Only for provide compiler hint for Kotlin jvm
method hashCode (line 28) | @Override //Only for provide compiler hint for Kotlin jvm
FILE: nms/v26_R1/src/main/java/kr/toxicity/model/bukkit/nms/v26_R1/AbstractHitBox.java
class AbstractHitBox (line 17) | public abstract class AbstractHitBox extends ArmorStand implements HitBox {
method AbstractHitBox (line 19) | AbstractHitBox(@NotNull Level level) {
method equals (line 23) | @Override //Only for provide compiler hint for Kotlin jvm
method hashCode (line 28) | @Override //Only for provide compiler hint for Kotlin jvm
FILE: platform/fabric/src/main/java/kr/toxicity/model/impl/fabric/entity/AbstractArmorStand.java
class AbstractArmorStand (line 15) | public abstract class AbstractArmorStand extends ArmorStand {
method AbstractArmorStand (line 16) | public AbstractArmorStand(EntityType<? extends ArmorStand> type, Level...
method equals (line 20) | @Override
method hashCode (line 25) | @Override
FILE: platform/fabric/src/main/java/kr/toxicity/model/impl/fabric/entity/EntityHook.java
type EntityHook (line 12) | public interface EntityHook {
method bettermodel$getModelData (line 13) | @Nullable String bettermodel$getModelData();
method bettermodel$setModelData (line 15) | void bettermodel$setModelData(@Nullable String modelData);
FILE: platform/fabric/src/main/java/kr/toxicity/model/impl/fabric/network/BetterModelBundlePacket.java
type BetterModelBundlePacket (line 10) | public interface BetterModelBundlePacket {
method bettermodel$isBetterModelPacket (line 11) | boolean bettermodel$isBetterModelPacket();
method bettermodel$setBetterModelPacket (line 12) | void bettermodel$setBetterModelPacket(boolean isBetterModel);
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/AvatarAccessor.java
type AvatarAccessor (line 16) | @Mixin(value = Avatar.class)
method bettermodel$getDataPlayerModeCustomisation (line 18) | @Accessor("DATA_PLAYER_MODE_CUSTOMISATION")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/ClientboundBundlePacketMixin.java
class ClientboundBundlePacketMixin (line 15) | @Mixin(value = ClientboundBundlePacket.class)
method bettermodel$isBetterModelPacket (line 20) | @Override
method bettermodel$setBetterModelPacket (line 25) | @Override
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/ConnectionAccessor.java
type ConnectionAccessor (line 16) | @Mixin(value = Connection.class)
method bettermodel$getChannel (line 18) | @Accessor(value = "channel")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/DisplayAccessor.java
type DisplayAccessor (line 18) | @Mixin(value = Display.class)
method bettermodel$getDataTransformationInterpolationStartDeltaTicksId (line 20) | @Accessor("DATA_TRANSFORMATION_INTERPOLATION_START_DELTA_TICKS_ID")
method bettermodel$getDataTransformationInterpolationDurationId (line 25) | @Accessor("DATA_TRANSFORMATION_INTERPOLATION_DURATION_ID")
method bettermodel$getDataPosRotInterpolationDurationId (line 30) | @Accessor("DATA_POS_ROT_INTERPOLATION_DURATION_ID")
method bettermodel$getDataTranslationId (line 35) | @Accessor("DATA_TRANSLATION_ID")
method bettermodel$getDataScaleId (line 40) | @Accessor("DATA_SCALE_ID")
method bettermodel$getDataLeftRotationId (line 45) | @Accessor("DATA_LEFT_ROTATION_ID")
method bettermodel$getDataRightRotationId (line 50) | @Accessor("DATA_RIGHT_ROTATION_ID")
method bettermodel$getDataBillboardRenderConstraintsId (line 55) | @Accessor("DATA_BILLBOARD_RENDER_CONSTRAINTS_ID")
method bettermodel$getDataBrightnessOverrideId (line 60) | @Accessor("DATA_BRIGHTNESS_OVERRIDE_ID")
method bettermodel$getDataViewRangeId (line 65) | @Accessor("DATA_VIEW_RANGE_ID")
method bettermodel$getDataShadowRadiusId (line 70) | @Accessor("DATA_SHADOW_RADIUS_ID")
method bettermodel$getDataShadowStrengthId (line 75) | @Accessor("DATA_SHADOW_STRENGTH_ID")
method bettermodel$getDataWidthId (line 80) | @Accessor("DATA_WIDTH_ID")
method bettermodel$getDataHeightId (line 85) | @Accessor("DATA_HEIGHT_ID")
method bettermodel$getDataGlowColorOverrideId (line 90) | @Accessor("DATA_GLOW_COLOR_OVERRIDE_ID")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/EntityAccessor.java
type EntityAccessor (line 16) | @Mixin(value = Entity.class)
method bettermodel$getDataSharedFlagsId (line 18) | @Accessor(value = "DATA_SHARED_FLAGS_ID")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/EntityMixin.java
class EntityMixin (line 25) | @Mixin(value = Entity.class)
method level (line 27) | @Shadow
method bettermodel$getModelData (line 30) | @Override
method bettermodel$setModelData (line 35) | @Override
method bettermodel$invokeDismountCallbacks (line 40) | @Inject(
method betterModel$entity (line 56) | @Unique
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/ItemDisplayAccessor.java
type ItemDisplayAccessor (line 17) | @Mixin(value = Display.ItemDisplay.class)
method bettermodel$getDataItemStackId (line 19) | @Accessor(value = "DATA_ITEM_STACK_ID")
method bettermodel$getDataItemDisplayId (line 24) | @Accessor(value = "DATA_ITEM_DISPLAY_ID")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/LivingEntityMixin.java
class LivingEntityMixin (line 28) | @Mixin(value = LivingEntity.class)
method LivingEntityMixin (line 30) | private LivingEntityMixin(EntityType<?> type, Level level) {
method bettermodel$invokeJumpCallbacks (line 34) | @Inject(
method bettermodel$invokeEffectLoadCallbacks (line 47) | @Inject(
method bettermodel$invokeEffectUnloadCallbacks (line 61) | @Inject(
method bettermodel$livingEntity (line 75) | @Unique
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/MobAccessor.java
type MobAccessor (line 16) | @Mixin(value = Mob.class)
method bettermodel$getGoalSelector (line 18) | @Accessor(value = "goalSelector")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/ServerCommonPacketListenerImplAccessor.java
type ServerCommonPacketListenerImplAccessor (line 16) | @Mixin(value = ServerCommonPacketListenerImpl.class)
method bettermodel$getConnection (line 18) | @Accessor(value = "connection")
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/ServerLevelEntityCallbacksMixin.java
class ServerLevelEntityCallbacksMixin (line 20) | @Mixin(targets = "net.minecraft.server.level.ServerLevel$EntityCallbacks")
method bettermodel$invokeLoadCallbacks (line 23) | @Inject(
method bettermodel$invokeUnloadCallbacks (line 37) | @Inject(
FILE: platform/fabric/src/main/java/kr/toxicity/model/mixin/SynchedEntityDataAccessor.java
type SynchedEntityDataAccessor (line 17) | @Mixin(value = SynchedEntityData.class)
method bettermodel$getItemsById (line 19) | @Accessor(value = "itemsById")
method bettermodel$setDirty (line 22) | @Accessor(value = "isDirty")
method bettermodel$getItem (line 25) | @Invoker(value = "getItem")
FILE: platform/paper/src/main/java/kr/toxicity/model/paper/BetterModelLoader.java
class BetterModelLoader (line 24) | @SuppressWarnings({"UnstableApiUsage", "unused"})
method classloader (line 26) | @Override
FILE: test-plugin/src/main/java/kr/toxicity/model/test/BetterModelTest.java
class BetterModelTest (line 18) | @SuppressWarnings("unused")
method onEnable (line 26) | @Override
method onDisable (line 34) | @Override
method asByte (line 42) | public @NotNull Supplier<byte[]> asByte(@NotNull String path) {
FILE: test-plugin/src/main/java/kr/toxicity/model/test/FightTester.java
class FightTester (line 51) | public final class FightTester implements ModelTester, Listener {
method start (line 60) | @Override
method end (line 85) | @Override
method loadItem (line 90) | private void loadItem(@NotNull PackNamespace path, @NotNull String ite...
method rightClick (line 101) | @EventHandler
method giveKnightSword (line 118) | private void giveKnightSword(@NotNull Player player) {
method createLine (line 133) | private static @NotNull ItemStack createLine() {
method toDeltaVector (line 142) | private static @NotNull Vector3f toDeltaVector(@NotNull Location befor...
class PlayerSkillCounter (line 147) | @RequiredArgsConstructor
method skill (line 154) | @NotNull PlayerSkillCounter skill(@NotNull String name) {
method execute (line 159) | void execute() {
method execute (line 164) | private void execute(@NotNull String target) {
method playSound (line 189) | private void playSound() {
method cancelDrawer (line 205) | private void cancelDrawer() {
class LineDrawer (line 220) | private class LineDrawer {
method LineDrawer (line 227) | LineDrawer(@NotNull Player player, @NotNull RenderedBone bone, int c...
method cancel (line 256) | void cancel() {
method relativeLocation (line 261) | @NotNull Location relativeLocation(@NotNull Location location, @NotN...
method createDisplay (line 268) | void createDisplay(@NotNull Location start, float length, @NotNull Q...
FILE: test-plugin/src/main/java/kr/toxicity/model/test/ModelTester.java
type ModelTester (line 12) | public interface ModelTester {
method start (line 13) | void start(@NotNull BetterModelTest test);
method end (line 14) | void end(@NotNull BetterModelTest test);
FILE: test-plugin/src/main/java/kr/toxicity/model/test/RollTester.java
class RollTester (line 39) | public final class RollTester implements ModelTester, Listener {
method start (line 44) | @Override
method end (line 51) | @Override
method swap (line 56) | @EventHandler
method hit (line 79) | @EventHandler
method quit (line 83) | @EventHandler
method death (line 89) | @EventHandler
method damage (line 95) | @EventHandler
method push (line 99) | @EventHandler
method underBlock (line 104) | private static @NotNull Block underBlock(@NotNull Player player) {
method sendRollTime (line 108) | private static boolean sendRollTime(@NotNull Audience audience) {
method playRoll (line 121) | private void playRoll(@NotNull Player player) {
method inputToYaw (line 150) | private static float inputToYaw(@NotNull Player player) {
method packDegree (line 168) | private static float packDegree(float degree) {
type TriState (line 173) | private enum TriState {
method of (line 178) | static @NotNull TriState of(boolean left, boolean right) {
Condensed preview — 608 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,083K chars).
[
{
"path": ".editorconfig",
"chars": 346,
"preview": "# EditorConfig is awesome: https://editorconfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Unix-style newlines wit"
},
{
"path": ".gitattributes",
"chars": 65,
"preview": "# Auto detect text files and perform LF normalization\n* text=auto"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 609,
"preview": "## Contributing\n\nThanks for considering contributing!\n\n* **Step 1.** Forks BetterModel to your repository.\n* **Step 2.**"
},
{
"path": ".github/FUNDING.yml",
"chars": 820,
"preview": "# These are supported funding model platforms\n\ngithub: [toxicity188]\npatreon: # Replace with a single Patreon username\no"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 1075,
"preview": "---\nname: Bug report\nabout: Report a bug to help us improve BetterModel\ntitle: \"[Bug] \"\nlabels: bug\nassignees: toxicity1"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 1081,
"preview": "---\nname: Feature request\nabout: Suggest an idea or enhancement for BetterModel\ntitle: \"[Feature] \"\nlabels: help wanted\n"
},
{
"path": ".github/workflows/package.yml",
"chars": 2712,
"preview": "name: Package plugin\n\non:\n push:\n branches: [ \"master\", \"v2\", \"v3\" ]\n\npermissions:\n contents: read\n packages: writ"
},
{
"path": ".github/workflows/pr-test.yml",
"chars": 563,
"preview": "name: PR Test\n\non:\n pull_request:\n branches: [ \"dev\", \"v2-dev\", \"v3-dev\" ]\n\npermissions:\n contents: read\n\njobs:\n b"
},
{
"path": ".github/workflows/publish.yml",
"chars": 969,
"preview": "name: Publish plugin\n\non:\n push:\n branches: [ \"master\", \"v2\", \"v3\" ]\n\npermissions:\n contents: read\n\njobs:\n build:\n"
},
{
"path": ".gitignore",
"chars": 520,
"preview": ".gradle\nbuild/\n!gradle/wrapper/gradle-wrapper.jar\n!**/src/main/**/build/\n!**/src/test/**/build/\n\n### IntelliJ IDEA ###\n."
},
{
"path": ".idea/codeStyles/codeStyleConfig.xml",
"chars": 149,
"preview": "<component name=\"ProjectCodeStyleConfiguration\">\n <state>\n <option name=\"PREFERRED_PROJECT_CODE_STYLE\" value=\"Defaul"
},
{
"path": "AGENTS.md",
"chars": 8213,
"preview": "# BetterModel AGENT GUIDE (for Codex, Gemini, and other LLM agents)\n\nThis document defines repository-wide operating rul"
},
{
"path": "BANNER.md",
"chars": 4944,
"preview": "<div align=\"center\"> \n\n\n\n# BetterMo"
},
{
"path": "LICENSE.md",
"chars": 1073,
"preview": "MIT License\n\nCopyright (c) 2024–2026 toxicity188\n\nPermission is hereby granted, free of charge, to any person obtaining "
},
{
"path": "LICENSE_HEADER",
"chars": 181,
"preview": "This source file is part of BetterModel.\nCopyright (c) ${CREATION_YEAR} toxicity188\nLicensed under the MIT License.\nSee "
},
{
"path": "README.md",
"chars": 11236,
"preview": "<div align=\"center\">\n\n\n\n# BetterMode"
},
{
"path": "SECURITY.md",
"chars": 802,
"preview": "## Security Policy\n\nBetterModel is a server-side 3D model engine that operates in an isolated environment without direct"
},
{
"path": "api/build.gradle.kts",
"chars": 113,
"preview": "plugins {\n alias(libs.plugins.convention.publish)\n}\n\ndependencies {\n compileOnly(libs.bundles.minecraft)\n}\n"
},
{
"path": "api/bukkit-api/build.gradle.kts",
"chars": 152,
"preview": "plugins {\n alias(libs.plugins.convention.publish)\n alias(libs.plugins.convention.bukkit)\n}\n\ndependencies {\n api"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/BetterModelBukkit.java",
"chars": 2252,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/BukkitModelEventBus.java",
"chars": 1515,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/entity/BaseBukkitEntity.java",
"chars": 3318,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/entity/BaseBukkitPlayer.java",
"chars": 922,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/event/BetterModelBukkitEvent.java",
"chars": 3840,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/event/BukkitEventApplication.java",
"chars": 1613,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitAdapter.java",
"chars": 4060,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitEntity.java",
"chars": 1315,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitItemStack.java",
"chars": 1701,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitLivingEntity.java",
"chars": 1220,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitLocation.java",
"chars": 1799,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitOfflinePlayer.java",
"chars": 862,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitPlayer.java",
"chars": 1039,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/platform/BukkitWorld.java",
"chars": 547,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/bukkit-api/src/main/java/kr/toxicity/model/api/bukkit/scheduler/BukkitModelScheduler.java",
"chars": 1577,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/build.gradle.kts",
"chars": 227,
"preview": "plugins {\n alias(libs.plugins.convention.publish)\n id(\"net.neoforged.moddev\")\n}\n\ndependencies {\n api(project(\":"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/BetterModelMod.java",
"chars": 1392,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/entity/BaseModEntity.java",
"chars": 932,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/entity/BaseModPlayer.java",
"chars": 865,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModAdapter.java",
"chars": 4730,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModEntity.java",
"chars": 1199,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModItemStack.java",
"chars": 2131,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModLivingEntity.java",
"chars": 1402,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModLocation.java",
"chars": 5149,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModOfflinePlayer.java",
"chars": 1133,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModPlayer.java",
"chars": 1534,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModRegionHolder.java",
"chars": 615,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/platform/ModWorld.java",
"chars": 906,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/mod-api/src/main/java/kr/toxicity/model/api/mod/scheduler/ModModelScheduler.java",
"chars": 1245,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/BetterModel.java",
"chars": 8039,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/BetterModelConfig.java",
"chars": 5988,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/BetterModelEvaluator.java",
"chars": 558,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/BetterModelEventBus.java",
"chars": 3264,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/BetterModelLogger.java",
"chars": 584,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/BetterModelPlatform.java",
"chars": 8742,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/AnimationIterator.java",
"chars": 5066,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/AnimationKeyframe.java",
"chars": 6031,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/AnimationModifier.java",
"chars": 8898,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/AnimationOverrideState.java",
"chars": 360,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/AnimationProgress.java",
"chars": 3164,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/AnimationStateHandler.java",
"chars": 8263,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/RunningAnimation.java",
"chars": 416,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/Timed.java",
"chars": 579,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/TimedStorage.java",
"chars": 2207,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/animation/VectorPoint.java",
"chars": 4549,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/armor/ArmorItem.java",
"chars": 520,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/armor/PlayerArmor.java",
"chars": 1180,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneEventDispatcher.java",
"chars": 4093,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneEventHandler.java",
"chars": 476,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneIKSolver.java",
"chars": 5758,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneItemMapper.java",
"chars": 3735,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneMovement.java",
"chars": 2550,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneName.java",
"chars": 2257,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BonePosition.java",
"chars": 734,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneRenderContext.java",
"chars": 775,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneTag.java",
"chars": 905,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneTagRegistry.java",
"chars": 2892,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/BoneTags.java",
"chars": 4183,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/bone/RenderedBone.java",
"chars": 26474,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/config/DebugConfig.java",
"chars": 1908,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/config/IndicatorConfig.java",
"chars": 1476,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/config/ModuleConfig.java",
"chars": 934,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/config/PackConfig.java",
"chars": 1086,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/Float2.java",
"chars": 1031,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/Float3.java",
"chars": 5074,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/Float4.java",
"chars": 3142,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/ModelAsset.java",
"chars": 5531,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/AnimationGenerator.java",
"chars": 8717,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintAnimation.java",
"chars": 2521,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintAnimator.java",
"chars": 2525,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintElement.java",
"chars": 18289,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintImage.java",
"chars": 1481,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintJson.java",
"chars": 1199,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintLoadContext.java",
"chars": 5774,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintTexture.java",
"chars": 3939,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/ModelBlueprint.java",
"chars": 1560,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/blueprint/ModelBoundingBox.java",
"chars": 6797,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/KeyframeChannel.java",
"chars": 1274,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelAnimation.java",
"chars": 6230,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelAnimator.java",
"chars": 2663,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelData.java",
"chars": 5967,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelDatapoint.java",
"chars": 3807,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelElement.java",
"chars": 13088,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelFace.java",
"chars": 2992,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelGroup.java",
"chars": 2023,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelKeyframe.java",
"chars": 4329,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelLoadContext.java",
"chars": 2289,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelLoadResult.java",
"chars": 889,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelMeta.java",
"chars": 4365,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelOutliner.java",
"chars": 4717,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelPlaceholder.java",
"chars": 2056,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelResolution.java",
"chars": 521,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelTexture.java",
"chars": 2725,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/raw/ModelUV.java",
"chars": 2463,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/renderer/ModelRenderer.java",
"chars": 21426,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/renderer/RenderPipeline.java",
"chars": 21093,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/renderer/RenderSource.java",
"chars": 13809,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/data/renderer/RendererGroup.java",
"chars": 4783,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/entity/BaseEntity.java",
"chars": 4758,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/entity/BasePlayer.java",
"chars": 572,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/AnimationSignalEvent.java",
"chars": 710,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/CancellableEvent.java",
"chars": 901,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/CloseTrackerEvent.java",
"chars": 695,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/CreateDummyTrackerEvent.java",
"chars": 647,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/CreateEntityTrackerEvent.java",
"chars": 653,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/CreatePlayerSkinEvent.java",
"chars": 980,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/DismountModelEvent.java",
"chars": 2393,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelAssetsEvent.java",
"chars": 1161,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelDamageSource.java",
"chars": 2059,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelDespawnAtPlayerEvent.java",
"chars": 784,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelEvent.java",
"chars": 779,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelEventApplication.java",
"chars": 704,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelEventListener.java",
"chars": 686,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelImportedEvent.java",
"chars": 768,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/ModelSpawnAtPlayerEvent.java",
"chars": 1218,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/MountModelEvent.java",
"chars": 2383,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/PlayerHideTrackerEvent.java",
"chars": 1205,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/PlayerPerAnimationEndEvent.java",
"chars": 778,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/PlayerPerAnimationStartEvent.java",
"chars": 779,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/PlayerShowTrackerEvent.java",
"chars": 1379,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/PluginEndReloadEvent.java",
"chars": 621,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/PluginStartReloadEvent.java",
"chars": 704,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/RemovePlayerSkinEvent.java",
"chars": 968,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxCreateEvent.java",
"chars": 670,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxDamagedEvent.java",
"chars": 1351,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxDismountEvent.java",
"chars": 695,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxEvent.java",
"chars": 639,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxInteractAtEvent.java",
"chars": 1625,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxMountEvent.java",
"chars": 687,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/event/hitbox/HitBoxRemoveEvent.java",
"chars": 670,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/manager/ModelManager.java",
"chars": 4681,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/manager/PlayerManager.java",
"chars": 1359,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/manager/ProfileManager.java",
"chars": 1342,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/manager/ReloadInfo.java",
"chars": 1037,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/manager/ScriptManager.java",
"chars": 1172,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/manager/SkinManager.java",
"chars": 1414,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/mount/MountController.java",
"chars": 6990,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/mount/MountControllers.java",
"chars": 2207,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/AnimationBundler.java",
"chars": 1278,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/DisplayTransformer.java",
"chars": 1226,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/HitBox.java",
"chars": 5273,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/HitBoxListener.java",
"chars": 6766,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/Identifiable.java",
"chars": 776,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/ModAnimationBundler.java",
"chars": 629,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/ModelDisplay.java",
"chars": 5842,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/ModelInteractionHand.java",
"chars": 507,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/ModelNametag.java",
"chars": 1682,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/NMS.java",
"chars": 8498,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/NMSVersion.java",
"chars": 1657,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/PacketBundler.java",
"chars": 1647,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/PlayerChannelHandler.java",
"chars": 1734,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2024 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/nms/Profiled.java",
"chars": 1217,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackAssets.java",
"chars": 3241,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackBuilder.java",
"chars": 3205,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackBuiltInAssets.java",
"chars": 3897,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackByte.java",
"chars": 1059,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackMeta.java",
"chars": 10983,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackNamespace.java",
"chars": 1553,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackObfuscator.java",
"chars": 3533,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackOverlay.java",
"chars": 2782,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackPath.java",
"chars": 1540,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackResource.java",
"chars": 2732,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackResult.java",
"chars": 5370,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/pack/PackZipper.java",
"chars": 4514,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformAdapter.java",
"chars": 2079,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformBillboard.java",
"chars": 681,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformEntity.java",
"chars": 2120,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformItemStack.java",
"chars": 1499,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformItemTransform.java",
"chars": 1320,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformLivingEntity.java",
"chars": 721,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformLocation.java",
"chars": 2435,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformNamespace.java",
"chars": 515,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformOfflinePlayer.java",
"chars": 922,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformPlayer.java",
"chars": 745,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformRegionHolder.java",
"chars": 1282,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/platform/PlatformWorld.java",
"chars": 544,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2026 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/player/PlayerLimb.java",
"chars": 3428,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/player/PlayerSkinParts.java",
"chars": 2476,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/profile/ModelProfile.java",
"chars": 3722,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/profile/ModelProfileInfo.java",
"chars": 648,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
},
{
"path": "api/src/main/java/kr/toxicity/model/api/profile/ModelProfileSkin.java",
"chars": 692,
"preview": "/*\n * This source file is part of BetterModel.\n * Copyright (c) 2025 toxicity188\n * Licensed under the MIT License.\n * S"
}
]
// ... and 408 more files (download for full content)
About this extraction
This page contains the full source code of the toxicity188/BetterModel GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 608 files (2.7 MB), approximately 743.9k tokens, and a symbol index with 2077 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.