Skip to content

Commit ec4502b

Browse files
committed
More Kotlinifying
1 parent b628974 commit ec4502b

29 files changed

Lines changed: 771 additions & 297 deletions

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@
4545
- Ignore Mining Fatigue Speed
4646
- Legacy Loading Progress Bar
4747
- Option to re-enable the loading screen progress bar when the "Legacy Loading Screen" setting is enabled.
48+
- Blood Particles (Orange Marshall)
49+
- The classic blood particles when hitting a entity from Orange Marshalls 1.8 mod "Vanilla Enhancements"
50+
- Accompanied by a multiplier setting to adjust the amount of particles to show (5 * multiplier)
51+
- (Min: 0, Max: 40, Step: 1)
52+
- If Orange Marshall sees this and doesn't want me to include this feature in the mod,
53+
I will gladly remove it upon request/contact.
4854

4955
## Removed
5056

src/main/java/org/visuals/legacy/animatium/AnimatiumFabricClient.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.visuals.legacy.animatium.command.AnimatiumCommand;
4040
import org.visuals.legacy.animatium.packet.InfoPayloadPacket;
4141
import org.visuals.legacy.animatium.packet.SetServerFeaturesPayloadPacket;
42+
import org.visuals.legacy.animatium.particle.AnimatiumParticlesKt;
4243
import org.visuals.legacy.animatium.util.AnimatiumKeybinds;
4344

4445
import java.util.List;
@@ -58,6 +59,7 @@ public void onInitializeClient() {
5859
ModelLoadingPlugin.register(context -> context.addModel(AnimatiumConstants.FAST_GRASS_MODEL_KEY, SimpleUnbakedExtraModel.blockStateModel(AnimatiumConstants.FAST_GRASS_MODEL_LOCATION)));
5960
ClientCommandRegistrationCallback.EVENT.register((dispatcher, context) -> dispatcher.register(AnimatiumCommand.create()));
6061
AnimatiumKeybinds.register();
62+
AnimatiumParticlesKt.bootstrap();
6163
this.registerPayloads();
6264
}
6365

