diff --git a/.gitignore b/.gitignore index a25b798..e693502 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ bin/ # fabric -run/ \ No newline at end of file +run/ +/src/main/generated/.cache/ diff --git a/build.gradle b/build.gradle index 1f0aa7d..4bc0125 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.9-SNAPSHOT' id 'maven-publish' } @@ -31,6 +31,12 @@ dependencies { modLocalRuntime "com.terraformersmc:modmenu:${project.modmenu_version}" } +fabricApi { + configureDataGeneration() { + client = true + } +} + processResources { inputs.property "version", project.version diff --git a/gradle.properties b/gradle.properties index 76555ad..d9603a9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,24 +2,24 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop -minecraft_base_version=1.21 -minecraft_version=1.21 -yarn_mappings=1.21+build.2 -loader_version=0.15.11 +minecraft_base_version=1.21.4 +minecraft_version=1.21.4 +yarn_mappings=1.21.4+build.8 +loader_version=0.16.10 # Mod Properties -mod_version=0.2.3 +mod_version=0.3.0 maven_group=com.glisco archives_base_name=interactic # Dependencies -fabric_version=0.100.1+1.21 +fabric_version=0.115.1+1.21.4 # https://maven.terraformersmc.com/releases/com/terraformersmc/modmenu -modmenu_version = 11.0.0-rc.2 +modmenu_version = 13.0.1 -# https://maven.wispforest.io/io/wispforest/owo-lib/ -owo_version = 0.12.10+1.21 +# https://maven.wispforest.io/#/releases/io/wispforest/owo-lib/ +owo_version = 0.12.20+1.21.4 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index db4c326..77e5f2a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 64446d0..0a93213 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,5 @@ pluginManagement { repositories { - jcenter() maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' diff --git a/src/main/generated/assets/interactic/items/item_filter.json b/src/main/generated/assets/interactic/items/item_filter.json new file mode 100644 index 0000000..91977a7 --- /dev/null +++ b/src/main/generated/assets/interactic/items/item_filter.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "interactic:item/item_filter" + }, + "on_true": { + "type": "minecraft:model", + "model": "interactic:item/item_filter_enabled" + }, + "property": "interactic:enabled" + } +} \ No newline at end of file diff --git a/src/main/generated/assets/interactic/models/item/item_filter.json b/src/main/generated/assets/interactic/models/item/item_filter.json new file mode 100644 index 0000000..b607e36 --- /dev/null +++ b/src/main/generated/assets/interactic/models/item/item_filter.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "interactic:item/item_filter_disabled" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/interactic/models/item/item_filter_enabled.json b/src/main/generated/assets/interactic/models/item/item_filter_enabled.json similarity index 65% rename from src/main/resources/assets/interactic/models/item/item_filter_enabled.json rename to src/main/generated/assets/interactic/models/item/item_filter_enabled.json index da0d4dc..6072b14 100644 --- a/src/main/resources/assets/interactic/models/item/item_filter_enabled.json +++ b/src/main/generated/assets/interactic/models/item/item_filter_enabled.json @@ -1,5 +1,5 @@ { - "parent": "item/generated", + "parent": "minecraft:item/generated", "textures": { "layer0": "interactic:item/item_filter_enabled" } diff --git a/src/main/generated/data/interactic/advancement/recipes/tools/item_filter.json b/src/main/generated/data/interactic/advancement/recipes/tools/item_filter.json new file mode 100644 index 0000000..17e95c7 --- /dev/null +++ b/src/main/generated/data/interactic/advancement/recipes/tools/item_filter.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "get_item": { + "conditions": { + "items": [ + { + "items": "minecraft:crafting_table" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "interactic:item_filter" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "get_item" + ] + ], + "rewards": { + "recipes": [ + "interactic:item_filter" + ] + } +} \ No newline at end of file diff --git a/src/main/generated/data/interactic/recipe/item_filter.json b/src/main/generated/data/interactic/recipe/item_filter.json new file mode 100644 index 0000000..2e31df3 --- /dev/null +++ b/src/main/generated/data/interactic/recipe/item_filter.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "c": "minecraft:copper_ingot", + "e": "minecraft:ender_eye" + }, + "pattern": [ + " c ", + "cec", + " c " + ], + "result": { + "count": 1, + "id": "interactic:item_filter" + } +} \ No newline at end of file diff --git a/src/main/java/interactic/InteracticClientInit.java b/src/main/java/interactic/InteracticClientInit.java index 59da6e8..b6109f2 100644 --- a/src/main/java/interactic/InteracticClientInit.java +++ b/src/main/java/interactic/InteracticClientInit.java @@ -1,16 +1,17 @@ package interactic; +import interactic.data.EnabledProperty; +import interactic.itemfilter.ItemFilterScreen; import interactic.util.InteracticNetworking; -import io.wispforest.owo.config.ui.ConfigScreen; +import io.wispforest.owo.config.ui.ConfigScreenProviders; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.minecraft.client.gui.screen.ingame.HandledScreens; -import net.minecraft.client.item.ModelPredicateProviderRegistry; import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.render.item.property.bool.BooleanProperties; import net.minecraft.client.util.InputUtil; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; public class InteracticClientInit implements ClientModInitializer { @@ -19,15 +20,8 @@ public class InteracticClientInit implements ClientModInitializer { @Override public void onInitializeClient() { - if (InteracticInit.getConfig().itemFilterEnabled()) { - ModelPredicateProviderRegistry.register( - InteracticInit.getItemFilter(), - Identifier.of("enabled"), - (stack, world, entity, seed) -> stack.getOrDefault(ItemFilterItem.ENABLED, false) ? 1 : 0 - ); - } - HandledScreens.register(InteracticInit.ITEM_FILTER_SCREEN_HANDLER, ItemFilterScreen::new); + BooleanProperties.ID_MAPPER.put(InteracticInit.id("enabled"), EnabledProperty.CODEC); ClientTickEvents.END_CLIENT_TICK.register(client -> { while (PICKUP_ITEM.wasPressed()) { @@ -36,7 +30,7 @@ public void onInitializeClient() { } }); - ConfigScreen.registerProvider("interactic", InteracticConfigScreen::new); + ConfigScreenProviders.register("interactic", InteracticConfigScreen::new); InteracticNetworking.initClient(); } } diff --git a/src/main/java/interactic/InteracticInit.java b/src/main/java/interactic/InteracticInit.java index 628aa4f..8324b57 100644 --- a/src/main/java/interactic/InteracticInit.java +++ b/src/main/java/interactic/InteracticInit.java @@ -1,17 +1,16 @@ package interactic; -import interactic.mixin.ItemEntityAccessor; -import interactic.util.Helpers; +import interactic.itemfilter.ItemFilterItem; +import interactic.itemfilter.ItemFilterScreenHandler; import interactic.util.InteracticConfig; import interactic.util.InteracticNetworking; -import interactic.util.InteracticPlayerExtension; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.resource.featuretoggle.FeatureFlags; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.util.Identifier; @@ -51,7 +50,9 @@ public void onInitialize() { if (FabricLoader.getInstance().isModLoaded("iris")) itemRotationSpeedMultiplier = 0.5f; if (CONFIG.itemFilterEnabled()) { - ITEM_FILTER = Registry.register(Registries.ITEM, id("item_filter"), new ItemFilterItem()); + Identifier id = id("item_filter"); + RegistryKey key = RegistryKey.of(RegistryKeys.ITEM, id); + ITEM_FILTER = Registry.register(Registries.ITEM, id, new ItemFilterItem(key)); } InteracticNetworking.init(); diff --git a/src/main/java/interactic/data/EnabledProperty.java b/src/main/java/interactic/data/EnabledProperty.java new file mode 100644 index 0000000..bb0ad3e --- /dev/null +++ b/src/main/java/interactic/data/EnabledProperty.java @@ -0,0 +1,24 @@ +package interactic.data; + +import com.mojang.serialization.MapCodec; +import interactic.itemfilter.ItemFilterItem; +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 org.jetbrains.annotations.Nullable; + +public record EnabledProperty() implements BooleanProperty { + public static final MapCodec CODEC = MapCodec.unit(new EnabledProperty()); + + @Override + public boolean getValue(ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity user, int seed, ModelTransformationMode modelTransformationMode) { + return stack.getOrDefault(ItemFilterItem.ENABLED, false); + } + + @Override + public MapCodec getCodec() { + return CODEC; + } +} diff --git a/src/main/java/interactic/data/InteracticDataGen.java b/src/main/java/interactic/data/InteracticDataGen.java new file mode 100644 index 0000000..4114175 --- /dev/null +++ b/src/main/java/interactic/data/InteracticDataGen.java @@ -0,0 +1,14 @@ +package interactic.data; + +import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; +import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; + +public class InteracticDataGen implements DataGeneratorEntrypoint { + + @Override + public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { + var pack = fabricDataGenerator.createPack(); + pack.addProvider(ItemModelProvider::new); + pack.addProvider(ItemRecipeProvider::new); + } +} diff --git a/src/main/java/interactic/data/ItemModelProvider.java b/src/main/java/interactic/data/ItemModelProvider.java new file mode 100644 index 0000000..bab8c2b --- /dev/null +++ b/src/main/java/interactic/data/ItemModelProvider.java @@ -0,0 +1,35 @@ +package interactic.data; + +import interactic.InteracticInit; +import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.minecraft.client.data.*; +import net.minecraft.client.render.item.model.ItemModel; +import net.minecraft.item.Item; + +public class ItemModelProvider extends FabricModelProvider { + + public ItemModelProvider(FabricDataOutput output) { + super(output); + } + + @Override + public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) { + + } + + @Override + public void generateItemModels(ItemModelGenerator itemModelGenerator) { + Item item = InteracticInit.getItemFilter(); + + TextureMap textures = TextureMap.layer0(TextureMap.getSubId(item, "_disabled")); + Models.GENERATED.upload(ModelIds.getItemModelId(item), textures, itemModelGenerator.modelCollector); + ItemModel.Unbaked unbaked = ItemModels.basic(ModelIds.getItemModelId(item)); + + TextureMap texturesEnabled = TextureMap.layer0(TextureMap.getSubId(item, "_enabled")); + Models.GENERATED.upload(ModelIds.getItemSubModelId(item, "_enabled"), texturesEnabled, itemModelGenerator.modelCollector); + ItemModel.Unbaked unbakedEnabled = ItemModels.basic(ModelIds.getItemSubModelId(item, "_enabled")); + + itemModelGenerator.registerCondition(item, new EnabledProperty(), unbakedEnabled, unbaked); + } +} diff --git a/src/main/java/interactic/data/ItemRecipeProvider.java b/src/main/java/interactic/data/ItemRecipeProvider.java new file mode 100644 index 0000000..fb5babe --- /dev/null +++ b/src/main/java/interactic/data/ItemRecipeProvider.java @@ -0,0 +1,45 @@ +package interactic.data; + +import interactic.InteracticInit; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; +import net.minecraft.advancement.criterion.InventoryChangedCriterion; +import net.minecraft.data.recipe.RecipeExporter; +import net.minecraft.data.recipe.RecipeGenerator; +import net.minecraft.data.recipe.ShapedRecipeJsonBuilder; +import net.minecraft.item.Items; +import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper; + +import java.util.concurrent.CompletableFuture; + +public class ItemRecipeProvider extends FabricRecipeProvider { + + public ItemRecipeProvider(FabricDataOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected RecipeGenerator getRecipeGenerator(RegistryWrapper.WrapperLookup registryLookup, RecipeExporter exporter) { + return new RecipeGenerator(registryLookup, exporter) { + @Override + public void generate() { + var itemLookup = registryLookup.getOrThrow(RegistryKeys.ITEM); + ShapedRecipeJsonBuilder.create(itemLookup, RecipeCategory.TOOLS, InteracticInit.getItemFilter()) + .criterion("get_item", InventoryChangedCriterion.Conditions.items(Items.CRAFTING_TABLE)) + .pattern(" c ") + .pattern("cec") + .pattern(" c ") + .input('c', Items.COPPER_INGOT) + .input('e', Items.ENDER_EYE) + .offerTo(exporter); + } + }; + } + + @Override + public String getName() { + return "recipe"; + } +} diff --git a/src/main/java/interactic/ItemFilterItem.java b/src/main/java/interactic/itemfilter/ItemFilterItem.java similarity index 91% rename from src/main/java/interactic/ItemFilterItem.java rename to src/main/java/interactic/itemfilter/ItemFilterItem.java index b2b1169..b2e21e1 100644 --- a/src/main/java/interactic/ItemFilterItem.java +++ b/src/main/java/interactic/itemfilter/ItemFilterItem.java @@ -1,6 +1,7 @@ -package interactic; +package interactic.itemfilter; import com.mojang.serialization.Codec; +import interactic.InteracticInit; import interactic.util.InteracticNetworking; import io.wispforest.endec.Endec; import io.wispforest.endec.impl.RecordEndec; @@ -18,11 +19,12 @@ import net.minecraft.network.codec.PacketCodecs; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.screen.ScreenHandler; import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; import net.minecraft.util.collection.DefaultedList; import net.minecraft.world.World; import org.jetbrains.annotations.NotNull; @@ -44,7 +46,7 @@ public class ItemFilterItem extends Item { InteracticInit.id("item_filter_enabled"), ComponentType.builder() .codec(Codec.BOOL) - .packetCodec(PacketCodecs.BOOL) + .packetCodec(PacketCodecs.BOOLEAN) .build() ); @@ -53,7 +55,7 @@ public class ItemFilterItem extends Item { InteracticInit.id("item_filter_block_mode"), ComponentType.builder() .codec(Codec.BOOL) - .packetCodec(PacketCodecs.BOOL) + .packetCodec(PacketCodecs.BOOLEAN) .build() ); @@ -66,20 +68,23 @@ public class ItemFilterItem extends Item { .build() ); - public ItemFilterItem() { - super(new Settings().maxCount(1) + public ItemFilterItem(RegistryKey key) { + super(new Settings() + .maxCount(1) .component(ENABLED, true) .component(BLOCK_MODE, true) - .component(FILTER_SLOTS, DefaultedList.ofSize(ItemFilterScreenHandler.SLOT_COUNT, ItemStack.EMPTY))); + .component(FILTER_SLOTS, DefaultedList.ofSize(ItemFilterScreenHandler.SLOT_COUNT, ItemStack.EMPTY)) + .registryKey(key) + ); } @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + public ActionResult use(World world, PlayerEntity user, Hand hand) { final var playerStack = user.getStackInHand(hand); if (user.isSneaking()) { playerStack.apply(ENABLED, false, enabled -> !enabled); } else { - if (world.isClient) return TypedActionResult.success(playerStack); + if (world.isClient) return ActionResult.PASS; final var inv = new FilterInventory(playerStack); final var factory = new NamedScreenHandlerFactory() { @Override @@ -95,7 +100,7 @@ public Text getDisplayName() { user.openHandledScreen(factory); InteracticNetworking.CHANNEL.serverHandle(user).send(new SetFilterModePacket(inv.getFilterMode())); } - return TypedActionResult.success(playerStack); + return ActionResult.PASS; } public static List getItemsInFilter(ItemStack stack) { diff --git a/src/main/java/interactic/ItemFilterScreen.java b/src/main/java/interactic/itemfilter/ItemFilterScreen.java similarity index 84% rename from src/main/java/interactic/ItemFilterScreen.java rename to src/main/java/interactic/itemfilter/ItemFilterScreen.java index 32e6f17..bada32f 100644 --- a/src/main/java/interactic/ItemFilterScreen.java +++ b/src/main/java/interactic/itemfilter/ItemFilterScreen.java @@ -1,12 +1,11 @@ -package interactic; +package interactic.itemfilter; +import interactic.InteracticInit; import interactic.util.InteracticNetworking; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.TexturedButtonWidget; +import net.minecraft.client.render.RenderLayer; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -53,10 +52,10 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { @Override protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) { - context.drawTexture(TEXTURE, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight); + context.drawTexture(RenderLayer::getGuiTextured, TEXTURE, this.x, this.y, 0, 0, this.backgroundWidth, this.backgroundHeight, 256, 256); if (!this.blockMode) { - context.drawTexture(TEXTURE, this.x + 7, this.y + 19, 0, 178, 162, 54); + context.drawTexture(RenderLayer::getGuiTextured, TEXTURE, this.x + 7, this.y + 19, 0, 178, 162, 54, 256, 256); } } } diff --git a/src/main/java/interactic/ItemFilterScreenHandler.java b/src/main/java/interactic/itemfilter/ItemFilterScreenHandler.java similarity index 91% rename from src/main/java/interactic/ItemFilterScreenHandler.java rename to src/main/java/interactic/itemfilter/ItemFilterScreenHandler.java index bdd4664..7e54d39 100644 --- a/src/main/java/interactic/ItemFilterScreenHandler.java +++ b/src/main/java/interactic/itemfilter/ItemFilterScreenHandler.java @@ -1,10 +1,9 @@ -package interactic; +package interactic.itemfilter; +import interactic.InteracticInit; import interactic.util.InteracticNetworking; import io.wispforest.owo.client.screens.ScreenUtils; import io.wispforest.owo.client.screens.SlotGenerator; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; @@ -12,8 +11,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; public class ItemFilterScreenHandler extends ScreenHandler { diff --git a/src/main/java/interactic/mixin/InGameHudMixin.java b/src/main/java/interactic/mixin/InGameHudMixin.java index 99e453d..2d6d5fc 100644 --- a/src/main/java/interactic/mixin/InGameHudMixin.java +++ b/src/main/java/interactic/mixin/InGameHudMixin.java @@ -18,7 +18,7 @@ @Mixin(InGameHud.class) public class InGameHudMixin { - @Inject(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawGuiTexture(Lnet/minecraft/util/Identifier;IIII)V", ordinal = 0)) + @Inject(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawGuiTexture(Ljava/util/function/Function;Lnet/minecraft/util/Identifier;IIII)V", ordinal = 0)) private void renderItemTooltip(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { if (!InteracticInit.getConfig().renderItemTooltips()) return; diff --git a/src/main/java/interactic/mixin/ItemEntityMixin.java b/src/main/java/interactic/mixin/ItemEntityMixin.java index 9fe9e9d..4a4d26e 100644 --- a/src/main/java/interactic/mixin/ItemEntityMixin.java +++ b/src/main/java/interactic/mixin/ItemEntityMixin.java @@ -4,7 +4,6 @@ import interactic.util.Helpers; import interactic.util.InteracticItemExtensions; import interactic.util.ItemDamageSource; -import net.minecraft.component.ComponentType; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.AttributeModifiersComponent; import net.minecraft.entity.*; @@ -12,11 +11,9 @@ import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; import net.minecraft.server.world.ServerWorld; import net.minecraft.world.World; import org.apache.commons.lang3.mutable.MutableDouble; -import org.apache.commons.lang3.mutable.MutableFloat; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -89,13 +86,13 @@ private void dealThrowingDamage(CallbackInfo ci) { if (!this.wasThrown) return; final var hasDamageModifiers = this.getStack().getOrDefault(DataComponentTypes.ATTRIBUTE_MODIFIERS, AttributeModifiersComponent.DEFAULT) - .modifiers().stream().anyMatch(entry -> entry.attribute().value() == EntityAttributes.GENERIC_ATTACK_DAMAGE); + .modifiers().stream().anyMatch(entry -> entry.attribute().value() == EntityAttributes.ATTACK_DAMAGE); if (!(this.wasFullPower || hasDamageModifiers)) return; var damage = new MutableDouble(2d); if (hasDamageModifiers) { this.getStack().applyAttributeModifiers(EquipmentSlot.MAINHAND, (attribEntry, modifier) -> { - if (attribEntry.value() != EntityAttributes.GENERIC_ATTACK_DAMAGE || modifier.operation() != EntityAttributeModifier.Operation.ADD_VALUE) return; + if (attribEntry.value() != EntityAttributes.ATTACK_DAMAGE || modifier.operation() != EntityAttributeModifier.Operation.ADD_VALUE) return; damage.add(modifier.value()); }); } @@ -106,9 +103,9 @@ private void dealThrowingDamage(CallbackInfo ci) { final var target = entities.get(0); final var damageSource = new ItemDamageSource((ItemEntity) (Object) this, this.getOwner()); - if (target.hurtTime != 0 || target.isInvulnerableTo(damageSource)) return; + if (target.hurtTime != 0 || target.isInvulnerableTo((ServerWorld) world, damageSource)) return; - target.damage(damageSource, damage.floatValue()); + target.damage((ServerWorld) world, damageSource, damage.floatValue()); this.getStack().damage(1, (ServerWorld) world, null, item -> this.discard()); } diff --git a/src/main/java/interactic/mixin/ItemEntityRendererMixin.java b/src/main/java/interactic/mixin/ItemEntityRendererMixin.java index 124eb97..082a97c 100644 --- a/src/main/java/interactic/mixin/ItemEntityRendererMixin.java +++ b/src/main/java/interactic/mixin/ItemEntityRendererMixin.java @@ -2,16 +2,14 @@ import interactic.InteracticInit; import interactic.util.InteracticItemExtensions; -import net.minecraft.block.ShapeContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.entity.EntityRenderer; import net.minecraft.client.render.entity.EntityRendererFactory; import net.minecraft.client.render.entity.ItemEntityRenderer; -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.render.entity.state.ItemEntityRenderState; +import net.minecraft.client.render.item.ItemRenderState; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.ItemEntity; import net.minecraft.item.BlockItem; @@ -25,30 +23,25 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ItemEntityRenderer.class) -public abstract class ItemEntityRendererMixin extends EntityRenderer { - +public abstract class ItemEntityRendererMixin extends EntityRenderer { + private static final double TWO_PI = Math.PI * 2; private static final double HALF_PI = Math.PI * 0.5; private static final double THREE_HALF_PI = Math.PI * 1.5; + + @Unique + private ItemEntity entity; @Shadow @Final private Random random; - @Shadow - @Final - private ItemRenderer itemRenderer; - - @Shadow - static int getRenderedAmount(int stackSize) { - return 0; - } - private ItemEntityRendererMixin(EntityRendererFactory.Context dispatcher) { super(dispatcher); } @@ -57,9 +50,15 @@ private ItemEntityRendererMixin(EntityRendererFactory.Context dispatcher) { private void onConstructor(EntityRendererFactory.Context context, CallbackInfo ci) { this.shadowRadius = 0; } - - @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/entity/ItemEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", cancellable = true) - private void render(ItemEntity entity, float f, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light, CallbackInfo callback) { + + @Inject(at = @At("HEAD"), method = "Lnet/minecraft/client/render/entity/ItemEntityRenderer;updateRenderState(Lnet/minecraft/entity/ItemEntity;Lnet/minecraft/client/render/entity/state/ItemEntityRenderState;F)V") + private void updateRenderState(ItemEntity itemEntity, ItemEntityRenderState itemEntityRenderState, float f, CallbackInfo ci) { + this.entity = itemEntity; + } + + @SuppressWarnings("unchecked") + @Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/client/render/entity/state/ItemEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", cancellable = true) + private void render(ItemEntityRenderState itemEntityRenderState, MatrixStack matrices, VertexConsumerProvider vertexConsumerProvider, int light, CallbackInfo callback) { if (!InteracticInit.getConfig().fancyItemRendering()) return; ItemStack itemStack = entity.getStack(); @@ -70,33 +69,37 @@ private void render(ItemEntity entity, float f, float tickDelta, MatrixStack mat this.random.setSeed(seed); matrices.push(); - - BakedModel bakedModel = this.itemRenderer.getModel(itemStack, entity.getWorld(), null, seed); - final int renderCount = getRenderedAmount(itemStack.getCount()); + + ItemRenderState itemRenderState = itemEntityRenderState.itemRenderState; + final int renderCount = itemEntityRenderState.renderedAmount; InteracticItemExtensions rotator = (InteracticItemExtensions) entity; final var item = entity.getStack().getItem(); - final boolean treatAsDepthModel = item instanceof BlockItem && bakedModel.hasDepth(); + final boolean treatAsDepthModel = item instanceof BlockItem && itemRenderState.hasDepth(); + // 1.21.4 flat model rotation wobble fix + final boolean airborneAsDepthModel = true; - final var transform = bakedModel.getTransformation().ground; + final var transform = itemRenderState.getTransformation(); - final float scaleX = bakedModel.getTransformation().ground.scale.x; - final float scaleY = bakedModel.getTransformation().ground.scale.y; - final float scaleZ = bakedModel.getTransformation().ground.scale.z; + final float scaleX = itemRenderState.getTransformation().scale.x(); + final float scaleY = itemRenderState.getTransformation().scale.y(); + final float scaleZ = itemRenderState.getTransformation().scale.z(); // Calculate the distance the model's center is from the item entity's center using the block outline shape final double blockHeight = !treatAsDepthModel ? 0 : ((BlockItem) item).getBlock().getDefaultState().getOutlineShape(entity.getWorld(), entity.getBlockPos()).getMax(Direction.Axis.Y); final boolean isFlatBlock = treatAsDepthModel && blockHeight <= 0.75; - final double distanceToCenter = (0.5 - blockHeight + blockHeight / 2) * 0.25; + final double baseDistanceToCenter = (0.5 - blockHeight + blockHeight / 2) * 0.25; + // 1.21.4 rotation wobble fix + double distanceToCenter = baseDistanceToCenter - (treatAsDepthModel ? 0.20f : 0.25f); // Translate so that everything happens in the middle of the item hitbox matrices.translate(0, 0.125f, 0); // Move the model, so it's center is at the base of the item entity - if (treatAsDepthModel) matrices.translate(0, distanceToCenter, 0); + if (airborneAsDepthModel) matrices.translate(0, distanceToCenter, 0); // Calculate ground distance from either the amount of items or block height - float groundDistance = treatAsDepthModel ? (float) distanceToCenter : (float) (0.125 - 0.0625 * scaleZ); + float groundDistance = treatAsDepthModel ? (float) baseDistanceToCenter : (float) (0.125 - 0.0625 * scaleZ); if (!treatAsDepthModel) groundDistance -= (renderCount - 1) * 0.05 * scaleZ; matrices.translate(0, -groundDistance, 0); @@ -116,6 +119,7 @@ private void render(ItemEntity entity, float f, float tickDelta, MatrixStack mat if (angle >= TWO_PI) angle -= TWO_PI; // Clusterfuck our way back to either 0 or 180 degrees. There has to be a better way to do this + float tickDelta = MinecraftClient.getInstance().getRenderTickCounter().getTickDelta(false); if (entity.isOnGround() && !(angle == 0 || angle == (float) Math.PI)) { if (angle > Math.PI) { if (angle > THREE_HALF_PI) angle += tickDelta * 0.5; @@ -134,7 +138,7 @@ private void render(ItemEntity entity, float f, float tickDelta, MatrixStack mat } // Move the matrix back so the rotation happens around the model's center - if (treatAsDepthModel) matrices.translate(0, -distanceToCenter, 0); + if (airborneAsDepthModel) matrices.translate(0, -distanceToCenter, 0); // Spin the item and store the value inside it should it hit the ground next tick matrices.multiply(RotationAxis.POSITIVE_X.rotation((float) (angle + (isFlatBlock ? 0 : HALF_PI)))); @@ -147,7 +151,7 @@ private void render(ItemEntity entity, float f, float tickDelta, MatrixStack mat } // Undo the translation from before - if (treatAsDepthModel) { + if (airborneAsDepthModel) { matrices.translate(0, distanceToCenter, 0); } @@ -181,9 +185,10 @@ private void render(ItemEntity entity, float f, float tickDelta, MatrixStack mat // Only apply the scale and rotation part of the model transform to avoid weird issues with alignment and rotation matrices.multiply(new Quaternionf().rotateXYZ(transform.rotation.x, transform.rotation.y, transform.rotation.z)); - matrices.scale(scaleX, scaleY, scaleZ); + // 1.21.4 item shrinking fix +// matrices.scale(scaleX, scaleY, scaleZ); - this.itemRenderer.renderItem(itemStack, ModelTransformationMode.NONE, false, matrices, vertexConsumerProvider, light, OverlayTexture.DEFAULT_UV, bakedModel); + itemRenderState.render(matrices, vertexConsumerProvider, light, OverlayTexture.DEFAULT_UV); matrices.pop(); @@ -194,7 +199,7 @@ private void render(ItemEntity entity, float f, float tickDelta, MatrixStack mat } matrices.pop(); - super.render(entity, f, tickDelta, matrices, vertexConsumerProvider, light); + super.render(itemEntityRenderState, matrices, vertexConsumerProvider, light); callback.cancel(); } } diff --git a/src/main/java/interactic/mixin/MinecraftClientMixin.java b/src/main/java/interactic/mixin/MinecraftClientMixin.java index dc51458..3d0f365 100644 --- a/src/main/java/interactic/mixin/MinecraftClientMixin.java +++ b/src/main/java/interactic/mixin/MinecraftClientMixin.java @@ -5,19 +5,15 @@ import interactic.util.Helpers; import interactic.util.InteracticNetworking; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; import net.minecraft.client.option.GameOptions; import net.minecraft.client.util.InputUtil; import net.minecraft.entity.Entity; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.text.Text; import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -41,10 +37,6 @@ public class MinecraftClientMixin { @Nullable public Entity cameraEntity; - @Shadow - @Nullable - public ClientPlayerInteractionManager interactionManager; - @Shadow @Nullable public ClientPlayerEntity player; @@ -58,7 +50,7 @@ private void tryPickupItem(CallbackInfo ci) { if (!InteracticInit.getConfig().rightClickPickup()) return; if (KeyBindingHelper.getBoundKeyOf(InteracticClientInit.PICKUP_ITEM) != InputUtil.UNKNOWN_KEY) return; - if (Helpers.raycastItem(cameraEntity, (float) this.player.getAttributeValue(EntityAttributes.PLAYER_BLOCK_INTERACTION_RANGE)) == null) return; + if (Helpers.raycastItem(cameraEntity, (float) this.player.getAttributeValue(EntityAttributes.BLOCK_INTERACTION_RANGE)) == null) return; InteracticNetworking.CHANNEL.clientHandle().send(new InteracticNetworking.Pickup()); this.player.swingHand(Hand.MAIN_HAND); ci.cancel(); diff --git a/src/main/java/interactic/mixin/PlayerEntityMixin.java b/src/main/java/interactic/mixin/PlayerEntityMixin.java index 747b444..72feeaa 100644 --- a/src/main/java/interactic/mixin/PlayerEntityMixin.java +++ b/src/main/java/interactic/mixin/PlayerEntityMixin.java @@ -5,10 +5,8 @@ import interactic.util.InteracticPlayerExtension; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.ProjectileUtil; import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -16,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -@Mixin(PlayerEntity.class) +@Mixin(ServerPlayerEntity.class) public class PlayerEntityMixin implements InteracticPlayerExtension { @Unique @@ -27,7 +25,7 @@ public void setDropPower(float power) { this.dropPower = power; } - @Inject(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ItemEntity;setVelocity(DDD)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) + @Inject(method = "dropPlayerItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ItemEntity;setVelocity(DDD)V", shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) private void applyDropPower(ItemStack stack, boolean throwRandomly, boolean retainOwnership, CallbackInfoReturnable cir, double d, ItemEntity item) { if (!InteracticInit.getConfig().itemThrowing()) return; diff --git a/src/main/java/interactic/mixin/RecipeManagerMixin.java b/src/main/java/interactic/mixin/RecipeManagerMixin.java deleted file mode 100644 index 6e02ebd..0000000 --- a/src/main/java/interactic/mixin/RecipeManagerMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package interactic.mixin; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import interactic.InteracticInit; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; -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.Map; - -@Mixin(RecipeManager.class) -public class RecipeManagerMixin { - - private static final String FILTER_RECIPE = """ - { - "type": "minecraft:crafting_shaped", - "pattern": [ - " c ", - "cEc", - " c " - ], - "key": { - "c": { - "item": "minecraft:copper_ingot" - }, - "E": { - "item": "minecraft:ender_pearl" - } - }, - "result": { - "id": "interactic:item_filter", - "count": 1 - } - } - """; - - @Inject(method = "apply", at = @At("HEAD")) - public void injectFilterRecipe(Map map, ResourceManager resourceManager, Profiler profiler, CallbackInfo ci) { - if (InteracticInit.getConfig().itemFilterEnabled()) { - map.put(InteracticInit.id("item_filter"), new Gson().fromJson(FILTER_RECIPE, JsonObject.class)); - } - } -} diff --git a/src/main/java/interactic/util/Helpers.java b/src/main/java/interactic/util/Helpers.java index d31b5d5..33c9879 100644 --- a/src/main/java/interactic/util/Helpers.java +++ b/src/main/java/interactic/util/Helpers.java @@ -1,7 +1,7 @@ package interactic.util; import interactic.InteracticInit; -import interactic.ItemFilterItem; +import interactic.itemfilter.ItemFilterItem; import interactic.mixin.PlayerInventoryAccessor; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; @@ -15,7 +15,6 @@ import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; public class Helpers { diff --git a/src/main/java/interactic/util/InteracticNetworking.java b/src/main/java/interactic/util/InteracticNetworking.java index e0285c0..d3b9adf 100644 --- a/src/main/java/interactic/util/InteracticNetworking.java +++ b/src/main/java/interactic/util/InteracticNetworking.java @@ -1,9 +1,9 @@ package interactic.util; import interactic.InteracticInit; -import interactic.ItemFilterItem; -import interactic.ItemFilterScreen; -import interactic.ItemFilterScreenHandler; +import interactic.itemfilter.ItemFilterItem; +import interactic.itemfilter.ItemFilterScreen; +import interactic.itemfilter.ItemFilterScreenHandler; import interactic.mixin.ItemEntityAccessor; import io.wispforest.owo.network.OwoNetChannel; import net.fabricmc.api.EnvType; diff --git a/src/main/resources/assets/interactic/models/item/item_filter.json b/src/main/resources/assets/interactic/models/item/item_filter.json deleted file mode 100644 index 79f1d87..0000000 --- a/src/main/resources/assets/interactic/models/item/item_filter.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "parent": "item/generated", - "textures": { - "layer0": "interactic:item/item_filter_disabled" - }, - "overrides": [ - { - "predicate": { - "enabled": 1 - }, - "model": "interactic:item/item_filter_enabled" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 042034f..1764721 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -24,6 +24,9 @@ ], "client": [ "interactic.InteracticClientInit" + ], + "fabric-datagen": [ + "interactic.data.InteracticDataGen" ] }, "custom": { @@ -34,9 +37,9 @@ } }, "depends": { - "fabricloader": ">=0.4.0", - "fabric": "*", - "minecraft": ">=1.20.3", - "owo": ">=0.11.3" + "fabricloader": ">=0.15.0", + "fabric-api": "*", + "minecraft": ">=1.21.4", + "owo": ">=0.12.0" } } \ No newline at end of file diff --git a/src/main/resources/interactic.mixins.json b/src/main/resources/interactic.mixins.json index 0ac4293..18209f2 100644 --- a/src/main/resources/interactic.mixins.json +++ b/src/main/resources/interactic.mixins.json @@ -14,7 +14,6 @@ "ItemEntityAccessor", "ItemEntityMixin", "PlayerEntityMixin", - "PlayerInventoryAccessor", - "RecipeManagerMixin" + "PlayerInventoryAccessor" ] }