diff --git a/gradle.properties b/gradle.properties index 4af1c01..f675a92 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.20.1 yarn_mappings=1.20.1+build.10 loader_version=0.18.3 # Mod Properties -mod_version=26.2.14 +mod_version=26.2.16 maven_group=dev.tggamesyt archives_base_name=szar # Dependencies diff --git a/src/client/java/dev/tggamesyt/szar/client/mixin/RadiatedItemRendererMixin.java b/src/client/java/dev/tggamesyt/szar/client/mixin/RadiatedItemRendererMixin.java index 30ec1f8..570eff1 100644 --- a/src/client/java/dev/tggamesyt/szar/client/mixin/RadiatedItemRendererMixin.java +++ b/src/client/java/dev/tggamesyt/szar/client/mixin/RadiatedItemRendererMixin.java @@ -1,23 +1,30 @@ package dev.tggamesyt.szar.client.mixin; +import dev.tggamesyt.szar.Szar; import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.json.ModelTransformationMode; -import net.minecraft.client.texture.SpriteAtlasTexture; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; +import net.minecraft.item.Item; +import net.minecraft.util.Identifier; import org.joml.Matrix4f; 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 java.util.Random; + @Mixin(ItemRenderer.class) public abstract class RadiatedItemRendererMixin { + private static final Identifier WHITE = + new Identifier(Szar.MOD_ID, "textures/block/white.png"); + @Inject( method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;)V", at = @At("TAIL") @@ -34,24 +41,72 @@ public abstract class RadiatedItemRendererMixin { if (!stack.hasNbt() || !stack.getNbt().getBoolean("Radiated")) return; - int x = Math.min(stack.getNbt().getInt("RadPixelX"), 15) / 2; - int y = Math.min(stack.getNbt().getInt("RadPixelY"), 15) / 2; + /* + * Generate deterministic random pixel position. + * Same stack type + same NBT → same pixel. + * No stored coordinates required. + */ + int seed = Item.getRawId(stack.getItem()); + + if (stack.hasNbt()) { + seed = 31 * seed + stack.getNbt().hashCode(); + } + + Random random = new Random(seed); + + int x = random.nextInt(16); + int y = random.nextInt(16); matrices.push(); + Matrix4f matrix = matrices.peek().getPositionMatrix(); - VertexConsumer vc = vertexConsumers.getBuffer(RenderLayer.getSolid()); // no atlas + VertexConsumer vc = vertexConsumers.getBuffer( + RenderLayer.getBeaconBeam(WHITE, false) + ); - float px = x / 16f; - float py = y / 16f; + // Convert 0–15 pixel coords into -0.5 → +0.5 item space + float px = (x / 16f) - 0.5f; + float py = (y / 16f) - 0.5f; float size = 1f / 16f; - float z = 0.01f; + float z = 0.5f; - // draw 1px green quad on top of item - vc.vertex(matrix, px, py, z).color(0f,1f,0f,1f).texture(0f,0f).overlay(overlay).light(light).normal(0f,0f,1f).next(); - vc.vertex(matrix, px + size, py, z).color(0f,1f,0f,1f).texture(0f,0f).overlay(overlay).light(light).normal(0f,0f,1f).next(); - vc.vertex(matrix, px + size, py + size, z).color(0f,1f,0f,1f).texture(0f,0f).overlay(overlay).light(light).normal(0f,0f,1f).next(); - vc.vertex(matrix, px, py + size, z).color(0f,1f,0f,1f).texture(0f,0f).overlay(overlay).light(light).normal(0f,0f,1f).next(); + // Bright radioactive green + float r = 0.35f; + float g = 1.0f; + float b = 0.35f; + + vc.vertex(matrix, px, py, z) + .color(r, g, b, 1f) + .texture(0f, 0f) + .overlay(overlay) + .light(0xF000F0) + .normal(0f, 0f, 1f) + .next(); + + vc.vertex(matrix, px + size, py, z) + .color(r, g, b, 1f) + .texture(0f, 0f) + .overlay(overlay) + .light(0xF000F0) + .normal(0f, 0f, 1f) + .next(); + + vc.vertex(matrix, px + size, py + size, z) + .color(r, g, b, 1f) + .texture(0f, 0f) + .overlay(overlay) + .light(0xF000F0) + .normal(0f, 0f, 1f) + .next(); + + vc.vertex(matrix, px, py + size, z) + .color(r, g, b, 1f) + .texture(0f, 0f) + .overlay(overlay) + .light(0xF000F0) + .normal(0f, 0f, 1f) + .next(); matrices.pop(); } diff --git a/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin.java b/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin.java index 7fe463b..8354cde 100644 --- a/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin.java +++ b/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin.java @@ -7,12 +7,11 @@ import net.minecraft.inventory.CraftingResultInventory; import net.minecraft.inventory.RecipeInputInventory; import net.minecraft.item.ItemStack; import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; -import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.screen.ScreenHandler; import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.screen.CraftingScreenHandler; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -32,44 +31,33 @@ public class CraftingScreenHandlerMixin { CraftingResultInventory resultInventory, CallbackInfo ci) { - if (world.isClient) return; - - ItemStack resultStack = ItemStack.EMPTY; - boolean hasRadiated = false; ItemStack foodStack = ItemStack.EMPTY; - // Check the crafting grid for (int i = 0; i < craftingInventory.size(); i++) { ItemStack stack = craftingInventory.getStack(i); if (stack.isEmpty()) continue; - if (stack.getItem() instanceof RadiatedItem) { - hasRadiated = true; - } else if (stack.isFood()) { - foodStack = stack; - } + if (stack.getItem() instanceof RadiatedItem) hasRadiated = true; + else if (stack.isFood()) foodStack = stack; } - // If we found a food + radiated item, make a new edible copy if (hasRadiated && !foodStack.isEmpty()) { - resultStack = new ItemStack(foodStack.getItem()); // preserves the original Item and its FoodComponent - resultStack.setCount(1); // optional: set to 1 + ItemStack resultStack = new ItemStack(foodStack.getItem()); + resultStack.setCount(1); resultStack.setNbt(foodStack.getNbt() != null ? foodStack.getNbt().copy() : null); - - // Add our custom NBT to mark radiation resultStack.getOrCreateNbt().putBoolean("Radiated", true); - resultStack.getOrCreateNbt().putInt("RadPixelX", player.getRandom().nextInt(16)); - resultStack.getOrCreateNbt().putInt("RadPixelY", player.getRandom().nextInt(16)); + + resultInventory.setStack(0, resultStack); + handler.setPreviousTrackedSlot(0, resultStack); + + if (player instanceof ServerPlayerEntity serverPlayer) { + serverPlayer.networkHandler.sendPacket( + new ScreenHandlerSlotUpdateS2CPacket(handler.syncId, handler.nextRevision(), 0, resultStack) + ); + } + + ci.cancel(); // prevent vanilla overwrite } - - // Set the crafting output - resultInventory.setStack(0, resultStack); - handler.setPreviousTrackedSlot(0, resultStack); - ((ServerPlayerEntity) player).networkHandler.sendPacket( - new ScreenHandlerSlotUpdateS2CPacket(handler.syncId, handler.nextRevision(), 0, resultStack) - ); - - ci.cancel(); // prevent vanilla recipe overwrite } } diff --git a/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin2.java b/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin2.java new file mode 100644 index 0000000..098d9f2 --- /dev/null +++ b/src/main/java/dev/tggamesyt/szar/mixin/CraftingScreenHandlerMixin2.java @@ -0,0 +1,48 @@ +package dev.tggamesyt.szar.mixin; + +import dev.tggamesyt.szar.RadiatedItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.CraftingResultInventory; +import net.minecraft.inventory.RecipeInputInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket; +import net.minecraft.screen.CraftingScreenHandler; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.screen.slot.CraftingResultSlot; +import net.minecraft.screen.slot.Slot; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(CraftingResultSlot.class) +public class CraftingScreenHandlerMixin2 { + + @Inject( + method = "onTakeItem", + at = @At("HEAD") + ) + private void onTakeRadiatedItem(PlayerEntity player, ItemStack stack, CallbackInfo ci) { + if (stack.hasNbt() && stack.getNbt().getBoolean("Radiated")) { + ScreenHandler handler = player.currentScreenHandler; + + // Only modify the 2x2 or 3x3 crafting grid slots (1-9) + for (int i = 1; i <= 9; i++) { + if (i >= handler.slots.size()) break; // safety check for 2x2 + Slot slot = handler.slots.get(i); + ItemStack slotStack = slot.getStack(); + if (!slotStack.isEmpty()) { + // Halve and round up + int newCount = (slotStack.getCount() / 2); + slotStack.setCount(newCount); + slot.markDirty(); + } + } + } + } +} diff --git a/src/main/resources/data/szar/recipes/baiter.json b/src/main/resources/data/szar/recipes/baiter.json new file mode 100644 index 0000000..75c50e0 --- /dev/null +++ b/src/main/resources/data/szar/recipes/baiter.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "minecraft:music_discs" + }, + { + "item": "szar:epstein_files" + } + ], + "result": { + "item": "szar:baiter", + "count": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/szar.mixins.json b/src/main/resources/szar.mixins.json index 2b31406..920619b 100644 --- a/src/main/resources/szar.mixins.json +++ b/src/main/resources/szar.mixins.json @@ -6,6 +6,7 @@ "mixins": [ "PlayerEntityMixin", "CraftingScreenHandlerMixin", + "CraftingScreenHandlerMixin2", "RadiatedItemMixin" ], "injectors": {