src/main/java/org/visuals/legacy/animatium/config/category/Category.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@
2929
import dev.isxander.yacl3.api.Option;
3030
import dev.isxander.yacl3.api.OptionDescription;
3131
import dev.isxander.yacl3.api.StateManager;
32-
import dev.isxander.yacl3.api.controller.ControllerBuilder;
33-
import dev.isxander.yacl3.api.controller.EnumControllerBuilder;
34-
import dev.isxander.yacl3.api.controller.FloatSliderControllerBuilder;
35-
import dev.isxander.yacl3.api.controller.TickBoxControllerBuilder;
32+
import dev.isxander.yacl3.api.controller.*;
3633
import net.minecraft.network.chat.Component;
3734
import org.visuals.legacy.animatium.AnimatiumConstants;
3835
import org.visuals.legacy.animatium.util.config.EntryBundle;
@@ -44,6 +41,7 @@
4441
public abstract class Category {
4542
public enum OptionType {
4643
BOOLEAN(false),
44+
INT(true),
4745
FLOAT(true),
4846
ENUM(false);
4947

@@ -113,8 +111,18 @@ public OptionBuilder<T> instant() {
113111
public <CategoryLike extends Category, K> Option<K> build(final CategoryLike defaults, final CategoryLike current) {
114112
final Function<Option<K>, ControllerBuilder<K>> controllerBuilder = switch (this.type) {
115113
case BOOLEAN -> (opt) ->
116-
(ControllerBuilder<K>) TickBoxControllerBuilder
117-
.create((Option<Boolean>) opt);
114+
(ControllerBuilder<K>) TickBoxControllerBuilder.create((Option<Boolean>) opt);
115+
116+
case INT -> (opt) -> {
117+
if (this.slider) {
118+
return (ControllerBuilder<K>) IntegerSliderControllerBuilder
119+
.create((Option<Integer>) opt)
120+
.range((int) this.min, (int) this.max)
121+
.step((int) this.step);
122+
} else {
123+
throw new RuntimeException("TODO: Int non-slider");
124+
}
125+
};
118126

119127
case FLOAT -> (opt) -> {
120128
if (this.slider) {

src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@
2727

2828
import dev.isxander.yacl3.api.ConfigCategory;
2929
import net.minecraft.client.Minecraft;
30-
import net.minecraft.client.renderer.texture.OverlayTexture;
3130
import net.minecraft.network.chat.Component;
32-
import org.visuals.legacy.animatium.mixins.accessor.GameRendererAccessor;
3331
import org.visuals.legacy.animatium.util.compatibility.Mods;
3432
import org.visuals.legacy.animatium.util.config.EntryBundle;
3533
import org.visuals.legacy.animatium.util.enums.ServerFeature;
@@ -59,6 +57,8 @@ public final class ExtrasConfigCategory extends Category {
5957
public boolean alwaysBlockingHeadCap = false;
6058
public boolean hideRecipeBook = false;
6159
public boolean legacyLoadingScreenProgressBar = false;
60+
public boolean damageBloodParticles = false;
61+
public int bloodParticleMultiplier = 1;
6262
// Damage Tint
6363
public boolean damageTintItems = false;
6464
public boolean damageTintCape = false;
@@ -90,33 +90,34 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E
9090
@Override
9191
public EntryBundle bundle() {
9292
final EntryBundle bundle = new EntryBundle(this, "extras");
93-
94-
bundle.booleanEntry("minimalViewBobbing");
95-
bundle.booleanEntry("showNameTagInThirdPerson");
96-
bundle.booleanEntry("hideNameTagBackground");
97-
bundle.booleanEntry("nameTagTextShadow");
98-
bundle.booleanEntry("debugHudTextColor");
99-
bundle.booleanEntry("offhandUsageSwinging");
100-
bundle.booleanEntry("alwaysUsageSwing");
101-
bundle.booleanEntry("alwaysSharpParticles");
93+
bundle.booleanEntry("minimalViewBobbing")
94+
.booleanEntry("showNameTagInThirdPerson")
95+
.booleanEntry("hideNameTagBackground")
96+
.booleanEntry("nameTagTextShadow")
97+
.booleanEntry("debugHudTextColor")
98+
.booleanEntry("offhandUsageSwinging")
99+
.booleanEntry("alwaysUsageSwing")
100+
.booleanEntry("alwaysSharpParticles");
102101
if (!Mods.HAS_SODIUM_EXTRAS) {
103102
bundle.booleanEntry("disableRecipeAndTutorialToasts");
104103
}
105104

106105
final Minecraft minecraft = Minecraft.getInstance();
107-
bundle.booleanEntry("showArmWhileInvisible");
108-
bundle.booleanEntry("fakeMissPenaltySwing");
109-
bundle.booleanEntry("dontMoveBlueVoid");
110-
bundle.booleanEntry("disableEntityDeathTopple");
111-
bundle.booleanEntry("disableParticlePhysics");
112-
bundle.booleanEntry("disableFirstPersonParticles");
113-
bundle.booleanEntry("dontClearChat");
114-
bundle.booleanEntry("dontCloseChat");
115-
bundle.booleanEntry("oldWaterColorEffects", (option, event) -> minecraft.levelExtractor.allChanged());
116-
bundle.booleanEntry("colorBoost");
117-
bundle.booleanEntry("alwaysBlockingHeadCap");
118-
bundle.booleanEntry("hideRecipeBook");
119-
bundle.booleanEntry("legacyLoadingScreenProgressBar");
106+
bundle.booleanEntry("showArmWhileInvisible")
107+
.booleanEntry("fakeMissPenaltySwing")
108+
.booleanEntry("dontMoveBlueVoid")
109+
.booleanEntry("disableEntityDeathTopple")
110+
.booleanEntry("disableParticlePhysics")
111+
.booleanEntry("disableFirstPersonParticles")
112+
.booleanEntry("dontClearChat")
113+
.booleanEntry("dontCloseChat")
114+
.booleanEntry("oldWaterColorEffects", (option, event) -> minecraft.levelExtractor.allChanged())
115+
.booleanEntry("colorBoost")
116+
.booleanEntry("alwaysBlockingHeadCap")
117+
.booleanEntry("hideRecipeBook")
118+
.booleanEntry("legacyLoadingScreenProgressBar")
119+
.booleanEntry("damageBloodParticles")
120+
.intRange("bloodParticleMultiplier", 1, 40);
120121

121122
// Damage Tint
122123
bundle.group((EntryBundle.Group) new EntryBundle.Group("damage_tint")
@@ -125,9 +126,9 @@ public EntryBundle bundle() {
125126

126127
bundle.group((EntryBundle.Group) new EntryBundle.Group("item_swing")
127128
.booleanEntry("customSwingSpeed")
128-
.floatEntry("itemSwingSpeed", -2.0F, 1.0F, 0.1F)
129-
.floatEntry("hasteSwingSpeed", -2.0F, 1.0F, 0.1F)
130-
.floatEntry("miningFatigueSwingSpeed", -2.0F, 1.0F, 0.1F)
129+
.floatRange("itemSwingSpeed", -2.0F, 1.0F, 0.1F)
130+
.floatRange("hasteSwingSpeed", -2.0F, 1.0F, 0.1F)
131+
.floatRange("miningFatigueSwingSpeed", -2.0F, 1.0F, 0.1F)
131132
.booleanEntry("ignoreHasteSpeed")
132133
.booleanEntry("ignoreMiningFatigueSpeed"));
133134

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Animatium
3+
* The all-you-could-want legacy animations mod for modern minecraft versions.
4+
* Brings back animations from the 1.7/1.8 era and more.
5+
* <p>
6+
* Copyright (C) 2024-2025 lowercasebtw
7+
* Copyright (C) 2024-2025 mixces
8+
* Copyright (C) 2024-2025 Contributors to the project retain their copyright
9+
* <p>
10+
* This program is free software: you can redistribute it and/or modify
11+
* it under the terms of the GNU General Public License as published by
12+
* the Free Software Foundation, either version 3 of the License, or
13+
* (at your option) any later version.
14+
* <p>
15+
* This program is distributed in the hope that it will be useful,
16+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18+
* GNU General Public License for more details.
19+
* <p>
20+
* You should have received a copy of the GNU General Public License
21+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22+
* <p>
23+
* "MINECRAFT" LINKING EXCEPTION TO THE GPL
24+
*/
25+
26+
package org.visuals.legacy.animatium.mixins.v1.entity.particles;
27+
28+
import net.minecraft.client.Minecraft;
29+
import net.minecraft.world.phys.EntityHitResult;
30+
import net.minecraft.world.phys.HitResult;
31+
import org.jspecify.annotations.Nullable;
32+
import org.spongepowered.asm.mixin.Mixin;
33+
import org.spongepowered.asm.mixin.Shadow;
34+
import org.spongepowered.asm.mixin.injection.At;
35+
import org.spongepowered.asm.mixin.injection.Inject;
36+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
37+
import org.visuals.legacy.animatium.Animatium;
38+
import org.visuals.legacy.animatium.config.AnimatiumConfig;
39+
import org.visuals.legacy.animatium.particle.BloodParticle;
40+
41+
import java.util.Objects;
42+
43+
@Mixin(Minecraft.class)
44+
public abstract class MixinMinecraft_BloodParticles {
45+
@Shadow
46+
@Nullable
47+
public HitResult hitResult;
48+
49+
@Inject(method = "startAttack", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;attack(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/entity/Entity;)V", shift = At.Shift.AFTER))
50+
private void animatium$bloodParticles(final CallbackInfoReturnable<Boolean> cir) {
51+
if (Animatium.isEnabled() && AnimatiumConfig.instance().extras.damageBloodParticles && BloodParticle.canSpawn()) {
52+
BloodParticle.spawn(Objects.requireNonNull(((EntityHitResult) this.hitResult)).getEntity());
53+
}
54+
}
55+
}

src/main/java/org/visuals/legacy/animatium/mixins/v1/gui/old_inventory_rendering/MixinGuiGraphics_ToolTipItemBar.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4040
import org.visuals.legacy.animatium.Animatium;
4141
import org.visuals.legacy.animatium.config.AnimatiumConfig;
42-
import org.visuals.legacy.animatium.util.ItemUtils;
42+
import org.visuals.legacy.animatium.util.ItemUtilKt;
4343
import org.visuals.legacy.animatium.util.rendering.RenderUtils;
4444

4545
@Mixin(GuiGraphicsExtractor.class)
@@ -67,7 +67,7 @@ public abstract class MixinGuiGraphics_ToolTipItemBar {
6767
@Inject(method = "itemBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphicsExtractor;fill(Lcom/mojang/blaze3d/pipeline/RenderPipeline;IIIII)V", ordinal = 0, shift = At.Shift.AFTER))
6868
private void animatium$oldDurabilityBar(final ItemStack itemStack, final int x, final int y, final CallbackInfo ci, @Local(name = "left") final int left, final @Local(name = "top") int top) {
6969
if (Animatium.isEnabled() && AnimatiumConfig.instance().items.durabilityBarColors && !(itemStack.getItem() instanceof BundleItem)) {
70-
final int color = ARGB.opaque(ARGB.color((255 - ItemUtils.getLegacyDurabilityColorValue(itemStack)) / 4, 64, 0));
70+
final int color = ARGB.opaque(ARGB.color((255 - ItemUtilKt.getLegacyDurabilityColorValue(itemStack)) / 4, 64, 0));
7171
RenderUtils.fillRectangle((GuiGraphicsExtractor) (Object) this, left, top, 12, 1, color);
7272
}
7373
}

src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandLayer_ThirdPersonItemPositions.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,38 +47,38 @@
4747
import org.visuals.legacy.animatium.Animatium;
4848
import org.visuals.legacy.animatium.config.AnimatiumConfig;
4949
import org.visuals.legacy.animatium.util.EntityUtilKt;
50-
import org.visuals.legacy.animatium.util.ItemUtils;
50+
import org.visuals.legacy.animatium.util.ItemUtilKt;
5151
import org.visuals.legacy.animatium.util.enums.FishingRodVersionSetting;
5252

5353
@Mixin(ItemInHandLayer.class)
5454
public abstract class MixinItemInHandLayer_ThirdPersonItemPositions<S extends ArmedEntityRenderState> {
5555
@ModifyArgs(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V"))
5656
private void animatium$oldTransformTranslation(final Args args, @Local(argsOnly = true, name = "state") final S state, @Local(argsOnly = true, name = "arm") final HumanoidArm arm) {
5757
final ItemStack stack = state.animatium$getItemHeldByArm(arm);
58-
if (Animatium.isEnabled() && ItemUtils.shouldApplyItemPositionsInThirdPerson(state) && !ItemUtils.isItemBlacklisted(stack)) {
58+
if (Animatium.isEnabled() && ItemUtilKt.shouldApplyItemPositionsInThirdPerson(state) && !ItemUtilKt.isItemBlacklisted(stack)) {
5959
args.setAll((float) args.get(0) * -1.0F, 0.4375F, (float) args.get(2) / 10 * -1.0F);
6060
}
6161
}
6262

6363
@WrapWithCondition(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionfc;)V"))
6464
private boolean animatium$removeTransformMultiply(final PoseStack instance, final Quaternionfc by, @Local(argsOnly = true, name = "state") final S state, @Local(argsOnly = true, name = "arm") final HumanoidArm arm) {
6565
final ItemStack stack = state.animatium$getItemHeldByArm(arm);
66-
return !Animatium.isEnabled() || !ItemUtils.shouldApplyItemPositionsInThirdPerson(state) || ItemUtils.isItemBlacklisted(stack);
66+
return !Animatium.isEnabled() || !ItemUtilKt.shouldApplyItemPositionsInThirdPerson(state) || ItemUtilKt.isItemBlacklisted(stack);
6767
}
6868

6969
@Inject(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/item/ItemStackRenderState;submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;III)V"))
7070
private void animatium$itemPositionsThird(final S state, final ItemStackRenderState item, final ItemStack itemStack, final HumanoidArm arm, final PoseStack poseStack, final SubmitNodeCollector submitNodeCollector, final int lightCoords, final CallbackInfo ci) {
7171
if (Animatium.isEnabled()) {
7272
final int direction = EntityUtilKt.getArmMultiplier(arm);
7373
final ItemStack stack = state.animatium$getItemHeldByArm(arm);
74-
if (!stack.isEmpty() && !ItemUtils.isItemBlacklisted(stack)) {
74+
if (!stack.isEmpty() && !ItemUtilKt.isItemBlacklisted(stack)) {
7575
final boolean isStickRod = Animatium.isEnabled() &&
7676
AnimatiumConfig.instance().items.fishingRodVersion == FishingRodVersionSetting.V1_7 &&
7777
stack.is(Items.FISHING_ROD) &&
7878
(state instanceof AvatarRenderState && state.animatium$isFishing());
79-
if (ItemUtils.shouldApplyItemPositionsInThirdPerson(state)) {
79+
if (ItemUtilKt.shouldApplyItemPositionsInThirdPerson(state)) {
8080
final boolean usesBlockLight = item.usesBlockLight();
81-
if (ItemUtils.isBlock3d(stack, usesBlockLight)) {
81+
if (ItemUtilKt.isBlock3d(stack, usesBlockLight)) {
8282
final float scale = 0.375F;
8383
poseStack.translate(0.0F, 0.1875F, -0.3125F);
8484
poseStack.mulPose(Axis.XP.rotationDegrees(20.0F));
@@ -94,9 +94,9 @@ public abstract class MixinItemInHandLayer_ThirdPersonItemPositions<S extends Ar
9494
poseStack.mulPose(Axis.XP.rotationDegrees(100.0F));
9595
poseStack.mulPose(Axis.YP.rotationDegrees(direction * -145.0F));
9696
poseStack.translate(-0.011765625F, 0.0F, 0.002125F);
97-
} else if (ItemUtils.isHandheldItem(stack)) {
97+
} else if (ItemUtilKt.isHandheldItem(stack)) {
9898
final float scale = 0.625F;
99-
if (ItemUtils.isFishingRodItem(stack) && !isStickRod) {
99+
if (ItemUtilKt.isFishingRodItem(stack) && !isStickRod) {
100100
poseStack.mulPose(Axis.ZP.rotationDegrees(direction * 180.0F));
101101
poseStack.translate(0.0F, -0.125F, 0.0F);
102102
}
@@ -123,7 +123,7 @@ public abstract class MixinItemInHandLayer_ThirdPersonItemPositions<S extends Ar
123123
poseStack.mulPose(Axis.ZP.rotationDegrees(direction * 20.0F));
124124
}
125125

126-
if (!ItemUtils.isBlock3d(stack, usesBlockLight)) {
126+
if (!ItemUtilKt.isBlock3d(stack, usesBlockLight)) {
127127
poseStack.translate(0.0F, -0.3F, 0.0F);
128128
poseStack.scale(1.5F, 1.5F, 1.5F);
129129
poseStack.mulPose(Axis.YP.rotationDegrees(direction * 50.0F));
@@ -134,7 +134,7 @@ public abstract class MixinItemInHandLayer_ThirdPersonItemPositions<S extends Ar
134134
poseStack.translate(direction * -0.5F, 0.5F, 0.03125F);
135135
}
136136

137-
if (ItemUtils.isBlock3d(stack, usesBlockLight)) {
137+
if (ItemUtilKt.isBlock3d(stack, usesBlockLight)) {
138138
poseStack.scale(1 / 0.375F, 1 / 0.375F, 1 / 0.375F);
139139
poseStack.mulPose(Axis.YP.rotationDegrees(direction * -45.0F));
140140
poseStack.mulPose(Axis.XP.rotationDegrees(-75.0F));
@@ -145,8 +145,8 @@ public abstract class MixinItemInHandLayer_ThirdPersonItemPositions<S extends Ar
145145
poseStack.mulPose(Axis.YP.rotationDegrees(direction * -260.0F));
146146
poseStack.mulPose(Axis.XP.rotationDegrees(80.0F));
147147
poseStack.translate(direction * 0.0625F, 2.0F * 0.0625F, -2.5F * 0.0625F);
148-
} else if (ItemUtils.isHandheldItem(stack)) {
149-
final boolean isRod = ItemUtils.isFishingRodItem(stack) && !isStickRod;
148+
} else if (ItemUtilKt.isHandheldItem(stack)) {
149+
final boolean isRod = ItemUtilKt.isFishingRodItem(stack) && !isStickRod;
150150
poseStack.scale(1 / 0.85F, 1 / 0.85F, 1 / 0.85F);
151151
poseStack.mulPose(Axis.ZP.rotationDegrees(direction * -55.0F));
152152
poseStack.mulPose(Axis.YP.rotationDegrees(direction * 90.0F));

0 commit comments

Comments
 (0)