update to 1.21.1 and begin heat generator

This commit is contained in:
Robin 2024-12-08 22:52:09 +01:00
parent 0b8e03a10f
commit 9137810d2f
25 changed files with 314 additions and 136 deletions

View File

@ -2,13 +2,16 @@ import java.net.URI
plugins { plugins {
`java-library` `java-library`
eclipse
idea idea
`maven-publish` `maven-publish`
id("io.freefair.lombok") version "8.6" id("io.freefair.lombok") version "8.6"
id ("net.neoforged.gradle.userdev") version ("7.0.153")
id("com.diffplug.spotless") version "7.0.0.BETA1" id("com.diffplug.spotless") version "7.0.0.BETA1"
id("com.palantir.git-version") version "3.1.0" id("com.palantir.git-version") version "3.1.0"
id ("net.neoforged.gradle.userdev") version ("7.0.171")
}
tasks.named<Wrapper>("wrapper") {
distributionType = Wrapper.DistributionType.BIN
} }
val minecraftVersion: String by project val minecraftVersion: String by project
@ -46,7 +49,6 @@ val versionDetails: groovy.lang.Closure<com.palantir.gradle.gitversion.VersionDe
val details = versionDetails() val details = versionDetails()
val snapshot = "-SNAPSHOT" val snapshot = "-SNAPSHOT"
val subversion = ".${details.commitDistance}"
val noTag = !details.lastTag.contains(Regex("""\d+\.\d+""")) val noTag = !details.lastTag.contains(Regex("""\d+\.\d+"""))
val end = if (noTag) snapshot else ".${details.commitDistance}${snapshot}" val end = if (noTag) snapshot else ".${details.commitDistance}${snapshot}"
@ -179,7 +181,8 @@ runs {
create("server") { create("server") {
systemProperty ("forge.enabledGameTestNamespaces", modId) systemProperty ("forge.enabledGameTestNamespaces", modId)
programArgument ("--nogui")
argument("--nogui")
} }
// This run config launches GameTestServer and runs all registered gametests, then exits. // This run config launches GameTestServer and runs all registered gametests, then exits.
@ -187,7 +190,6 @@ runs {
// The gametest system is also enabled by default for other run configs under the /test command. // The gametest system is also enabled by default for other run configs under the /test command.
create("gameTestServer") { create("gameTestServer") {
systemProperty ("forge.enabledGameTestNamespaces", modId) systemProperty ("forge.enabledGameTestNamespaces", modId)
} }
@ -196,7 +198,7 @@ runs {
// workingDirectory project.file("run-data") // workingDirectory project.file("run-data")
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
programArguments.addAll ("--mod", modId, "--all", "--output", file("src/generated/resources/").absolutePath, "--existing", file("src/main/resources/").absolutePath) arguments.addAll ("--mod", modId, "--all", "--output", file("src/generated/resources/").absolutePath, "--existing", file("src/main/resources/").absolutePath)
} }
} }

View File

@ -6,20 +6,20 @@ org.gradle.debug=false
## Environment Properties ## Environment Properties
# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge # You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge
# The Minecraft version must agree with the Neo version to get a valid artifact # The Minecraft version must agree with the Neo version to get a valid artifact
minecraftVersion=1.21.0 minecraftVersion=1.21.1
# The Minecraft version range can use any release version of Minecraft as bounds. # The Minecraft version range can use any release version of Minecraft as bounds.
# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly # Snapshots, pre-releases, and release candidates are not guaranteed to sort properly
# as they do not follow standard versioning conventions. # as they do not follow standard versioning conventions.
minecraftVersionRange=[1.21.0,1.22) minecraftVersionRange=[1.21.1,1.22)
# The Neo version must agree with the Minecraft version to get a valid artifact # The Neo version must agree with the Minecraft version to get a valid artifact
neoVersion=21.0.65-beta neoVersion=21.1.84
# The Neo version range can use any version of Neo as bounds # The Neo version range can use any version of Neo as bounds
neoVersionRange=[21,) neoVersionRange=[21,)
# The loader version range can only use the major version of FML as bounds # The loader version range can only use the major version of FML as bounds
loaderVersionRange=[2,) loaderVersionRange=[2,)
neogradle.subsystems.parchment.minecraftVersion=1.21 neogradle.subsystems.parchment.minecraftVersion=1.21.1
neogradle.subsystems.parchment.mappingsVersion=2024.06.23 neogradle.subsystems.parchment.mappingsVersion=2024.11.17
## Mod Properties ## Mod Properties
@ -44,8 +44,8 @@ modDescription=
# Dependencies # Dependencies
junitVersion=5.10.2 junitVersion=5.10.2
assertjVersion=3.25.1 assertjVersion=3.25.1
topVersion=1.21_neo-12.0.0-1 topVersion=1.21_neo-12.0.4-6
reiVersion=16.0.729 reiVersion=16.0.729
jeiVersion=19.2.0.21 jeiVersion=19.9.1.125
jeiMcVersion=1.21 jeiMcVersion=1.21.1
emiVersion=1.1.10+1.21 emiVersion=1.1.18+1.21.1

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

