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

Implement Capability system #3898

Merged
merged 10 commits into from
Feb 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ dependencies {
api("net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev")
api("com.github.GTNewHorizons:NotEnoughItems:2.7.29-GTNH:dev")
api("com.github.GTNewHorizons:NotEnoughIds:2.1.6:dev")
api("com.github.GTNewHorizons:GTNHLib:0.6.10:dev")
api("com.github.GTNewHorizons:GTNHLib:0.6.11:dev")
api("com.github.GTNewHorizons:ModularUI:1.2.17:dev")
api("com.github.GTNewHorizons:ModularUI2:2.2.4-1.7.10:dev")
api("com.github.GTNewHorizons:waila:1.8.2:dev")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
import gregtech.common.pollution.Pollution;

/**
* Implement this interface for TileEntities that can have association to cleanroom.
* Implement this interface for machines that can have association to cleanroom.
* Calling {@link Pollution#addPollution(TileEntity, int)} from this machine
* will pollute associated cleanroom.
* Instead of directly implementing this interface for TileEntity, you can also expose capability implementation via
* {@link com.gtnewhorizon.gtnhlib.capability.CapabilityProvider#getCapability CapabilityProvider.getCapability}.
*/
public interface ICleanroomReceiver {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import net.minecraftforge.fluids.IFluidHandler;
import net.minecraftforge.fluids.IFluidTank;

import com.gtnewhorizon.gtnhlib.capability.CapabilityProvider;
import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;

import appeng.api.crafting.ICraftingIconProvider;
Expand All @@ -44,7 +45,7 @@
* Don't implement this yourself and expect it to work. Extend @MetaTileEntity itself.
*/
public interface IMetaTileEntity extends ISidedInventory, IFluidTank, IFluidHandler, IMachineBlockUpdateable,
IGregtechWailaProvider, IGetGUITextureSet, ICraftingIconProvider, IGregTechDeviceInformation {
IGregtechWailaProvider, IGetGUITextureSet, ICraftingIconProvider, IGregTechDeviceInformation, CapabilityProvider {

/**
* This determines the BaseMetaTileEntity belonging to this MetaTileEntity by using the Meta ID of the Block itself.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.IFluidHandler;

import com.gtnewhorizon.gtnhlib.capability.CapabilityProvider;

import gregtech.api.interfaces.IDescribable;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.modularui.IAddInventorySlots;
Expand All @@ -26,7 +28,7 @@
*/
public interface IGregTechTileEntity extends ITexturedTileEntity, ICoverable, IFluidHandler, ITurnable,
IGregTechDeviceInformation, IUpgradableMachine, IDigitalChest, IDescribable, IMachineBlockUpdateable,
IGregtechWailaProvider, IGetGUITextureSet, IAddInventorySlots {
IGregtechWailaProvider, IGetGUITextureSet, IAddInventorySlots, CapabilityProvider {

/**
* @return the MetaID of the Block or the MetaTileEntity ID.
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import gregtech.api.GregTechAPI;
import gregtech.api.covers.CoverRegistry;
import gregtech.api.enums.GTValues;
Expand Down Expand Up @@ -660,6 +663,15 @@ public int setMetaTileID(short aID) {
return mID = aID;
}

@Nullable
@Override
public <T> T getCapability(@NotNull Class<T> capability, @NotNull ForgeDirection side) {
if (canAccessData()) {
return mMetaTileEntity.getCapability(capability, side);
}
return null;
}

@Override
public boolean isActive() {
return false;
Expand Down
29 changes: 10 additions & 19 deletions src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@
import gregtech.api.graphs.GenerateNodeMap;
import gregtech.api.graphs.GenerateNodeMapPower;
import gregtech.api.graphs.Node;
import gregtech.api.interfaces.ICleanroom;
import gregtech.api.interfaces.ICleanroomReceiver;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IDebugableTileEntity;
Expand Down Expand Up @@ -97,7 +95,7 @@
*/
public class BaseMetaTileEntity extends CommonBaseMetaTileEntity
implements IGregTechTileEntity, IActionHost, IGridProxyable, IAlignmentProvider, IConstructableProvider,
IDebugableTileEntity, IGregtechWailaProvider, ICleanroomReceiver, ICustomNameObject {
IDebugableTileEntity, IGregtechWailaProvider, ICustomNameObject {

private static final Field ENTITY_ITEM_HEALTH_FIELD = ReflectionHelper
.findField(EntityItem.class, "health", "field_70291_e");
Expand Down Expand Up @@ -1084,6 +1082,15 @@ public int setMetaTileID(short aID) {
return mID = aID;
}

@Nullable
@Override
public <T> T getCapability(@NotNull Class<T> capability, @NotNull ForgeDirection side) {
if (canAccessData()) {
return mMetaTileEntity.getCapability(capability, side);
}
return null;
}

@Override
public boolean isActive() {
return mActive;
Expand Down Expand Up @@ -1348,22 +1355,6 @@ public boolean privateAccess() {
return mLockUpgrade || mMetaTileEntity.ownerControl();
}

@Nullable
@Override
public ICleanroom getCleanroom() {
if (canAccessData()) {
return mMetaTileEntity.getCleanroom();
}
return null;
}

@Override
public void setCleanroom(ICleanroom cleanroom) {
if (canAccessData()) {
mMetaTileEntity.setCleanroom(cleanroom);
}
}

public void doEnergyExplosion() {
if (getUniversalEnergyCapacity() > 0 && getUniversalEnergyStored() >= getUniversalEnergyCapacity() / 5) {
GTLog.exp.println(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gnu.trove.list.TIntList;
Expand Down Expand Up @@ -80,6 +83,15 @@ protected CommonMetaTileEntity(String name, int invSlotCount) {
mName = name;
}

/**
* @inheritDoc
*/
@Nullable
@Override
public <T> T getCapability(@NotNull Class<T> capability, @NotNull ForgeDirection side) {
return null;
}

@Override
public void onServerStart() {}

Expand Down
34 changes: 20 additions & 14 deletions src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
Expand All @@ -30,7 +31,6 @@
import gregtech.api.enums.SteamVariant;
import gregtech.api.gui.GUIColorOverride;
import gregtech.api.gui.modularui.GUITextureSet;
import gregtech.api.interfaces.ICleanroom;
import gregtech.api.interfaces.ICleanroomReceiver;
import gregtech.api.interfaces.IConfigurationCircuitSupport;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
Expand All @@ -41,6 +41,7 @@
import gregtech.api.util.GTTooltipDataCache;
import gregtech.api.util.GTUtil;
import gregtech.api.util.GTUtility;
import gregtech.common.capability.CleanroomReference;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import tectech.thing.metaTileEntity.pipe.MTEPipeData;
Expand All @@ -56,7 +57,7 @@
* GT_MetaTileEntity_E_Furnace(54, "GT_E_Furnace", "Automatic E-Furnace");"
*/
@SuppressWarnings("unused")
public abstract class MetaTileEntity extends CommonMetaTileEntity implements ICleanroomReceiver {
public abstract class MetaTileEntity extends CommonMetaTileEntity {

/**
* Inventory wrapper for ModularUI
Expand All @@ -71,7 +72,7 @@ public ItemStackHandler getInventoryHandler() {
return inventoryHandler;
}

private ICleanroom cleanroom;
protected final ICleanroomReceiver cleanroomReference = new CleanroomReference();

/**
* accessibility to this Field is no longer given, see below
Expand Down Expand Up @@ -136,6 +137,22 @@ public boolean isValid() {
&& !getBaseMetaTileEntity().isDead();
}

/**
* Override to delegate capability this machine implements to baseMTE. Don't forget to fall back to
* {@code super.getCapability}.
*
* @see com.gtnewhorizon.gtnhlib.capability.CapabilityProvider CapabilityProvider
* @inheritDoc
*/
@Nullable
@Override
public <T> T getCapability(@NotNull Class<T> capability, @NotNull ForgeDirection side) {
if (capability == ICleanroomReceiver.class) {
return capability.cast(cleanroomReference);
}
return super.getCapability(capability, side);
}

@Override
public ItemStack getStackForm(long aAmount) {
return new ItemStack(GregTechAPI.sBlockMachines, (int) aAmount, getBaseMetaTileEntity().getMetaTileID());
Expand Down Expand Up @@ -260,17 +277,6 @@ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlaye
return onRightclick(aBaseMetaTileEntity, aPlayer);
}

@Nullable
@Override
public ICleanroom getCleanroom() {
return cleanroom;
}

@Override
public void setCleanroom(ICleanroom cleanroom) {
this.cleanroom = cleanroom;
}

/**
* @return true if this Device emits Energy at all
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1096,7 +1096,7 @@ public int checkRecipe(boolean skipOC) {
mOutputBlocked++;
return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
}
ICleanroom cleanroom = getCleanroom();
ICleanroom cleanroom = cleanroomReference.getCleanroom();
if (tRecipe.mSpecialValue == -200 || tRecipe.mSpecialValue == -300) {
if (cleanroom == null || !cleanroom.isValidCleanroom() || cleanroom.getCleanness() == 0) {
return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS;
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/gregtech/common/capability/CleanroomReference.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package gregtech.common.capability;

import javax.annotation.Nullable;

import gregtech.api.interfaces.ICleanroom;
import gregtech.api.interfaces.ICleanroomReceiver;

public class CleanroomReference implements ICleanroomReceiver {

private ICleanroom cleanroom;

public CleanroomReference() {}

@Nullable
@Override
public ICleanroom getCleanroom() {
return this.cleanroom;
}

@Override
public void setCleanroom(ICleanroom cleanroom) {
this.cleanroom = cleanroom;
}
}
13 changes: 9 additions & 4 deletions src/main/java/gregtech/common/pollution/Pollution.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
import net.minecraftforge.event.world.ChunkWatchEvent;
import net.minecraftforge.event.world.WorldEvent;

import com.gtnewhorizon.gtnhlib.capability.Capabilities;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
Expand Down Expand Up @@ -343,10 +345,13 @@ public static void addPollution(IGregTechTileEntity te, int aPollution) {
public static void addPollution(TileEntity te, int aPollution) {
if (!GTMod.gregtechproxy.mPollution || aPollution == 0 || te.getWorldObj().isRemote) return;

if (aPollution > 0 && te instanceof ICleanroomReceiver receiver) {
ICleanroom cleanroom = receiver.getCleanroom();
if (cleanroom != null && cleanroom.isValidCleanroom()) {
cleanroom.pollute();
if (aPollution > 0) {
ICleanroomReceiver receiver = Capabilities.getCapability(te, ICleanroomReceiver.class);
if (receiver != null) {
ICleanroom cleanroom = receiver.getCleanroom();
if (cleanroom != null && cleanroom.isValidCleanroom()) {
cleanroom.pollute();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;

import com.gtnewhorizon.gtnhlib.capability.Capabilities;
import com.gtnewhorizon.structurelib.StructureLibAPI;
import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable;
import com.gtnewhorizons.modularui.api.math.Alignment;
Expand Down Expand Up @@ -663,7 +664,8 @@ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack a
for (int dx = dxMin + 1; dx <= dxMax - 1; ++dx) {
for (int dz = dzMin + 1; dz <= dzMax - 1; dz++) {
TileEntity te = aBaseMetaTileEntity.getTileEntityOffset(dx, dy, dz);
if (te instanceof ICleanroomReceiver receiver) {
ICleanroomReceiver receiver = Capabilities.getCapability(te, ICleanroomReceiver.class);
if (receiver != null) {
receiver.setCleanroom(this);
cleanroomReceivers.add(receiver);
}
Expand Down