Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1.20.6] Add GatherItemComponentsEvent #9944

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7f1cb1b
Added GatherItemComponentsEvent.java
RealMangorage Apr 30, 2024
afe9dc3
Cleaned up the code for the patch file, moving it into ForgeHooks.java.
RealMangorage May 1, 2024
bfc5640
Cleaned up the Hooks, moved everything where it belongs.
RealMangorage May 1, 2024
8f6851a
Merge remote-tracking branch 'refs/remotes/origin/1.20.x' into 1.20.x…
RealMangorage May 1, 2024
8a5fe1f
Fixed ForgeEventFactory.java
RealMangorage May 1, 2024
cedf346
Cleaned up the Event, adding a DataComponentsMap getter for the event…
RealMangorage May 8, 2024
3ce878d
Cleaned up ForgeHooks.gatherItemComponents to use DataComponentsMap.c…
RealMangorage May 8, 2024
362f6a6
Added GatherItemComponentsEvent.java
RealMangorage Apr 30, 2024
055ae7b
Cleaned up the code for the patch file, moving it into ForgeHooks.java.
RealMangorage May 1, 2024
66079bd
Fixed ForgeEventFactory.java
RealMangorage May 1, 2024
6ff478c
Cleaned up the Event, adding a DataComponentsMap getter for the event…
RealMangorage May 8, 2024
d81945e
Updated
RealMangorage May 14, 2024
25496cb
Merge remote-tracking branch 'refs/remotes/origin/1.20.x' into 1.20.x…
RealMangorage May 14, 2024
08c634c
Updated
RealMangorage May 14, 2024
51393b5
Changed event from .ItemEvent to .Item
RealMangorage May 14, 2024
0394d12
Added JavaDoc
RealMangorage May 14, 2024
d899f72
Added JavaDocs & cleanup
RealMangorage May 14, 2024
933918f
Added JavaDocs & cleanup
RealMangorage May 14, 2024
5f52127
Added GameTest
RealMangorage May 14, 2024
b232bd1
Finished GameTests, Fixed build_forge.gradle, now test runs work.
RealMangorage May 15, 2024
5ca461f
Cleaned up GameTest for GatherComponentsEventTest.java
RealMangorage May 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions build_forge.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ patcher {

forge_client_test {
parent runs.forge_client
source sourceSets.test
}

forge_server {
Expand All @@ -188,6 +189,7 @@ patcher {

forge_server_test {
parent runs.forge_server
source sourceSets.test
}

forge_server_gametest {
Expand All @@ -196,6 +198,7 @@ patcher {

forge_server_gametest_test {
parent runs.forge_server_gametest
source sourceSets.test
}

forge_data {
Expand Down
22 changes: 21 additions & 1 deletion patches/minecraft/net/minecraft/world/item/Item.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,27 @@
}

@Deprecated
@@ -111,6 +_,7 @@
@@ -100,17 +_,25 @@
return this.builtInRegistryHolder;
}

+ @Nullable
+ private DataComponentMap builtComponents = null;
+
public DataComponentMap components() {
- return this.components;
+ if (builtComponents == null) {
+ builtComponents = net.minecraftforge.common.ForgeHooks.gatherItemComponents(this, components);
+ }
+
+ return builtComponents;
}

public int getDefaultMaxStackSize() {
- return this.components.getOrDefault(DataComponents.MAX_STACK_SIZE, 1);
+ return builtComponents == null ? this.components.getOrDefault(DataComponents.MAX_STACK_SIZE, 1) : this.builtComponents.getOrDefault(DataComponents.MAX_STACK_SIZE, 1);
}

public void onUseTick(Level p_41428_, LivingEntity p_41429_, ItemStack p_41430_, int p_41431_) {
}

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/net/minecraftforge/common/ForgeHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import net.minecraft.core.HolderLookup;
import net.minecraft.core.HolderSet;
import net.minecraft.core.NonNullList;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.network.Connection;
Expand Down Expand Up @@ -130,6 +131,7 @@
import net.minecraftforge.event.AnvilUpdateEvent;
import net.minecraftforge.event.BuildCreativeModeTabContentsEvent;
import net.minecraftforge.event.ForgeEventFactory;
import net.minecraftforge.event.GatherComponentsEvent;
import net.minecraftforge.event.GrindstoneEvent;
import net.minecraftforge.event.ModMismatchEvent;
import net.minecraftforge.event.ServerChatEvent;
Expand Down Expand Up @@ -1299,4 +1301,8 @@ public static DyeColor getDyeColorFromItemStack(ItemStack stack) {

return null;
}

public static DataComponentMap gatherItemComponents(Item item, DataComponentMap dataComponents) {
return DataComponentMap.composite(dataComponents, ForgeEventFactory.gatherItemComponentsEvent(item, dataComponents).getDataComponentMap());
}
}
6 changes: 6 additions & 0 deletions src/main/java/net/minecraftforge/event/ForgeEventFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;

import net.minecraft.core.component.DataComponentMap;
import net.minecraft.world.item.Item;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.Cancelable;
import net.minecraftforge.eventbus.api.Event;
Expand Down Expand Up @@ -1088,4 +1090,8 @@ public static AnvilRepairEvent onAnvilRepair(Player player, @NotNull ItemStack o
public static void onPlayerTradeWithVillager(Player player, MerchantOffer offer, AbstractVillager villager) {
post(new TradeWithVillagerEvent(player, offer, villager));
}

public static GatherComponentsEvent.Item gatherItemComponentsEvent(Item item, DataComponentMap dataComponents) {
return fire(new GatherComponentsEvent.Item(item, dataComponents));
}
}
62 changes: 62 additions & 0 deletions src/main/java/net/minecraftforge/event/GatherComponentsEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package net.minecraftforge.event;

import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.component.DataComponents;
import net.minecraft.world.item.Item;
import net.minecraftforge.eventbus.api.Event;
import org.jetbrains.annotations.ApiStatus;

import javax.annotation.Nullable;

/**
Where all the events fore Gathering Components will exist.
*/

public abstract class GatherComponentsEvent extends Event {
private final DataComponentMap.Builder components = DataComponentMap.builder();
private final DataComponentMap originalComponents;
private final Object owner;

protected GatherComponentsEvent(Object owner, DataComponentMap originalComponents) {
this.originalComponents = originalComponents;
this.owner = owner;
}

public <T> void register(DataComponentType<T> componentType, @Nullable T value) {
components.set(componentType, value);
}

@ApiStatus.Internal
public DataComponentMap getDataComponentMap() {
return components.build();
}

public DataComponentMap getOriginalComponentMap() {
return originalComponents;
}

public Object getOwner() {
return owner;
}

/**
* Used to get additional Components for any {@link net.minecraft.world.item.Item}
*
* Fired once for every {@link net.minecraft.world.item.Item} instance, only once, Lazily.
*
* Recursion is not supported. Cant call {@link net.minecraft.world.item.Item#components()} as that would cause a loop.
*
* References in {@link net.minecraft.world.item.Items} may not be valid at the current time.
*/
public static class Item extends GatherComponentsEvent {
public Item(net.minecraft.world.item.Item item, DataComponentMap dataComponents) {
super(item, dataComponents);
}

@Override
public net.minecraft.world.item.Item getOwner() {
return (net.minecraft.world.item.Item) super.getOwner();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package net.minecraftforge.debug.gameplay.item;

import net.minecraft.core.component.DataComponents;
import net.minecraft.gametest.framework.GameTest;
import net.minecraft.gametest.framework.GameTestHelper;
import net.minecraft.world.food.FoodProperties;
import net.minecraft.world.item.Items;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.GatherComponentsEvent;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.gametest.GameTestHolder;
import net.minecraftforge.test.BaseTestMod;

import java.util.List;

@GameTestHolder("forge." + GatherComponentsEventTest.MOD_ID)
@Mod(GatherComponentsEventTest.MOD_ID)
public class GatherComponentsEventTest extends BaseTestMod {
public static final String MOD_ID = "gather_components_test_event";

public GatherComponentsEventTest() {
IEventBus bus = MinecraftForge.EVENT_BUS;
bus.addListener(this::onItem);
}

public void onItem(GatherComponentsEvent.Item itemEvent) {
if (!itemEvent.getOriginalComponentMap().has(DataComponents.FOOD) && itemEvent.getOwner() == Items.IRON_NUGGET) {
itemEvent.register(DataComponents.FOOD, new FoodProperties(
2,
7,
true,
3,
List.of()
));
}
}

@GameTest(template = "forge:empty3x3x3")
public static void onTestForFood(GameTestHelper helper) {
helper.assertTrue(Items.IRON_NUGGET.components().has(DataComponents.FOOD), "Iron Nugget is not edible, failed to apply DataComponents.FOOD to it.");
helper.assertFalse(Items.IRON_INGOT.components().has(DataComponents.FOOD), "Iron Ingot is edible, should not have DataComponents.FOOD");
helper.succeed();
}
}