fixed radiated foods kinda
This commit is contained in:
@@ -6,7 +6,7 @@ minecraft_version=1.20.1
|
|||||||
yarn_mappings=1.20.1+build.10
|
yarn_mappings=1.20.1+build.10
|
||||||
loader_version=0.18.3
|
loader_version=0.18.3
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version=26.2.14
|
mod_version=26.2.16
|
||||||
maven_group=dev.tggamesyt
|
maven_group=dev.tggamesyt
|
||||||
archives_base_name=szar
|
archives_base_name=szar
|
||||||
# Dependencies
|
# Dependencies
|
||||||
|
|||||||
@@ -1,23 +1,30 @@
|
|||||||
package dev.tggamesyt.szar.client.mixin;
|
package dev.tggamesyt.szar.client.mixin;
|
||||||
|
|
||||||
|
import dev.tggamesyt.szar.Szar;
|
||||||
import net.minecraft.client.render.RenderLayer;
|
import net.minecraft.client.render.RenderLayer;
|
||||||
import net.minecraft.client.render.VertexConsumer;
|
import net.minecraft.client.render.VertexConsumer;
|
||||||
import net.minecraft.client.render.VertexConsumerProvider;
|
import net.minecraft.client.render.VertexConsumerProvider;
|
||||||
import net.minecraft.client.render.item.ItemRenderer;
|
import net.minecraft.client.render.item.ItemRenderer;
|
||||||
import net.minecraft.client.render.model.BakedModel;
|
import net.minecraft.client.render.model.BakedModel;
|
||||||
import net.minecraft.client.render.model.json.ModelTransformationMode;
|
import net.minecraft.client.render.model.json.ModelTransformationMode;
|
||||||
import net.minecraft.client.texture.SpriteAtlasTexture;
|
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
@Mixin(ItemRenderer.class)
|
@Mixin(ItemRenderer.class)
|
||||||
public abstract class RadiatedItemRendererMixin {
|
public abstract class RadiatedItemRendererMixin {
|
||||||
|
|
||||||
|
private static final Identifier WHITE =
|
||||||
|
new Identifier(Szar.MOD_ID, "textures/block/white.png");
|
||||||
|
|
||||||
@Inject(
|
@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",
|
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")
|
at = @At("TAIL")
|
||||||
@@ -34,24 +41,72 @@ public abstract class RadiatedItemRendererMixin {
|
|||||||
|
|
||||||
if (!stack.hasNbt() || !stack.getNbt().getBoolean("Radiated")) return;
|
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();
|
matrices.push();
|
||||||
|
|
||||||
Matrix4f matrix = matrices.peek().getPositionMatrix();
|
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;
|
// Convert 0–15 pixel coords into -0.5 → +0.5 item space
|
||||||
float py = y / 16f;
|
float px = (x / 16f) - 0.5f;
|
||||||
|
float py = (y / 16f) - 0.5f;
|
||||||
float size = 1f / 16f;
|
float size = 1f / 16f;
|
||||||
float z = 0.01f;
|
float z = 0.5f;
|
||||||
|
|
||||||
// draw 1px green quad on top of item
|
// Bright radioactive green
|
||||||
vc.vertex(matrix, px, py, z).color(0f,1f,0f,1f).texture(0f,0f).overlay(overlay).light(light).normal(0f,0f,1f).next();
|
float r = 0.35f;
|
||||||
vc.vertex(matrix, px + size, py, z).color(0f,1f,0f,1f).texture(0f,0f).overlay(overlay).light(light).normal(0f,0f,1f).next();
|
float g = 1.0f;
|
||||||
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();
|
float b = 0.35f;
|
||||||
vc.vertex(matrix, px, 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, 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();
|
matrices.pop();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,11 @@ import net.minecraft.inventory.CraftingResultInventory;
|
|||||||
import net.minecraft.inventory.RecipeInputInventory;
|
import net.minecraft.inventory.RecipeInputInventory;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
|
import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket;
|
||||||
import net.minecraft.screen.CraftingScreenHandler;
|
|
||||||
import net.minecraft.screen.ScreenHandler;
|
import net.minecraft.screen.ScreenHandler;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
|
import net.minecraft.screen.CraftingScreenHandler;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
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.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
@@ -32,44 +31,33 @@ public class CraftingScreenHandlerMixin {
|
|||||||
CraftingResultInventory resultInventory,
|
CraftingResultInventory resultInventory,
|
||||||
CallbackInfo ci) {
|
CallbackInfo ci) {
|
||||||
|
|
||||||
if (world.isClient) return;
|
|
||||||
|
|
||||||
ItemStack resultStack = ItemStack.EMPTY;
|
|
||||||
|
|
||||||
boolean hasRadiated = false;
|
boolean hasRadiated = false;
|
||||||
ItemStack foodStack = ItemStack.EMPTY;
|
ItemStack foodStack = ItemStack.EMPTY;
|
||||||
|
|
||||||
// Check the crafting grid
|
|
||||||
for (int i = 0; i < craftingInventory.size(); i++) {
|
for (int i = 0; i < craftingInventory.size(); i++) {
|
||||||
ItemStack stack = craftingInventory.getStack(i);
|
ItemStack stack = craftingInventory.getStack(i);
|
||||||
if (stack.isEmpty()) continue;
|
if (stack.isEmpty()) continue;
|
||||||
|
|
||||||
if (stack.getItem() instanceof RadiatedItem) {
|
if (stack.getItem() instanceof RadiatedItem) hasRadiated = true;
|
||||||
hasRadiated = true;
|
else if (stack.isFood()) foodStack = stack;
|
||||||
} else if (stack.isFood()) {
|
|
||||||
foodStack = stack;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we found a food + radiated item, make a new edible copy
|
|
||||||
if (hasRadiated && !foodStack.isEmpty()) {
|
if (hasRadiated && !foodStack.isEmpty()) {
|
||||||
resultStack = new ItemStack(foodStack.getItem()); // preserves the original Item and its FoodComponent
|
ItemStack resultStack = new ItemStack(foodStack.getItem());
|
||||||
resultStack.setCount(1); // optional: set to 1
|
resultStack.setCount(1);
|
||||||
resultStack.setNbt(foodStack.getNbt() != null ? foodStack.getNbt().copy() : null);
|
resultStack.setNbt(foodStack.getNbt() != null ? foodStack.getNbt().copy() : null);
|
||||||
|
|
||||||
// Add our custom NBT to mark radiation
|
|
||||||
resultStack.getOrCreateNbt().putBoolean("Radiated", true);
|
resultStack.getOrCreateNbt().putBoolean("Radiated", true);
|
||||||
resultStack.getOrCreateNbt().putInt("RadPixelX", player.getRandom().nextInt(16));
|
|
||||||
resultStack.getOrCreateNbt().putInt("RadPixelY", player.getRandom().nextInt(16));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the crafting output
|
|
||||||
resultInventory.setStack(0, resultStack);
|
resultInventory.setStack(0, resultStack);
|
||||||
handler.setPreviousTrackedSlot(0, resultStack);
|
handler.setPreviousTrackedSlot(0, resultStack);
|
||||||
((ServerPlayerEntity) player).networkHandler.sendPacket(
|
|
||||||
|
if (player instanceof ServerPlayerEntity serverPlayer) {
|
||||||
|
serverPlayer.networkHandler.sendPacket(
|
||||||
new ScreenHandlerSlotUpdateS2CPacket(handler.syncId, handler.nextRevision(), 0, resultStack)
|
new ScreenHandlerSlotUpdateS2CPacket(handler.syncId, handler.nextRevision(), 0, resultStack)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
ci.cancel(); // prevent vanilla recipe overwrite
|
ci.cancel(); // prevent vanilla overwrite
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/main/resources/data/szar/recipes/baiter.json
Normal file
15
src/main/resources/data/szar/recipes/baiter.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"type": "minecraft:crafting_shapeless",
|
||||||
|
"ingredients": [
|
||||||
|
{
|
||||||
|
"tag": "minecraft:music_discs"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"item": "szar:epstein_files"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"result": {
|
||||||
|
"item": "szar:baiter",
|
||||||
|
"count": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
"mixins": [
|
"mixins": [
|
||||||
"PlayerEntityMixin",
|
"PlayerEntityMixin",
|
||||||
"CraftingScreenHandlerMixin",
|
"CraftingScreenHandlerMixin",
|
||||||
|
"CraftingScreenHandlerMixin2",
|
||||||
"RadiatedItemMixin"
|
"RadiatedItemMixin"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
|
|||||||
Reference in New Issue
Block a user