Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refine useAnimations feature #207

Merged
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,9 @@ public class BedrockifySettings {
public boolean bedrockRecipes = true;
public boolean dyingTrees = true;
public boolean fireAspectLight = true;
public boolean pickupAnimations = true;
public boolean fernBonemeal = true;
public boolean fallenTrees = true;

public boolean isPickupAnimationsEnabled() {
return pickupAnimations;
}

public boolean isBedrockRecipesEnabled() {
return bedrockRecipes;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ public class BedrockifyClientSettings {
public boolean bedrockShading = true;
public boolean disableFlyingMomentum = true;
public boolean elytraStop = true;
public boolean pickupAnimations = true;

public boolean isPickupAnimationsEnabled() {
return pickupAnimations;
}


public List<String> panoramaIgnoredScreens = PANORAMA_IGNORED_SCREENS;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package me.juancarloscp52.bedrockify.client.features.useAnimations;

import me.juancarloscp52.bedrockify.client.BedrockifyClient;
import net.minecraft.item.ItemStack;

public final class AnimationsHelper {
public static final int ANIMATION_TIME = 5;

/**
* Bobbing!
*
* @param target the ItemStack
*/
public static void doBobbingAnimation(ItemStack target) {
if (!BedrockifyClient.getInstance().settings.isPickupAnimationsEnabled()) {
return;
}
if (target.isEmpty()) {
return;
}

target.setBobbingAnimationTime(AnimationsHelper.ANIMATION_TIME);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public Screen getConfigScreen(Screen parent, boolean isTransparent){
guiImprovements.add(entryBuilder.startAlphaColorField(Text.translatable("bedrockify.options.inventoryHighlight.color2"), settingsClient.highLightColor2).setDefaultValue(64 + (170 << 8) + (109 << 16) + (255 << 24)).setSaveConsumer(newValue -> settingsClient.highLightColor2=newValue).build());
guiImprovements.add(entryBuilder.startSelector(Text.translatable("bedrockify.options.idleAnimation"), new Float []{0.0f,0.5f,1.0f,1.5f,2.0f,2.5f,3.0f,4.0f}, settingsClient.idleAnimation).setDefaultValue(1.0f).setNameProvider((value)-> Text.literal("x"+ value)).setSaveConsumer((newValue)-> settingsClient.idleAnimation=newValue).build());
guiImprovements.add(entryBuilder.startBooleanToggle(Text.translatable("bedrockify.options.eatingAnimations"), settingsClient.eatingAnimations).setDefaultValue(true).setSaveConsumer(newValue -> settingsClient.eatingAnimations=newValue).build());
guiImprovements.add(entryBuilder.startBooleanToggle(Text.translatable("bedrockify.options.pickupAnimations"), settingsCommon.pickupAnimations).setTooltip(wrapLines(Text.translatable("bedrockify.options.pickupAnimations.tooltip"))).setDefaultValue(true).setSaveConsumer(newValue -> settingsCommon.pickupAnimations=newValue).build());
guiImprovements.add(entryBuilder.startBooleanToggle(Text.translatable("bedrockify.options.pickupAnimations"), settingsClient.pickupAnimations).setTooltip(wrapLines(Text.translatable("bedrockify.options.pickupAnimations.tooltip"))).setDefaultValue(true).setSaveConsumer(newValue -> settingsClient.pickupAnimations=newValue).build());
guiImprovements.add(entryBuilder.startBooleanToggle(Text.translatable("bedrockify.options.loadingScreen"), settingsClient.loadingScreen).setDefaultValue(true).setSaveConsumer(newValue -> settingsClient.loadingScreen=newValue).build());
guiImprovements.add(entryBuilder.startBooleanToggle(Text.translatable("bedrockify.options.bedrockShading"), settingsClient.bedrockShading).setDefaultValue(true).setSaveConsumer(newValue -> {
settingsClient.bedrockShading=newValue;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package me.juancarloscp52.bedrockify.mixin.client.features.pickupAnimations;

import me.juancarloscp52.bedrockify.Bedrockify;
import me.juancarloscp52.bedrockify.client.BedrockifyClient;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.DrawableHelper;
Expand All @@ -27,7 +27,7 @@ private void captureItemStack(int x, int y, float tickDelta, PlayerEntity player
}
@Redirect(method = "renderHotbarItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;scale(FFF)V"))
private void applyAnimation(MatrixStack matrixStack, float x, float y, float z){
if(!Bedrockify.getInstance().settings.isPickupAnimationsEnabled()){
if(!BedrockifyClient.getInstance().settings.isPickupAnimationsEnabled()){
matrixStack.scale(x,y,z);
return;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package me.juancarloscp52.bedrockify.mixin.client.features.useAnimations;

import me.juancarloscp52.bedrockify.client.features.useAnimations.AnimationsHelper;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
import net.minecraft.screen.PlayerScreenHandler;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Environment(EnvType.CLIENT)
@Mixin(ClientPlayNetworkHandler.class)
public abstract class ClientPlayNetworkHandlerMixin {
@Shadow
private @Final MinecraftClient client;

/**
* Animate always by receiving S2C packet.<br>
* Original method prevents the bobbing animation when decrementing and damaging.
*
* @see ClientPlayNetworkHandler#onScreenHandlerSlotUpdate
*/
@Inject(method = "onScreenHandlerSlotUpdate", at = @At("RETURN"))
private void bedrockify$animateAlways(ScreenHandlerSlotUpdateS2CPacket packet, CallbackInfo ci) {
final ItemStack itemStack = packet.getItemStack();
final int slotIdx = packet.getSlot();
if (packet.getSyncId() != 0 && !PlayerScreenHandler.isInHotbar(slotIdx) || itemStack == null) {
return;
}

AnimationsHelper.doBobbingAnimation(itemStack);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package me.juancarloscp52.bedrockify.mixin.client.features.useAnimations;

import com.mojang.authlib.GameProfile;
import me.juancarloscp52.bedrockify.client.features.useAnimations.AnimationsHelper;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Environment(EnvType.CLIENT)
@Mixin(ClientPlayerEntity.class)
public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity {
public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) {
super(world, profile);
}

/**
* Drop animation for Hotbar item.
*/
@Inject(method = "dropSelectedItem", at = @At("HEAD"))
private void bedrockify$animateHotbarItemDrop(boolean entireStack, CallbackInfoReturnable<Boolean> cir) {
if (entireStack) {
return;
}

AnimationsHelper.doBobbingAnimation(this.getMainHandStack());
}

/**
* Handles the status message.
*
* @see net.minecraft.entity.LivingEntity#damage
* @see net.minecraft.world.World#sendEntityStatus
* @see net.minecraft.entity.LivingEntity#handleStatus
*/
@Override
public void handleStatus(byte status) {
final ItemStack itemStack = this.getStackInHand(this.getActiveHand());
if (status == 29 && itemStack.isOf(Items.SHIELD)) {
// Blocked by shield
AnimationsHelper.doBobbingAnimation(itemStack);
}
super.handleStatus(status);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package me.juancarloscp52.bedrockify.mixin.client.features.useAnimations;

import me.juancarloscp52.bedrockify.client.features.useAnimations.AnimationsHelper;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.*;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Environment(EnvType.CLIENT)
@Mixin(ClientPlayerInteractionManager.class)
public abstract class ClientPlayerInteractionManagerMixin {
@Shadow
private @Final MinecraftClient client;

/**
* Attack the entity, animate only damageable item.<br>
* When no damage may prevent Bobbing animation. e.g.) Unbreaking Enchantment
*/
@Inject(method = "attackEntity", at = @At("RETURN"))
private void bedrockify$useWeaponBreakable(PlayerEntity player, Entity target, CallbackInfo ci) {
if (player == null) {
return;
}

if (!(target instanceof LivingEntity)) {
return;
}

final ItemStack itemStack = player.getMainHandStack();
if (itemStack.getItem() instanceof ToolItem) {
AnimationsHelper.doBobbingAnimation(itemStack);
}
}

/**
* Break the block and animate.
*/
@Inject(method = "breakBlock", at = @At("RETURN"))
private void bedrockify$useToolBreakable(BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
final PlayerEntity player = this.client.player;
if (!cir.getReturnValue() || player == null) {
return;
}

final ItemStack itemStack = player.getMainHandStack();
final Item item = itemStack.getItem();
if (item instanceof ToolItem || item == Items.SHEARS) {
AnimationsHelper.doBobbingAnimation(itemStack);
}
}

/**
* Placing a block, Using an item to block.
*/
@Redirect(method = "interactBlockInternal", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;useOnBlock(Lnet/minecraft/item/ItemUsageContext;)Lnet/minecraft/util/ActionResult;"))
private ActionResult bedrockify$useItemToBlock(ItemStack instance, ItemUsageContext context) {
final ActionResult actionResult = instance.useOnBlock(context);
if (actionResult.isAccepted() && context.getPlayer() != null && !context.getStack().isStackable()) {
AnimationsHelper.doBobbingAnimation(context.getPlayer().getStackInHand(context.getHand()));
}
return actionResult;
}

/**
* Do animate of consuming item.
*/
@Inject(method = "interactItem", at = @At("RETURN"))
private void bedrockify$consumeItem(PlayerEntity player, Hand hand, CallbackInfoReturnable<ActionResult> cir) {
if (player == null) {
return;
}

final ItemStack itemStack = player.getStackInHand(hand);
final ActionResult actionResult = cir.getReturnValue();
final boolean bNotSwingHandAnim = actionResult.isAccepted() && (itemStack.isOf(Items.GOAT_HORN) || itemStack.isOf(Items.ENDER_PEARL));
if (actionResult.shouldSwingHand() || bNotSwingHandAnim) {
AnimationsHelper.doBobbingAnimation(player.getStackInHand(hand));
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class MixinFeatureManager {
features.put("client.features.biggerDraggingItem",true);
//features.put("client.features.sneakingShield", true);
features.put("common.features.recipes", true);
features.put("common.features.useAnimations", true);
features.put("client.features.useAnimations", true);
//features.put("common.features.worldGeneration", true);
features.put("client.features.bedrockShading", true);
features.put("common.features.fireAspect", true);
Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/bedrockify.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
"client.features.screenSafeArea.InGameHudMixin",
"client.features.screenSafeArea.SubtitlesHudMixin",
"client.features.slotHighlight.HandledScreenMixin",
"client.features.useAnimations.ClientPlayerEntityMixin",
"client.features.useAnimations.ClientPlayerInteractionManagerMixin",
"client.features.useAnimations.ClientPlayNetworkHandlerMixin",
"client.features.worldColorNoise.BiomeColorsMixin"
],
"mixins": [
Expand All @@ -51,7 +54,6 @@
"common.features.recipes.FireworkStarRecipeMixin",
"common.features.recipes.RecipeManagerMixin",
"common.features.recipes.ShulkerBoxColoringRecipeMixin",
"common.features.useAnimations.ItemStackMixin",
"common.features.worldGeneration.TreeConfiguredFeaturesInvoker"
],
"injectors": {
Expand Down