7
gradlew vendored
View File

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum

2
gradlew.bat vendored
View File

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################

View File

@ -21,6 +21,7 @@ import net.neoforged.neoforge.server.command.EnumArgument;
import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.commands.arguments.coordinates.BlockPosArgument;
import net.minecraft.commands.arguments.coordinates.WorldCoordinates; import net.minecraft.commands.arguments.coordinates.WorldCoordinates;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -31,11 +32,12 @@ import com.mojang.brigadier.arguments.LongArgumentType;
import xyz.robaertschi.environmenttech.data.attachments.ETAttachments; import xyz.robaertschi.environmenttech.data.attachments.ETAttachments;
import xyz.robaertschi.environmenttech.data.capabilities.ETCapabilities; import xyz.robaertschi.environmenttech.data.capabilities.ETCapabilities;
import xyz.robaertschi.environmenttech.data.capabilities.EnvType;
import static net.minecraft.commands.Commands.*; import static net.minecraft.commands.Commands.*;
@SuppressWarnings("resource")
public class EnvironmenttechCommand { public class EnvironmenttechCommand {
public EnvironmenttechCommand(CommandDispatcher<CommandSourceStack> dispatcher) { public EnvironmenttechCommand(CommandDispatcher<CommandSourceStack> dispatcher) {
dispatcher.register( dispatcher.register(
literal("environmenttech") literal("environmenttech")
@ -64,12 +66,25 @@ public class EnvironmenttechCommand {
return 1; return 1;
})) }))
.then(literal("set_env").then(argument("pos", BlockPosArgument.blockPos()).then(argument("env_type", EnumArgument.enumArgument(EnvType.class)).then(argument("amount", LongArgumentType.longArg(0)).executes( .then(literal("set_env").then(argument("pos", BlockPosArgument.blockPos()).then(argument("amount", LongArgumentType.longArg(0)).executes(
context -> { context -> {
WorldCoordinates pos = context.getArgument("pos", WorldCoordinates.class); WorldCoordinates pos = context.getArgument("pos", WorldCoordinates.class);
EnvType type = context.getArgument("env_type", EnvType.class);
long amount = context.getArgument("amount", Long.class); long amount = context.getArgument("amount", Long.class);
var cap = context.getSource().getPlayerOrException().level().getCapability(ETCapabilities.ENV_STORAGE_BLOCK, pos.getBlockPos(context.getSource()), type);
var cap = context.getSource().getPlayerOrException().level().getCapability(ETCapabilities.ENV_STORAGE_BLOCK, pos.getBlockPos(context.getSource()));
if (cap != null) {
cap.receiveEnv(amount, false);
}
return 1;
}
)).then(literal("set_bundled_env").then(argument("pos", BlockPosArgument.blockPos()).then(argument("direction", EnumArgument.enumArgument(Direction.class)).then(argument("amount", LongArgumentType.longArg(0)).executes(
context -> {
WorldCoordinates pos = context.getArgument("pos", WorldCoordinates.class);
long amount = context.getArgument("amount", Long.class);
Direction direction = context.getArgument("direction", Direction.class);
var cap = context.getSource().getPlayerOrException().level().getCapability(ETCapabilities.ENV_BUNDLED_STORAGE_BLOCK, pos.getBlockPos(context.getSource()), direction);
if (cap != null) { if (cap != null) {
cap.receiveEnv(amount, false); cap.receiveEnv(amount, false);
} }
@ -77,6 +92,7 @@ public class EnvironmenttechCommand {
return 1; return 1;
} }
))))) )))))
))
); );
} }
} }

View File

@ -16,11 +16,10 @@
*/ */
package xyz.robaertschi.environmenttech.compat.jei; package xyz.robaertschi.environmenttech.compat.jei;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; import mezz.jei.api.gui.builder.IRecipeLayoutBuilder;
import mezz.jei.api.gui.builder.ITooltipBuilder;
import mezz.jei.api.gui.drawable.IDrawable; import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.gui.ingredient.IRecipeSlotsView; import mezz.jei.api.gui.ingredient.IRecipeSlotsView;
import mezz.jei.api.helpers.IGuiHelper; import mezz.jei.api.helpers.IGuiHelper;
@ -79,11 +78,8 @@ public class EnvCollectorRecipeCategory implements IRecipeCategory<RecipeHolder<
@Override @Override
public void setRecipe(IRecipeLayoutBuilder builder, RecipeHolder<EnvCollectorRecipe> recipeHolder, IFocusGroup focuses) { public void setRecipe(IRecipeLayoutBuilder builder, RecipeHolder<EnvCollectorRecipe> recipeHolder, IFocusGroup focuses) {
EnvCollectorRecipe recipe = recipeHolder.value(); EnvCollectorRecipe recipe = recipeHolder.value();
builder.addSlot(RecipeIngredientRole.INPUT, 6, 16).addIngredients(recipe.input()); builder.addSlot(RecipeIngredientRole.INPUT, 6, 16).addIngredients(recipe.input());
builder.addSlot(RecipeIngredientRole.OUTPUT, 68, 17).addItemStack(recipe.output()); builder.addSlot(RecipeIngredientRole.OUTPUT, 68, 17).addItemStack(recipe.output());
} }
@Override @Override
@ -93,15 +89,11 @@ public class EnvCollectorRecipeCategory implements IRecipeCategory<RecipeHolder<
} }
@Override @Override
public List<Component> getTooltipStrings(RecipeHolder<EnvCollectorRecipe> recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) { public void getTooltip(ITooltipBuilder builder, RecipeHolder<EnvCollectorRecipe> recipe, IRecipeSlotsView recipeSlotsView, double mouseX, double mouseY) {
List<Component> components = new ArrayList<>();
int x = getWidth() - 10; int x = getWidth() - 10;
if (MouseUtils.isMouseOver(Mth.floor(mouseX), Mth.floor(mouseY), x, 2, 8, 45)) { if (MouseUtils.isMouseOver(Mth.floor(mouseX), Mth.floor(mouseY), x, 2, 8, 45)) {
components.add(Component.literal(recipe.value().envUsed() + " / " + 64 + " ENV")); builder.add(Component.literal(recipe.value().envUsed() + " / " + 64 + " ENV"));
} }
return components;
} }

