This commit is contained in:
modmuss50 2024-03-06 16:40:52 +00:00
parent 403ef19793
commit 031f0cf067
17 changed files with 68 additions and 63 deletions
fabric-api-lookup-api-v1/src/testmod/java/net/fabricmc/fabric/test/lookup/compat
fabric-content-registries-v0/src/main/java/net/fabricmc/fabric/mixin/content/registry
fabric-data-generation-api-v1/src
main/resources
testmod/java/net/fabricmc/fabric/test/datagen
fabric-entity-events-v1/src/main/java/net/fabricmc/fabric/api/entity/event/v1
fabric-item-api-v1/src
client/java/net/fabricmc/fabric/mixin/item/client
testmod/java/net/fabricmc/fabric/test/item/gametest
fabric-item-group-api-v1/src/main/java/net/fabricmc/fabric/api/itemgroup/v1
fabric-object-builder-api-v1/src
main/java/net/fabricmc/fabric/mixin/object/builder
testmod/java/net/fabricmc/fabric/test/object/builder
fabric-transfer-api-v1/src
main
testmod/java/net/fabricmc/fabric/test/transfer/gametests
gradle.properties

View file

@ -60,7 +60,7 @@ final class WrappedInventory implements ItemInsertable, ItemExtractable {
if (inv.isValid(i, input)) {
ItemStack stack = inv.getStack(i);
if (stack.isEmpty() || ItemStack.areItemsAndNbtEqual(stack, input)) {
if (stack.isEmpty() || ItemStack.areItemsAndComponentsEqual(stack, input)) {
int remainingSpace = Math.min(inv.getMaxCountPerStack(), stack.getItem().getMaxCount()) - stack.getCount();
int inserted = Math.min(remainingSpace, input.getCount());

View file

@ -24,14 +24,14 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.BlockState;
import net.minecraft.class_9316;
import net.minecraft.entity.ai.pathing.PathContext;
import net.minecraft.entity.ai.pathing.PathNodeType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.CollisionView;
import net.fabricmc.fabric.api.registry.LandPathNodeTypesRegistry;
@Mixin(class_9316.class)
@Mixin(PathContext.class)
public abstract class class_9316Mixin {
@Shadow
public abstract BlockState method_57623(BlockPos blockPos);
@ -42,7 +42,7 @@ public abstract class class_9316Mixin {
/**
* Overrides the node type for the specified position, if the position is found as neighbor block in a path.
*/
@Inject(method = "method_57622", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/util/math/BlockPos$Mutable;set(III)Lnet/minecraft/util/math/BlockPos$Mutable;"), cancellable = true)
@Inject(method = "getNodeType", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/util/math/BlockPos$Mutable;set(III)Lnet/minecraft/util/math/BlockPos$Mutable;"), cancellable = true)
private void method_57622(int x, int y, int z, CallbackInfoReturnable<PathNodeType> cir, @Local BlockPos pos) {
final PathNodeType neighborNodeType = LandPathNodeTypesRegistry.getPathNodeType(method_57623(pos), method_57621(), pos, true);

View file

@ -320,12 +320,12 @@ transitive-extendable method net/minecraft/data/MetadataProvider getName ()Ljava
transitive-extendable method net/minecraft/data/SnbtProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/client/ModelProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/dev/NbtProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/report/BiomeParametersProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/report/BlockListProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/report/CommandSyntaxProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/report/DynamicRegistriesProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/report/ItemListProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/report/RegistryDumpProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/server/BiomeParametersProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/server/DynamicRegistriesProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/server/advancement/AdvancementProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/server/loottable/LootTableProvider getName ()Ljava/lang/String;
transitive-extendable method net/minecraft/data/server/recipe/RecipeProvider getName ()Ljava/lang/String;

View file

@ -164,10 +164,10 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
public void generate(RecipeExporter exporter) {
offerPlanksRecipe2(exporter, SIMPLE_BLOCK, ItemTags.ACACIA_LOGS, 1);
ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.LEATHER, 4).input(Items.ITEM_FRAME)
ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.DIAMOND_ORE, 4).input(Items.ITEM_FRAME)
.criterion("has_frame", conditionsFromItem(Items.ITEM_FRAME))
.offerTo(withConditions(exporter, DefaultResourceConditions.itemsRegistered(Blocks.DIAMOND_BLOCK)));
ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.LEATHER_BOOTS, 4).input(Items.ITEM_FRAME, 2)
ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, Items.EMERALD, 4).input(Items.ITEM_FRAME, 2)
.criterion("has_frame", conditionsFromItem(Items.ITEM_FRAME))
.offerTo(withConditions(exporter, DefaultResourceConditions.registryContains(BiomeKeys.PLAINS, BiomeKeys.BADLANDS)));

View file

@ -52,7 +52,7 @@ public interface FabricElytraItem {
* A helper to perform the default vanilla elytra tick logic: damage the elytra every 20 ticks, and send a game event every 10 ticks.
*/
default void doVanillaElytraTick(LivingEntity entity, ItemStack chestStack) {
int nextRoll = entity.getRoll() + 1;
int nextRoll = entity.getFallFlyingTicks() + 1;
if (!entity.getWorld().isClient && nextRoll % 10 == 0) {
if ((nextRoll / 10) % 2 == 0) {

View file

@ -45,12 +45,12 @@ public class ClientPlayerInteractionManagerMixin {
@Redirect(
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/item/ItemStack;areItemsAndNbtEqual(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
target = "Lnet/minecraft/item/ItemStack;areItemsAndComponentsEqual(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
),
method = "isCurrentlyBreaking"
)
private boolean fabricItemContinueBlockBreakingInject(ItemStack stack, ItemStack otherStack) {
boolean stackUnchanged = ItemStack.areItemsAndNbtEqual(stack, this.selectedStack);
boolean stackUnchanged = ItemStack.areItemsAndComponentsEqual(stack, this.selectedStack);
if (!stackUnchanged) {
// The stack changed and vanilla is about to cancel block breaking progress. Check if the item wants to continue block breaking instead.

View file

@ -127,7 +127,7 @@ public class RecipeGameTest implements FabricGameTest {
throw new GameTestException("Size doesnt match. " + extraErrorInfo);
}
if (!ItemStack.areItemsAndNbtEqual(currentStack, expectedStack)) {
if (!ItemStack.areItemsAndComponentsEqual(currentStack, expectedStack)) {
throw new GameTestException("Stack doesnt match. " + extraErrorInfo);
}
}

View file

@ -431,7 +431,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
checkStacks(newStacks);
for (int i = 0; i < addTo.size(); i++) {
if (ItemStack.areItemsAndNbtEqual(anchor, addTo.get(i))) {
if (ItemStack.areItemsAndComponentsEqual(anchor, addTo.get(i))) {
addTo.subList(i, i).addAll(newStacks);
return;
}
@ -446,7 +446,7 @@ public class FabricItemGroupEntries implements ItemGroup.Entries {
// Iterate in reverse to add after the last match
for (int i = addTo.size() - 1; i >= 0; i--) {
if (ItemStack.areItemsAndNbtEqual(anchor, addTo.get(i))) {
if (ItemStack.areItemsAndComponentsEqual(anchor, addTo.get(i))) {
addTo.subList(i + 1, i + 1).addAll(newStacks);
return;
}

View file

@ -25,12 +25,12 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.class_9306;
import net.minecraft.entity.Entity;
import net.minecraft.registry.DefaultedRegistry;
import net.minecraft.util.math.random.Random;
import net.minecraft.village.TradeOffer;
import net.minecraft.village.TradeOffers;
import net.minecraft.village.TradedItem;
import net.minecraft.village.VillagerType;
@Mixin(TradeOffers.TypeAwareBuyForOneEmeraldFactory.class)
@ -50,8 +50,8 @@ public abstract class TradeOffersTypeAwareBuyForOneEmeraldFactoryMixin {
* To prevent "item" -> "air" trades, if the result of a type aware trade is air, make sure no offer is created.
*/
@Inject(method = "create", at = @At(value = "NEW", target = "net/minecraft/village/TradeOffer"), cancellable = true)
private void failOnNullItem(Entity entity, Random random, CallbackInfoReturnable<TradeOffer> cir, @Local() class_9306 buyingItem) {
if (buyingItem.itemStack().isEmpty()) { // Will return true for an "empty" item stack that had null passed in the ctor
private void failOnNullItem(Entity entity, Random random, CallbackInfoReturnable<TradeOffer> cir, @Local() TradedItem tradedItem) {
if (tradedItem.itemStack().isEmpty()) { // Will return true for an "empty" item stack that had null passed in the ctor
cir.setReturnValue(null); // Return null to prevent creation of empty trades
}
}

View file

@ -25,7 +25,6 @@ import java.util.Optional;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import net.minecraft.class_9306;
import net.minecraft.entity.Entity;
import net.minecraft.entity.passive.WanderingTraderEntity;
import net.minecraft.item.Item;
@ -37,6 +36,7 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.math.random.Random;
import net.minecraft.village.TradeOffer;
import net.minecraft.village.TradeOffers;
import net.minecraft.village.TradedItem;
import net.minecraft.village.VillagerProfession;
import net.fabricmc.api.ModInitializer;
@ -51,16 +51,16 @@ public class VillagerTypeTest1 implements ModInitializer {
public void onInitialize() {
TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, (factories, rebalanced) -> {
Item scrap = rebalanced ? Items.NETHER_BRICK : Items.NETHERITE_SCRAP;
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLD_INGOT, 3), Optional.of(new class_9306(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLD_INGOT, 3), Optional.of(new TradedItem(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
});
// Toolsmith is not rebalanced yet
TradeOfferHelper.registerVillagerOffers(VillagerProfession.TOOLSMITH, 1, (factories, rebalanced) -> {
Item scrap = rebalanced ? Items.NETHER_BRICK : Items.NETHERITE_SCRAP;
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLD_INGOT, 3), Optional.of(new class_9306(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLD_INGOT, 3), Optional.of(new TradedItem(scrap, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.15F)));
});
TradeOfferHelper.registerWanderingTraderOffers(1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLD_INGOT, 3), Optional.of(new class_9306(Items.NETHERITE_SCRAP, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.35F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLD_INGOT, 3), Optional.of(new TradedItem(Items.NETHERITE_SCRAP, 4)), new ItemStack(Items.NETHERITE_INGOT), 2, 6, 0.35F)));
});
TradeOfferHelper.registerRebalancedWanderingTraderOffers(builder -> {
@ -68,28 +68,28 @@ public class VillagerTypeTest1 implements ModInitializer {
FOOD_POOL_ID,
5,
Registries.ITEM.stream().filter(item -> item.getFoodComponent() != null).map(
item -> new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHERITE_INGOT), new ItemStack(item), 3, 4, 0.15F))
item -> new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHERITE_INGOT), new ItemStack(item), 3, 4, 0.15F))
).toList()
);
builder.addAll(
THING_POOL_ID,
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHERITE_INGOT), new ItemStack(Items.MOJANG_BANNER_PATTERN), 1, 4, 0.15F))
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHERITE_INGOT), new ItemStack(Items.MOJANG_BANNER_PATTERN), 1, 4, 0.15F))
);
builder.addOffersToPool(
TradeOfferHelper.WanderingTraderOffersBuilder.BUY_ITEMS_POOL,
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.BLAZE_POWDER, 1), new ItemStack(Items.EMERALD, 4), 3, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHER_WART, 5), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.GOLDEN_CARROT, 4), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F))
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.BLAZE_POWDER, 1), new ItemStack(Items.EMERALD, 4), 3, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHER_WART, 5), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.GOLDEN_CARROT, 4), new ItemStack(Items.EMERALD, 1), 3, 4, 0.15F))
);
builder.addOffersToPool(
TradeOfferHelper.WanderingTraderOffersBuilder.SELL_SPECIAL_ITEMS_POOL,
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.EMERALD, 6), new ItemStack(Items.BRUSH, 1), 1, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 16), new ItemStack(Items.ELYTRA, 1), 1, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.EMERALD, 3), new ItemStack(Items.LEAD, 2), 3, 4, 0.15F))
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.EMERALD, 6), new ItemStack(Items.BRUSH, 1), 1, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 16), new ItemStack(Items.ELYTRA, 1), 1, 4, 0.15F)),
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.EMERALD, 3), new ItemStack(Items.LEAD, 2), 3, 4, 0.15F))
);
builder.addOffersToPool(
FOOD_POOL_ID,
new SimpleTradeFactory(new TradeOffer(new class_9306(Items.NETHERITE_INGOT), new ItemStack(Items.EGG), 3, 4, 0.15F))
new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.NETHERITE_INGOT), new ItemStack(Items.EGG), 3, 4, 0.15F))
);
});

