diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/FluidIngredient.java b/src/main/java/de/dafuqs/spectrum/api/recipe/FluidIngredient.java index 0fd20cd9f8..772d0e7152 100644 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/FluidIngredient.java +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/FluidIngredient.java @@ -81,7 +81,7 @@ public Optional fluid() { return Optional.ofNullable(this.fluid); } public Optional> tag() { - return Optional.of(TagKey.of(RegistryKeys.FLUID, this.tag)); + return Registries.FLUID.streamTags().filter(tagKey -> tagKey.id().equals(this.tag)).findFirst(); } public boolean isTag() { return this.tag != null; diff --git a/src/main/java/de/dafuqs/spectrum/mixin/MiningToolItemMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/MiningToolItemMixin.java deleted file mode 100644 index 488ee309c5..0000000000 --- a/src/main/java/de/dafuqs/spectrum/mixin/MiningToolItemMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.dafuqs.spectrum.mixin; - -import com.llamalad7.mixinextras.injector.*; -import de.dafuqs.spectrum.components.*; -import de.dafuqs.spectrum.helpers.*; -import de.dafuqs.spectrum.registries.*; -import net.minecraft.block.*; -import net.minecraft.item.*; -import net.minecraft.registry.tag.*; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.*; - -@Mixin(MiningToolItem.class) -public abstract class MiningToolItemMixin { - - @Shadow - @Final - private TagKey effectiveBlocks; - - @ModifyReturnValue(method = "getMiningSpeedMultiplier(Lnet/minecraft/item/ItemStack;Lnet/minecraft/block/BlockState;)F", at = @At("RETURN")) - public float applyMiningSpeedMultipliers(float original, ItemStack stack, BlockState state) { - if (stack == null) - return original; // thank you, gobber - - // RAZING GAMING - int razingLevel = SpectrumEnchantmentHelper.getLevel(lookup, SpectrumEnchantments.RAZING, stack); - if (razingLevel > 0 && state.isIn(this.effectiveBlocks)) { - float hardness = state.getBlock().getHardness(); - original = (float) Math.max(1 + hardness, Math.pow(2, 1 + razingLevel / 8F)); - } - - // INERTIA GAMING - // inertia mining speed calculation logic is capped at 5 levels. - // Higher and the formula would do weird stuff - int inertiaLevel = SpectrumEnchantmentHelper.getLevel(lookup, SpectrumEnchantments.INERTIA, stack); - inertiaLevel = Math.min(4, inertiaLevel); - if (inertiaLevel > 0) { - var inertia = stack.getOrDefault(SpectrumDataComponentTypes.INERTIA, InertiaComponent.DEFAULT); - if (state.isOf(inertia.lastMined())) { - var additionalSpeedPercent = 2.0 * Math.log(inertia.count()) / Math.log((6 - inertiaLevel) * (6 - inertiaLevel) + 1); - original *= 0.5F + (float) additionalSpeedPercent; - } else { - original /= 4; - } - } - - return original; - } - -} diff --git a/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java index d3a7e75164..54648fe53f 100644 --- a/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java +++ b/src/main/java/de/dafuqs/spectrum/mixin/PlayerEntityMixin.java @@ -9,6 +9,7 @@ import de.dafuqs.spectrum.api.entity.*; import de.dafuqs.spectrum.api.item.*; import de.dafuqs.spectrum.cca.*; +import de.dafuqs.spectrum.components.*; import de.dafuqs.spectrum.entity.entity.*; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.helpers.enchantments.*; @@ -17,6 +18,9 @@ import de.dafuqs.spectrum.progression.*; import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.status_effects.*; +import net.minecraft.block.*; +import net.minecraft.component.*; +import net.minecraft.component.type.*; import net.minecraft.enchantment.*; import net.minecraft.entity.*; import net.minecraft.entity.attribute.*; @@ -25,6 +29,7 @@ import net.minecraft.entity.player.*; import net.minecraft.item.*; import net.minecraft.particle.*; +import net.minecraft.registry.*; import net.minecraft.registry.entry.*; import net.minecraft.registry.tag.*; import net.minecraft.server.network.*; @@ -57,9 +62,44 @@ protected PlayerEntityMixin(EntityType entityType, World @Shadow protected abstract boolean canChangeIntoPose(EntityPose pose); + @Shadow + @Final + private PlayerInventory inventory; @Unique public SpectrumFishingBobberEntity fishingBobber; + @WrapOperation(method = "getBlockBreakingSpeed(Lnet/minecraft/block/BlockState;)F", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerInventory;getBlockBreakingSpeed(Lnet/minecraft/block/BlockState;)F")) + private float yourHandlerMethod(PlayerInventory inventory, BlockState state, Operation original) { + ItemStack stack = inventory.main.get(inventory.selectedSlot); + DynamicRegistryManager drm = getRegistryManager(); + ToolComponent tool = stack.get(DataComponentTypes.TOOL); + float speed = original.call(inventory, state); + + // RAZING GAMING + int razingLevel = SpectrumEnchantmentHelper.getLevel(drm, SpectrumEnchantments.RAZING, stack); + if (razingLevel > 0 && tool != null && tool.getSpeed(state) > tool.defaultMiningSpeed()) { + float hardness = state.getBlock().getHardness(); + speed = (float) Math.max(1 + hardness, Math.pow(2, 1 + razingLevel / 8F)); + } + + // INERTIA GAMING + // inertia mining speed calculation logic is capped at 5 levels. + // Higher and the formula would do weird stuff + int inertiaLevel = SpectrumEnchantmentHelper.getLevel(drm, SpectrumEnchantments.INERTIA, stack); + inertiaLevel = Math.min(4, inertiaLevel); + if (inertiaLevel > 0) { + var inertia = stack.getOrDefault(SpectrumDataComponentTypes.INERTIA, InertiaComponent.DEFAULT); + if (state.isOf(inertia.lastMined())) { + var additionalSpeedPercent = 2.0 * Math.log(inertia.count()) / Math.log((6 - inertiaLevel) * (6 - inertiaLevel) + 1); + speed *= 0.5F + (float) additionalSpeedPercent; + } else { + speed /= 4; + } + } + + return speed; + } + @Inject(method = "updateSwimming()V", at = @At("HEAD"), cancellable = true) public void spectrum$updateSwimming(CallbackInfo ci) { if (SpectrumTrinketItem.hasEquipped(this, SpectrumItems.RING_OF_DENSER_STEPS)) { @@ -145,7 +185,7 @@ protected PlayerEntityMixin(EntityType entityType, World return value; } - @Inject(method = "attack(Lnet/minecraft/entity/Entity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/enchantment/EnchantmentHelper;getFireAspect(Lnet/minecraft/entity/LivingEntity;)I")) + @Inject(method = "attack(Lnet/minecraft/entity/Entity;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getVelocity()Lnet/minecraft/util/math/Vec3d;")) private void spectrum$perfectCounter(Entity target, CallbackInfo ci, @Local(ordinal = 0) LocalFloatRef damage) { var player = (PlayerEntity) (Object) this; if (MiscPlayerDataComponent.get(player).consumePerfectCounter()) { @@ -257,7 +297,7 @@ public int addExperience(int experience) { } @ModifyVariable(method = "getBlockBreakingSpeed", - slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;hasStatusEffect(Lnet/minecraft/entity/effect/StatusEffect;)Z"), + slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;hasStatusEffect(Lnet/minecraft/registry/entry/RegistryEntry;)Z"), to = @At("TAIL") ), at = @At(value = "LOAD"), @@ -276,7 +316,8 @@ public float applyInexorableAntiSlowdowns(float original) { var player = (PlayerEntity) (Object) this; var f = original; - if (player.isSubmergedIn(FluidTags.WATER) && !EnchantmentHelper.hasAquaAffinity(player)) + boolean hasAquaAffinity = SpectrumEnchantmentHelper.getEquipmentLevel(player.getWorld().getRegistryManager(), Enchantments.AQUA_AFFINITY, player) > 0; + if (player.isSubmergedIn(FluidTags.WATER) && !hasAquaAffinity) f *= 5; if (!player.isOnGround()) diff --git a/src/main/java/de/dafuqs/spectrum/status_effects/SleepStatusEffect.java b/src/main/java/de/dafuqs/spectrum/status_effects/SleepStatusEffect.java index 3cf21d891a..92d99654b1 100644 --- a/src/main/java/de/dafuqs/spectrum/status_effects/SleepStatusEffect.java +++ b/src/main/java/de/dafuqs/spectrum/status_effects/SleepStatusEffect.java @@ -3,7 +3,6 @@ import de.dafuqs.spectrum.cca.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.entity.*; -import net.minecraft.entity.attribute.*; import net.minecraft.entity.effect.*; import net.minecraft.entity.player.*; import net.minecraft.registry.entry.*; @@ -17,7 +16,7 @@ public SleepStatusEffect(StatusEffectCategory category, int color, boolean scale super(category, color); this.scales = scales; } - + // oh my god // TODO: can the tag check be implemented into the entities base attribute modifier somehow? public static float getSleepResistance(@Nullable StatusEffectInstance sleepEffect, LivingEntity entity) { @@ -97,10 +96,11 @@ else if (entity.hasStatusEffect(SpectrumStatusEffects.SOMNOLENCE)) { } // Sleep effects don't scale except for uh, calming ufck - @Override - public double adjustModifierAmount(int amplifier, EntityAttributeModifier modifier) { - if (scales) - return super.adjustModifierAmount(amplifier, modifier); - return modifier.getValue(); - } + //TODO verify that you can't more than one level of eternal or fatal slumber +// @Override +// public double adjustModifierAmount(int amplifier, EntityAttributeModifier modifier) { +// if (scales) +// return super.adjustModifierAmount(amplifier, modifier); +// return modifier.getValue(); +// } } diff --git a/src/main/resources/spectrum.mixins.json b/src/main/resources/spectrum.mixins.json index 0de72c2ad0..3f76b9b156 100644 --- a/src/main/resources/spectrum.mixins.json +++ b/src/main/resources/spectrum.mixins.json @@ -52,7 +52,6 @@ "MapStateMixin", "MapStatePlayerUpdateTrackerMixin", "MC252934Mixin", - "MiningToolItemMixin", "MobEntityMixin", "NoteBlockMixin", "PiglinBrainMixin",