View File

@ -35,7 +35,6 @@ import net.minecraft.world.item.ItemStack;
import xyz.robaertschi.environmenttech.ET; import xyz.robaertschi.environmenttech.ET;
import xyz.robaertschi.environmenttech.data.recipes.ETRecipes; import xyz.robaertschi.environmenttech.data.recipes.ETRecipes;
import xyz.robaertschi.environmenttech.level.block.ETBlocks; import xyz.robaertschi.environmenttech.level.block.ETBlocks;
import xyz.robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEntity;
import xyz.robaertschi.environmenttech.menu.ETMenus; import xyz.robaertschi.environmenttech.menu.ETMenus;
import xyz.robaertschi.environmenttech.menu.EnvCollectorMenu; import xyz.robaertschi.environmenttech.menu.EnvCollectorMenu;
@ -68,9 +67,9 @@ public class JeiCompatPlugin implements IModPlugin {
@Override @Override
public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) { public void registerRecipeTransferHandlers(IRecipeTransferRegistration registration) {
registration.addRecipeTransferHandler(EnvCollectorMenu.class, ETMenus.ENV_COLLECTOR_MENU.get(), EnvCollectorRecipeCategory.ENV_COLLECTOR, registration.addRecipeTransferHandler(EnvCollectorMenu.class, ETMenus.ENV_COLLECTOR_MENU.get(), EnvCollectorRecipeCategory.ENV_COLLECTOR,
EnvCollectorBlockEntity.SLOT_INPUT, 0,
EnvCollectorBlockEntity.SLOT_INPUT_COUNT, 1,
EnvCollectorBlockEntity.SLOT_COUNT, 2,
Inventory.INVENTORY_SIZE); Inventory.INVENTORY_SIZE);
} }
} }

View File