View file

@ -16,10 +16,10 @@
package net.fabricmc.fabric.test.object.builder;
import net.minecraft.class_9306;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.village.TradeOffer;
import net.minecraft.village.TradedItem;
import net.minecraft.village.VillagerProfession;
import net.fabricmc.api.ModInitializer;
@ -32,22 +32,22 @@ public class VillagerTypeTest2 implements ModInitializer {
@Override
public void onInitialize() {
TradeOfferHelper.registerVillagerOffers(VillagerProfession.WEAPONSMITH, 1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 5), new ItemStack(Items.NETHERITE_INGOT), 3, 4, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 5), new ItemStack(Items.NETHERITE_INGOT), 3, 4, 0.15F)));
});
TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 6), new ItemStack(Items.ELYTRA), 3, 4, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 6), new ItemStack(Items.ELYTRA), 3, 4, 0.15F)));
});
TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 7), new ItemStack(Items.CHAINMAIL_BOOTS), 3, 4, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 7), new ItemStack(Items.CHAINMAIL_BOOTS), 3, 4, 0.15F)));
});
TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 8), new ItemStack(Items.CHAINMAIL_CHESTPLATE), 3, 4, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 8), new ItemStack(Items.CHAINMAIL_CHESTPLATE), 3, 4, 0.15F)));
});
TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 9), new ItemStack(Items.CHAINMAIL_HELMET), 3, 4, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 9), new ItemStack(Items.CHAINMAIL_HELMET), 3, 4, 0.15F)));
});
TradeOfferHelper.registerVillagerOffers(VillagerProfession.ARMORER, 1, factories -> {
factories.add(new SimpleTradeFactory(new TradeOffer(new class_9306(Items.DIAMOND, 10), new ItemStack(Items.CHAINMAIL_LEGGINGS), 3, 4, 0.15F)));
factories.add(new SimpleTradeFactory(new TradeOffer(new TradedItem(Items.DIAMOND, 10), new ItemStack(Items.CHAINMAIL_LEGGINGS), 3, 4, 0.15F)));
});
}
}

