diff --git a/build.gradle.kts b/build.gradle.kts index d19653e..30e7230 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,8 +1,8 @@ plugins { - id ("java-library") - id ("eclipse") - id ("idea") - id ("maven-publish") + `java-library` + eclipse + idea + `maven-publish` id ("net.neoforged.gradle.userdev") version ("7.0.138") } diff --git a/src/main/java/robaertschi/environmenttech/EnvironmentTech.java b/src/main/java/robaertschi/environmenttech/EnvironmentTech.java index 46714ac..d4d9f6c 100644 --- a/src/main/java/robaertschi/environmenttech/EnvironmentTech.java +++ b/src/main/java/robaertschi/environmenttech/EnvironmentTech.java @@ -5,6 +5,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; @@ -33,6 +34,7 @@ import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; import org.slf4j.Logger; import robaertschi.environmenttech.data.attachments.ETAttachments; +import robaertschi.environmenttech.data.capabilities.ETCapabilities; import robaertschi.environmenttech.level.block.ETBlocks; import robaertschi.environmenttech.level.item.ETItems; @@ -44,8 +46,9 @@ public class EnvironmentTech public static final String MODID = "environmenttech"; public static final Logger LOGGER = LogUtils.getLogger(); - - + public static ResourceLocation id(String name) { + return new ResourceLocation(MODID, name); + } // The constructor for the mod class is the first code that is run when your mod is loaded. // FML will recognize some parameter types like IEventBus or ModContainer and pass them in automatically. @@ -56,6 +59,7 @@ public class EnvironmentTech modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC); ETAttachments.init(modEventBus); + ETCapabilities.init(modEventBus); ETBlocks.init(modEventBus); ETItems.init(modEventBus); diff --git a/src/main/java/robaertschi/environmenttech/data/capabilities/ETCapabilities.java b/src/main/java/robaertschi/environmenttech/data/capabilities/ETCapabilities.java new file mode 100644 index 0000000..93c0e33 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/data/capabilities/ETCapabilities.java @@ -0,0 +1,22 @@ +package robaertschi.environmenttech.data.capabilities; + +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.capabilities.BlockCapability; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import robaertschi.environmenttech.EnvironmentTech; + +public class ETCapabilities { + public static final BlockCapability ENV_STORAGE_BLOCK = + BlockCapability.create(EnvironmentTech.id("env_storage"), + IEnvStorage.class, + EnvCapabilityContext.class + ); + + public static void init(IEventBus iEventBus) { + iEventBus.addListener(ETCapabilities::registerCapabilities); + } + + private static void registerCapabilities(RegisterCapabilitiesEvent event) { + + } +} diff --git a/src/main/java/robaertschi/environmenttech/data/capabilities/EnvCapabilityContext.java b/src/main/java/robaertschi/environmenttech/data/capabilities/EnvCapabilityContext.java new file mode 100644 index 0000000..0a17251 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/data/capabilities/EnvCapabilityContext.java @@ -0,0 +1,6 @@ +package robaertschi.environmenttech.data.capabilities; + +public record EnvCapabilityContext(EnvType type) { + + +} diff --git a/src/main/java/robaertschi/environmenttech/data/capabilities/EnvStorage.java b/src/main/java/robaertschi/environmenttech/data/capabilities/EnvStorage.java new file mode 100644 index 0000000..f00487d --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/data/capabilities/EnvStorage.java @@ -0,0 +1,55 @@ +package robaertschi.environmenttech.data.capabilities; + +import net.minecraft.util.Mth; + +// TODO: Add max receive or something +public class EnvStorage implements IEnvStorage { + private final EnvType[] acceptedEnvTypes; + private final long maxEnv; + private long env; + + public EnvStorage(EnvType acceptedEnvType, long maxEnv, long env) { + this.acceptedEnvTypes = new EnvType[1]; + this.acceptedEnvTypes[0] = acceptedEnvType; + this.maxEnv = maxEnv; + this.env = env; + } + + public EnvStorage(EnvType acceptedEnvType, long maxEnv) { + this(acceptedEnvType, maxEnv, 0); + } + + public EnvStorage(EnvType[] acceptedEnvTypes, long maxEnv, long env) { + this.acceptedEnvTypes = acceptedEnvTypes; + this.maxEnv = maxEnv; + this.env = env; + } + + public EnvStorage(EnvType[] acceptedEnvTypes, long maxEnv) { + this(acceptedEnvTypes, maxEnv, 0); + } + + @Override + public long receiveEnv(long amount, boolean simulate) { + long received = Mth.clamp(this.maxEnv - this.env, 0, amount); + if (!simulate) + env += received; + + return received; + } + + @Override + public long getEnvStored() { + return env; + } + + @Override + public long getMaxEnv() { + return maxEnv; + } + + @Override + public EnvType[] canAcceptEnvType() { + return acceptedEnvTypes; + } +} diff --git a/src/main/java/robaertschi/environmenttech/data/capabilities/EnvType.java b/src/main/java/robaertschi/environmenttech/data/capabilities/EnvType.java new file mode 100644 index 0000000..632c33a --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/data/capabilities/EnvType.java @@ -0,0 +1,7 @@ +package robaertschi.environmenttech.data.capabilities; + +public enum EnvType { + Chunk, + Normal, + Bundled, +} diff --git a/src/main/java/robaertschi/environmenttech/data/capabilities/IEnvStorage.java b/src/main/java/robaertschi/environmenttech/data/capabilities/IEnvStorage.java new file mode 100644 index 0000000..2d36860 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/data/capabilities/IEnvStorage.java @@ -0,0 +1,24 @@ +package robaertschi.environmenttech.data.capabilities; + +/** + * ENV is pushed based, so you should not be able to extract ENV from anything. + * This is the reason for the nonexistent extract method. + */ +public interface IEnvStorage { + /** + * Receive ENV. + * The type is provided in {@link EnvCapabilityContext} + * @param amount The Amount of ENV to receive. + * @param simulate If the operation is to only be simulated and not affect the storage amount + * @return How much energy was accepted. + */ + long receiveEnv(long amount, boolean simulate); + + long getEnvStored(); + long getMaxEnv(); + + /** + * @return Which ENVType's that are supported. + */ + EnvType[] canAcceptEnvType(); +} diff --git a/src/main/java/robaertschi/environmenttech/level/block/EnvCollectorBlock.java b/src/main/java/robaertschi/environmenttech/level/block/EnvCollectorBlock.java new file mode 100644 index 0000000..cf24edb --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/level/block/EnvCollectorBlock.java @@ -0,0 +1,41 @@ +package robaertschi.environmenttech.level.block; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.level.block.BaseEntityBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault() +public class EnvCollectorBlock extends BaseEntityBlock { + public static final MapCodec CODEC = simpleCodec(EnvCollectorBlock::new); + + public EnvCollectorBlock(Properties properties) { + super(properties); + } + + @Override + protected @NotNull MapCodec codec() { + return CODEC; + } + + @SuppressWarnings("deprecation") + @Override + protected @NotNull RenderShape getRenderShape(BlockState pState) { + return RenderShape.MODEL; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return null; + } +} diff --git a/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java b/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java new file mode 100644 index 0000000..b045ec4 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/level/block/entity/EnvCollectorBlockEntity.java @@ -0,0 +1,12 @@ +package robaertschi.environmenttech.level.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class EnvCollectorBlockEntity extends BlockEntity { + public EnvCollectorBlockEntity(BlockEntityType pType, BlockPos pPos, BlockState pBlockState) { + super(pType, pPos, pBlockState); + } +} diff --git a/src/main/java/robaertschi/environmenttech/level/item/ETItems.java b/src/main/java/robaertschi/environmenttech/level/item/ETItems.java index 0c7c694..1d62cdf 100644 --- a/src/main/java/robaertschi/environmenttech/level/item/ETItems.java +++ b/src/main/java/robaertschi/environmenttech/level/item/ETItems.java @@ -34,6 +34,8 @@ public class ETItems { .durability(10) ); + public static final DeferredItem ENVIRONMENTAL_ESSENCE = ITEMS.registerSimpleItem("environmental_essence"); + @SuppressWarnings("unused") public static final DeferredHolder CREATE_MODE_TAB = CREATIVE_MODE_TABS.register("environmenttech", () -> CreativeModeTab.builder() @@ -43,6 +45,7 @@ public class ETItems { .displayItems((parameters, output) -> { output.accept(ENV_DETECTOR_ITEM.get()); output.accept(EXAMPLE_BLOCK_ITEM.get()); + output.accept(ENVIRONMENTAL_ESSENCE.get()); }).build()); diff --git a/src/main/resources/assets/environmenttech/lang/en_US.json b/src/main/resources/assets/environmenttech/lang/en_US.json index 04de606..48f6a3f 100644 --- a/src/main/resources/assets/environmenttech/lang/en_US.json +++ b/src/main/resources/assets/environmenttech/lang/en_US.json @@ -1,5 +1,6 @@ { "item.environmenttech.env_detector": "ENV Detector", + "item.environmenttech.environmental_essence": "Environmental Essence", "itemGroup.environmenttech": "Environment Tech" } \ No newline at end of file