@ -24,6 +24,7 @@ import net.neoforged.fml.InterModComms;
import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent; import net.neoforged.fml.event.lifecycle.InterModEnqueueEvent;
import net.neoforged.neoforge.capabilities.BlockCapabilityCache; import net.neoforged.neoforge.capabilities.BlockCapabilityCache;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
@ -34,7 +35,7 @@ import xyz.robaertschi.environmenttech.ET;
import xyz.robaertschi.environmenttech.EnvironmentTech; import xyz.robaertschi.environmenttech.EnvironmentTech;
import xyz.robaertschi.environmenttech.client.renderer.EnvStorageRenderer; import xyz.robaertschi.environmenttech.client.renderer.EnvStorageRenderer;
import xyz.robaertschi.environmenttech.data.capabilities.ETCapabilities; import xyz.robaertschi.environmenttech.data.capabilities.ETCapabilities;
import xyz.robaertschi.environmenttech.data.capabilities.EnvType; import xyz.robaertschi.environmenttech.data.capabilities.IBundledEnvStorage;
import xyz.robaertschi.environmenttech.data.capabilities.IEnvStorage; import xyz.robaertschi.environmenttech.data.capabilities.IEnvStorage;
public class TopCompat { public class TopCompat {
@ -54,7 +55,8 @@ public class TopCompat {
probe = theOneProbe; probe = theOneProbe;
EnvironmentTech.LOGGER.info("Enabled TheOneProbe support"); EnvironmentTech.LOGGER.info("Enabled TheOneProbe support");
theOneProbe.registerProvider(new IProbeInfoProvider() { theOneProbe.registerProvider(new IProbeInfoProvider() {
private BlockCapabilityCache<IEnvStorage, EnvType> capCache = null; private BlockCapabilityCache<IEnvStorage, Void> capCache = null;
private BlockCapabilityCache<IBundledEnvStorage, Direction> bundledCapCache = null;
@Override @Override
public ResourceLocation getID() { public ResourceLocation getID() {
@ -71,14 +73,11 @@ public class TopCompat {
if (!(level instanceof ServerLevel)) return; if (!(level instanceof ServerLevel)) return;
if (capCache == null || !capCache.pos().equals(iProbeHitData.getPos())) { if (capCache == null || !capCache.pos().equals(iProbeHitData.getPos())) {
capCache = BlockCapabilityCache.create(ETCapabilities.ENV_STORAGE_BLOCK, (ServerLevel) level, iProbeHitData.getPos(), EnvType.Normal); capCache = BlockCapabilityCache.create(ETCapabilities.ENV_STORAGE_BLOCK, (ServerLevel) level, iProbeHitData.getPos(), null);
}
// Try other env types // Try other env types
if (capCache.getCapability() == null) { if (bundledCapCache == null || !capCache.pos().equals(iProbeHitData.getPos())) {
capCache = BlockCapabilityCache.create(ETCapabilities.ENV_STORAGE_BLOCK, (ServerLevel) level, iProbeHitData.getPos(), EnvType.Bundled); bundledCapCache = BlockCapabilityCache.create(ETCapabilities.ENV_BUNDLED_STORAGE_BLOCK, (ServerLevel) level, iProbeHitData.getPos(), null);
}
if (capCache.getCapability() == null) {
capCache = BlockCapabilityCache.create(ETCapabilities.ENV_STORAGE_BLOCK, (ServerLevel) level, iProbeHitData.getPos(), EnvType.Chunk);
}
} }
IEnvStorage cap = capCache.getCapability(); IEnvStorage cap = capCache.getCapability();
@ -89,6 +88,15 @@ public class TopCompat {
.suffix(" ENV"); .suffix(" ENV");
iProbeInfo.horizontal().progress(cap.getEnvStored(),cap.getMaxEnv(), style); iProbeInfo.horizontal().progress(cap.getEnvStored(),cap.getMaxEnv(), style);
} }
IBundledEnvStorage bundledCap = bundledCapCache.getCapability();
if (bundledCap != null) {
var style = iProbeInfo.defaultProgressStyle()
.filledColor(EnvStorageRenderer.from)
.alternateFilledColor(EnvStorageRenderer.to)
.suffix(" Bundled ENV");
iProbeInfo.horizontal().progress(bundledCap.getEnvStored(), bundledCap.getMaxEnv(), style);
}
} }
}); });

View File

@ -27,11 +27,13 @@ import xyz.robaertschi.environmenttech.ET;
import xyz.robaertschi.environmenttech.level.block.entity.ETBlockEntities; import xyz.robaertschi.environmenttech.level.block.entity.ETBlockEntities;
public class ETCapabilities { public class ETCapabilities {
public static final BlockCapability<IEnvStorage, EnvType> ENV_STORAGE_BLOCK = public static final BlockCapability<IEnvStorage, Void> ENV_STORAGE_BLOCK =
BlockCapability.create(ET.id("env_storage"), BlockCapability.createVoid(ET.id("env_storage"),
IEnvStorage.class, IEnvStorage.class);
EnvType.class
); public static final BlockCapability<IBundledEnvStorage, Direction> ENV_BUNDLED_STORAGE_BLOCK =
BlockCapability.create(ET.id("env_bundled_storage"),
IBundledEnvStorage.class, Direction.class);
public static void init(IEventBus iEventBus) { public static void init(IEventBus iEventBus) {
iEventBus.addListener(ETCapabilities::registerCapabilities); iEventBus.addListener(ETCapabilities::registerCapabilities);
@ -55,19 +57,13 @@ public class ETCapabilities {
event.registerBlockEntity( event.registerBlockEntity(
ENV_STORAGE_BLOCK, ENV_STORAGE_BLOCK,
ETBlockEntities.ENV_COLLECTOR_BLOCK_ENTITY.get(), ETBlockEntities.ENV_COLLECTOR_BLOCK_ENTITY.get(),
(object, context) -> { (object, context) -> object.getEnvStorage()
if (context == EnvType.Chunk) return object.getEnvStorage();
return null;
}
); );
event.registerBlockEntity( event.registerBlockEntity(
ENV_STORAGE_BLOCK, ENV_STORAGE_BLOCK,
ETBlockEntities.ENV_DISTRIBUTOR_BLOCK_ENTITY.get(), ETBlockEntities.ENV_DISTRIBUTOR_BLOCK_ENTITY.get(),
(object, context) -> { (object, context) -> object.getEnvStorage()
if (context == EnvType.Chunk) return object.getEnvStorage();
return null;
}
); );
} }

View File

@ -20,34 +20,20 @@ import net.minecraft.util.Mth;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class EnvStorage implements IEnvStorage { public class EnvStorage implements IEnvStorage {
private final EnvType[] acceptedEnvTypes;
private final long maxEnv; private final long maxEnv;
private long env; private long env;
private final long maxTransfer; private final long maxTransfer;
public EnvStorage(EnvType acceptedEnvType, long maxEnv, long env, long maxTransfer) { public EnvStorage(long maxEnv) {
this.acceptedEnvTypes = new EnvType[1]; this(maxEnv, 0, maxEnv);
this.acceptedEnvTypes[0] = acceptedEnvType; }
public EnvStorage(long maxEnv, long env, long maxTransfer) {
this.maxEnv = maxEnv; this.maxEnv = maxEnv;
this.env = env; this.env = env;
this.maxTransfer = maxTransfer; this.maxTransfer = maxTransfer;
} }
public EnvStorage(EnvType acceptedEnvType, long maxEnv) {
this(acceptedEnvType, maxEnv, 0, maxEnv);
}
public EnvStorage(EnvType[] acceptedEnvTypes, long maxEnv, long env, long maxTransfer) {
this.acceptedEnvTypes = acceptedEnvTypes;
this.maxEnv = maxEnv;
this.env = env;
this.maxTransfer = maxTransfer;
}
public EnvStorage(EnvType[] acceptedEnvTypes, long maxEnv) {
this(acceptedEnvTypes, maxEnv, 0, maxEnv);
}
@Override @Override
public long receiveEnv(long amount, boolean simulate) { public long receiveEnv(long amount, boolean simulate) {
long received = Mth.clamp(this.maxEnv - this.env, 0, Math.min(amount, maxTransfer)); long received = Mth.clamp(this.maxEnv - this.env, 0, Math.min(amount, maxTransfer));
@ -73,10 +59,5 @@ public class EnvStorage implements IEnvStorage {
return maxEnv; return maxEnv;
} }
@Override
public EnvType[] canAcceptEnvType() {
return acceptedEnvTypes;
}
public void onContentsChanged() {} public void onContentsChanged() {}
} }

View File

@ -0,0 +1,36 @@
/*
* EnvironmentTech MC Mod
Copyright (C) 2024 Robin Bärtschi and Contributors
This program 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, by version 3 of the License.
This program 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 program. If not, see <https://www.gnu.org/licenses/>.
*/
package xyz.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.
* This is currently the same as {@link IEnvStorage}. This will however change sometime. Also they are not the same.
* Bundled Env Storage is per Cable, which has a {@link net.minecraft.core.Direction} while the Normal Storage doesn't.
*/
public interface IBundledEnvStorage {
/**
* Receive ENV.
* @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();
}

View File

@ -32,10 +32,4 @@ public interface IEnvStorage {
long getEnvStored(); long getEnvStored();
long getMaxEnv(); long getMaxEnv();
/**
* @return Which ENVType's that are supported.
*/
EnvType[] canAcceptEnvType();
} }

View File

@ -21,12 +21,13 @@ import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.DeferredRegister;
import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponentType;
import net.minecraft.core.registries.Registries;
import xyz.robaertschi.environmenttech.ET; import xyz.robaertschi.environmenttech.ET;
public class ETComponents { public class ETComponents {
public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(ET.MODID); public static final DeferredRegister.DataComponents DATA_COMPONENTS = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, ET.MODID);
public static final DeferredHolder<DataComponentType<?>, DataComponentType<FilledComponent>> FILLED_COMPONENT = DATA_COMPONENTS.registerComponentType("filled_component", public static final DeferredHolder<DataComponentType<?>, DataComponentType<FilledComponent>> FILLED_COMPONENT = DATA_COMPONENTS.registerComponentType("filled_component",
filledComponentBuilder -> filledComponentBuilder.persistent(FilledComponent.CODEC).networkSynchronized(FilledComponent.STREAM_CODEC) filledComponentBuilder -> filledComponentBuilder.persistent(FilledComponent.CODEC).networkSynchronized(FilledComponent.STREAM_CODEC)

View File

@ -36,5 +36,6 @@ public class ETBlockStateProvider extends BlockStateProvider {
// registerEnvCollector(); // registerEnvCollector();
horizontalBlock(ETBlocks.ENV_COLLECTOR_BLOCK.get(), new ModelFile.UncheckedModelFile(modLoc("block/env_collector"))); horizontalBlock(ETBlocks.ENV_COLLECTOR_BLOCK.get(), new ModelFile.UncheckedModelFile(modLoc("block/env_collector")));
horizontalBlock(ETBlocks.ENV_DISTRIBUTOR_BLOCK.get(), new ModelFile.UncheckedModelFile(modLoc("block/env_distributor"))); horizontalBlock(ETBlocks.ENV_DISTRIBUTOR_BLOCK.get(), new ModelFile.UncheckedModelFile(modLoc("block/env_distributor")));
horizontalBlock(ETBlocks.HEAT_GENERATOR_BLOCK.get(), new ModelFile.UncheckedModelFile(modLoc("block/heat_generator")));
} }
} }

View File

@ -23,6 +23,7 @@ import net.neoforged.neoforge.registries.DeferredRegister;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
import xyz.robaertschi.environmenttech.ET; import xyz.robaertschi.environmenttech.ET;
import xyz.robaertschi.environmenttech.level.block.generators.HeatGeneratorBlock;
public class ETBlocks { public class ETBlocks {
@ -31,7 +32,8 @@ public class ETBlocks {
// Creates a new Block with the id "environmenttech:example_block", combining the namespace and path // Creates a new Block with the id "environmenttech:example_block", combining the namespace and path
// public static final DeferredBlock<Block> EXAMPLE_BLOCK = BLOCKS.registerSimpleBlock("example_block", BlockBehaviour.Properties.of().mapColor(MapColor.STONE)); // public static final DeferredBlock<Block> EXAMPLE_BLOCK = BLOCKS.registerSimpleBlock("example_block", BlockBehaviour.Properties.of().mapColor(MapColor.STONE));
public static final DeferredBlock<EnvCollectorBlock> ENV_COLLECTOR_BLOCK = BLOCKS.registerBlock("env_collector", EnvCollectorBlock::new, BlockBehaviour.Properties.of()); public static final DeferredBlock<EnvCollectorBlock> ENV_COLLECTOR_BLOCK = BLOCKS.registerBlock("env_collector", EnvCollectorBlock::new, BlockBehaviour.Properties.of());
public static final DeferredBlock<EnvDistributorBlock> ENV_DISTRIBUTOR_BLOCK =BLOCKS.registerBlock("env_distributor", EnvDistributorBlock::new, BlockBehaviour.Properties.of()); public static final DeferredBlock<EnvDistributorBlock> ENV_DISTRIBUTOR_BLOCK = BLOCKS.registerBlock("env_distributor", EnvDistributorBlock::new, BlockBehaviour.Properties.of());
public static final DeferredBlock<HeatGeneratorBlock> HEAT_GENERATOR_BLOCK = BLOCKS.registerBlock("heat_generator", HeatGeneratorBlock::new, BlockBehaviour.Properties.of());
public static void init(IEventBus iEventBus) { public static void init(IEventBus iEventBus) {

View File

@ -41,6 +41,11 @@ public class ETBlockEntities {
BLOCK_ENTITIES.register("env_distributor", BLOCK_ENTITIES.register("env_distributor",
() -> BlockEntityType.Builder.of(EnvDistributorBlockEntity::new, ETBlocks.ENV_DISTRIBUTOR_BLOCK.get()).build(null)); () -> BlockEntityType.Builder.of(EnvDistributorBlockEntity::new, ETBlocks.ENV_DISTRIBUTOR_BLOCK.get()).build(null));
public static final DeferredHolder<BlockEntityType<?>, BlockEntityType<HeatGeneratorBlockEntity>> HEAT_GENERATOR_BLOCK_ENTITY =
BLOCK_ENTITIES.register("heat_generator",
() -> BlockEntityType.Builder.of(HeatGeneratorBlockEntity::new, ETBlocks.HEAT_GENERATOR_BLOCK.get()).build(null)
);
public static void init(IEventBus iEventBus) { public static void init(IEventBus iEventBus) {
BLOCK_ENTITIES.register(iEventBus); BLOCK_ENTITIES.register(iEventBus);
} }

View File

@ -55,7 +55,6 @@ import xyz.robaertschi.environmenttech.compat.top.TOPInfoProvider;
import xyz.robaertschi.environmenttech.data.attachments.ETAttachments; import xyz.robaertschi.environmenttech.data.attachments.ETAttachments;
import xyz.robaertschi.environmenttech.data.capabilities.AdaptedItemHandler; import xyz.robaertschi.environmenttech.data.capabilities.AdaptedItemHandler;
import xyz.robaertschi.environmenttech.data.capabilities.EnvStorage; import xyz.robaertschi.environmenttech.data.capabilities.EnvStorage;
import xyz.robaertschi.environmenttech.data.capabilities.EnvType;
import xyz.robaertschi.environmenttech.data.recipes.ETRecipes; import xyz.robaertschi.environmenttech.data.recipes.ETRecipes;
import xyz.robaertschi.environmenttech.data.recipes.EnvCollectorRecipe; import xyz.robaertschi.environmenttech.data.recipes.EnvCollectorRecipe;
import xyz.robaertschi.environmenttech.menu.EnvCollectorMenu; import xyz.robaertschi.environmenttech.menu.EnvCollectorMenu;
@ -87,7 +86,7 @@ public class EnvCollectorBlockEntity extends BlockEntity implements MenuProvider
} }
}; };
@Getter @Getter
private final ItemStackHandler outputInventory = new ItemStackHandler(SLOT_INPUT_COUNT) { private final ItemStackHandler outputInventory = new ItemStackHandler(SLOT_OUTPUT_COUNT) {
protected void onContentsChanged(int slot) { protected void onContentsChanged(int slot) {
EnvCollectorBlockEntity.this.setChanged(); EnvCollectorBlockEntity.this.setChanged();
assert level != null; assert level != null;
@ -133,7 +132,7 @@ public class EnvCollectorBlockEntity extends BlockEntity implements MenuProvider
@Getter @Getter
private final EnvStorage envStorage = new EnvStorage(EnvType.Chunk, 64, 0, 1) { private final EnvStorage envStorage = new EnvStorage(64, 0, 1) {
@Override @Override
public void onContentsChanged() { public void onContentsChanged() {
EnvCollectorBlockEntity.this.setChanged(); EnvCollectorBlockEntity.this.setChanged();

View File

@ -38,7 +38,6 @@ import net.minecraft.world.level.chunk.ChunkAccess;
import xyz.robaertschi.environmenttech.ET; import xyz.robaertschi.environmenttech.ET;
import xyz.robaertschi.environmenttech.data.attachments.ETAttachments; import xyz.robaertschi.environmenttech.data.attachments.ETAttachments;
import xyz.robaertschi.environmenttech.data.capabilities.EnvStorage; import xyz.robaertschi.environmenttech.data.capabilities.EnvStorage;
import xyz.robaertschi.environmenttech.data.capabilities.EnvType;
@Getter @Getter
@ -51,7 +50,7 @@ public class EnvDistributorBlockEntity extends BlockEntity implements ITickableB
private int ticksBetweenProcessTick = 0; private int ticksBetweenProcessTick = 0;
public static final String ENV_TAG = "Env"; public static final String ENV_TAG = "Env";
private final EnvStorage envStorage = new EnvStorage(EnvType.Chunk, 64) { private final EnvStorage envStorage = new EnvStorage(64) {
@Override @Override
public void onContentsChanged() { public void onContentsChanged() {
EnvDistributorBlockEntity.this.setChanged(); EnvDistributorBlockEntity.this.setChanged();

View File

@ -0,0 +1,82 @@
/*
* EnvironmentTech MC Mod
Copyright (C) 2024 Robin Bärtschi and Contributors
This program 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, by version 3 of the License.
This program 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 program. If not, see <https://www.gnu.org/licenses/>.
*/
package xyz.robaertschi.environmenttech.level.block.entity;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.NotNull;
import xyz.robaertschi.environmenttech.ET;
import xyz.robaertschi.environmenttech.data.capabilities.EnvStorage;
public class HeatGeneratorBlockEntity extends BlockEntity implements ITickableBlockEntity {
private static final HashMap<Block, Long> BLOCK_TO_ENV = new HashMap<>(Map.of(Blocks.TORCH, 1L, Blocks.FIRE, 3L, Blocks.CAMPFIRE, 5L, Blocks.SOUL_TORCH, 6L, Blocks.SOUL_FIRE, 8L, Blocks.SOUL_CAMPFIRE, 10L, Blocks.LAVA, 14L));
public static final String ENV_TAG = "Env";
private final EnvStorage envStorage = new EnvStorage(64) {
@Override
public void onContentsChanged() {
HeatGeneratorBlockEntity.this.setChanged();
assert level != null;
if (!level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL);
}
}
@Override
public void setEnvStored(long env) {
super.setEnvStored(env);
if (level != null && !level.isClientSide()) {
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL);
}
}
};
public HeatGeneratorBlockEntity(BlockPos pos, BlockState blockState) {
super(ETBlockEntities.HEAT_GENERATOR_BLOCK_ENTITY.get(), pos, blockState);
}
@Override
public void serverTick(ServerLevel level, BlockPos blockPos, BlockState blockState) {
var toAdd = BLOCK_TO_ENV.getOrDefault(level.getBlockState(blockPos.below()).getBlock(), 0L);
envStorage.receiveEnv(toAdd, false);
}
@Override
protected void loadAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider registries) {
super.loadAdditional(tag, registries);
CompoundTag modData = tag.getCompound(ET.MODID);
this.envStorage.setEnvStored(modData.getLong(ENV_TAG));
}
@Override
protected void saveAdditional(@NotNull CompoundTag tag, HolderLookup.@NotNull Provider registries) {
super.saveAdditional(tag, registries);
CompoundTag modData = new CompoundTag();
modData.putLong(ENV_TAG, envStorage.getEnvStored());
tag.put(ET.MODID, modData);
}
}

View File

@ -0,0 +1,54 @@
/*
* EnvironmentTech MC Mod
Copyright (C) 2024 Robin Bärtschi and Contributors
This program 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, by version 3 of the License.
This program 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 program. If not, see <https://www.gnu.org/licenses/>.
*/
package xyz.robaertschi.environmenttech.level.block.generators;
import javax.annotation.ParametersAreNonnullByDefault;
import org.jetbrains.annotations.Nullable;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.BaseEntityBlock;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import com.mojang.serialization.MapCodec;
import xyz.robaertschi.environmenttech.level.block.SimpleBlockWithEntity;
import xyz.robaertschi.environmenttech.level.block.entity.ETBlockEntities;
import xyz.robaertschi.environmenttech.level.block.entity.HeatGeneratorBlockEntity;
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public class HeatGeneratorBlock extends SimpleBlockWithEntity<HeatGeneratorBlockEntity> {
public static final MapCodec<HeatGeneratorBlock> CODEC = simpleCodec(HeatGeneratorBlock::new);
public HeatGeneratorBlock(Properties pProperties) {
super(pProperties, ETBlockEntities.HEAT_GENERATOR_BLOCK_ENTITY);
}
@Override
protected MapCodec<? extends BaseEntityBlock> codec() {
return CODEC;
}
@Nullable
@Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new HeatGeneratorBlockEntity(pos, state);
}
}

View File

@ -16,17 +16,16 @@
*/ */
package xyz.robaertschi.environmenttech.level.fluid; package xyz.robaertschi.environmenttech.level.fluid;
import java.util.function.Consumer;
import javax.annotation.ParametersAreNonnullByDefault;
import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions;
import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent;
import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.fluids.FluidType;
import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.DeferredRegister;
import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforge.registries.NeoForgeRegistries;
import org.jetbrains.annotations.NotNull;
import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import xyz.robaertschi.environmenttech.ET; import xyz.robaertschi.environmenttech.ET;
@ -43,32 +42,30 @@ public class ETFluidTypes {
public static final DeferredHolder<FluidType, FluidType> ENV = FLUID_TYPES.register("env", public static final DeferredHolder<FluidType, FluidType> ENV = FLUID_TYPES.register("env",
resourceLocation -> new FluidType( resourceLocation -> new FluidType(
FluidType.Properties.create().density(15).viscosity(5) FluidType.Properties.create().density(15).viscosity(5)
) { )
@Override );
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault public static void registerClientExtensionsEvent(RegisterClientExtensionsEvent event) {
public void initializeClient(Consumer<IClientFluidTypeExtensions> consumer) { event.registerFluidType(new IClientFluidTypeExtensions() {
consumer.accept(new IClientFluidTypeExtensions() {
@Override @Override
public int getTintColor() { public int getTintColor() {
return EnvStorageRenderer.to; return EnvStorageRenderer.to;
} }
@Override @Override
public ResourceLocation getFlowingTexture() { public @NotNull ResourceLocation getFlowingTexture() {
return WATER_FLOWING_RL; return WATER_FLOWING_RL;
} }
@Override @Override
public ResourceLocation getStillTexture() { public @NotNull ResourceLocation getStillTexture() {
return WATER_STILL_RL; return WATER_STILL_RL;
} }
}); }, ENV);
} }
}
);
public static void init(IEventBus modEventBus) { public static void init(IEventBus modEventBus) {
modEventBus.addListener(ETFluidTypes::registerClientExtensionsEvent);
FLUID_TYPES.register(modEventBus); FLUID_TYPES.register(modEventBus);
} }
} }

View File

@ -31,10 +31,9 @@ import net.minecraft.world.item.ItemStack;
import xyz.robaertschi.environmenttech.level.block.ETBlocks; import xyz.robaertschi.environmenttech.level.block.ETBlocks;
import xyz.robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEntity; import xyz.robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEntity;
import static xyz.robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEntity.SLOT_COUNT; import static xyz.robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEntity.*;
import static xyz.robaertschi.environmenttech.level.block.entity.EnvCollectorBlockEntity.SLOT_INPUT;
@SuppressWarnings("SameParameterValue") @SuppressWarnings("ALL")
public class EnvCollectorMenu extends AbstractContainerMenu { public class EnvCollectorMenu extends AbstractContainerMenu {
@Getter @Getter
@ -49,13 +48,12 @@ public class EnvCollectorMenu extends AbstractContainerMenu {
super(ETMenus.ENV_COLLECTOR_MENU.get(), pContainerId); super(ETMenus.ENV_COLLECTOR_MENU.get(), pContainerId);
this.blockEntity = blockEntity; this.blockEntity = blockEntity;
this.data = data; this.data = data;
addSlot(new SlotItemHandler(blockEntity.getInputInventory(), 0, 54, 34)); addSlot(new ModifiableSlotItemHandler(blockEntity.getInventory().get(), 0, 54, 34));
addSlot(new SlotItemHandler(blockEntity.getOutputInventory(), 0, 116, 35)); addSlot(new SlotItemHandler(blockEntity.getInventory().get(), 1, 116, 35));
layoutPlayerInventorySlots(player.getInventory(), 8, 84); layoutPlayerInventorySlots(player.getInventory(), 8, 84);
addDataSlots(data); addDataSlots(data);
} }
@ -107,7 +105,7 @@ public class EnvCollectorMenu extends AbstractContainerMenu {
} }
} }
if (!this.moveItemStackTo(stack, SLOT_INPUT, SLOT_INPUT+1, false)) { if (!this.moveItemStackTo(stack, SLOT_INPUT, SLOT_INPUT_COUNT, false)) {
if (pIndex < 27 + SLOT_COUNT) { if (pIndex < 27 + SLOT_COUNT) {
if (!this.moveItemStackTo(stack, 27 + SLOT_COUNT, 36 + SLOT_COUNT, false)) { if (!this.moveItemStackTo(stack, 27 + SLOT_COUNT, 36 + SLOT_COUNT, false)) {
return ItemStack.EMPTY; return ItemStack.EMPTY;

View File

@ -14,10 +14,21 @@
You should have received a copy of the GNU Lesser General Public License You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package xyz.robaertschi.environmenttech.data.capabilities; package xyz.robaertschi.environmenttech.menu;
public enum EnvType { import net.neoforged.neoforge.items.IItemHandler;
Chunk, import net.neoforged.neoforge.items.SlotItemHandler;
Normal, import org.jetbrains.annotations.NotNull;
Bundled,
import net.minecraft.world.entity.player.Player;
public class ModifiableSlotItemHandler extends SlotItemHandler {
public ModifiableSlotItemHandler(IItemHandler itemHandler, int index, int xPosition, int yPosition) {
super(itemHandler, index, xPosition, yPosition);
}
@Override
public boolean allowModification(@NotNull Player player) {
return true;
}
} }