diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/caps/ForgeCapability.java b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/caps/ForgeCapability.java new file mode 100644 index 0000000..5e98c56 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/caps/ForgeCapability.java @@ -0,0 +1,11 @@ +package me.hypherionmc.craterlib.api.blockentities.caps; + +/** + * @author HypherionSA + * @date 24/09/2022 + */ +public enum ForgeCapability { + ENERGY, + ITEM, + FLUID +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/caps/IForgeCapProvider.java b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/caps/IForgeCapProvider.java new file mode 100644 index 0000000..f364409 --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/api/blockentities/caps/IForgeCapProvider.java @@ -0,0 +1,15 @@ +package me.hypherionmc.craterlib.api.blockentities.caps; + +import net.minecraft.core.Direction; + +import java.util.Optional; + +/** + * @author HypherionSA + * @date 24/09/2022 + */ +public interface IForgeCapProvider { + + Optional getForgeCapability(ForgeCapability capability, Direction side); + +} diff --git a/Common/src/main/java/me/hypherionmc/craterlib/common/blockentity/CraterBlockEntity.java b/Common/src/main/java/me/hypherionmc/craterlib/common/blockentity/CraterBlockEntity.java new file mode 100644 index 0000000..cc2216e --- /dev/null +++ b/Common/src/main/java/me/hypherionmc/craterlib/common/blockentity/CraterBlockEntity.java @@ -0,0 +1,47 @@ +package me.hypherionmc.craterlib.common.blockentity; + +import me.hypherionmc.craterlib.api.blockentities.caps.ForgeCapability; +import me.hypherionmc.craterlib.api.blockentities.caps.IForgeCapProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.Optional; + +/** + * @author HypherionSA + * @date 24/09/2022 + */ +public class CraterBlockEntity extends BlockEntity implements IForgeCapProvider { + + public CraterBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState state) { + super(blockEntityType, pos, state); + } + + public void sendUpdates() { + level.blockEntityChanged(this.getBlockPos()); + level.sendBlockUpdated(this.getBlockPos(), level.getBlockState(this.getBlockPos()), level.getBlockState(this.getBlockPos()), 3); + setChanged(); + } + + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public CompoundTag getUpdateTag() { + CompoundTag compoundTag = new CompoundTag(); + saveAdditional(compoundTag); + return compoundTag; + } + + @Override + public Optional getForgeCapability(ForgeCapability capability, Direction side) { + return Optional.empty(); + } +} diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java b/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java new file mode 100644 index 0000000..ccdf7c7 --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java @@ -0,0 +1,39 @@ +package me.hypherionmc.craterlib.mixin; + +import me.hypherionmc.craterlib.api.blockentities.caps.ForgeCapability; +import me.hypherionmc.craterlib.api.blockentities.caps.IForgeCapProvider; +import me.hypherionmc.craterlib.common.blockentity.CraterBlockEntity; +import me.hypherionmc.craterlib.systems.energy.CustomEnergyStorage; +import me.hypherionmc.craterlib.systems.energy.ForgeEnergyWrapper; +import net.minecraft.core.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.Optional; + +/** + * @author HypherionSA + * @date 24/09/2022 + */ +@Mixin(CraterBlockEntity.class) +public class BlockEntityMixin implements ICapabilityProvider { + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + IForgeCapProvider capProvider = (IForgeCapProvider) this; + + if (cap == ForgeCapabilities.ENERGY) { + Optional forgeCap = capProvider.getForgeCapability(ForgeCapability.ENERGY, side); + if (forgeCap.isPresent()) { + return LazyOptional.of(() -> new ForgeEnergyWrapper(forgeCap.get())).cast(); + } + } + + return LazyOptional.empty(); + } +} diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/systems/energy/ForgeCustomEnergyStorage.java b/Forge/src/main/java/me/hypherionmc/craterlib/systems/energy/ForgeCustomEnergyStorage.java deleted file mode 100644 index 9f32c15..0000000 --- a/Forge/src/main/java/me/hypherionmc/craterlib/systems/energy/ForgeCustomEnergyStorage.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.hypherionmc.craterlib.systems.energy; - -import net.minecraftforge.energy.IEnergyStorage; - -/** - * @author HypherionSA - * @date 03/07/2022 - * Forge Energy Support on top of the custom system - */ -public class ForgeCustomEnergyStorage extends CustomEnergyStorage implements IEnergyStorage { - - - public ForgeCustomEnergyStorage(int capacity) { - super(capacity); - } - - public ForgeCustomEnergyStorage(int powerCapacity, int maxTransfer) { - super(powerCapacity, maxTransfer); - } - - public ForgeCustomEnergyStorage(int powerCapacity, int maxInput, int maxOutput) { - super(powerCapacity, maxInput, maxOutput); - } - - public ForgeCustomEnergyStorage(int capacity, int maxInput, int maxOutput, int initialPower) { - super(capacity, maxInput, maxOutput, initialPower); - } - - @Override - public int getEnergyStored() { - return this.getPowerLevel(); - } - - @Override - public int getMaxEnergyStored() { - return this.getPowerCapacity(); - } - - @Override - public boolean canExtract() { - return this.maxOutput > 0; - } - - @Override - public boolean canReceive() { - return this.maxInput > 0; - } -} diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/systems/energy/ForgeEnergyWrapper.java b/Forge/src/main/java/me/hypherionmc/craterlib/systems/energy/ForgeEnergyWrapper.java new file mode 100644 index 0000000..99be3ce --- /dev/null +++ b/Forge/src/main/java/me/hypherionmc/craterlib/systems/energy/ForgeEnergyWrapper.java @@ -0,0 +1,41 @@ +package me.hypherionmc.craterlib.systems.energy; + +import net.minecraftforge.energy.IEnergyStorage; + +/** + * @author HypherionSA + * @date 03/07/2022 + * Forge Energy Support on top of the custom system + */ +public record ForgeEnergyWrapper(CustomEnergyStorage storage) implements IEnergyStorage { + + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + return storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + return storage.extractEnergy(maxExtract, simulate); + } + + @Override + public int getEnergyStored() { + return storage.getPowerLevel(); + } + + @Override + public int getMaxEnergyStored() { + return storage.getPowerCapacity(); + } + + @Override + public boolean canExtract() { + return storage.getMaxOutput() > 0; + } + + @Override + public boolean canReceive() { + return storage.getMaxInput() > 0; + } +} diff --git a/Forge/src/main/resources/craterlib.forge.mixins.json b/Forge/src/main/resources/craterlib.forge.mixins.json index 7ed9188..df3210a 100644 --- a/Forge/src/main/resources/craterlib.forge.mixins.json +++ b/Forge/src/main/resources/craterlib.forge.mixins.json @@ -4,6 +4,7 @@ "package": "me.hypherionmc.craterlib.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "BlockEntityMixin" ], "client": [ "ConfigScreenHandlerMixin" diff --git a/gradle.properties b/gradle.properties index ef092f7..a4f83a0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # Project version_major=0 version_minor=0 -version_patch=1d +version_patch=3d group=me.hypherionmc.craterlib # Common