From 7569de7004072cb55a9b61bd9b7a080b5d1c161b Mon Sep 17 00:00:00 2001 From: failall <32547539+failall@users.noreply.github.com> Date: Mon, 26 Dec 2022 22:20:01 +0100 Subject: [PATCH] Add TradeWithVillagerEvent (#9244) --- .../entity/npc/AbstractVillager.java.patch | 8 +++ .../entity/player/TradeWithVillagerEvent.java | 51 +++++++++++++++++++ .../player/TradeWithVillagerEventTest.java | 37 ++++++++++++++ src/test/resources/META-INF/mods.toml | 2 + 4 files changed, 98 insertions(+) create mode 100644 src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java create mode 100644 src/test/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java diff --git a/patches/minecraft/net/minecraft/world/entity/npc/AbstractVillager.java.patch b/patches/minecraft/net/minecraft/world/entity/npc/AbstractVillager.java.patch index 4d81607902..4641520e29 100644 --- a/patches/minecraft/net/minecraft/world/entity/npc/AbstractVillager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/npc/AbstractVillager.java.patch @@ -1,5 +1,13 @@ --- a/net/minecraft/world/entity/npc/AbstractVillager.java +++ b/net/minecraft/world/entity/npc/AbstractVillager.java +@@ -116,6 +_,7 @@ + CriteriaTriggers.f_10585_.m_70959_((ServerPlayer)this.f_35263_, this, p_35274_.m_45368_()); + } + ++ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.TradeWithVillagerEvent(this.f_35263_, p_35274_, this)); + } + + protected abstract void m_8058_(MerchantOffer p_35299_); @@ -164,9 +_,9 @@ } diff --git a/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java b/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java new file mode 100644 index 0000000000..64abbd9815 --- /dev/null +++ b/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.event.entity.player; + +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.Cancelable; +import org.jetbrains.annotations.ApiStatus; + +/** + * Fired when a player trades with an {@link AbstractVillager}. + * + *
This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain Event.HasResult have a result}.
+ * + *This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, + * only on the {@linkplain LogicalSide#SERVER logical server}.
+ */ +public class TradeWithVillagerEvent extends PlayerEvent +{ + private final MerchantOffer offer; + private final AbstractVillager abstractVillager; + + @ApiStatus.Internal + public TradeWithVillagerEvent(Player player, MerchantOffer offer, AbstractVillager abstractVillager) + { + super(player); + this.offer = offer; + this.abstractVillager = abstractVillager; + } + + /** + * {@return the {@link MerchantOffer} selected by the player to trade with} + */ + public MerchantOffer getMerchantOffer() + { + return offer; + } + + /** + * {@return the villager the player traded with} + */ + public AbstractVillager getAbstractVillager() + { + return abstractVillager; + } +} \ No newline at end of file diff --git a/src/test/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java b/src/test/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java new file mode 100644 index 0000000000..2ddf31ff51 --- /dev/null +++ b/src/test/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.debug.entity.player; + +import com.mojang.logging.LogUtils; +import net.minecraftforge.event.entity.player.TradeWithVillagerEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import org.slf4j.Logger; + + +/** + * This tests for {@link TradeWithVillagerEvent} and fires when + * the player completes a trade with either a Villager or WanderingTrader(must inherit from AbstractVillager). + * This test shows the player name involved along with the villager name and what the result of the trade is(Count and Item). + */ +@Mod("trade_with_villager_event_test") +@Mod.EventBusSubscriber() +public class TradeWithVillagerEventTest +{ + + private static final boolean ENABLE = true; + private static final Logger LOGGER = LogUtils.getLogger(); + + @SubscribeEvent + public static void onPlayerVillagerTrade(TradeWithVillagerEvent event) + { + if (!ENABLE) return; + LOGGER.info("Player {} traded with villager {} and exchanged for {} {}.", + event.getEntity().getName().getString(), event.getAbstractVillager().getName().getString(), + event.getMerchantOffer().getResult().getCount(), + event.getMerchantOffer().getResult().getDisplayName().getString()); + } +} diff --git a/src/test/resources/META-INF/mods.toml b/src/test/resources/META-INF/mods.toml index eb341ff2fc..590550228d 100644 --- a/src/test/resources/META-INF/mods.toml +++ b/src/test/resources/META-INF/mods.toml @@ -274,6 +274,8 @@ modId="grindstone_event_test" modId="data_pack_registries_test" [[mods]] modId="creative_mode_tab_test" +[[mods]] +modId="trade_with_villager_event_test" # ADD ABOVE THIS LINE