diff --git a/patchwork-capabilities/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java b/patchwork-capabilities/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java index a2d23d43..3215229d 100644 --- a/patchwork-capabilities/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java +++ b/patchwork-capabilities/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java @@ -23,13 +23,13 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.math.Direction; +import net.patchworkmc.impl.capability.CapabilityEvents; + @ParametersAreNonnullByDefault public abstract class CapabilityProvider implements ICapabilityProvider { protected final Class baseClass; @@ -45,14 +45,7 @@ public final void gatherCapabilities() { } public void gatherCapabilities(@Nullable ICapabilityProvider parent) { - AttachCapabilitiesEvent event = new AttachCapabilitiesEvent<>(baseClass, (B) this); - MinecraftForge.EVENT_BUS.post(event); - - if (!event.getCapabilities().isEmpty() || parent != null) { - capabilities = new CapabilityDispatcher(event.getCapabilities(), event.getListeners(), parent); - } else { - capabilities = null; - } + capabilities = CapabilityEvents.gatherCapabilities(baseClass, this, parent); } public final @Nullable CapabilityDispatcher getCapabilities() { diff --git a/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/BaseCapabilityProvider.java b/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/BaseCapabilityProvider.java index 31a3d2c1..1b682810 100644 --- a/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/BaseCapabilityProvider.java +++ b/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/BaseCapabilityProvider.java @@ -21,11 +21,8 @@ import javax.annotation.Nullable; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.CapabilityDispatcher; import net.minecraftforge.common.capabilities.CapabilityProvider; import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.event.AttachCapabilitiesEvent; public class BaseCapabilityProvider extends CapabilityProvider { private final T provider; @@ -37,13 +34,6 @@ public BaseCapabilityProvider(Class baseClass, T provider) { @Override public void gatherCapabilities(@Nullable ICapabilityProvider parent) { - AttachCapabilitiesEvent event = new AttachCapabilitiesEvent<>(baseClass, provider); - MinecraftForge.EVENT_BUS.post(event); - - if (!event.getCapabilities().isEmpty() || parent != null) { - capabilities = new CapabilityDispatcher(event.getCapabilities(), event.getListeners(), parent); - } else { - capabilities = null; - } + capabilities = CapabilityEvents.gatherCapabilities(baseClass, provider, parent); } } diff --git a/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/CapabilityEvents.java b/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/CapabilityEvents.java new file mode 100644 index 00000000..42794d67 --- /dev/null +++ b/patchwork-capabilities/src/main/java/net/patchworkmc/impl/capability/CapabilityEvents.java @@ -0,0 +1,43 @@ +/* + * Minecraft Forge, Patchwork Project + * Copyright (c) 2016-2020, 2019-2020 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +package net.patchworkmc.impl.capability; + +import javax.annotation.Nullable; + +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.CapabilityDispatcher; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.event.AttachCapabilitiesEvent; + +public class CapabilityEvents { + // This is less restrictive than Forge's implementation, since patchwork can't make vanilla extend stuff at random. + @SuppressWarnings("unchecked") + @Nullable + public static CapabilityDispatcher gatherCapabilities(Class type, T provider, @Nullable ICapabilityProvider parent) { + AttachCapabilitiesEvent event = new AttachCapabilitiesEvent((Class) type, provider); + MinecraftForge.EVENT_BUS.post(event); + + if (!event.getCapabilities().isEmpty() || parent != null) { + return new CapabilityDispatcher(event.getCapabilities(), event.getListeners(), parent); + } else { + return null; + } + } +} diff --git a/patchwork-god-classes/build.gradle b/patchwork-god-classes/build.gradle index 6768d533..445a1e9b 100644 --- a/patchwork-god-classes/build.gradle +++ b/patchwork-god-classes/build.gradle @@ -3,5 +3,6 @@ version = getSubprojectVersion(project, "0.1.0") dependencies { compile project(path: ':patchwork-fml', configuration: 'dev') + compile project(path: ':patchwork-capabilities', configuration: 'dev') compile project(path: ':patchwork-events-lifecycle', configuration: 'dev') } diff --git a/patchwork-god-classes/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/patchwork-god-classes/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index f9e54a66..9d526437 100644 --- a/patchwork-god-classes/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/patchwork-god-classes/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -19,9 +19,25 @@ package net.minecraftforge.event; +import javax.annotation.Nullable; + +import net.minecraftforge.common.capabilities.CapabilityDispatcher; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +import net.patchworkmc.impl.capability.CapabilityEvents; + /* * Note: this class is intended for mod use only, to dispatch to the implementations kept in their own modules. * Do not keep implementation details here, methods should be thin wrappers around methods in other modules. */ public class ForgeEventFactory { + @Nullable + public static CapabilityDispatcher gatherCapabilities(Class type, T provider) { + return gatherCapabilities(type, provider, null); + } + + @Nullable + public static CapabilityDispatcher gatherCapabilities(Class type, T provider, @Nullable ICapabilityProvider parent) { + return CapabilityEvents.gatherCapabilities(type, provider, parent); + } } diff --git a/patchwork-god-classes/src/main/resources/fabric.mod.json b/patchwork-god-classes/src/main/resources/fabric.mod.json index 7c0f2121..102bb0d7 100644 --- a/patchwork-god-classes/src/main/resources/fabric.mod.json +++ b/patchwork-god-classes/src/main/resources/fabric.mod.json @@ -17,6 +17,7 @@ "depends": { "fabricloader": ">=0.8.4", "patchwork-fml": "*", + "patchwork-capabilities": "*", "patchwork-events-lifecycle": "*" }, "custom": {