diff --git a/.github/workflows/1.18_push.yml b/.github/workflows/1.18_push.yml index 49de097d..b2ba7b1c 100644 --- a/.github/workflows/1.18_push.yml +++ b/.github/workflows/1.18_push.yml @@ -8,6 +8,7 @@ on: - '**/src/**' branches: - "1.18.2" + - "1.19-oneblockatatime" workflow_dispatch: inputs: norelease: diff --git a/common/src/main/java/dev/architectury/event/events/common/InteractionEvent.java b/common/src/main/java/dev/architectury/event/events/common/InteractionEvent.java index f315d709..43d37ddb 100644 --- a/common/src/main/java/dev/architectury/event/events/common/InteractionEvent.java +++ b/common/src/main/java/dev/architectury/event/events/common/InteractionEvent.java @@ -50,7 +50,7 @@ public interface InteractionEvent { */ Event CLIENT_LEFT_CLICK_AIR = EventFactory.createLoop(); /** - * @see ClientRightClickAir#click(Player, InteractionHand) + * @see ClientRightClickAir#click(Player, ItemStack) */ Event CLIENT_RIGHT_CLICK_AIR = EventFactory.createLoop(); /** @@ -112,9 +112,9 @@ public interface InteractionEvent { * Equivalent to Forge's {@code PlayerInteractEvent.RightClickEmpty} event. * * @param player The player. Always {@link net.minecraft.client.player.LocalPlayer} - * @param hand The hand used. + * @param stack The item stack in the player's hand. */ - void click(Player player, InteractionHand hand); + void click(Player player, ItemStack stack); } interface ClientLeftClickAir { diff --git a/common/src/main/java/dev/architectury/event/events/common/PlayerEvent.java b/common/src/main/java/dev/architectury/event/events/common/PlayerEvent.java index b9975081..32d8ba83 100644 --- a/common/src/main/java/dev/architectury/event/events/common/PlayerEvent.java +++ b/common/src/main/java/dev/architectury/event/events/common/PlayerEvent.java @@ -27,6 +27,7 @@ import net.minecraft.advancements.Advancement; import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; +import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -35,6 +36,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import org.jetbrains.annotations.Nullable; +import java.util.List; + public interface PlayerEvent { /** * @see PlayerJoin#join(ServerPlayer) @@ -77,7 +80,7 @@ public interface PlayerEvent { */ Event CHANGE_DIMENSION = EventFactory.createLoop(); /** - * @see DropItem#drop(Player, ItemEntity) + * @see DropItem#drop(Player, ItemStack, ItemEntity) */ Event DROP_ITEM = EventFactory.createEventResult(); /** @@ -219,12 +222,13 @@ public interface PlayerEvent { * Invoked when a player drops an item. * Equivalent to Forge's {@code ItemTossEvent} event. * - * @param player The player dropping something. - * @param entity The entity that has spawned when the player dropped a ItemStack. + * @param player The player dropping something. + * @param stack The item that is being dropped. + * @param entities The entities that have been spawned when the player dropped a ItemStack. * @return A {@link EventResult} determining the outcome of the event, * the execution of the drop may be cancelled by the result. */ - EventResult drop(Player player, ItemEntity entity); + EventResult drop(Player player, ItemStack stack, List entities); } interface OpenMenu { diff --git a/common/src/main/java/dev/architectury/hooks/item/ItemStackHooks.java b/common/src/main/java/dev/architectury/hooks/item/ItemStackHooks.java index 5f50428c..ba931328 100644 --- a/common/src/main/java/dev/architectury/hooks/item/ItemStackHooks.java +++ b/common/src/main/java/dev/architectury/hooks/item/ItemStackHooks.java @@ -22,7 +22,9 @@ package dev.architectury.hooks.item; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.CarriedBlocks; public final class ItemStackHooks { private ItemStackHooks() { @@ -35,22 +37,13 @@ public final class ItemStackHooks { } public static void giveItem(ServerPlayer player, ItemStack stack) { - var bl = player.getInventory().add(stack); - if (bl && stack.isEmpty()) { - stack.setCount(1); - var entity = player.drop(stack, false); - if (entity != null) { - entity.makeFakeItem(); - } - - player.level.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, 0.2F, ((player.getRandom().nextFloat() - player.getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F); - player.inventoryMenu.broadcastChanges(); - } else { - var entity = player.drop(stack, false); - if (entity != null) { - entity.setNoPickUpDelay(); - entity.setOwner(player.getUUID()); - } + if (player.getCarried() == LivingEntity.Carried.NONE && stack.getCount() == 1) { + player.setCarriedBlock(CarriedBlocks.getBlockFromItemStack(stack).orElse(null)); + } else if (!stack.isEmpty()) { + player.drop(stack, false); + player.level.playSound(null, player.getX(), player.getY(), player.getZ(), + SoundEvents.ITEM_PICKUP, SoundSource.PLAYERS, 0.2F, + ((player.getRandom().nextFloat() - player.getRandom().nextFloat()) * 0.7F + 1.0F) * 2.0F); } } } diff --git a/common/src/main/java/dev/architectury/registry/level/entity/trade/SimpleTrade.java b/common/src/main/java/dev/architectury/registry/level/entity/trade/SimpleTrade.java index bc72b569..1d2b2546 100644 --- a/common/src/main/java/dev/architectury/registry/level/entity/trade/SimpleTrade.java +++ b/common/src/main/java/dev/architectury/registry/level/entity/trade/SimpleTrade.java @@ -21,7 +21,7 @@ package dev.architectury.registry.level.entity.trade; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.npc.VillagerTrades; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.trading.CarryableTrade; import net.minecraft.world.item.trading.MerchantOffer; import org.jetbrains.annotations.Nullable; @@ -37,15 +37,14 @@ import java.util.Random; * or * {@link TradeRegistry#registerTradeForWanderingTrader(boolean, VillagerTrades.ItemListing...)}. */ -public record SimpleTrade(ItemStack primaryPrice, ItemStack secondaryPrice, - ItemStack sale, int maxTrades, int experiencePoints, +public record SimpleTrade(CarryableTrade price, + CarryableTrade sale, int maxTrades, int experiencePoints, float priceMultiplier) implements VillagerTrades.ItemListing { /** * Constructor for creating the trade. * You can take a look at all the values the vanilla game uses right here {@link VillagerTrades#TRADES}. * - * @param primaryPrice The first price a player has to pay to get the 'sale' stack. - * @param secondaryPrice A optional, secondary price to pay as well as the primary one. If not needed just use {@link ItemStack#EMPTY}. + * @param price The price a player has to pay to get the 'sale' stack. * @param sale The ItemStack which a player can purchase in exchange for the two prices. * @param maxTrades The amount of trades one villager or wanderer can do. When the amount is surpassed, the trade can't be purchased anymore. * @param experiencePoints How much experience points does the player get, when trading. Vanilla uses between 2 and 30 for this. @@ -57,6 +56,6 @@ public record SimpleTrade(ItemStack primaryPrice, ItemStack secondaryPrice, @Nullable @Override public MerchantOffer getOffer(Entity entity, Random random) { - return new MerchantOffer(this.primaryPrice, this.secondaryPrice, this.sale, this.maxTrades, this.experiencePoints, this.priceMultiplier); + return new MerchantOffer(this.price, this.sale, this.maxTrades, this.experiencePoints, this.priceMultiplier); } } diff --git a/fabric/build.gradle b/fabric/build.gradle index 55be8e87..7c1e8bb4 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -106,8 +106,7 @@ curseforge { releaseType = "$rootProject.cf_type" changelogType = "html" changelog = releaseChangelog() - addGameVersion "1.18.2" - addGameVersion "1.18-Snapshot" + addGameVersion "1.19-Snapshot" addGameVersion "Java 17" addGameVersion "Fabric" relations { diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinFallingBlockEntity.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinFallingBlockEntity.java index 49e9a03a..53283484 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinFallingBlockEntity.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinFallingBlockEntity.java @@ -27,6 +27,8 @@ import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -46,7 +48,7 @@ public abstract class MixinFallingBlockEntity extends Entity { @Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/Fallable;onLand(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/item/FallingBlockEntity;)V"), locals = LocalCapture.CAPTURE_FAILHARD) - public void handleLand(CallbackInfo ci, Block block, BlockPos blockPos2, boolean bl, boolean bl2, double d, BlockState blockState) { - BlockEvent.FALLING_LAND.invoker().onLand(this.level, blockPos2, this.blockState, blockState, (FallingBlockEntity) (Object) this); + public void handleLand(CallbackInfo ci, Block block, Vec3 vec, double d, BlockPos blockPos, FluidState fluidState, boolean bl, boolean bl2, double d2, BlockState blockState) { + BlockEvent.FALLING_LAND.invoker().onLand(this.level, blockPos, this.blockState, blockState, (FallingBlockEntity) (Object) this); } } diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinPlayer.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinPlayer.java index cd3b6a19..5d6b27ae 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinPlayer.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinPlayer.java @@ -25,6 +25,7 @@ import dev.architectury.event.events.common.TickEvent; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -34,6 +35,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.util.List; + @Mixin(Player.class) public class MixinPlayer { @Inject(method = "tick", at = @At("HEAD")) @@ -46,10 +49,10 @@ public class MixinPlayer { TickEvent.PLAYER_POST.invoker().tick((Player) (Object) this); } - @Inject(method = "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;", at = @At("RETURN"), cancellable = true) - private void drop(ItemStack itemStack, boolean bl, boolean bl2, CallbackInfoReturnable cir) { - if (cir.getReturnValue() != null && PlayerEvent.DROP_ITEM.invoker().drop((Player) (Object) this, cir.getReturnValue()).isFalse()) { - cir.setReturnValue(null); + @Inject(method = "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Ljava/util/List;", at = @At("RETURN"), cancellable = true) + private void drop(ItemStack itemStack, boolean bl, boolean bl2, CallbackInfoReturnable> cir) { + if (!cir.getReturnValue().isEmpty() && PlayerEvent.DROP_ITEM.invoker().drop((Player) (Object) this, itemStack, cir.getReturnValue()).isFalse()) { + cir.setReturnValue(List.of()); } } diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayerGameMode.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayerGameMode.java index 006cd1ef..cb7f7926 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayerGameMode.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinServerPlayerGameMode.java @@ -46,7 +46,7 @@ public class MixinServerPlayerGameMode { target = "Lnet/minecraft/world/level/block/state/BlockState;getBlock()Lnet/minecraft/world/level/block/Block;", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) - private void onBreak(BlockPos blockPos, CallbackInfoReturnable cir, BlockState state) { + private void onBreak(BlockPos blockPos, CallbackInfoReturnable cir, boolean isDigging, BlockState state) { if (BlockEvent.BREAK.invoker().breakBlock(this.level, blockPos, state, this.player, null).isFalse()) { cir.setReturnValue(false); } diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinMinecraft.java b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinMinecraft.java index 8c99560a..2d08b121 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinMinecraft.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinMinecraft.java @@ -63,11 +63,11 @@ public abstract class MixinMinecraft { ClientPlayerEvent.CLIENT_PLAYER_QUIT.invoker().quit(player); } - @Inject(method = "startUseItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;isEmpty()Z", ordinal = 1), + @Inject(method = "startUseItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;isShiftKeyDown()Z", ordinal = 0), locals = LocalCapture.CAPTURE_FAILHARD) - private void rightClickAir(CallbackInfo ci, InteractionHand[] var1, int var2, int var3, InteractionHand interactionHand, ItemStack itemStack) { - if (itemStack.isEmpty() && (this.hitResult == null || this.hitResult.getType() == HitResult.Type.MISS)) { - InteractionEvent.CLIENT_RIGHT_CLICK_AIR.invoker().click(player, interactionHand); + private void rightClickAir(CallbackInfo ci, InteractionHand[] var1, int var2, int var3) { + if (this.player.getCarriedAsItem().isEmpty() && (this.hitResult == null || this.hitResult.getType() == HitResult.Type.MISS)) { + InteractionEvent.CLIENT_RIGHT_CLICK_AIR.invoker().click(player, this.player.getCarriedAsItem()); } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index f38ce4f5..2d899ff2 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -34,7 +34,7 @@ }, "icon": "icon.png", "depends": { - "minecraft": "~1.18.2-", + "minecraft": "1.19-22.w.13.oneBlockAtATime", "fabricloader": ">=0.13.0", "fabric": ">=0.44.0" }, diff --git a/gradle.properties b/gradle.properties index b9c909b5..16fddb72 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,20 @@ org.gradle.jvmargs=-Xmx6G org.gradle.daemon=false -forgeEnabled=true +forgeEnabled=false -minecraft_version=1.18.2 -supported_version=1.18.2 +supported_version=1.19 (22w13oneblockatatime) +minecraft_version=22w13oneblockatatime -cf_type=release +cf_type=beta archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=4.1 +base_version=5.1 maven_group=dev.architectury fabric_loader_version=0.13.3 -fabric_api_version=0.47.8+1.18.2 +fabric_api_version=0.48.1+22w13oneblockatatime mod_menu_version=3.0.0 forge_version=40.0.1 diff --git a/settings.gradle b/settings.gradle index 938c20fb..752c1f7d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,9 +14,9 @@ if (JavaVersion.current().ordinal() + 1 < 17) { include("common") include("fabric") -include("forge") +//include("forge") include("testmod-common") include("testmod-fabric") -include("testmod-forge") +//include("testmod-forge") rootProject.name = "architectury" diff --git a/testmod-common/src/main/java/dev/architectury/test/events/DebugEvents.java b/testmod-common/src/main/java/dev/architectury/test/events/DebugEvents.java index c4429b52..2036e407 100644 --- a/testmod-common/src/main/java/dev/architectury/test/events/DebugEvents.java +++ b/testmod-common/src/main/java/dev/architectury/test/events/DebugEvents.java @@ -197,8 +197,8 @@ public class DebugEvents { PlayerEvent.PICKUP_ITEM_POST.register((player, entity, stack) -> { TestMod.SINK.accept(player.getScoreboardName() + " picks up " + new TranslatableComponent(stack.getDescriptionId()).getString() + logSide(player.level)); }); - PlayerEvent.DROP_ITEM.register((player, entity) -> { - TestMod.SINK.accept(player.getScoreboardName() + " drops " + new TranslatableComponent(entity.getItem().getDescriptionId()).getString() + logSide(player.level)); + PlayerEvent.DROP_ITEM.register((player, stack, entity) -> { + TestMod.SINK.accept(player.getScoreboardName() + " drops " + new TranslatableComponent(stack.getItem().getDescriptionId()).getString() + logSide(player.level)); return EventResult.pass(); }); PlayerEvent.OPEN_MENU.register((player, menu) -> { diff --git a/testmod-common/src/main/java/dev/architectury/test/trade/TestTrades.java b/testmod-common/src/main/java/dev/architectury/test/trade/TestTrades.java index f6929c26..47a1ec63 100644 --- a/testmod-common/src/main/java/dev/architectury/test/trade/TestTrades.java +++ b/testmod-common/src/main/java/dev/architectury/test/trade/TestTrades.java @@ -22,10 +22,11 @@ package dev.architectury.test.trade; import dev.architectury.registry.level.entity.trade.SimpleTrade; import dev.architectury.registry.level.entity.trade.TradeRegistry; import net.minecraft.core.Registry; -import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.entity.npc.VillagerTrades; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.trading.CarryableTrade; +import net.minecraft.world.level.CarriedBlocks; +import net.minecraft.world.level.block.state.BlockBehaviour; public class TestTrades { public static void init() { @@ -36,7 +37,13 @@ public class TestTrades { } private static VillagerTrades.ItemListing[] createTrades() { - var trade = new SimpleTrade(Items.APPLE.getDefaultInstance(), ItemStack.EMPTY, Items.ACACIA_BOAT.getDefaultInstance(), 1, 0, 1.0F); + var price = CarryableTrade.block(CarriedBlocks.getBlockFromItemStack(Items.APPLE.getDefaultInstance()) + .map(BlockBehaviour.BlockStateBase::getBlock) + .orElse(VillagerTrades.CURRENCY.block())); + var sale = CarryableTrade.block(CarriedBlocks.getBlockFromItemStack(Items.ACACIA_BOAT.getDefaultInstance()) + .map(BlockBehaviour.BlockStateBase::getBlock) + .orElse(VillagerTrades.CURRENCY.block())); + var trade = new SimpleTrade(price, sale, 1, 0, 1.0F); return new VillagerTrades.ItemListing[]{trade}; } }