diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index f82c9328980..28641f84243 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -2,13 +2,11 @@ name: Publish docs via GitHub Pages on: workflow_dispatch: push: - branches: [1.20.1] + branches: ["1.20.1", "1.21"] paths: ['docs/**'] permissions: - contents: read - pages: write - id-token: write + contents: write concurrency: group: 'pages' @@ -24,33 +22,17 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: '1.20.1' - sparse-checkout: './docs' + ref: '${{ github.ref_name }}' + fetch-depth: 0 - uses: actions/setup-python@v4 with: python-version: '3.11' cache: 'pip' - - run: pip install -r ./requirements.txt - - uses: actions/cache@v4 - with: - key: 'mkdocs-cache' - path: './docs/.cache' - - name: Build static files - id: mkdocs - run: mkdocs build - - name: Upload pages as artifact - id: artifact - uses: actions/upload-pages-artifact@v3 - with: - path: './docs/site/' - - deploy: - runs-on: ubuntu-latest - needs: build - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Deploy Pages - id: deployment - uses: actions/deploy-pages@v4 + - name: Install packages + run: pip install -r ./requirements.txt + - name: Set git username and password + run: git config user.name 'github-actions[bot]'; git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + - name: Deploy pages to gh-pages branch + run: mike deploy "${{ github.ref_name }}" --push + - name: Ensure 1.20.1 is the default version + run: mike set-default 1.20.1 --push \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 4686e4e4b57..66b84b35b54 100644 --- a/docs/README.md +++ b/docs/README.md @@ -79,3 +79,8 @@ mkdocs serve The following plugins for MkDocs are being used: - https://squidfunk.github.io/mkdocs-material/ - https://github.com/lukasgeiter/mkdocs-awesome-pages-plugin + +## Deployment +The hosted documentation is found on the `gh-pages` branch of the repository. [Mike](https://github.com/jimporter/mike) is used to deploy both the 1.20.1 and 1.21.1 documentation on the same site through Github Actions. + +When working on the docs locally, the plain `mkdocs` commands should be used to view the changes made to the version of the docs you are currently working on, like the previously mentioned `mkdocs serve`. \ No newline at end of file diff --git a/docs/content/index.md b/docs/content/index.md index 51dc1e6d725..430437cbf85 100644 --- a/docs/content/index.md +++ b/docs/content/index.md @@ -5,8 +5,7 @@ hide: title: Home --- - -# Welcome to GregTech CEu Modern's Documentation! +# Welcome to GregTech CEu Modern's Documentation for 1.21.1! GregTech CEu Modern is a port of [GregTech Community Edition Unofficial](https://github.com/GregTechCEu/GregTech) to modern Minecraft versions. diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index f5072ad3755..2ce13daed00 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -47,6 +47,8 @@ extra_css: - stylesheets/extra.css extra: + version: + provider: mike social: - icon: fontawesome/brands/discord link: https://discord.gg/bWSWuYvURP diff --git a/docs/requirements.txt b/docs/requirements.txt index 80c8e8446b0..9ee0202d764 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,2 +1,3 @@ mkdocs-material mkdocs-awesome-pages-plugin +mike \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index 94e4a39bddd..58884a8350c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -3,8 +3,8 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.syncdata.IManaged; @@ -25,6 +25,7 @@ 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 net.minecraft.world.level.block.state.properties.Property; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -117,10 +118,50 @@ public void removeComponentsFromTag(CompoundTag tag) { @Override public void setRenderState(MachineRenderState state) { + if (state != null) { + // Validate that the state belongs to this block entity's definition + if (!state.is(getDefinition())) { + state = correctRenderStateDefinition(state); + } + // Ensure we're using the interned (canonical) state instance + state = state.intern(); + } this.renderState = state; scheduleRenderUpdate(); } + /** + * Corrects a render state that belongs to the wrong definition by creating a new state + * from this block entity's definition while preserving any compatible property values. + */ + private MachineRenderState correctRenderStateDefinition(MachineRenderState wrongState) { + MachineRenderState correctedState = getDefinition().defaultRenderState(); + // Copy any property values that exist in both the wrong state and this definition's state + for (Property property : wrongState.getProperties()) { + if (correctedState.hasProperty(property)) { + correctedState = copyProperty(correctedState, wrongState, property); + } + } + return correctedState; // intern() will be called by setRenderState + } + + /** + * Helper method to copy a single property value from one state to another. + * Uses a type parameter to satisfy the generic constraints of setValue(). + */ + @SuppressWarnings("unchecked") + private static > MachineRenderState copyProperty( + MachineRenderState target, + MachineRenderState source, + Property property) { + T value = source.getValue(property); + // Verify the value is valid for the target state's property + if (property.getPossibleValues().contains(value)) { + return target.setValue(property, value); + } + return target; + } + @Override public long getOffset() { return offset; @@ -135,6 +176,16 @@ public void setRemoved() { @Override public void onLoad() { super.onLoad(); + // Validate and intern render state after NBT load - @Persisted writes directly to field via reflection, + // bypassing setRenderState(), so we need to validate and intern here as well + if (renderState != null) { + if (!renderState.is(getDefinition())) { + this.renderState = correctRenderStateDefinition(renderState).intern(); + } else { + // Ensure the state is properly interned even if definition is correct + this.renderState = renderState.intern(); + } + } metaMachine.onLoad(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java index 250bffc87b6..9fd79da9945 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/IMachineBlockEntity.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.blockentity.IPaintable; import com.gregtechceu.gtceu.api.item.tool.IToolGridHighLight; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.core.mixins.LevelAccessor; import com.lowdragmc.lowdraglib.syncdata.blockentity.IAsyncAutoSyncBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java index 1a9d980b7ef..ee08d1df4f9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.kind.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.lowdragmc.lowdraglib.utils.ShapeUtils; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineRenderState.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineRenderState.java new file mode 100644 index 00000000000..10c122548a3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineRenderState.java @@ -0,0 +1,63 @@ +package com.gregtechceu.gtceu.api.machine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.world.level.block.state.StateHolder; +import net.minecraft.world.level.block.state.properties.Property; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; + +import java.util.function.Function; + +public class MachineRenderState extends StateHolder { + + private static boolean hasLoggedInternFallback = false; + + /** + * CODEC that always returns interned (canonical) state instances. + * This is critical because StateHolder uses identity-based lookups internally. + */ + public static final Codec CODEC = codec(GTRegistries.MACHINES.byNameCodec(), + MachineDefinition::defaultRenderState) + .xmap(MachineRenderState::intern, Function.identity()) + .stable(); + + /** + * Returns the interned (canonical) instance of this state from the definition's StateDefinition. + * This ensures identity-based lookups work correctly. + */ + public MachineRenderState intern() { + for (MachineRenderState interned : getDefinition().getStateDefinition().getPossibleStates()) { + if (interned.getValues().equals(this.getValues())) { + return interned; + } + } + // Fallback if not found (shouldn't happen) + if (!hasLoggedInternFallback) { + hasLoggedInternFallback = true; + GTCEu.LOGGER.debug("MachineRenderState.intern() fallback triggered for definition: {}, values: {}", + getDefinition().getId(), getValues()); + } + return this; + } + + public MachineRenderState(MachineDefinition owner, Reference2ObjectArrayMap, Comparable> values, + MapCodec propertiesCodec) { + super(owner, values, propertiesCodec); + } + + public MachineDefinition getDefinition() { + return this.owner; + } + + public boolean is(MetaMachine machine) { + return this.is(machine.getDefinition()); + } + + public boolean is(MachineDefinition definition) { + return this.getDefinition() == definition; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 47044ecfae0..1571f6b1aac 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -24,7 +24,6 @@ import com.gregtechceu.gtceu.api.misc.IOFluidHandlerList; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.util.ModelUtils; import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index a9d61b3df6b..7fec774eed0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.api.capability.IParallelHatch; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; @@ -12,7 +13,6 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.multiblock.MultiblockState; import com.gregtechceu.gtceu.api.multiblock.MultiblockWorldSavedData; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; @@ -23,7 +23,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.state.BlockState; import lombok.Getter; import lombok.Setter; @@ -204,16 +203,20 @@ public void onStructureInvalid() { } /** - * mark multiblockState as unload error first. - * if it's actually cuz by block breaking. - * {@link #onStructureInvalid()} will be called from - * {@link MultiblockState#onBlockStateChanged(BlockPos, BlockState)} + * Called when a part is unloaded (chunk unload or block broken). + * If the structure is currently formed, immediately invalidate it to ensure + * all remaining parts have their render state updated. */ @Override public void onPartUnload() { parts.removeIf(part -> part.self().isInValid()); getMultiblockState().setError(MultiblockState.UNLOAD_ERROR); if (getLevel() instanceof ServerLevel serverLevel) { + // If structure is formed, invalidate it immediately to update all parts' render states + if (isFormed) { + onStructureInvalid(); + MultiblockWorldSavedData.getOrCreate(serverLevel).removeMapping(getMultiblockState()); + } MultiblockWorldSavedData.getOrCreate(serverLevel).addAsyncLogic(this); } updatePartPositions(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index 11084de0f5d..269756e3e2a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.feature.ICleanroomProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; @@ -17,7 +18,6 @@ import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.kind.GTRecipe; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.lowdragmc.lowdraglib.syncdata.ISubscription; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java index 54428759c09..446082fd0ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java @@ -3,15 +3,16 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; @@ -38,6 +39,7 @@ public class MultiblockPartMachine extends MetaMachine implements IMultiPart { protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MultiblockPartMachine.class, MetaMachine.MANAGED_FIELD_HOLDER); + @Persisted @DescSynced @RequireRerender @UpdateListener(methodName = "onControllersUpdated") @@ -114,6 +116,26 @@ protected RecipeHandlerList getHandlerList() { return handlerList; } + @Override + public void onLoad() { + super.onLoad(); + // Rebuild controllers from persisted positions on load + // @UpdateListener only fires on sync updates, not on NBT load + if (!controllerPositions.isEmpty()) { + onControllersUpdated(controllerPositions, Collections.emptySet()); + // If we couldn't resolve controllers (loading order or cross-chunk), + // clear the formed state to avoid inconsistent visuals (overlays without texture overrides). + // The async multiblock validation will restore formed state properly when ready. + if (controllers.isEmpty()) { + MachineRenderState renderState = getRenderState(); + if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED) && + renderState.getValue(GTMachineModelProperties.IS_FORMED)) { + setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); + } + } + } + } + @Override public void onUnload() { super.onUnload(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index c28d46a94de..9c1f0d6fff0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.PredicatedImageWidget; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IExhaustVentMachine; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; @@ -20,7 +21,6 @@ import com.gregtechceu.gtceu.api.recipe.kind.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 134b7c206c0..df75bddeff7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.machine.trait; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.lowdragmc.lowdraglib.syncdata.IEnhancedManaged; import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockState.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockState.java index 309087c8025..633e62efdf3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/MultiblockState.java @@ -172,11 +172,6 @@ public void onBlockStateChanged(BlockPos pos, BlockState state) { } } else { IMultiController controller = getController(); - if (controller == null && error == UNLOAD_ERROR) { - if (!serverLevel.isLoaded(controllerPos)) { - GTCEu.LOGGER.info("Controller not loaded, pos {}", controllerPos); - } - } if (controller != null) { if (controller.isFormed() && state.getBlock() instanceof ActiveBlock) { LongSet activeBlocks = getMatchContext().getOrDefault("vaBlocks", LongSets.emptySet()); diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index c4a1844256a..c35337a7f7e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.RotationState; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; @@ -20,7 +21,6 @@ import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.renderer.BlockEntityWithBERModelRenderer; import com.gregtechceu.gtceu.client.renderer.ItemWithBERModelRenderer; import com.gregtechceu.gtceu.config.ConfigHolder; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java index ad6f6c2b080..5595131135e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; @@ -293,6 +294,22 @@ public void renderBaseModel(List quads, @NotNull MachineRenderState r } if (modelsByState.containsKey(renderState)) { quads.addAll(modelsByState.get(renderState).getQuads(blockState, side, rand, modelData, renderType)); + } else { + // State not found by identity - try to find matching state by values as fallback + MachineRenderState fallbackState = null; + for (MachineRenderState expected : modelsByState.keySet()) { + if (expected.getValues().equals(renderState.getValues())) { + fallbackState = expected; + break; + } + } + if (fallbackState != null) { + quads.addAll(modelsByState.get(fallbackState).getQuads(blockState, side, rand, modelData, renderType)); + } else if (modelsByState.containsKey(definition.defaultRenderState())) { + // Fall back to default state as last resort + quads.addAll(modelsByState.get(definition.defaultRenderState()) + .getQuads(blockState, side, rand, modelData, renderType)); + } } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java index 6fd3b0619dc..a0a48fd66b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModelLoader.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.client.model.BasicUnbakedModel; import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartSelector; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineRenderState.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineRenderState.java deleted file mode 100644 index 45c4bbef3c9..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineRenderState.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gregtechceu.gtceu.client.model.machine; - -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.registry.GTRegistries; - -import net.minecraft.world.level.block.state.StateHolder; -import net.minecraft.world.level.block.state.properties.Property; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.MapCodec; -import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; - -public class MachineRenderState extends StateHolder { - - public static final Codec CODEC = codec(GTRegistries.MACHINES.byNameCodec(), - MachineDefinition::defaultRenderState).stable(); - - public MachineRenderState(MachineDefinition owner, Reference2ObjectArrayMap, Comparable> values, - MapCodec propertiesCodec) { - super(owner, values, propertiesCodec); - } - - public MachineDefinition getDefinition() { - return this.owner; - } - - public boolean is(MetaMachine machine) { - return this.is(machine.getDefinition()); - } - - public boolean is(MachineDefinition definition) { - return this.getDefinition() == definition; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/UnbakedMachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/UnbakedMachineModel.java index b4fe2e489eb..e0630e76fca 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/UnbakedMachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/UnbakedMachineModel.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartBakedModel; import com.gregtechceu.gtceu.client.model.machine.multipart.MultiPartUnbakedModel; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/AndPartCondition.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/AndPartCondition.java index b2a9f6ddcf7..fc405777305 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/AndPartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/AndPartCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import net.minecraft.world.level.block.state.StateDefinition; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/KeyValuePartCondition.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/KeyValuePartCondition.java index 3c7aa3489fe..97e7dfd0ffd 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/KeyValuePartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/KeyValuePartCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.Property; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java index d06d8003826..5fc84988f84 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartBakedModel.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartSelector.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartSelector.java index 955f29e579e..d2a33b61d50 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartSelector.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartSelector.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.client.model.machine.variant.MultiVariantModel; import net.minecraft.client.resources.model.ModelState; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartUnbakedModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartUnbakedModel.java index aefe9cffbc1..76ca4522c18 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartUnbakedModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/MultiPartUnbakedModel.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.model.machine.variant.MultiVariantModel; import net.minecraft.client.renderer.texture.TextureAtlasSprite; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/OrPartCondition.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/OrPartCondition.java index cf124314c79..19289b4938d 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/OrPartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/OrPartCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import net.minecraft.world.level.block.state.StateDefinition; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/PartCondition.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/PartCondition.java index 0c6fc180b49..a87b3bdcafb 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/PartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/multipart/PartCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine.multipart; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import net.minecraft.world.level.block.state.StateDefinition; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index cffa8b27303..5cd98c9b71f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; @@ -15,7 +16,6 @@ import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.data.item.GTItems; import com.gregtechceu.gtceu.utils.FormattingUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java index 31c5e5fd0c8..9c7e7bc2a70 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java @@ -2,10 +2,10 @@ import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.data.block.GTBlocks; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; diff --git a/src/main/java/com/gregtechceu/gtceu/data/datagen/model/builder/MachineModelBuilder.java b/src/main/java/com/gregtechceu/gtceu/data/datagen/model/builder/MachineModelBuilder.java index ef2e8c0c947..6f3e3da5e7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/datagen/model/builder/MachineModelBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/data/datagen/model/builder/MachineModelBuilder.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.data.datagen.model.builder; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; import com.gregtechceu.gtceu.client.model.machine.MachineModelLoader; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; import com.gregtechceu.gtceu.core.mixins.neoforge.ConfiguredModelBuilderAccessor; import com.gregtechceu.gtceu.core.mixins.neoforge.ConfiguredModelListAccessor; diff --git a/src/main/java/com/gregtechceu/gtceu/data/inject/GTSyncedFieldAccessors.java b/src/main/java/com/gregtechceu/gtceu/data/inject/GTSyncedFieldAccessors.java index c23576e22bd..2e48b6e1c12 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/inject/GTSyncedFieldAccessors.java +++ b/src/main/java/com/gregtechceu/gtceu/data/inject/GTSyncedFieldAccessors.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.data.inject; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.material.material.Material; import com.gregtechceu.gtceu.api.recipe.kind.GTRecipe; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; import com.gregtechceu.gtceu.syncdata.*; diff --git a/src/main/java/com/gregtechceu/gtceu/data/machine/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/data/machine/GTMachines.java index 99a47856c28..588af352d8c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/machine/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/data/machine/GTMachines.java @@ -7,6 +7,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.RotationState; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; @@ -16,7 +17,6 @@ import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderHelper; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.machine.electric.*; @@ -49,7 +49,6 @@ import com.google.common.math.IntMath; import it.unimi.dsi.fastutil.Pair; -import java.util.Iterator; import java.util.List; import java.util.function.BiConsumer; @@ -1101,9 +1100,7 @@ public static void init() { } public static void bakeRenderStates(Registry registry) { - Iterator iter = registry.iterator(); - while (iter.hasNext()) { - MachineDefinition machine = iter.next(); + for (MachineDefinition machine : registry) { for (MachineRenderState renderState : machine.getStateDefinition().getPossibleStates()) { MachineDefinition.RENDER_STATE_REGISTRY.add(renderState); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/model/GTMachineModels.java b/src/main/java/com/gregtechceu/gtceu/data/model/GTMachineModels.java index a8498fe5952..56155f0ef8c 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/model/GTMachineModels.java +++ b/src/main/java/com/gregtechceu/gtceu/data/model/GTMachineModels.java @@ -4,12 +4,12 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.IMachineBlock; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.material.material.Material; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.client.model.machine.overlays.EnergyIOOverlay; import com.gregtechceu.gtceu.client.model.machine.overlays.HPCAOverlay; import com.gregtechceu.gtceu.client.model.machine.overlays.WorkableOverlays; diff --git a/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java b/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java index 2468da497e1..261b5627b89 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java +++ b/src/main/java/com/gregtechceu/gtceu/syncdata/MachineRenderStatePayload.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.syncdata; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; +import com.gregtechceu.gtceu.api.machine.MachineRenderState; import com.lowdragmc.lowdraglib.syncdata.payload.ObjectTypedPayload; @@ -18,6 +18,10 @@ public class MachineRenderStatePayload extends ObjectTypedPayload