View file

@ -163,7 +163,7 @@ class InventorySlotWrapper extends SingleStackStorage {
original.set(type, null);
}
original.copyComponentsFrom(currentStack.getComponents());
original.applyComponentsFrom(currentStack.getComponents());
}
// None is empty and the items and components match: just update the amount, and reuse the original stack.

View file

@ -73,7 +73,7 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableContainerB
ItemStack stack = newStack;
// Update cook time if needed. Code taken from AbstractFurnaceBlockEntity#setStack.
boolean bl = !stack.isEmpty() && ItemStack.areItemsAndNbtEqual(stack, itemStack);
boolean bl = !stack.isEmpty() && ItemStack.areItemsAndComponentsEqual(stack, itemStack);
if (!bl) {
this.cookTimeTotal = getCookTime(this.world, (AbstractFurnaceBlockEntity) (Object) this);

View file

@ -16,12 +16,13 @@
package net.fabricmc.fabric.mixin.transfer;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import net.minecraft.block.entity.LootableContainerBlockEntity;
import net.minecraft.block.entity.LockableContainerBlockEntity;
import net.minecraft.item.ItemStack;
import net.fabricmc.fabric.impl.transfer.item.SpecialLogicInventory;
@ -29,18 +30,18 @@ import net.fabricmc.fabric.impl.transfer.item.SpecialLogicInventory;
/**
* Defer markDirty until the outer transaction close callback when setStack is called from an inventory wrapper.
*/
@Mixin(LootableContainerBlockEntity.class)
public class LootableContainerBlockEntityMixin implements SpecialLogicInventory {
@Mixin(LockableContainerBlockEntity.class)
public class LockableContainerBlockEntityMixin implements SpecialLogicInventory {
@Unique
private boolean fabric_suppressSpecialLogic = false;
@Redirect(
at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/LootableContainerBlockEntity;markDirty()V"),
@WrapOperation(
at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/LockableContainerBlockEntity;markDirty()V"),
method = "setStack(ILnet/minecraft/item/ItemStack;)V"
)
public void fabric_redirectMarkDirty(LootableContainerBlockEntity self) {
public void fabric_redirectMarkDirty(LockableContainerBlockEntity instance, Operation<Void> original) {
if (!fabric_suppressSpecialLogic) {
self.markDirty();
original.call(instance);
}
}

View file

@ -13,7 +13,7 @@
"HopperBlockEntityMixin",
"ItemMixin",
"JukeboxBlockEntityMixin",
"LootableContainerBlockEntityMixin",
"LockableContainerBlockEntityMixin",
"SimpleInventoryMixin"
]
}

View file

@ -119,6 +119,10 @@ public class VanillaStorageTests {
context.setBlockState(comparatorPos, Blocks.COMPARATOR.getDefaultState().with(ComparatorBlock.FACING, Direction.WEST));
try (Transaction transaction = Transaction.openOuter()) {
if (world.getBlockTickScheduler().isQueued(context.getAbsolutePos(comparatorPos), Blocks.COMPARATOR)) {
throw new GameTestException("Comparator should not have a tick scheduled.");
}
storage.insert(variant, 1000000, transaction);
// uncommitted insert should not schedule an update

View file

@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx2560M
org.gradle.parallel=true
fabric.loom.multiProjectOptimisation=true
version=0.96.7
minecraft_version=24w09a
yarn_version=+build.5
version=0.96.8
minecraft_version=24w10a
yarn_version=+build.1
loader_version=0.15.6
installer_version=0.11.1
@ -13,7 +13,7 @@ curseforge_minecraft_version=1.20.5-Snapshot
# Do not manually update, use the bumpversions task:
fabric-api-base-version=0.4.38
fabric-api-lookup-api-v1-version=1.6.54
fabric-api-lookup-api-v1-version=1.6.55
fabric-biome-api-v1-version=13.0.20
fabric-block-api-v1-version=1.0.18
fabric-block-view-api-v2-version=1.0.6
@ -21,18 +21,18 @@ fabric-blockrenderlayer-v1-version=1.1.48
fabric-command-api-v1-version=1.2.43
fabric-command-api-v2-version=2.2.22
fabric-commands-v0-version=0.2.60
fabric-content-registries-v0-version=6.0.10
fabric-content-registries-v0-version=6.0.11
fabric-crash-report-info-v1-version=0.2.25
fabric-data-attachment-api-v1-version=1.1.5
fabric-data-generation-api-v1-version=17.0.1
fabric-data-attachment-api-v1-version=1.1.6
fabric-data-generation-api-v1-version=17.0.2
fabric-dimensions-v1-version=2.1.64
fabric-entity-events-v1-version=1.6.4
fabric-entity-events-v1-version=1.6.5
fabric-events-interaction-v0-version=0.7.4
fabric-events-lifecycle-v0-version=0.2.80
fabric-events-lifecycle-v0-version=0.2.81
fabric-game-rule-api-v1-version=1.0.48
fabric-gametest-api-v1-version=1.3.9
fabric-item-api-v1-version=5.0.0
fabric-item-group-api-v1-version=4.0.29
fabric-item-api-v1-version=5.0.1
fabric-item-group-api-v1-version=4.0.30
fabric-key-binding-api-v1-version=1.0.43
fabric-keybindings-v0-version=0.2.41
fabric-lifecycle-events-v1-version=2.3.0
@ -42,10 +42,10 @@ fabric-mining-level-api-v1-version=2.1.68
fabric-model-loading-api-v1-version=1.0.10
fabric-models-v0-version=0.4.9
fabric-networking-api-v1-version=4.0.3
fabric-object-builder-api-v1-version=14.0.7
fabric-object-builder-api-v1-version=14.0.8
fabric-particles-v1-version=2.0.0
fabric-recipe-api-v1-version=4.0.0
fabric-registry-sync-v0-version=5.0.7
fabric-registry-sync-v0-version=5.0.8
fabric-renderer-api-v1-version=3.2.9
fabric-renderer-indigo-version=1.5.9
fabric-renderer-registries-v1-version=3.2.57
@ -56,9 +56,9 @@ fabric-rendering-v1-version=4.2.0
fabric-resource-conditions-api-v1-version=2.3.18
fabric-resource-loader-v0-version=0.11.23
fabric-screen-api-v1-version=2.0.19
fabric-screen-handler-api-v1-version=1.3.64
fabric-screen-handler-api-v1-version=1.3.65
fabric-sound-api-v1-version=1.0.19
fabric-transfer-api-v1-version=5.0.1
fabric-transfer-api-v1-version=5.0.2
fabric-transitive-access-wideners-v1-version=6.0.6
fabric-convention-tags-v1-version=1.5.13
fabric-client-tags-api-v1-version=1.1.9