diff --git a/src/main/java/ivorius/psychedelicraft/client/PsychedelicraftClient.java b/src/main/java/ivorius/psychedelicraft/client/PsychedelicraftClient.java index 1ca9c32a..36ea2cb2 100644 --- a/src/main/java/ivorius/psychedelicraft/client/PsychedelicraftClient.java +++ b/src/main/java/ivorius/psychedelicraft/client/PsychedelicraftClient.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; import ivorius.psychedelicraft.Psychedelicraft; -import ivorius.psychedelicraft.client.item.PSModelPredicates; +import ivorius.psychedelicraft.client.item.PSItemProperties; import ivorius.psychedelicraft.client.render.*; import ivorius.psychedelicraft.client.render.shader.ShaderLoader; import ivorius.psychedelicraft.client.screen.PSScreens; @@ -54,7 +54,7 @@ public void onInitializeClient() { ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(ShaderLoader.POST_EFFECTS); PSRenderers.bootstrap(); - PSModelPredicates.bootstrap(); + PSItemProperties.bootstrap(); PSScreens.bootstrap(); } } diff --git a/src/main/java/ivorius/psychedelicraft/client/item/AgeProperty.java b/src/main/java/ivorius/psychedelicraft/client/item/AgeProperty.java new file mode 100644 index 00000000..ccbc077b --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/AgeProperty.java @@ -0,0 +1,24 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; + +import net.minecraft.client.render.item.property.numeric.NumericProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; + +public record AgeProperty() implements NumericProperty { + public static final MapCodec CODEC = MapCodec.unit(new AgeProperty()); + + @Override + public float getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity holder, int seed) { + return stack.getDamage() / 10F; + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/FilledProperty.java b/src/main/java/ivorius/psychedelicraft/client/item/FilledProperty.java new file mode 100644 index 00000000..ed25c132 --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/FilledProperty.java @@ -0,0 +1,58 @@ +package ivorius.psychedelicraft.client.item; + +import java.util.Locale; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; + +import ivorius.psychedelicraft.item.BongItem; +import ivorius.psychedelicraft.item.PaperBagItem; +import ivorius.psychedelicraft.item.component.BagContentsComponent; +import ivorius.psychedelicraft.item.component.ItemFluids; +import net.minecraft.client.render.item.property.select.SelectProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; +import net.minecraft.util.StringIdentifiable; + +public record FilledProperty() implements SelectProperty { + public static final SelectProperty.Type TYPE = SelectProperty.Type.create(MapCodec.unit(new FilledProperty()), FillPercentage.CODEC); + + @Override + public FillPercentage getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode) { + if (stack.getItem() instanceof PaperBagItem) { + BagContentsComponent contents = BagContentsComponent.get(stack); + return contents.isEmpty() ? FillPercentage.EMPTY : contents.count() > BagContentsComponent.FULL_COUNT + ? (contents.count() > BagContentsComponent.FULL_COUNT * 2F ? FillPercentage.FULL : FillPercentage.THREE_QUARTER) : FillPercentage.HALF; + } + if (stack.getItem() instanceof BongItem item) { + return item.hasUsableConsumable(user) ? FillPercentage.FULL : FillPercentage.EMPTY; + } + return ItemFluids.of(stack).isEmpty() ? FillPercentage.EMPTY : FillPercentage.FULL; + } + + @Override + public SelectProperty.Type getType() { + return TYPE; + } + + public enum FillPercentage implements StringIdentifiable { + EMPTY, + ONE_QUARTER, + HALF, + THREE_QUARTER, + FULL; + + public static final Codec CODEC = StringIdentifiable.createCodec(FillPercentage::values); + + private final String name = name().toLowerCase(Locale.ROOT); + + @Override + public String asString() { + return name; + } + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/FilledWithLavaProperty.java b/src/main/java/ivorius/psychedelicraft/client/item/FilledWithLavaProperty.java new file mode 100644 index 00000000..8db0310e --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/FilledWithLavaProperty.java @@ -0,0 +1,27 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; + +import ivorius.psychedelicraft.item.component.ItemFluids; +import net.minecraft.client.render.item.property.bool.BooleanProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; +import net.minecraft.registry.tag.FluidTags; + +public record FilledWithLavaProperty() implements BooleanProperty { + public static final MapCodec CODEC = MapCodec.unit(new FilledWithLavaProperty()); + + @Override + public boolean getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode) { + return ItemFluids.of(stack).isIn(FluidTags.LAVA); + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/FluidTintSource.java b/src/main/java/ivorius/psychedelicraft/client/item/FluidTintSource.java new file mode 100644 index 00000000..0ba2a89c --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/FluidTintSource.java @@ -0,0 +1,31 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import ivorius.psychedelicraft.client.render.FluidBoxRenderer; +import ivorius.psychedelicraft.item.component.ItemFluids; +import net.minecraft.client.render.item.tint.TintSource; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.dynamic.Codecs; + +public record FluidTintSource(int defaultColor) implements TintSource { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance.group(Codecs.RGB.fieldOf("default").forGetter(FluidTintSource::defaultColor)).apply(instance, FluidTintSource::new) + ); + + @Override + public int getTint(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user) { + ItemFluids fluids = ItemFluids.of(stack); + return fluids.isEmpty() ? defaultColor : FluidBoxRenderer.FluidAppearance.getItemColor(fluids); + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} \ No newline at end of file diff --git a/src/main/java/ivorius/psychedelicraft/client/item/FlyingProperty.java b/src/main/java/ivorius/psychedelicraft/client/item/FlyingProperty.java new file mode 100644 index 00000000..3a1406e9 --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/FlyingProperty.java @@ -0,0 +1,26 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; + +import ivorius.psychedelicraft.entity.MolotovCocktailEntity; +import net.minecraft.client.render.item.property.bool.BooleanProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; + +public record FlyingProperty() implements BooleanProperty { + public static final MapCodec CODEC = MapCodec.unit(new FlyingProperty()); + + @Override + public boolean getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode) { + return stack.getHolder() instanceof MolotovCocktailEntity; + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/HallucinatedItemModel.java b/src/main/java/ivorius/psychedelicraft/client/item/HallucinatedItemModel.java new file mode 100644 index 00000000..39a6cda9 --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/HallucinatedItemModel.java @@ -0,0 +1,45 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; +import ivorius.psychedelicraft.item.SuspiciousItem; +import net.minecraft.client.item.ItemModelManager; +import net.minecraft.client.render.item.ItemRenderState; +import net.minecraft.client.render.item.model.ItemModel; +import net.minecraft.client.render.model.ResolvableModel; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; + +public class HallucinatedItemModel implements ItemModel { + public static final ItemModel INSTANCE = new HallucinatedItemModel(); + @Override + public void update(ItemRenderState state, ItemStack stack, ItemModelManager resolver, ModelTransformationMode mode, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed) { + if (stack.getItem() instanceof SuspiciousItem sus) { + sus.getHallucinatedItem().map(Item::getDefaultStack).ifPresent(replacement -> { + resolver.update(state, replacement, mode, world, user, seed); + }); + } + } + + public static record Unbaked() implements ItemModel.Unbaked { + public static final MapCodec CODEC = MapCodec.unit(Unbaked::new); + + @Override + public void resolve(ResolvableModel.Resolver resolver) { + } + + @Override + public ItemModel bake(ItemModel.BakeContext context) { + return INSTANCE; + } + + @Override + public MapCodec getCodec() { + return CODEC; + } + } +} \ No newline at end of file diff --git a/src/main/java/ivorius/psychedelicraft/client/item/PSItemProperties.java b/src/main/java/ivorius/psychedelicraft/client/item/PSItemProperties.java new file mode 100644 index 00000000..861a9422 --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/PSItemProperties.java @@ -0,0 +1,96 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; + +import ivorius.psychedelicraft.Psychedelicraft; +import net.minecraft.client.render.item.model.ItemModel; +import net.minecraft.client.render.item.model.ItemModelTypes; +import net.minecraft.client.render.item.model.special.SpecialModelRenderer; +import net.minecraft.client.render.item.model.special.SpecialModelTypes; +import net.minecraft.client.render.item.property.bool.BooleanProperties; +import net.minecraft.client.render.item.property.bool.BooleanProperty; +import net.minecraft.client.render.item.property.numeric.NumericProperties; +import net.minecraft.client.render.item.property.numeric.NumericProperty; +import net.minecraft.client.render.item.property.select.SelectProperties; +import net.minecraft.client.render.item.property.select.SelectProperty; +import net.minecraft.client.render.item.tint.TintSource; +import net.minecraft.client.render.item.tint.TintSourceTypes; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; + +public interface PSItemProperties { + + private static

, T> void option(String name, SelectProperty.Type codec) { + SelectProperties.ID_MAPPER.put(Psychedelicraft.id(name), codec); + } + + private static void flag(String name, MapCodec codec) { + BooleanProperties.ID_MAPPER.put(Psychedelicraft.id(name), codec); + } + + private static void range(String name, MapCodec codec) { + NumericProperties.ID_MAPPER.put(Psychedelicraft.id(name), codec); + } + + private static void tint(String name, MapCodec codec) { + TintSourceTypes.ID_MAPPER.put(Psychedelicraft.id(name), codec); + } + + private static void model(String name, MapCodec codec) { + ItemModelTypes.ID_MAPPER.put(Psychedelicraft.id(name), codec); + } + + private static void specialModel(String name, MapCodec codec) { + SpecialModelTypes.ID_MAPPER.put(Psychedelicraft.id(name), codec); + } + + static void bootstrap() { + flag("tripping", TrippingProperty.CODEC); + flag("flying", FlyingProperty.CODEC); + flag("using", UsingProperty.CODEC); + option("filled", FilledProperty.TYPE); + flag("filled_with_lava", FilledWithLavaProperty.CODEC); + range("age", AgeProperty.CODEC); + + tint("fluid", FluidTintSource.CODEC); + + model("hallucination", HallucinatedItemModel.Unbaked.CODEC); + specialModel("rift_jar", RiftJarItemModelRenderer.Unbaked.CODEC); + + // layer 1,2,3,etc -> minecraft:dye + // ColorProviderRegistry.ITEM.register((stack, layer) -> layer > 0 ? -1 : DyedColorComponent.getColor(stack, Colors.RED), PSItems.HARMONIUM); + + // layer0 -> minecraft:dye (default is white) + // layer1 -> psychedelicraft:fluid (default is white) + /*ColorProviderRegistry.ITEM.register((stack, layer) -> { + if (layer == 0) { + return DyedColorComponent.getColor(stack, Colors.WHITE); + } + if (layer == 1) { + ItemFluids fluids = ItemFluids.of(stack); + if (!fluids.isEmpty()) { + return FluidBoxRenderer.FluidAppearance.getItemColor(fluids); + } + } + return Colors.WHITE; + }, PSItems.BOTTLE, PSItems.MOLOTOV_COCKTAIL, PSItems.GLASS_CHALICE, PSItems.STONE_CUP, PSItems.WOODEN_MUG, PSItems.FILLED_BUCKET, PSItems.FILLED_BOWL, PSItems.SYRINGE);*/ + // layer0 -> psychedelicraft:fluid (default is white) + /*ColorProviderRegistry.ITEM.register((stack, layer) -> { + if (layer == 0) { + ItemFluids fluids = ItemFluids.of(stack); + if (!fluids.isEmpty()) { + return FluidBoxRenderer.FluidAppearance.getItemColor(fluids); + } + } + return Colors.WHITE; + }, PSItems.FILLED_GLASS_BOTTLE);*/ + } + + interface ValueSupplier { + T getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode); + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/PSModelPredicates.java b/src/main/java/ivorius/psychedelicraft/client/item/PSModelPredicates.java deleted file mode 100644 index a7eafa57..00000000 --- a/src/main/java/ivorius/psychedelicraft/client/item/PSModelPredicates.java +++ /dev/null @@ -1,71 +0,0 @@ -package ivorius.psychedelicraft.client.item; - -import ivorius.psychedelicraft.Psychedelicraft; -import ivorius.psychedelicraft.client.render.FluidBoxRenderer; -import ivorius.psychedelicraft.entity.MolotovCocktailEntity; -import ivorius.psychedelicraft.entity.drug.DrugProperties; -import ivorius.psychedelicraft.item.*; -import ivorius.psychedelicraft.item.component.BagContentsComponent; -import ivorius.psychedelicraft.item.component.ItemFluids; -import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; -import net.minecraft.client.item.ModelPredicateProviderRegistry; -import net.minecraft.component.type.DyedColorComponent; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.util.Colors; - -/** - * @author Sollace - * @since 1 Jan 2023 - */ -public interface PSModelPredicates { - static void bootstrap() { - ModelPredicateProviderRegistry.register(Psychedelicraft.id("using"), (stack, world, entity, seed) -> { - if (entity == null || entity.getActiveItem() != stack) { - return 0; - } - return entity.getItemUseTimeLeft() > 0 ? 1 : 0; - }); - ModelPredicateProviderRegistry.register(Psychedelicraft.id("flying"), (stack, world, entity, seed) -> { - return (stack.getHolder() instanceof MolotovCocktailEntity) ? 1 : 0; - }); - ModelPredicateProviderRegistry.register(Psychedelicraft.id("tripping"), (stack, world, entity, seed) -> { - return DrugProperties.of(entity).filter(DrugProperties::isTripping).isPresent() ? 1 : 0; - }); - ModelPredicateProviderRegistry.register(PSItems.WINE_GRAPE_LATTICE, Psychedelicraft.id("age"), (stack, world, entity, seed) -> stack.getDamage() / 10F); - ModelPredicateProviderRegistry.register(PSItems.MORNING_GLORY_LATTICE, Psychedelicraft.id("age"), (stack, world, entity, seed) -> stack.getDamage() / 10F); - ModelPredicateProviderRegistry.register(Psychedelicraft.id("filled"), (stack, world, entity, seed) -> { - if (stack.getItem() instanceof PaperBagItem) { - BagContentsComponent contents = BagContentsComponent.get(stack); - return contents.isEmpty() ? 0 : contents.count() > BagContentsComponent.FULL_COUNT - ? (contents.count() > BagContentsComponent.FULL_COUNT * 2F ? 1 : 0.75F) : 0.5F; - } - if (stack.getItem() instanceof BongItem item) { - return item.hasUsableConsumable(entity) ? 1 : 0; - } - return ItemFluids.of(stack).isEmpty() ? 0 : 1; - }); - ModelPredicateProviderRegistry.register(Psychedelicraft.id("filled_with_lava"), (stack, world, entity, seed) -> ItemFluids.of(stack).isIn(FluidTags.LAVA) ? 1 : 0); - ColorProviderRegistry.ITEM.register((stack, layer) -> layer > 0 ? -1 : DyedColorComponent.getColor(stack, Colors.RED), PSItems.HARMONIUM); - ColorProviderRegistry.ITEM.register((stack, layer) -> { - if (layer == 0) { - return DyedColorComponent.getColor(stack, Colors.WHITE); - } - if (layer == 1) { - ItemFluids fluids = ItemFluids.of(stack); - if (!fluids.isEmpty()) { - return FluidBoxRenderer.FluidAppearance.getItemColor(fluids); - } - } - return Colors.WHITE; - }, PSItems.BOTTLE, PSItems.MOLOTOV_COCKTAIL, PSItems.GLASS_CHALICE, PSItems.STONE_CUP, PSItems.WOODEN_MUG, PSItems.FILLED_BUCKET, PSItems.FILLED_BOWL, PSItems.SYRINGE); - ColorProviderRegistry.ITEM.register((stack, layer) -> { - if (layer == 0) { - ItemFluids fluids = ItemFluids.of(stack); - if (!fluids.isEmpty()) { - return FluidBoxRenderer.FluidAppearance.getItemColor(fluids); - } - } - return Colors.WHITE; - }, PSItems.FILLED_GLASS_BOTTLE); - } -} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/RiftJarItemModelRenderer.java b/src/main/java/ivorius/psychedelicraft/client/item/RiftJarItemModelRenderer.java new file mode 100644 index 00000000..7be4ac6e --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/RiftJarItemModelRenderer.java @@ -0,0 +1,45 @@ +package ivorius.psychedelicraft.client.item; + +import com.mojang.serialization.MapCodec; + +import ivorius.psychedelicraft.client.render.blocks.RiftJarBlockEntityRenderer; +import ivorius.psychedelicraft.item.component.RiftFractionComponent; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.model.LoadedEntityModels; +import net.minecraft.client.render.item.model.special.SpecialModelRenderer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; + +public class RiftJarItemModelRenderer implements SpecialModelRenderer { + private final RiftJarBlockEntityRenderer renderer; + + public RiftJarItemModelRenderer(RiftJarBlockEntityRenderer renderer) { + this.renderer = renderer; + } + + @Override + public Float getData(ItemStack stack) { + return RiftFractionComponent.getRiftFraction(stack); + } + + @Override + public void render(Float data, ModelTransformationMode modelTransformationMode, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay, boolean glint) { + renderer.renderAsItem(data, MinecraftClient.getInstance().getRenderTickCounter().getTickDelta(false), matrices, vertices, light, overlay); + } + + public static record Unbaked() implements SpecialModelRenderer.Unbaked { + public static final MapCodec CODEC = MapCodec.unit(new Unbaked()); + + @Override + public MapCodec getCodec() { + return CODEC; + } + + @Override + public SpecialModelRenderer bake(LoadedEntityModels entityModels) { + return new RiftJarItemModelRenderer(new RiftJarBlockEntityRenderer()); + } + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/TrippingProperty.java b/src/main/java/ivorius/psychedelicraft/client/item/TrippingProperty.java new file mode 100644 index 00000000..3411f0fa --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/TrippingProperty.java @@ -0,0 +1,25 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; +import ivorius.psychedelicraft.entity.drug.DrugProperties; +import net.minecraft.client.render.item.property.bool.BooleanProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; + +public record TrippingProperty() implements BooleanProperty { + public static final MapCodec CODEC = MapCodec.unit(new TrippingProperty()); + + @Override + public boolean getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode) { + return DrugProperties.of(user).filter(DrugProperties::isTripping).isPresent(); + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/item/UsingProperty.java b/src/main/java/ivorius/psychedelicraft/client/item/UsingProperty.java new file mode 100644 index 00000000..eba56761 --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/client/item/UsingProperty.java @@ -0,0 +1,24 @@ +package ivorius.psychedelicraft.client.item; + +import org.jetbrains.annotations.Nullable; + +import com.mojang.serialization.MapCodec; +import net.minecraft.client.render.item.property.bool.BooleanProperty; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ModelTransformationMode; + +public record UsingProperty() implements BooleanProperty { + public static final MapCodec CODEC = MapCodec.unit(new UsingProperty()); + + @Override + public boolean getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode) { + return user != null && user.getActiveItem() == stack && user.getItemUseTimeLeft() > 0; + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/ivorius/psychedelicraft/client/render/DrugRenderer.java b/src/main/java/ivorius/psychedelicraft/client/render/DrugRenderer.java index 4097032f..4572379f 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/DrugRenderer.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/DrugRenderer.java @@ -23,10 +23,11 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.render.entity.model.PlayerEntityModel; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; +import net.minecraft.client.util.Pool; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.Vec3d; @@ -146,12 +147,15 @@ public void distortHand(MatrixStack matrices) { }); } - public void poseModel(PlayerEntity player, BipedEntityModel model) { + public void poseModel(PlayerEntityRenderState player, BipedEntityModel model) { ModelPart head = model.getHead(); ModelPart leftArm = model.leftArm; ModelPart rightArm = model.rightArm; - DrugProperties properties = DrugProperties.of(player); + DrugProperties properties = DrugProperties.of(player).orElse(null); + if (properties == null) { + return; + } float tick = ShaderContext.ticks(); float shiftX = DrugEffectInterpreter.getHandShiftX(properties, tick) * 2; @@ -174,13 +178,13 @@ public void poseModel(PlayerEntity player, BipedEntityModel model) { } } - public void onRenderOverlay(DrawContext context, RenderTickCounter tickCounter) { + public void onRenderOverlay(Pool pool, DrawContext context, RenderTickCounter tickCounter) { MinecraftClient client = MinecraftClient.getInstance(); RenderPhase.SCREEN.push(); float tickDelta = tickCounter.getTickDelta(false); - postEffects.render(tickDelta); + postEffects.render(pool, tickDelta); getScreenEffects().render(context, client.getWindow(), tickDelta); diff --git a/src/main/java/ivorius/psychedelicraft/client/render/PSRenderers.java b/src/main/java/ivorius/psychedelicraft/client/render/PSRenderers.java index 910cecbb..a8c2b25b 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/PSRenderers.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/PSRenderers.java @@ -5,9 +5,6 @@ import org.jetbrains.annotations.Nullable; -import com.terraformersmc.terraform.boat.api.client.TerraformBoatClientHelper; - -import ivorius.psychedelicraft.Psychedelicraft; import ivorius.psychedelicraft.block.PSBlocks; import ivorius.psychedelicraft.block.entity.*; import ivorius.psychedelicraft.client.particle.PSParticleFactories; @@ -15,7 +12,6 @@ import ivorius.psychedelicraft.client.render.shader.PSShaders; import ivorius.psychedelicraft.entity.*; import ivorius.psychedelicraft.fluid.SimpleFluid; -import ivorius.psychedelicraft.item.PSItems; import ivorius.psychedelicraft.item.component.ItemFluids; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; @@ -70,8 +66,6 @@ static void bootstrap() { PSBlocks.POTTED_CANNABIS, PSBlocks.POTTED_JUNIPER_SAPLING, PSBlocks.POTTED_MORNING_GLORY, PSBlocks.POTTED_HOP, PSBlocks.POTTED_TOBACCO, PSBlocks.POTTED_COCA, PSBlocks.POTTED_COFFEA); - BuiltinItemRendererRegistry.INSTANCE.register(PSItems.RIFT_JAR, RiftJarBlockEntityRenderer::renderStack); - SimpleFluid.REGISTRY.forEach(fluid -> { if (fluid.isEmpty()) { return; diff --git a/src/main/java/ivorius/psychedelicraft/client/render/RenderUtil.java b/src/main/java/ivorius/psychedelicraft/client/render/RenderUtil.java index 8f8eeb9f..4259de97 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/RenderUtil.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/RenderUtil.java @@ -15,6 +15,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import ivorius.psychedelicraft.util.MathUtils; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.gui.DrawContext; @@ -49,6 +50,10 @@ public static void setColor(int color, boolean hasAlpha) { ); } + public static VertexConsumer getBuffer(RenderLayer layer) { + return MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers().getBuffer(layer); + } + private static VertexConsumer fastVertex(VertexConsumer buffer, MatrixStack.Entry entry, float x, float y, float z) { entry.getPositionMatrix().transform(POSITION_VECTOR.set(x, y, z, 1)); return buffer.vertex(POSITION_VECTOR.x, POSITION_VECTOR.y, POSITION_VECTOR.z); @@ -98,7 +103,7 @@ public static void drawOverlay(DrawContext context, Identifier texture,float alp } public static void drawBuffer(Framebuffer frame, float r, float g, float b, float a) { - RenderSystem.setShader(GameRenderer::getPositionTexProgram); + RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX); RenderSystem.setShaderTexture(0, frame.getColorAttachment()); RenderSystem.setShaderColor(r, g, b, a); RenderSystem.enableBlend(); @@ -112,7 +117,7 @@ public static void drawBuffer(Framebuffer frame, float r, float g, float b, floa RenderSystem.disableBlend(); } - public static void drawRepeatingSprite(DrawContext context, Sprite sprite, int x, int y, int width, int height, float r, float g, float b, float a) { + public static void drawRepeatingSprite(DrawContext context, Sprite sprite, int x, int y, int width, int height, int color) { final int tileSize = 16; int tilesX = width / tileSize; @@ -126,7 +131,7 @@ public static void drawRepeatingSprite(DrawContext context, Sprite sprite, int x int w = tileX == tilesX ? remainedWidth : tileSize; int h = tileY == tilesY ? remainedHeight : tileSize; if (h > 0 && w > 0) { - context.drawSprite(x + tileX * tileSize, y + tileY * tileSize, 0, w, h, sprite, r, g, b, a); + context.drawSpriteStretched(RenderLayer::getGuiTextured, sprite, x + tileX * tileSize, y + tileY * tileSize, w, h, color); } } } diff --git a/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarBlockEntityRenderer.java b/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarBlockEntityRenderer.java index 8fa551c2..b28c5fa2 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarBlockEntityRenderer.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarBlockEntityRenderer.java @@ -6,20 +6,14 @@ package ivorius.psychedelicraft.client.render.blocks; import ivorius.psychedelicraft.Psychedelicraft; -import ivorius.psychedelicraft.block.PSBlocks; -import ivorius.psychedelicraft.block.entity.PSBlockEntities; import ivorius.psychedelicraft.block.entity.RiftJarBlockEntity; import ivorius.psychedelicraft.client.render.*; import ivorius.psychedelicraft.client.render.bezier.*; -import ivorius.psychedelicraft.item.component.RiftFractionComponent; import ivorius.psychedelicraft.util.MathUtils; import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; import net.minecraft.client.render.block.entity.*; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ModelTransformationMode; import net.minecraft.text.Text; import net.minecraft.util.Colors; import net.minecraft.util.Identifier; @@ -44,53 +38,66 @@ public class RiftJarBlockEntityRenderer implements BlockEntityRenderer 0) { model.render(matrices, vertices.getBuffer(model.getLayer(CRACKED_TEXTURE)), light, overlay, MathUtils.withAlpha(Colors.WHITE, crackedVisibility)); } - if (entity.currentRiftFraction > 0) { + if (currentRiftFraction > 0) { matrices.push(); matrices.translate(0, 1.5F, 0); matrices.multiply(RotationAxis.NEGATIVE_X.rotationDegrees(180)); matrices.scale(0.9F, 1, 0.9F); ZeroScreen.render(ticks, (layer, u, v) -> { - model.renderInterior(matrices, vertices.getBuffer(layer), 0, 0, MathUtils.withAlpha(Colors.WHITE, Math.min(entity.currentRiftFraction * 2, 1))); + model.renderInterior(matrices, vertices.getBuffer(layer), 0, 0, MathUtils.withAlpha(Colors.WHITE, Math.min(currentRiftFraction * 2, 1))); }); matrices.pop(); } matrices.pop(); matrices.pop(); + } + + public void renderConnections(RiftJarBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light, int overlay) { + float ticks = entity.ticksAliveVisual + tickDelta; matrices.push(); matrices.translate(0.5F, 0.5f, 0.5F); @@ -135,6 +142,7 @@ public void render(RiftJarBlockEntity entity, float tickDelta, MatrixStack matri matrices.pop(); } + public static String cheeseString(String string, float effect, Random rand) { if (effect <= 0) { return string; diff --git a/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarModel.java b/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarModel.java index 105101d4..98ae3ac4 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarModel.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/blocks/RiftJarModel.java @@ -62,6 +62,12 @@ public void setAngles(RiftJarBlockEntity entity, float tickDelta) { knot.roll = 0.2602503F + (entity.fractionHandleUp * (1 + MathHelper.sin(entity.ticksAliveVisual * 0.1f) * 0.1f)) * 0.5f; } + public void setAngles(float fractionOpen, float fractionHandleUp, int age, float tickDelta) { + cork.pivotX = fractionOpen * 2; + cork.yaw = fractionOpen * 0.1F; + knot.roll = 0.2602503F + (fractionHandleUp * (1 + MathHelper.sin(age * 0.1f) * 0.1f)) * 0.5f; + } + public void renderInterior(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, int color) { interior.hidden = false; interior.render(matrices, vertices, light, overlay, color); diff --git a/src/main/java/ivorius/psychedelicraft/client/render/effect/AlcoholOverlayScreenEffect.java b/src/main/java/ivorius/psychedelicraft/client/render/effect/AlcoholOverlayScreenEffect.java index b53ef935..6d1b77a2 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/effect/AlcoholOverlayScreenEffect.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/effect/AlcoholOverlayScreenEffect.java @@ -5,8 +5,11 @@ import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.Window; +import net.minecraft.util.Colors; +import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.MathHelper; public class AlcoholOverlayScreenEffect extends DrugOverlayScreenEffect { @@ -23,6 +26,6 @@ protected void render(DrawContext context, Window window, float tickDelta, DrugP float overlayAlpha = Math.min(0.8F, (MathHelper.sin(tickDelta / 80F) * alcohol * 0.5F + alcohol)); Sprite sprite = MinecraftClient.getInstance().getBlockRenderManager().getModels().getModelParticleSprite(Blocks.NETHER_PORTAL.getDefaultState()); - context.drawSprite(0, 0, -90, window.getScaledWidth(), window.getScaledHeight(), sprite, 1, 1, 1, overlayAlpha); + context.drawSpriteStretched(RenderLayer::getGuiTextured, sprite, 0, 0, window.getScaledWidth(), window.getScaledHeight(), ColorHelper.withAlpha(ColorHelper.channelFromFloat(overlayAlpha), Colors.WHITE)); } } diff --git a/src/main/java/ivorius/psychedelicraft/client/render/effect/EnvironmentalScreenEffect.java b/src/main/java/ivorius/psychedelicraft/client/render/effect/EnvironmentalScreenEffect.java index f896b110..5b84a219 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/effect/EnvironmentalScreenEffect.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/effect/EnvironmentalScreenEffect.java @@ -69,7 +69,7 @@ public void update(float tickDelta) { experiencedHealth = MathUtils.nearValue(experiencedHealth, entity.getHealth(), 0.01f, 0.01f); wasInWater = entity.getWorld().getFluidState(BlockPos.ofFloored(entity.getEyePos())).isIn(FluidTags.WATER); wasInRain = entity.getWorld().getRainGradient(tickDelta) > 0 - && entity.getWorld().getBiome(entity.getBlockPos()).value().getPrecipitation(entity.getBlockPos()) == Precipitation.RAIN + && entity.getWorld().getBiome(entity.getBlockPos()).value().getPrecipitation(entity.getBlockPos(), entity.getWorld().getSeaLevel()) == Precipitation.RAIN && entity.getWorld().getTopPosition(Type.MOTION_BLOCKING, entity.getBlockPos()).getY() <= entity.getY(); if (PsychedelicraftClient.getConfig().visual.waterOverlayEnabled) { diff --git a/src/main/java/ivorius/psychedelicraft/client/render/effect/LensFlareScreenEffect.java b/src/main/java/ivorius/psychedelicraft/client/render/effect/LensFlareScreenEffect.java index c461a182..866c3169 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/effect/LensFlareScreenEffect.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/effect/LensFlareScreenEffect.java @@ -99,9 +99,9 @@ public void render(DrawContext context, Window window, float tickDelta) { float yDist = normSunPos.y * screenHeight; int colorValue = world.getBiome(client.gameRenderer.getCamera().getBlockPos()).value().getFogColor(); - int fogRed = ColorHelper.Abgr.getRed(colorValue); - int fogGreen = ColorHelper.Abgr.getGreen(colorValue); - int fogBlue = ColorHelper.Abgr.getBlue(colorValue); + int fogRed = ColorHelper.getRed(colorValue); + int fogGreen = ColorHelper.getGreen(colorValue); + int fogBlue = ColorHelper.getBlue(colorValue); float alpha = Math.min(1, sunPositionOnScreen.z); RenderSystem.blendFuncSeparate(SrcFactor.SRC_ALPHA, DstFactor.ONE, SrcFactor.ONE, DstFactor.ZERO); diff --git a/src/main/java/ivorius/psychedelicraft/client/render/effect/MotionBlurScreenEffect.java b/src/main/java/ivorius/psychedelicraft/client/render/effect/MotionBlurScreenEffect.java index 82df0e7d..5d05c4aa 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/effect/MotionBlurScreenEffect.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/effect/MotionBlurScreenEffect.java @@ -136,7 +136,7 @@ private class GlTexture implements AutoCloseable { public GlTexture(int sample, int width, int height) { this.sample = sample; - output = new SimpleFramebuffer(width, height, true, MinecraftClient.IS_SYSTEM_MAC); + output = new SimpleFramebuffer(width, height, true); output.viewportWidth = width; output.viewportHeight = height; } diff --git a/src/main/java/ivorius/psychedelicraft/client/render/effect/PowerOverlayScreenEffect.java b/src/main/java/ivorius/psychedelicraft/client/render/effect/PowerOverlayScreenEffect.java index 7c3746bc..d7417b79 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/effect/PowerOverlayScreenEffect.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/effect/PowerOverlayScreenEffect.java @@ -9,6 +9,7 @@ import ivorius.psychedelicraft.Psychedelicraft; import ivorius.psychedelicraft.entity.drug.*; import ivorius.psychedelicraft.entity.drug.type.PowerDrug; +import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.*; import net.minecraft.client.render.VertexFormat.DrawMode; @@ -52,7 +53,7 @@ protected void render(DrawContext context, Window window, float tickDelta, DrugP if (powerLightnings > 0) { int lightningW = height; - RenderSystem.setShader(GameRenderer::getPositionTexProgram); + RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX); RenderSystem.blendFuncSeparate( GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE, GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ZERO @@ -86,7 +87,7 @@ private void renderRandomParticles(DrawContext context, int number, int width, i int x = rand.nextInt(screenWidth + width) - width; int y = rand.nextInt(screenHeight + height) - height; - context.drawTexture(POWER_PARTICLE_TEXTURE, x, y, -90, 0, 0, width, height, 16, 16); + context.drawTexture(RenderLayer::getGuiTextured, POWER_PARTICLE_TEXTURE, x, y, -90, 0, 0, width, height, 16, 16); } } } diff --git a/src/main/java/ivorius/psychedelicraft/client/render/effect/WarmthOverlayScreenEffect.java b/src/main/java/ivorius/psychedelicraft/client/render/effect/WarmthOverlayScreenEffect.java index b6b11ab1..a38128da 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/effect/WarmthOverlayScreenEffect.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/effect/WarmthOverlayScreenEffect.java @@ -1,6 +1,7 @@ package ivorius.psychedelicraft.client.render.effect; import ivorius.psychedelicraft.Psychedelicraft; +import ivorius.psychedelicraft.client.render.RenderUtil; import ivorius.psychedelicraft.entity.drug.*; import ivorius.psychedelicraft.entity.drug.type.WarmthDrug; import net.minecraft.client.gui.DrawContext; @@ -23,7 +24,7 @@ protected void render(DrawContext context, Window window, float tickDelta, DrugP } private void renderWarmthOverlay(DrawContext context, float alpha, int width, int height, int ticks) { - var buffer = context.getVertexConsumers().getBuffer(RenderLayer.getEntityTranslucent(COFFEE_OVERLAY)); + var buffer = RenderUtil.getBuffer(RenderLayer.getEntityTranslucent(COFFEE_OVERLAY)); final int segWidth = width / 9; final int segHeight = height / 3; @@ -46,7 +47,7 @@ private void renderWarmthOverlay(DrawContext context, float alpha, int width, in float mY = (float) y / (float) steps * height / 7 * 5 + segHeight; if (init) { - int color = ColorHelper.Argb.fromFloats( + int color = ColorHelper.fromFloats( Math.max(0, alpha - prog * 0.4F), 1, 0.5F + prog * 0.3F, diff --git a/src/main/java/ivorius/psychedelicraft/client/render/shader/GeometryShader.java b/src/main/java/ivorius/psychedelicraft/client/render/shader/GeometryShader.java index 46ca7f1c..ef19a5c2 100644 --- a/src/main/java/ivorius/psychedelicraft/client/render/shader/GeometryShader.java +++ b/src/main/java/ivorius/psychedelicraft/client/render/shader/GeometryShader.java @@ -49,11 +49,6 @@ public class GeometryShader { map.put("PS_SurfaceFractalSampler", () -> MinecraftClient.getInstance().getTextureManager().getTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE).getGlId()); }); - public void setup(Type type, String domain, String name) { - this.name = Identifier.of(name); - this.type = type; - } - public void setup(Type type, Identifier name) { this.name = name; this.type = type; diff --git a/src/main/java/ivorius/psychedelicraft/client/screen/AbstractFluidContraptionScreen.java b/src/main/java/ivorius/psychedelicraft/client/screen/AbstractFluidContraptionScreen.java index ec9b0175..99d60c90 100644 --- a/src/main/java/ivorius/psychedelicraft/client/screen/AbstractFluidContraptionScreen.java +++ b/src/main/java/ivorius/psychedelicraft/client/screen/AbstractFluidContraptionScreen.java @@ -13,6 +13,7 @@ import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; import net.minecraft.util.Formatting; +import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.MathHelper; import com.mojang.blaze3d.systems.RenderSystem; @@ -54,7 +55,7 @@ public static void drawTank(DrawContext context, Resovoir tank, int x, int y, in float[] color = appearance.rgba(); - RenderUtil.drawRepeatingSprite(context, appearance.sprite(), x, y - fluidHeightPixels, width, fluidHeightPixels, color[0], color[1], color[2], color[3]); + RenderUtil.drawRepeatingSprite(context, appearance.sprite(), x, y - fluidHeightPixels, width, fluidHeightPixels, ColorHelper.fromFloats(color[3], color[0], color[1], color[2])); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } @@ -71,7 +72,7 @@ public static void drawTank(DrawContext context, ItemFluids fluids, int capacity float[] color = appearance.rgba(); - RenderUtil.drawRepeatingSprite(context, appearance.sprite(), x, y + height - fluidHeightPixels, width, fluidHeightPixels, color[0], color[1], color[2], color[3]); + RenderUtil.drawRepeatingSprite(context, appearance.sprite(), x, y + height - fluidHeightPixels, width, fluidHeightPixels, ColorHelper.fromFloats(color[3], color[0], color[1], color[2])); RenderSystem.disableBlend(); RenderSystem.defaultBlendFunc(); } diff --git a/src/main/java/ivorius/psychedelicraft/entity/drug/DrugProperties.java b/src/main/java/ivorius/psychedelicraft/entity/drug/DrugProperties.java index 0d7e8dfc..36cffd54 100644 --- a/src/main/java/ivorius/psychedelicraft/entity/drug/DrugProperties.java +++ b/src/main/java/ivorius/psychedelicraft/entity/drug/DrugProperties.java @@ -22,6 +22,7 @@ import ivorius.psychedelicraft.util.NbtSerialisable; import net.minecraft.block.Blocks; import net.minecraft.block.FireBlock; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; import net.minecraft.entity.*; import net.minecraft.entity.attribute.*; import net.minecraft.entity.attribute.EntityAttributeModifier.Operation; @@ -85,6 +86,10 @@ public static DrugProperties of(PlayerEntity player) { return ((DrugPropertiesContainer)player).getDrugProperties(); } + public static Optional of(LivingEntityRenderState state) { + return Optional.ofNullable(((DrugPropertiesContainer)state).getDrugProperties()); + } + public static Stream stream(Entity entity) { if (entity instanceof DrugPropertiesContainer c) { return Stream.of(c.getDrugProperties()); diff --git a/src/main/java/ivorius/psychedelicraft/entity/drug/DrugPropertiesContainer.java b/src/main/java/ivorius/psychedelicraft/entity/drug/DrugPropertiesContainer.java index cfa700b6..dd07ba68 100644 --- a/src/main/java/ivorius/psychedelicraft/entity/drug/DrugPropertiesContainer.java +++ b/src/main/java/ivorius/psychedelicraft/entity/drug/DrugPropertiesContainer.java @@ -2,4 +2,8 @@ public interface DrugPropertiesContainer { DrugProperties getDrugProperties(); + + interface Mutable { + void setDrugProperties(DrugProperties properties); + } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/MixinAbstractFurnaceBlockEntity.java b/src/main/java/ivorius/psychedelicraft/mixin/MixinAbstractFurnaceBlockEntity.java index c5d4bf7c..4b727780 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/MixinAbstractFurnaceBlockEntity.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/MixinAbstractFurnaceBlockEntity.java @@ -19,8 +19,7 @@ abstract class MixinAbstractFurnaceBlockEntity { target = "net/minecraft/item/ItemStack.decrement(I)V" ) ) - private static void onTick(World world, BlockPos pos, BlockState state, - AbstractFurnaceBlockEntity blockEntity, CallbackInfo info) { + private static void onTick(World world, BlockPos pos, BlockState state, AbstractFurnaceBlockEntity blockEntity, CallbackInfo info) { ItemStack fuel = blockEntity.getStack(1); if (fuel.getItem() instanceof SmokeableItem smokeable) { smokeable.onIncinerated(fuel, world, pos, blockEntity); diff --git a/src/main/java/ivorius/psychedelicraft/mixin/MixinHungerManager.java b/src/main/java/ivorius/psychedelicraft/mixin/MixinHungerManager.java index 43703dd2..12d9affa 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/MixinHungerManager.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/MixinHungerManager.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import ivorius.psychedelicraft.entity.drug.GluttonyManager; import ivorius.psychedelicraft.entity.drug.LockableHungerManager; @@ -31,25 +31,19 @@ private void onAdd(int food, float saturationModifier, CallbackInfo info) { } } - @Inject(method = "isNotFull()Z", at = @At("HEAD"), cancellable = true) - private void onIsNotFull(CallbackInfoReturnable info) { - if (lockedState != null) { - info.setReturnValue(!lockedState.full()); - } + @ModifyReturnValue(method = "isNotFull()Z", at = @At("RETURN")) + private boolean onIsNotFull(boolean notFull) { + return lockedState != null ? !lockedState.full() : notFull; } - @Inject(method = "getFoodLevel()I", at = @At("HEAD"), cancellable = true) - private void onGetFoodLevel(CallbackInfoReturnable info) { - if (lockedState != null) { - info.setReturnValue((int)lockedState.hunger().toFloat(foodLevel)); - } + @ModifyReturnValue(method = "getFoodLevel()I", at = @At("RETURN")) + private int onGetFoodLevel(int foodLevel) { + return lockedState != null ? (int)lockedState.hunger().toFloat(foodLevel) : foodLevel; } - @Inject(method = "getSaturationLevel()F", at = @At("HEAD"), cancellable = true) - private void onGetSaturationLevel(CallbackInfoReturnable info) { - if (lockedState != null) { - info.setReturnValue(lockedState.saturation().toFloat(saturationLevel)); - } + @ModifyReturnValue(method = "getSaturationLevel()F", at = @At("RETURN")) + private float onGetSaturationLevel(float saturation) { + return lockedState != null ? lockedState.saturation().toFloat(saturation) : saturation; } @Inject(method = { "setFoodLevel(I)V", "setSaturationLevel(F)V" }, at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/ivorius/psychedelicraft/mixin/MixinPlayerEntity.java b/src/main/java/ivorius/psychedelicraft/mixin/MixinPlayerEntity.java index 3f73a805..4d93e668 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/MixinPlayerEntity.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/MixinPlayerEntity.java @@ -10,6 +10,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.google.common.base.Suppliers; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.mojang.datafixers.util.Either; import ivorius.psychedelicraft.entity.drug.*; @@ -58,9 +59,9 @@ private void onTrySleep(BlockPos pos, CallbackInfoReturnable info) { - info.setReturnValue(info.getReturnValue() * getDrugProperties().getModifier(Drug.DIG_SPEED)); + @ModifyReturnValue(method = "getBlockBreakingSpeed", at = @At("RETURN")) + private float onGetBlockBreakingSpeed(float speed, BlockState block) { + return speed * getDrugProperties().getModifier(Drug.DIG_SPEED); } @Inject(method = "writeCustomDataToNbt", at = @At("HEAD")) diff --git a/src/main/java/ivorius/psychedelicraft/mixin/MixinStructurePool.java b/src/main/java/ivorius/psychedelicraft/mixin/MixinStructurePool.java index f373e826..6110785d 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/MixinStructurePool.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/MixinStructurePool.java @@ -24,11 +24,11 @@ interface MixinStructurePool extends MutableStructurePool { void setElements(ObjectArrayList elements); @Override - @Accessor + @Accessor("elementWeights") List> getElementCounts(); @Override - @Accessor + @Accessor("elementWeights") @Mutable void setElementCounts(List> elementCounts); } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/MixinVillagerTasks.java b/src/main/java/ivorius/psychedelicraft/mixin/MixinVillagerTasks.java index 7256aebf..b3defd17 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/MixinVillagerTasks.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/MixinVillagerTasks.java @@ -34,7 +34,7 @@ private static void onTryLoseJobSite(ServerWorld world, VillagerEntity entity, l @Mixin(VillagerTaskListProvider.class) abstract class MixinVillagerTaskListProvider { @Shadow - static Pair> createBusyFollowTask() { return null; } + private static Pair> createBusyFollowTask() { return null; } @Inject(method = "createWorkTasks(Lnet/minecraft/village/VillagerProfession;F)Lcom/google/common/collect/ImmutableList;", at = @At("HEAD"), cancellable = true) private static void onCreateWorkTasks(VillagerProfession profession, float speed, diff --git a/src/main/java/ivorius/psychedelicraft/mixin/MixinVoxelShape.java b/src/main/java/ivorius/psychedelicraft/mixin/MixinVoxelShape.java index dd10003a..124f9999 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/MixinVoxelShape.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/MixinVoxelShape.java @@ -2,8 +2,7 @@ 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; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -12,20 +11,19 @@ @Mixin(VoxelShape.class) abstract class MixinVoxelShape { - // Raytrace fix for block collissions that extend beyond their tile - @Inject(method = "raycast", at = @At("RETURN"), cancellable = true) - private void raycast(Vec3d start, Vec3d end, BlockPos pos, CallbackInfoReturnable info) { - BlockHitResult result = info.getReturnValue(); + // Raytrace fix for block collisions that extend beyond their tile + @ModifyReturnValue(method = "raycast", at = @At("RETURN")) + private BlockHitResult raycast(BlockHitResult result, Vec3d start, Vec3d end, BlockPos pos) { if (result == null) { - return; + return result; } Vec3d diff = result.getPos().subtract(Vec3d.ofCenter(result.getBlockPos())); final double maxDiff = 1.0000001; if (Math.abs(diff.getX()) < maxDiff && Math.abs(diff.getY()) < maxDiff && Math.abs(diff.getZ()) < maxDiff) { - return; + return result; } - info.setReturnValue(result.withBlockPos(BlockPos.ofFloored(result.getPos()))); + return result.withBlockPos(BlockPos.ofFloored(result.getPos())); } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinChatScreen.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinChatScreen.java index 1a61c980..680a01aa 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinChatScreen.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinChatScreen.java @@ -4,9 +4,7 @@ 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; - +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.mojang.authlib.GameProfile; import ivorius.psychedelicraft.entity.drug.DrugProperties; @@ -25,34 +23,31 @@ abstract class MixinChatScreen extends Screen { MixinChatScreen() { super(null); } - @Inject(method = "normalize(Ljava/lang/String;)Ljava/lang/String;", - at = @At("RETURN"), - cancellable = true) - public void onNormalize(String chatText, CallbackInfoReturnable info) { - info.setReturnValue(MessageDistorter.INSTANCE.distortOutgoingMessage(client.player, info.getReturnValue())); + @ModifyReturnValue(method = "normalize(Ljava/lang/String;)Ljava/lang/String;", at = @At("RETURN")) + private String onNormalize(String message) { + return MessageDistorter.INSTANCE.distortOutgoingMessage(client.player, message); } } @Mixin(ChatMessages.class) abstract class MixinChatMessages { - @Inject(method = "getRenderedChatMessage(Ljava/lang/String;)Ljava/lang/String;", - at = @At("RETURN"), - cancellable = true) - private static void onGetRenderedChatMessage(String message, CallbackInfoReturnable info) { - info.setReturnValue(MessageDistorter.INSTANCE.distortIncomingMessage(MinecraftClient.getInstance().player, info.getReturnValue())); + @ModifyReturnValue(method = "getRenderedChatMessage(Ljava/lang/String;)Ljava/lang/String;", at = @At("RETURN")) + private static String onGetRenderedChatMessage(String message) { + return MessageDistorter.INSTANCE.distortIncomingMessage(MinecraftClient.getInstance().player, message); } } @Mixin(MessageHandler.class) abstract class MixinMessageHandler { - @Inject(method = "processChatMessageInternal", at = @At("RETURN")) - private void onProcessChatMessageInternal(MessageType.Parameters params, SignedMessage message, Text decorated, GameProfile sender, boolean onlyShowSecureChat, Instant receptionTimestamp, CallbackInfoReturnable info) { - if (info.getReturnValueZ()) { + @ModifyReturnValue(method = "processChatMessageInternal(Lnet/minecraft/network/message/MessageType$Parameters;Lnet/minecraft/network/message/SignedMessage;Lnet/minecraft/text/Text;Lcom/mojang/authlib/GameProfile;ZLjava/time/Instant;)Z", at = @At("RETURN")) + private boolean onProcessChatMessageInternal(boolean success, MessageType.Parameters params, SignedMessage message, Text decorated, GameProfile sender, boolean onlyShowSecureChat, Instant receptionTimestamp) { + if (success) { DrugProperties.of((Entity)MinecraftClient.getInstance().player).ifPresent(properties -> { properties.getHallucinations().getEntities().getChatBots().forEach(chatbot -> { chatbot.onMessageReceived(sender.getName(), decorated); }); }); } + return success; } } \ No newline at end of file diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinEntityRenderDispatcher.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinEntityRenderDispatcher.java index ed924c8f..91f6f6d3 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinEntityRenderDispatcher.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinEntityRenderDispatcher.java @@ -14,7 +14,7 @@ @Mixin(EntityRenderDispatcher.class) abstract class MixinEntityRenderDispatcher { - @ModifyVariable(method = "render", at = @At("HEAD"), index = 1) + @ModifyVariable(method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), index = 1) private Entity swapEntity(Entity entity) { return DrugProperties.of((Entity)MinecraftClient.getInstance().player) .stream() diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinGameRenderer.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinGameRenderer.java index ff536c29..03c957de 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinGameRenderer.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinGameRenderer.java @@ -8,9 +8,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ivorius.psychedelicraft.client.render.DrugRenderer; import ivorius.psychedelicraft.client.render.RenderPhase; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.RenderTickCounter; +import net.minecraft.client.util.Pool; import net.minecraft.client.util.math.MatrixStack; @Mixin(GameRenderer.class) @@ -18,6 +20,9 @@ abstract class MixinGameRenderer { @Shadow private @Final Camera camera; + @Shadow + private @Final Pool pool; + @Inject(method = "tiltViewWhenHurt", at = @At("HEAD")) private void onRenderWorld(MatrixStack matrices, float tickDelta, CallbackInfo info) { DrugRenderer.INSTANCE.distortScreen(matrices, camera, tickDelta); @@ -33,8 +38,9 @@ private void afterRenderWorld(RenderTickCounter tickCounter, CallbackInfo info) RenderPhase.pop(); } - @Inject(method = "onResized", at = @At("HEAD")) - private void onResized(int width, int height, CallbackInfo info) { - DrugRenderer.INSTANCE.getPostEffects().setupDimensions(width, height); + @Inject(method = "render(Lnet/minecraft/client/render/RenderTickCounter;Z)V", + at = @At(value = "INVOKE", target = "net/minecraft/client/gui/hud/InGameHud.render(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V")) + private void onRenderHud(DrawContext context, RenderTickCounter tickCounter, CallbackInfo info) { + DrugRenderer.INSTANCE.onRenderOverlay(pool, context, tickCounter); } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinInGameHud.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinInGameHud.java deleted file mode 100644 index 6608e96e..00000000 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinInGameHud.java +++ /dev/null @@ -1,19 +0,0 @@ -package ivorius.psychedelicraft.mixin.client; - -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.CallbackInfo; - -import ivorius.psychedelicraft.client.render.DrugRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.render.RenderTickCounter; - -@Mixin(InGameHud.class) -abstract class MixinInGameHud { - @Inject(method = "render(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V", at = @At("HEAD")) - private void onRender(DrawContext context, RenderTickCounter tickCounter, CallbackInfo info) { - DrugRenderer.INSTANCE.onRenderOverlay(context, tickCounter); - } -} diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinItemModels.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinItemModels.java deleted file mode 100644 index e7af4d35..00000000 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinItemModels.java +++ /dev/null @@ -1,23 +0,0 @@ -package ivorius.psychedelicraft.mixin.client; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -import ivorius.psychedelicraft.item.SuspiciousItem; -import net.minecraft.client.render.item.ItemModels; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -@Mixin(ItemModels.class) -abstract class MixinItemModels { - @ModifyVariable(method = "getModel(Lnet/minecraft/item/ItemStack;)Lnet/minecraft/client/render/model/BakedModel;", - at = @At("HEAD"), - index = 1) - private ItemStack modifyStack(ItemStack stack) { - if (stack.getItem() instanceof SuspiciousItem sus) { - return sus.getHallucinatedItem().map(Item::getDefaultStack).orElse(stack); - } - return stack; - } -} diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderState.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderState.java new file mode 100644 index 00000000..f985c90a --- /dev/null +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderState.java @@ -0,0 +1,21 @@ +package ivorius.psychedelicraft.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; + +import ivorius.psychedelicraft.entity.drug.DrugProperties; +import ivorius.psychedelicraft.entity.drug.DrugPropertiesContainer; +import net.minecraft.client.render.entity.state.LivingEntityRenderState; + +@Mixin(LivingEntityRenderState.class) +abstract class MixinLivingEntityRenderState implements DrugPropertiesContainer.Mutable { + private DrugProperties psychedelicraft_drugProperties; + + public DrugProperties getDrugProperties() { + return psychedelicraft_drugProperties; + } + + @Override + public void setDrugProperties(DrugProperties properties) { + psychedelicraft_drugProperties = properties; + } +} diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderer.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderer.java index 3b6ea187..7d6bd327 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderer.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinLivingEntityRenderer.java @@ -16,6 +16,7 @@ import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.render.entity.model.EntityModel; import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import net.minecraft.client.render.entity.state.PlayerEntityRenderState; import net.minecraft.client.render.entity.state.VillagerEntityRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.LivingEntity; @@ -30,16 +31,10 @@ abstract class MixinLivingEntityRenderer)getModel()); } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinMouse.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinMouse.java index 38e558e9..adc48333 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinMouse.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinMouse.java @@ -17,12 +17,12 @@ abstract class MixinMouse { private double cursorDeltaY; @Inject(method = "updateMouse", at = @At("HEAD")) - private void beforeUpdateMouse(CallbackInfo info) { + private void beforeUpdateMouse(double timeDelta, CallbackInfo info) { SmoothCameraHelper.INSTANCE.setCursorDelta((float)cursorDeltaX, (float)cursorDeltaY); } @Inject(method = "updateMouse", at = @At("RETURN")) - private void onUpdateMouse(CallbackInfo info) { + private void onUpdateMouse(double timeDelta, CallbackInfo info) { SmoothCameraHelper.INSTANCE.applyCameraChange(); } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinShaderProgram.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinShaderProgram.java index 1fbbdb4a..e90b9117 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinShaderProgram.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinShaderProgram.java @@ -1,20 +1,19 @@ package ivorius.psychedelicraft.mixin.client; -import java.io.IOException; -import java.io.InputStream; import java.util.List; import java.util.Map; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - +import com.google.common.collect.ImmutableMap.Builder; import com.mojang.blaze3d.systems.RenderSystem; import ivorius.psychedelicraft.client.render.shader.GeometryShader; import net.minecraft.client.gl.*; import net.minecraft.client.gl.CompiledShader.Type; +import net.minecraft.resource.Resource; +import net.minecraft.util.Identifier; @Mixin(ShaderProgram.class) abstract class MixinShaderProgram implements AutoCloseable { @@ -56,10 +55,10 @@ private String modifySource(String source) { } } -@Mixin(CompiledShader.class) -abstract class MixinShaderStage { - @Inject(method = "load", at = @At("HEAD")) - private static void onLoad(Type type, String name, InputStream stream, String domain, GlImportProcessor loader, CallbackInfoReturnable info) throws IOException { - GeometryShader.INSTANCE.setup(type, domain, name); +@Mixin(ShaderLoader.class) +abstract class MixinShaderLoader { + @Inject(method = "loadShaderSource(Lnet/minecraft/util/Identifier;Lnet/minecraft/resource/Resource;Lnet/minecraft/client/gl/CompiledShader$Type;Ljava/util/Map;Lcom/google/common/collect/ImmutableMap$Builder;)V", at = @At("HEAD")) + private static void onLoadShaderSource(Identifier id, Resource resource, Type type, Map allResources, @SuppressWarnings("rawtypes") Builder builder, CallbackInfo info) { + GeometryShader.INSTANCE.setup(type, type.createFinder().toResourceId(id)); } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinSoundSystem.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinSoundSystem.java index a7ebfc42..877dbac7 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinSoundSystem.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinSoundSystem.java @@ -1,25 +1,22 @@ package ivorius.psychedelicraft.mixin.client; -import org.jetbrains.annotations.Nullable; 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; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import ivorius.psychedelicraft.entity.drug.Drug; import ivorius.psychedelicraft.entity.drug.DrugProperties; import net.minecraft.client.MinecraftClient; import net.minecraft.client.sound.SoundSystem; import net.minecraft.entity.Entity; -import net.minecraft.sound.SoundCategory; import net.minecraft.util.math.MathHelper; @Mixin(SoundSystem.class) abstract class MixinSoundSystem { - @Inject(method = "getSoundVolume", at = @At("RETURN"), cancellable = true) - private void getSoundVolume(@Nullable SoundCategory category, CallbackInfoReturnable info) { - DrugProperties.of((Entity)MinecraftClient.getInstance().player).ifPresent(properties -> { - info.setReturnValue(MathHelper.clamp(info.getReturnValueF() * properties.getModifier(Drug.SOUND_VOLUME), 0, 1)); - }); + @ModifyReturnValue(method = "getSoundVolume", at = @At("RETURN")) + private float getSoundVolume(float volume) { + return DrugProperties.of((Entity)MinecraftClient.getInstance().player) + .map(properties -> MathHelper.clamp(volume * properties.getModifier(Drug.SOUND_VOLUME), 0, 1)) + .orElse(volume); } } diff --git a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinWorldRenderer.java b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinWorldRenderer.java index e9d8833b..087c0a93 100644 --- a/src/main/java/ivorius/psychedelicraft/mixin/client/MixinWorldRenderer.java +++ b/src/main/java/ivorius/psychedelicraft/mixin/client/MixinWorldRenderer.java @@ -10,8 +10,8 @@ @Mixin(WorldRenderer.class) abstract class MixinWorldRenderer { - private static final String SKY = "renderSky(Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;FLnet/minecraft/client/render/Camera;ZLjava/lang/Runnable;)V"; - private static final String CLOUDS = "renderClouds(Lnet/minecraft/client/util/math/MatrixStack;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;FDDD)V"; + private static final String SKY = "renderSky(Lnet/minecraft/client/render/FrameGraphBuilder;Lnet/minecraft/client/render/Camera;FLnet/minecraft/client/render/Fog;)V"; + private static final String CLOUDS = "renderClouds(Lnet/minecraft/client/render/FrameGraphBuilder;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;Lnet/minecraft/client/option/CloudRenderMode;Lnet/minecraft/util/math/Vec3d;FIF)V"; @Inject(method = SKY, at = @At("HEAD")) private void beforeRenderSky(CallbackInfo info) { diff --git a/src/main/resources/psychedelicraft.mixin.json b/src/main/resources/psychedelicraft.mixin.json index 97f3b0a0..3cf52e58 100644 --- a/src/main/resources/psychedelicraft.mixin.json +++ b/src/main/resources/psychedelicraft.mixin.json @@ -27,14 +27,13 @@ "client.MixinMouse", "client.MixinGLImportProcessor", "client.MixinShaderProgram", - "client.MixinShaderStage", + "client.MixinShaderLoader", "client.MixinSoundSystem", "client.MixinGameRenderer", "client.MixinWorldRenderer", "client.MixinHeldItemRenderer", - "client.MixinInGameHud", - "client.MixinItemModels", "client.MixinLivingEntityRenderer", + "client.MixinLivingEntityRenderState", "client.sodium.MixinGlProgram", "client.sodium.MixinGlProgram_Builder", "client.sodium.MixinShaderLoader"