diff --git a/build.gradle b/build.gradle index 9093e8c..e440104 100644 --- a/build.gradle +++ b/build.gradle @@ -64,8 +64,6 @@ dependencies { // mod compats modCompileOnly("maven.modrinth:illager-invasion:${project.illager_invasion_version}") - modCompileOnly("maven.modrinth:puzzles-lib:${project.puzzles_lib_version}") - modCompileOnly("maven.modrinth:forge-config-api-port:${project.forge_config_api_port_version}") modCompileOnly("maven.modrinth:friends-and-foes:${project.friends_and_foes_version}") } diff --git a/gradle.properties b/gradle.properties index 8d9148c..58ff452 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,4 @@ archives_base_name=bettertrims fabric_version=0.86.0+1.20.1 mixin_extras_version=0.2.0-beta.9 illager_invasion_version=v8.0.0-1.20.1-Fabric -puzzles_lib_version=v8.0.15-1.20.1-Fabric -forge_config_api_port_version=v8.0.0-1.20.1-Fabric friends_and_foes_version=fabric-mc1.20.1-1.9.3 \ No newline at end of file diff --git a/src/client/java/com/bawnorton/bettertrims/mixin/client/BackgroundRendererMixin.java b/src/client/java/com/bawnorton/bettertrims/mixin/client/BackgroundRendererMixin.java new file mode 100644 index 0000000..7e46406 --- /dev/null +++ b/src/client/java/com/bawnorton/bettertrims/mixin/client/BackgroundRendererMixin.java @@ -0,0 +1,29 @@ +package com.bawnorton.bettertrims.mixin.client; + +import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.effect.ArmorTrimEffects; +import com.bawnorton.bettertrims.extend.EntityExtender; +import com.bawnorton.bettertrims.util.NumberWrapper; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.render.BackgroundRenderer; +import net.minecraft.entity.Entity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; +import org.spongepowered.asm.mixin.injection.Slice; + +@Mixin(BackgroundRenderer.class) +public abstract class BackgroundRendererMixin { + @ModifyConstant(method = "render", constant = @Constant(floatValue = 0.0F, ordinal = 0), slice = + @Slice( + from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F") + )) + private static float modifyLight(float original, @Local Entity entity) { + NumberWrapper increase = NumberWrapper.of(0f); + if(entity instanceof EntityExtender extender && extender.betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(extender.betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.improveVision)); + } + return original + increase.getFloat(); + } +} diff --git a/src/client/java/com/bawnorton/bettertrims/mixin/client/LightmapTextureManagerMixin.java b/src/client/java/com/bawnorton/bettertrims/mixin/client/LightmapTextureManagerMixin.java new file mode 100644 index 0000000..83badb8 --- /dev/null +++ b/src/client/java/com/bawnorton/bettertrims/mixin/client/LightmapTextureManagerMixin.java @@ -0,0 +1,29 @@ +package com.bawnorton.bettertrims.mixin.client; + +import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.effect.ArmorTrimEffects; +import com.bawnorton.bettertrims.extend.EntityExtender; +import com.bawnorton.bettertrims.util.NumberWrapper; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.LightmapTextureManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.*; + +@Mixin(LightmapTextureManager.class) +public abstract class LightmapTextureManagerMixin { + @Shadow @Final private MinecraftClient client; + + @ModifyConstant(method = "update", constant = @Constant(floatValue = 0.0F, ordinal = 1), slice = + @Slice( + from = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/GameRenderer;getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F") + )) + private float modifyLight(float original) { + NumberWrapper increase = NumberWrapper.of(0f); + if(client.player instanceof EntityExtender extender && extender.betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(extender.betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.improveVision)); + } + return original + increase.getFloat(); + } +} diff --git a/src/client/resources/bettertrims.client.mixins.json b/src/client/resources/bettertrims.client.mixins.json index e9f3080..4bfc0f3 100644 --- a/src/client/resources/bettertrims.client.mixins.json +++ b/src/client/resources/bettertrims.client.mixins.json @@ -3,6 +3,8 @@ "package": "com.bawnorton.bettertrims.mixin.client", "compatibilityLevel": "JAVA_17", "client": [ + "BackgroundRendererMixin", + "LightmapTextureManagerMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/java/com/bawnorton/bettertrims/config/Config.java b/src/main/java/com/bawnorton/bettertrims/config/Config.java index 70d6aa5..f807b67 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/Config.java +++ b/src/main/java/com/bawnorton/bettertrims/config/Config.java @@ -35,6 +35,9 @@ public class Config { @Expose @SerializedName("amethyst_potion_duration_modify_chance") public Float amethystEffectChance; + @Expose + @SerializedName("silver_night_bonus") + public SilverBonus silverNightBonus; private Config() { } @@ -61,6 +64,40 @@ public String toString() { ", diamondDamageReduction=" + diamondDamageReduction + ", lapisEnchantability=" + lapisEnchantability + ", amethystEffectChance=" + amethystEffectChance + + ", silverNightBonus=" + silverNightBonus + '}'; } + + public static class SilverBonus { + @Expose + @SerializedName("movement_speed") + public Float movementSpeed; + @Expose + @SerializedName("jump_height") + public Float jumpHeight; + @Expose + @SerializedName("attack_damage") + public Float attackDamage; + @Expose + @SerializedName("attack_speed") + public Float attackSpeed; + @Expose + @SerializedName("damage_reduction") + public Float damageReduction; + @Expose + @SerializedName("improve_vision") + public Float improveVision; + + @Override + public String toString() { + return "SilverBonus{" + + "movementSpeed=" + movementSpeed + + ", jumpHeight=" + jumpHeight + + ", attackDamage=" + attackDamage + + ", attackSpeed=" + attackSpeed + + ", damageReduction=" + damageReduction + + ", improveVision=" + improveVision + + '}'; + } + } } diff --git a/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java b/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java index 64e9155..d1967b1 100644 --- a/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java +++ b/src/main/java/com/bawnorton/bettertrims/config/ConfigManager.java @@ -38,11 +38,33 @@ public static void loadConfig() { if (config.amethystEffectChance == null || config.amethystEffectChance < 0) config.amethystEffectChance = 0.0625f; + validateSilverBonus(config); + Config.update(config); save(); BetterTrims.LOGGER.info("Loaded config"); } + private static void validateSilverBonus(Config config) { + Config.SilverBonus silverBonus = config.silverNightBonus; + if(silverBonus == null) { + silverBonus = new Config.SilverBonus(); + config.silverNightBonus = silverBonus; + } + if (silverBonus.movementSpeed == null || silverBonus.movementSpeed < 0) + silverBonus.movementSpeed = 0.05f; + if (silverBonus.jumpHeight == null || silverBonus.jumpHeight < 0) + silverBonus.jumpHeight = 0.05f; + if (silverBonus.attackDamage == null || silverBonus.attackDamage < 0) + silverBonus.attackDamage = 0.5f; + if (silverBonus.attackSpeed == null || silverBonus.attackSpeed < 0) + silverBonus.attackSpeed = 0.3f; + if (silverBonus.damageReduction == null || silverBonus.damageReduction < 0) + silverBonus.damageReduction = 0.03f; + if (silverBonus.improveVision == null || silverBonus.improveVision < 0) + silverBonus.improveVision = 0.25f; + } + private static Config load() { Config config = Config.getInstance(); try { diff --git a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java index 7b0d49d..c855a00 100644 --- a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java +++ b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffect.java @@ -2,19 +2,18 @@ import com.bawnorton.bettertrims.compat.Compat; import com.bawnorton.bettertrims.compat.StackedTrimsCompat; +import com.bawnorton.bettertrims.util.RegexIdentifier; import net.minecraft.item.ItemStack; -import net.minecraft.item.trim.ArmorTrimMaterial; import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; -import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; import java.util.List; public class ArmorTrimEffect { - private final Identifier material; + private final RegexIdentifier material; - public ArmorTrimEffect(Identifier matieral) { + public ArmorTrimEffect(RegexIdentifier matieral) { this.material = matieral; } @@ -30,9 +29,9 @@ public boolean appliesTo(ItemStack stack) { if (Compat.isStackedTrimsLoaded()) { List materials = StackedTrimsCompat.getTrimMaterials(stack); if (materials == null) return false; - return materials.contains(material); + return material.matchesAny(materials); } - return material.equals(getTrimMaterial(stack)); + return material.matches(getTrimMaterial(stack)); } public boolean appliesTo(Iterable stacks) { diff --git a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java index 13b4de1..a0c84b5 100644 --- a/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java +++ b/src/main/java/com/bawnorton/bettertrims/effect/ArmorTrimEffects.java @@ -1,5 +1,6 @@ package com.bawnorton.bettertrims.effect; +import com.bawnorton.bettertrims.util.RegexIdentifier; import net.minecraft.item.trim.ArmorTrimMaterial; import net.minecraft.item.trim.ArmorTrimMaterials; import net.minecraft.registry.RegistryKey; @@ -19,13 +20,14 @@ public abstract class ArmorTrimEffects { public static final ArmorTrimEffect AMETHYST = of(ArmorTrimMaterials.AMETHYST); // modded materials - public static final ArmorTrimEffect PLATINUM = of(new Identifier("illagerinvasion", "platinum")); + public static final ArmorTrimEffect PLATINUM = of(new RegexIdentifier(".*", "platinum")); + public static final ArmorTrimEffect SILVER = of(new RegexIdentifier(".*", "silver")); private static ArmorTrimEffect of(RegistryKey material) { - return of(material.getValue()); + return of(new RegexIdentifier(".*", material.getValue().getPath())); } - private static ArmorTrimEffect of(Identifier material) { + private static ArmorTrimEffect of(RegexIdentifier material) { return new ArmorTrimEffect(material); } } diff --git a/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java b/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java index f9cbd12..1e951e6 100644 --- a/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java +++ b/src/main/java/com/bawnorton/bettertrims/extend/EntityExtender.java @@ -4,4 +4,5 @@ public interface EntityExtender { Iterable betterTrims$getTrimmables(); + boolean betterTrims$shouldSilverApply(); } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java index f27494e..ddd6b74 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/EntityMixin.java @@ -2,12 +2,12 @@ import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; -import com.bawnorton.bettertrims.util.IterHelper; -import com.bawnorton.bettertrims.util.Wrapper; +import com.bawnorton.bettertrims.util.NumberWrapper; import com.bawnorton.bettertrims.config.Config; import net.minecraft.entity.Entity; import net.minecraft.item.ArmorItem; import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -16,6 +16,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.ArrayList; import java.util.List; @Mixin(Entity.class) @@ -25,24 +26,35 @@ public abstract class EntityMixin implements EntityExtender { @Shadow public abstract Iterable getHandItems(); + @Shadow public abstract World getWorld(); + @Inject(method = "isFireImmune", at = @At("RETURN"), cancellable = true) private void isFireImmune(CallbackInfoReturnable cir) { - Wrapper netheriteCount = Wrapper.of(0f); - ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), stack -> netheriteCount.set(netheriteCount.get() + Config.getInstance().netheriteFireResistance)); - cir.setReturnValue(cir.getReturnValue() || netheriteCount.get() >= 0.99f); + NumberWrapper netheriteCount = NumberWrapper.of(0f); + ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), stack -> netheriteCount.increment(Config.getInstance().netheriteFireResistance)); + cir.setReturnValue(cir.getReturnValue() || netheriteCount.getFloat() >= 0.99f); } @ModifyArg(method = "setOnFireFromLava", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z")) private float modifyDamage(float original) { - Wrapper netheriteCount = Wrapper.of(0f); - ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), stack -> netheriteCount.set(netheriteCount.get() + Config.getInstance().netheriteFireResistance)); - return original * (1 - netheriteCount.get()); + NumberWrapper netheriteCount = NumberWrapper.of(0f); + ArmorTrimEffects.NETHERITE.apply(betterTrims$getTrimmables(), stack -> netheriteCount.increment(Config.getInstance().netheriteFireResistance)); + return original * (1 - netheriteCount.getFloat()); + } + + @Unique + public List betterTrims$getTrimmables() { + List equipped = new ArrayList<>(); + for(ItemStack stack: getHandItems()) equipped.add(stack); + equipped.removeIf(stack -> stack.getItem() instanceof ArmorItem); + for(ItemStack stack: getArmorItems()) equipped.add(stack); + equipped.removeIf(ItemStack::isEmpty); + return equipped; } @Unique - public Iterable betterTrims$getTrimmables() { - List handItems = IterHelper.toList(getHandItems()); - handItems.removeIf(stack -> stack.getItem() instanceof ArmorItem); - return IterHelper.combine(getArmorItems(), handItems); + public boolean betterTrims$shouldSilverApply() { + long time = getWorld().getTimeOfDay() % 24000; + return time >= 13000 && time <= 23000; } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java index d912b63..3361c91 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/LivingEntityMixin.java @@ -1,17 +1,24 @@ package com.bawnorton.bettertrims.mixin; -import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.config.Config; +import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; -import com.bawnorton.bettertrims.util.Wrapper; +import com.bawnorton.bettertrims.util.NumberWrapper; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.AttributeContainer; +import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.passive.AbstractHorseEntity; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.util.math.Vec3d; +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.ModifyArg; @@ -21,49 +28,78 @@ @SuppressWarnings("unused") @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends EntityMixin { + @Shadow public abstract AttributeContainer getAttributes(); + + @Shadow @Final private AttributeContainer attributes; + + @Shadow protected abstract float modifyAppliedDamage(DamageSource source, float amount); + + @Shadow public abstract ItemStack getEquippedStack(EquipmentSlot slot); + @ModifyArg(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;updateVelocity(FLnet/minecraft/util/math/Vec3d;)V", ordinal = 0)) private float modifySwimSpeed(float speed) { - Wrapper increase = Wrapper.of(0f); - ArmorTrimEffects.COPPER.apply(betterTrims$getTrimmables(), stack -> increase.set(increase.get() + Config.getInstance().copperSwimSpeedIncrease)); - return speed + increase.get(); + NumberWrapper increase = NumberWrapper.of(0f); + ArmorTrimEffects.COPPER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().copperSwimSpeedIncrease)); + return speed + increase.getFloat(); } - @Inject(method = "getMovementSpeed()F", at = @At("RETURN"), cancellable = true) - private void modifyMovementSpeed(CallbackInfoReturnable cir) { + @ModifyReturnValue(method = "getMovementSpeed()F", at = @At("RETURN")) + private float modifyMovementSpeed(float original) { if(((LivingEntity) (Object) this) instanceof AbstractHorseEntity horseEntity) { if(horseEntity.getControllingPassenger() instanceof PlayerEntity player) { - Wrapper increase = Wrapper.of(1f); - ArmorTrimEffects.REDSTONE.apply(((EntityExtender) player).betterTrims$getTrimmables(), stack -> increase.set(increase.get() + Config.getInstance().redstoneMovementSpeedIncrease)); - cir.setReturnValue(cir.getReturnValue() * increase.get()); + NumberWrapper increase = NumberWrapper.of(1f); + ArmorTrimEffects.REDSTONE.apply(((EntityExtender) player).betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); + if(betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(((EntityExtender) player).betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + } + return original * increase.getFloat(); } } - Wrapper increase = Wrapper.of(1f); - ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), stack -> increase.set(increase.get() + Config.getInstance().redstoneMovementSpeedIncrease)); - cir.setReturnValue(cir.getReturnValue() * increase.get()); + NumberWrapper increase = NumberWrapper.of(1f); + ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); + if(betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + } + return original * increase.getFloat(); } @ModifyExpressionValue(method = "travel", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getVelocity()Lnet/minecraft/util/math/Vec3d;", ordinal = 2), slice = @Slice( - from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isFallFlying()Z"), - to = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getWorld()Lnet/minecraft/world/World;", ordinal = 1) + from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;isFallFlying()Z") )) private Vec3d modifyFlightSpeed(Vec3d original) { - Wrapper increase = Wrapper.of(1f); - ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), stack -> increase.set(increase.get() + Config.getInstance().redstoneMovementSpeedIncrease)); - return original.multiply(increase.get(), 1, increase.get()); + NumberWrapper increase = NumberWrapper.of(1f); + ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); + if(betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + } + return original.multiply(increase.getFloat(), 1, increase.getFloat()); } @WrapOperation(method = "applyArmorToDamage", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/DamageUtil;getDamageLeft(FFF)F")) private float modifyDamage(float damage, float armor, float armorToughness, Operation original) { float orignal = original.call(damage, armor, armorToughness); - Wrapper decrease = Wrapper.of(1f); - ArmorTrimEffects.DIAMOND.apply(betterTrims$getTrimmables(), stack -> decrease.set(decrease.get() - Config.getInstance().diamondDamageReduction)); - return decrease.get() * orignal; + NumberWrapper decrease = NumberWrapper.of(1f); + ArmorTrimEffects.DIAMOND.apply(betterTrims$getTrimmables(), stack -> decrease.decrement(Config.getInstance().diamondDamageReduction)); + if(betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> decrease.decrement(Config.getInstance().silverNightBonus.damageReduction)); + } + return decrease.getFloat() * orignal; + } + + @ModifyReturnValue(method = "getJumpVelocity", at = @At("RETURN")) + private float modifyJumpHeight(float original) { + if(betterTrims$shouldSilverApply()) { + NumberWrapper increase = NumberWrapper.of(0f); + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.jumpHeight)); + return original + increase.getFloat(); + } + return original; } @SuppressWarnings("CancellableInjectionUsage") @Inject(method = "canTarget(Lnet/minecraft/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) protected void canTargetOverride(LivingEntity target, CallbackInfoReturnable cir) { - + // overriden in IllagerEntityMixin } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/PiglinBrainMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/PiglinBrainMixin.java index 8b2f705..a3b094f 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/PiglinBrainMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/PiglinBrainMixin.java @@ -2,6 +2,7 @@ import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.extend.EntityExtender; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.mob.PiglinBrain; import org.spongepowered.asm.mixin.Mixin; @@ -11,9 +12,9 @@ @Mixin(PiglinBrain.class) public abstract class PiglinBrainMixin { - @Inject(method = "wearsGoldArmor", at = @At("RETURN"), cancellable = true) - private static void wearsGoldTrim(LivingEntity entity, CallbackInfoReturnable cir) { - if (cir.getReturnValue()) return; - ArmorTrimEffects.GOLD.apply(((EntityExtender) entity).betterTrims$getTrimmables(), stack -> cir.setReturnValue(true)); + @ModifyReturnValue(method = "wearsGoldArmor", at = @At("RETURN")) + private static boolean wearsGoldTrim(boolean original, LivingEntity entity) { + if (original) return true; + return ArmorTrimEffects.GOLD.appliesTo(((EntityExtender) entity).betterTrims$getTrimmables()); } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java index 61370db..4975a85 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/PlayerEntityMixin.java @@ -2,44 +2,77 @@ import com.bawnorton.bettertrims.config.Config; import com.bawnorton.bettertrims.effect.ArmorTrimEffects; -import com.bawnorton.bettertrims.util.Wrapper; +import com.bawnorton.bettertrims.util.NumberWrapper; +import com.google.common.collect.Multimap; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.block.BlockState; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeModifier; +import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; +import org.slf4j.Logger; +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.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @SuppressWarnings("unused") @Mixin(PlayerEntity.class) public abstract class PlayerEntityMixin extends LivingEntityMixin { + @Shadow @Final private static Logger LOGGER; + @ModifyVariable(method = "addExperience", at = @At("HEAD"), argsOnly = true) private int modifyExperience(int experience) { if (experience <= 0) return experience; - Wrapper increase = Wrapper.of(1F); - ArmorTrimEffects.QUARTZ.apply(betterTrims$getTrimmables(), stack -> increase.set(increase.get() + Config.getInstance().quartzExperienceBonus)); - return (int) (experience * increase.get()); + NumberWrapper increase = NumberWrapper.of(1F); + ArmorTrimEffects.QUARTZ.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().quartzExperienceBonus)); + return (int) (experience * increase.getFloat()); } @WrapOperation(method = "getBlockBreakingSpeed", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerInventory;getBlockBreakingSpeed(Lnet/minecraft/block/BlockState;)F")) private float modifyMiningSpeed(PlayerInventory instance, BlockState block, Operation original) { - Wrapper increase = Wrapper.of(original.call(instance, block)); + NumberWrapper increase = NumberWrapper.of(original.call(instance, block)); ArmorTrimEffects.IRON.apply(betterTrims$getTrimmables(), stack -> { if(instance.getMainHandStack().isSuitableFor(block)) { - increase.set(increase.get() + Config.getInstance().ironMiningSpeedIncrease); + increase.increment(Config.getInstance().ironMiningSpeedIncrease); } }); - return increase.get(); + return increase.getFloat(); + } + + @ModifyReturnValue(method = "getMovementSpeed", at = @At("RETURN")) + private float modifyMovementSpeed(float original) { + NumberWrapper increase = NumberWrapper.of(1f); + ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().redstoneMovementSpeedIncrease)); + if (betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.movementSpeed)); + } + return original * increase.getFloat(); + } + + @ModifyArg(method = "attack", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z")) + private float modifyAttributeModifiers(float original) { + NumberWrapper increase = NumberWrapper.of(original); + if(betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.attackDamage)); + } + return increase.getFloat(); } - @Inject(method = "getMovementSpeed", at = @At("RETURN"), cancellable = true) - private void modifyMovementSpeed(CallbackInfoReturnable cir) { - Wrapper increase = Wrapper.of(1f); - ArmorTrimEffects.REDSTONE.apply(betterTrims$getTrimmables(), stack -> increase.set(increase.get() + Config.getInstance().redstoneMovementSpeedIncrease)); - cir.setReturnValue(cir.getReturnValue() * increase.get()); + @ModifyExpressionValue(method = "getAttackCooldownProgressPerTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getAttributeValue(Lnet/minecraft/entity/attribute/EntityAttribute;)D")) + private double modifyAttackCooldown(double original) { + NumberWrapper increase = NumberWrapper.of(original); + if(betterTrims$shouldSilverApply()) { + ArmorTrimEffects.SILVER.apply(betterTrims$getTrimmables(), stack -> increase.increment(Config.getInstance().silverNightBonus.attackSpeed)); + } + return increase.getFloat(); } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java index d84dfdf..7dcd673 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/StatusEffectInstanceMixin.java @@ -3,6 +3,7 @@ import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.config.Config; import com.bawnorton.bettertrims.extend.EntityExtender; +import com.bawnorton.bettertrims.util.NumberWrapper; import com.bawnorton.bettertrims.util.RandomHelper; import com.bawnorton.bettertrims.util.Wrapper; import net.minecraft.entity.LivingEntity; @@ -26,8 +27,8 @@ public abstract class StatusEffectInstanceMixin { @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/effect/StatusEffectInstance;updateDuration()I", shift = At.Shift.AFTER)) private void modifyDuration(LivingEntity entity, Runnable overwriteCallback, CallbackInfoReturnable cir) { - Wrapper chance = Wrapper.of(0f); - ArmorTrimEffects.AMETHYST.apply(((EntityExtender) entity).betterTrims$getTrimmables(), stack -> chance.set(chance.get() + Config.getInstance().amethystEffectChance)); - if (RandomHelper.nextFloat() < chance.get()) duration += type.isBeneficial() ? 1 : -1; + NumberWrapper chance = NumberWrapper.of(0f); + ArmorTrimEffects.AMETHYST.apply(((EntityExtender) entity).betterTrims$getTrimmables(), stack -> chance.increment(Config.getInstance().amethystEffectChance)); + if (RandomHelper.nextFloat() < chance.getFloat()) duration += type.isBeneficial() ? 1 : -1; } } diff --git a/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java b/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java index 5923087..2438fe5 100644 --- a/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java +++ b/src/main/java/com/bawnorton/bettertrims/mixin/VillagerEntityMixin.java @@ -3,6 +3,7 @@ import com.bawnorton.bettertrims.effect.ArmorTrimEffects; import com.bawnorton.bettertrims.config.Config; import com.bawnorton.bettertrims.extend.EntityExtender; +import com.bawnorton.bettertrims.util.NumberWrapper; import com.bawnorton.bettertrims.util.Wrapper; import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.entity.player.PlayerEntity; @@ -17,11 +18,11 @@ public abstract class VillagerEntityMixin { @Inject(method = "prepareOffersFor", at = @At("TAIL")) private void prepareOffersFor(PlayerEntity player, CallbackInfo ci) { - Wrapper discount = new Wrapper<>(0f); - ArmorTrimEffects.EMERALD.apply(((EntityExtender) player).betterTrims$getTrimmables(), stack -> discount.set(discount.get() + Config.getInstance().emeraldVillagerDiscount)); - if (discount.get() > 0) { + NumberWrapper discount = NumberWrapper.of(0f); + ArmorTrimEffects.EMERALD.apply(((EntityExtender) player).betterTrims$getTrimmables(), stack -> discount.increment(Config.getInstance().emeraldVillagerDiscount)); + if (discount.getFloat() > 0) { for (TradeOffer offer : ((VillagerEntity) (Object) this).getOffers()) { - offer.increaseSpecialPrice(-MathHelper.ceil(discount.get() * offer.getOriginalFirstBuyItem().getCount())); + offer.increaseSpecialPrice(-MathHelper.ceil(discount.getFloat() * offer.getOriginalFirstBuyItem().getCount())); } } } diff --git a/src/main/java/com/bawnorton/bettertrims/util/IterHelper.java b/src/main/java/com/bawnorton/bettertrims/util/IterHelper.java deleted file mode 100644 index 9065caa..0000000 --- a/src/main/java/com/bawnorton/bettertrims/util/IterHelper.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.bawnorton.bettertrims.util; - -import net.minecraft.item.ItemStack; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.NoSuchElementException; - -public abstract class IterHelper { - @SafeVarargs - public static Iterable combine(Iterable... iterables) { - return () -> new Iterator<>() { - private int index = 0; - private Iterator currentIterator = iterables[0].iterator(); - - @Override - public boolean hasNext() { - if (currentIterator.hasNext()) return true; - if (index + 1 < iterables.length) { - index++; - currentIterator = iterables[index].iterator(); - return hasNext(); - } - return false; - } - - @Override - public T next() { - if (!hasNext()) throw new NoSuchElementException(); - return currentIterator.next(); - } - }; - } - - public static List toList(Iterable iterable) { - ArrayList list = new ArrayList<>(); - iterable.forEach(list::add); - return list; - } -} diff --git a/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java b/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java new file mode 100644 index 0000000..2740b1e --- /dev/null +++ b/src/main/java/com/bawnorton/bettertrims/util/NumberWrapper.java @@ -0,0 +1,27 @@ +package com.bawnorton.bettertrims.util; + +public class NumberWrapper extends Wrapper { + public NumberWrapper(Number value) { + super(value); + } + + public static NumberWrapper of(Number value) { + return new NumberWrapper(value); + } + + public void increment(Number amount) { + set(getDouble() + amount.doubleValue()); + } + + public void decrement(Number amount) { + set(getDouble() - amount.doubleValue()); + } + + public float getFloat() { + return get().floatValue(); + } + + public double getDouble() { + return get().doubleValue(); + } +} diff --git a/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java b/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java new file mode 100644 index 0000000..14f3fbb --- /dev/null +++ b/src/main/java/com/bawnorton/bettertrims/util/RegexIdentifier.java @@ -0,0 +1,34 @@ +package com.bawnorton.bettertrims.util; + +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Pattern; + +public record RegexIdentifier(String namespace, String path) { + public boolean matches(@Nullable Identifier other) { + if (other == null) return false; + return matches(other.getNamespace(), other.getPath()); + } + + public boolean matchesAny(Iterable others) { + for (Identifier other : others) { + if (matches(other)) return true; + } + return false; + } + + private boolean matches(String namespace, String path) { + return matchesNamespace(namespace) && matchesPath(path); + } + + private boolean matchesNamespace(String namespace) { + Pattern pattern = Pattern.compile(this.namespace()); + return pattern.matcher(namespace).matches(); + } + + private boolean matchesPath(String path) { + Pattern pattern = Pattern.compile(this.path()); + return pattern.matcher(path).matches(); + } +} diff --git a/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java b/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java index 07df1ae..83184b3 100644 --- a/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java +++ b/src/main/java/com/bawnorton/bettertrims/util/Wrapper.java @@ -1,7 +1,7 @@ package com.bawnorton.bettertrims.util; public class Wrapper { - private T value; + protected T value; public Wrapper(T value) { this.value = value; @@ -18,4 +18,12 @@ public T get() { public void set(T value) { this.value = value; } + + @Override + public String toString() { + if (value == null) return "null"; + return "Wrapper{" + + "value=" + value + + '}'; + } }