aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/shcm/shsupercm/fabric/citresewn/mixin
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/shcm/shsupercm/fabric/citresewn/mixin')
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemRendererMixin.java61
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemStackMixin.java29
2 files changed, 89 insertions, 1 deletions
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemRendererMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemRendererMixin.java
index b19e901..4594d8f 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemRendererMixin.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemRendererMixin.java
@@ -1,8 +1,69 @@
package shcm.shsupercm.fabric.citresewn.mixin.citenchantment;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.render.*;
import net.minecraft.client.render.item.ItemRenderer;
+import net.minecraft.client.render.model.BakedModel;
+import net.minecraft.client.render.model.json.ModelTransformation;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.world.World;
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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+import shcm.shsupercm.fabric.citresewn.CITResewn;
+import shcm.shsupercm.fabric.citresewn.pack.cits.CITEnchantment;
@Mixin(ItemRenderer.class)
public class ItemRendererMixin {
+ @Inject(method = "getHeldItemModel", at = @At("TAIL"))
+ private void setAppliedContext(ItemStack stack, World world, LivingEntity entity, int seed, CallbackInfoReturnable<BakedModel> cir) {
+ if (CITResewn.INSTANCE.activeCITs != null)
+ CITResewn.INSTANCE.activeCITs.setEnchantmentAppliedContextCached(stack, world, entity);
+ }
+
+ @Inject(method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformation$Mode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;)V", at = @At("TAIL"))
+ private void clearAppliedContext(ItemStack stack, ModelTransformation.Mode renderMode, boolean leftHanded, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay, BakedModel model, CallbackInfo ci) {
+ if (CITResewn.INSTANCE.activeCITs != null)
+ CITResewn.INSTANCE.activeCITs.setEnchantmentAppliedContextCached(null, null, null);
+ }
+
+
+ @Inject(method = "getArmorGlintConsumer", cancellable = true, at = @At("RETURN"))
+ private static void getArmorGlintConsumer(VertexConsumerProvider provider, RenderLayer layer, boolean solid, boolean glint, CallbackInfoReturnable<VertexConsumer> cir) {
+ VertexConsumer vertexConsumer = solid ? CITEnchantment.GlintRenderLayer.ARMOR_GLINT.tryApply(cir.getReturnValue(), provider) : CITEnchantment.GlintRenderLayer.ARMOR_ENTITY_GLINT.tryApply(cir.getReturnValue(), provider);
+ if (vertexConsumer != null)
+ cir.setReturnValue(vertexConsumer);
+ }
+
+ @Inject(method = "getCompassGlintConsumer", cancellable = true, at = @At("RETURN"))
+ private static void getCompassGlintConsumer(VertexConsumerProvider provider, RenderLayer layer, MatrixStack.Entry entry, CallbackInfoReturnable<VertexConsumer> cir) {
+ VertexConsumer vertexConsumer = CITEnchantment.GlintRenderLayer.GLINT.tryApply(null, provider);
+ if (vertexConsumer != null)
+ cir.setReturnValue(VertexConsumers.union(new OverlayVertexConsumer(vertexConsumer, entry.getModel(), entry.getNormal()), cir.getReturnValue()));
+ }
+
+ @Inject(method = "getDirectCompassGlintConsumer", cancellable = true, at = @At("RETURN"))
+ private static void getDirectCompassGlintConsumer(VertexConsumerProvider provider, RenderLayer layer, MatrixStack.Entry entry, CallbackInfoReturnable<VertexConsumer> cir) {
+ VertexConsumer vertexConsumer = CITEnchantment.GlintRenderLayer.DIRECT_GLINT.tryApply(null, provider);
+ if (vertexConsumer != null)
+ cir.setReturnValue(VertexConsumers.union(new OverlayVertexConsumer(vertexConsumer, entry.getModel(), entry.getNormal()), cir.getReturnValue()));
+ }
+
+ @Inject(method = "getItemGlintConsumer", cancellable = true, at = @At("RETURN"))
+ private static void getItemGlintConsumer(VertexConsumerProvider provider, RenderLayer layer, boolean solid, boolean glint, CallbackInfoReturnable<VertexConsumer> cir) {
+ VertexConsumer vertexConsumer = MinecraftClient.isFabulousGraphicsOrBetter() && layer == TexturedRenderLayers.getItemEntityTranslucentCull() ? CITEnchantment.GlintRenderLayer.GLINT_TRANSLUCENT.tryApply(cir.getReturnValue(), provider) : (solid ? CITEnchantment.GlintRenderLayer.GLINT.tryApply(cir.getReturnValue(), provider) : CITEnchantment.GlintRenderLayer.ENTITY_GLINT.tryApply(cir.getReturnValue(), provider));
+ if (vertexConsumer != null)
+ cir.setReturnValue(vertexConsumer);
+ }
+
+ @Inject(method = "getDirectItemGlintConsumer", cancellable = true, at = @At("RETURN"))
+ private static void getDirectItemGlintConsumer(VertexConsumerProvider provider, RenderLayer layer, boolean solid, boolean glint, CallbackInfoReturnable<VertexConsumer> cir) {
+ VertexConsumer vertexConsumer = solid ? CITEnchantment.GlintRenderLayer.DIRECT_GLINT.tryApply(cir.getReturnValue(), provider) : CITEnchantment.GlintRenderLayer.DIRECT_ENTITY_GLINT.tryApply(cir.getReturnValue(), provider);
+ if (vertexConsumer != null)
+ cir.setReturnValue(vertexConsumer);
+ }
} \ No newline at end of file
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemStackMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemStackMixin.java
index 07faf22..7ac7a3a 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemStackMixin.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/citenchantment/ItemStackMixin.java
@@ -2,7 +2,34 @@ package shcm.shsupercm.fabric.citresewn.mixin.citenchantment;
import net.minecraft.item.ItemStack;
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 shcm.shsupercm.fabric.citresewn.config.CITResewnConfig;
+import shcm.shsupercm.fabric.citresewn.pack.cits.CITEnchantment;
+
+import java.lang.ref.WeakReference;
+import java.util.List;
+import java.util.function.Supplier;
@Mixin(ItemStack.class)
-public class ItemStackMixin {
+public class ItemStackMixin implements CITEnchantment.Cached {
+ private WeakReference<List<CITEnchantment>> citresewn_cachedCITEnchantment = new WeakReference<>(null);
+ private long citresewn_cacheTimeCITEnchantment = 0;
+
+ @Override
+ public List<CITEnchantment> citresewn_getCachedCITEnchantment(Supplier<List<CITEnchantment>> realtime) {
+ if (System.currentTimeMillis() - citresewn_cacheTimeCITEnchantment >= CITResewnConfig.INSTANCE().cache_ms) {
+ citresewn_cachedCITEnchantment = new WeakReference<>(realtime.get());
+ citresewn_cacheTimeCITEnchantment = System.currentTimeMillis();
+ }
+
+ return citresewn_cachedCITEnchantment.get();
+ }
+
+ @Inject(method = "hasGlint", cancellable = true, at = @At("HEAD"))
+ private void disableDefaultGlint(CallbackInfoReturnable<Boolean> cir) {
+ if (CITEnchantment.appliedContext != null && !CITEnchantment.appliedContext.get(0).useGlint)
+ cir.setReturnValue(false);
+ }
}