From ce955e9fcd2e0f27adfb8423312e00937aaf262d Mon Sep 17 00:00:00 2001 From: Xavier Stouder Date: Mon, 13 Mar 2023 20:31:28 +0100 Subject: [PATCH 01/10] fix(#4527): prevent hand crank from draining hunger using extendo grip (#4539) --- .../contraptions/components/crank/HandCrankBlock.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java index 96cb2a8ba..cdf8c260a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.crank; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; @@ -74,7 +75,8 @@ public class HandCrankBlock extends DirectionalKineticBlock return InteractionResult.PASS; withTileEntityDo(worldIn, pos, te -> te.turn(player.isShiftKeyDown())); - player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); + if(!player.getItemInHand(handIn).is(AllItems.EXTENDO_GRIP.get())) + player.causeFoodExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); if (player.getFoodData() .getFoodLevel() == 0) @@ -117,14 +119,14 @@ public class HandCrankBlock extends DirectionalKineticBlock } } } - + @Override public BlockState updateShape(BlockState pState, Direction pDirection, BlockState pNeighborState, LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pNeighborPos) { updateWater(pLevel, pState, pCurrentPos); return pState; } - + @Override public FluidState getFluidState(BlockState pState) { return fluidState(pState); From c2977bbffff4c1b1b3cfb2311fdd42e51b05749c Mon Sep 17 00:00:00 2001 From: caelwarner Date: Tue, 14 Mar 2023 14:26:28 -0700 Subject: [PATCH 02/10] Fixed GirderEncasedShaftBlock's default blockstate - GirderEncasedShaftBlock was missing entries for WATERLOGGED, TOP and BOTTOM in its default blockstate - Fixes #4550 --- .../content/curiosities/girder/GirderEncasedShaftBlock.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderEncasedShaftBlock.java b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderEncasedShaftBlock.java index 0a74a1a29..0d507b4a4 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderEncasedShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderEncasedShaftBlock.java @@ -44,6 +44,10 @@ public class GirderEncasedShaftBlock extends HorizontalAxisKineticBlock public GirderEncasedShaftBlock(Properties properties) { super(properties); + registerDefaultState(super.defaultBlockState() + .setValue(WATERLOGGED, false) + .setValue(TOP, false) + .setValue(BOTTOM, false)); } @Override From 2a59fd7e8ab91a6004abe4b92152a2a936a22c1b Mon Sep 17 00:00:00 2001 From: techno-sam Date: Thu, 6 Apr 2023 21:13:54 -0700 Subject: [PATCH 03/10] Track API maybe? Not yet tested, but it is progress --- .../java/com/simibubi/create/AllBlocks.java | 5 +- .../java/com/simibubi/create/AllTags.java | 6 + .../com/simibubi/create/AllTileEntities.java | 10 +- .../actors/DrillMovementBehaviour.java | 4 +- .../press/MechanicalPressTileEntity.java | 4 +- .../curiosities/girder/GirderBlock.java | 3 +- .../tools/BlueprintOverlayRenderer.java | 4 +- .../logistics/trains/BezierConnection.java | 33 +++-- .../logistics/trains/IHasTrackMaterial.java | 16 +++ .../logistics/trains/TrackMaterial.java | 118 ++++++++++++++++++ .../trains/TrackMaterialFactory.java | 118 ++++++++++++++++++ .../trains/track/CurvedTrackInteraction.java | 4 +- .../track/PlaceExtendedCurvePacket.java | 6 +- .../logistics/trains/track/TrackBlock.java | 45 +++++-- .../trains/track/TrackBlockItem.java | 5 +- .../trains/track/TrackBlockOutline.java | 6 +- .../logistics/trains/track/TrackInstance.java | 12 +- .../trains/track/TrackPlacement.java | 62 ++++++--- .../logistics/trains/track/TrackRenderer.java | 11 +- .../trains/track/TrackTileEntity.java | 3 +- .../ponder/content/PonderIndex.java | 3 +- 21 files changed, 414 insertions(+), 64 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 255f0037e..071f944d3 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -207,6 +207,7 @@ import com.simibubi.create.content.logistics.block.vault.ItemVaultBlock; import com.simibubi.create.content.logistics.block.vault.ItemVaultCTBehaviour; import com.simibubi.create.content.logistics.block.vault.ItemVaultItem; import com.simibubi.create.content.logistics.item.LecternControllerBlock; +import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayBlock; import com.simibubi.create.content.logistics.trains.management.edgePoint.EdgePointType; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBlockItem; @@ -1500,7 +1501,7 @@ public class AllBlocks { .transform(customItemModel()) .register(); - public static final BlockEntry TRACK = REGISTRATE.block("track", TrackBlock::new) + public static final BlockEntry TRACK = REGISTRATE.block("track", TrackMaterial.ANDESITE::create) .initialProperties(Material.STONE) .properties(p -> p.color(MaterialColor.METAL) .strength(0.8F) @@ -1510,6 +1511,8 @@ public class AllBlocks { .transform(pickaxeOnly()) .blockstate(new TrackBlockStateGenerator()::generate) .tag(AllBlockTags.RELOCATION_NOT_SUPPORTED.tag) + .tag(AllBlockTags.TRACKS.tag) + .tag(AllBlockTags.GIRDABLE_TRACKS.tag) .lang("Train Track") .item(TrackBlockItem::new) .model((c, p) -> p.generated(c, Create.asResource("item/" + c.getName()))) diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 725836177..027ca062d 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -107,6 +107,8 @@ public class AllTags { SAFE_NBT, SEATS, TOOLBOXES, + TRACKS, + GIRDABLE_TRACKS, TREE_ATTACHMENTS, VALVE_HANDLES, WINDMILL_SAILS, @@ -155,6 +157,10 @@ public class AllTags { .is(tag); } + public boolean matches(ItemStack stack) { + return stack != null && stack.getItem() instanceof BlockItem blockItem && matches(blockItem.getBlock()); + } + public boolean matches(BlockState state) { return state.is(tag); } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 6f74119bb..0582ec7e6 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -182,6 +182,7 @@ import com.simibubi.create.content.logistics.block.vault.ItemVaultTileEntity; import com.simibubi.create.content.logistics.item.LecternControllerRenderer; import com.simibubi.create.content.logistics.item.LecternControllerTileEntity; import com.simibubi.create.content.logistics.trains.BogeyTileEntityRenderer; +import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayRenderer; import com.simibubi.create.content.logistics.trains.management.display.FlapDisplayTileEntity; import com.simibubi.create.content.logistics.trains.management.edgePoint.observer.TrackObserverRenderer; @@ -201,6 +202,7 @@ import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.tterrag.registrate.util.entry.BlockEntityEntry; +import com.tterrag.registrate.util.entry.BlockEntry; public class AllTileEntities { @@ -656,7 +658,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.ANALOG_LEVER) .renderer(() -> AnalogLeverRenderer::new) .register(); - + public static final BlockEntityEntry PLACARD = REGISTRATE .tileEntity("placard", PlacardTileEntity::new) .validBlocks(AllBlocks.PLACARD) @@ -781,9 +783,9 @@ public class AllTileEntities { .tileEntity("track", TrackTileEntity::new) .instance(() -> TrackInstance::new) .renderer(() -> TrackRenderer::new) - .validBlocks(AllBlocks.TRACK) + .validBlocks(TrackMaterial.allBlocks().toArray(new BlockEntry[0])) .register(); - + public static final BlockEntityEntry FAKE_TRACK = REGISTRATE .tileEntity("fake_track", FakeTrackTileEntity::new) .validBlocks(AllBlocks.FAKE_TRACK) @@ -800,7 +802,7 @@ public class AllTileEntities { .renderer(() -> StationRenderer::new) .validBlocks(AllBlocks.TRACK_STATION) .register(); - + public static final BlockEntityEntry SLIDING_DOOR = REGISTRATE .tileEntity("sliding_door", SlidingDoorTileEntity::new) .renderer(() -> SlidingDoorRenderer::new) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 89ebb9582..d0a7a7cb6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -4,7 +4,7 @@ import javax.annotation.Nullable; import com.jozufozu.flywheel.api.MaterialManager; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; -import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionMatrices; @@ -61,7 +61,7 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override public boolean canBreak(Level world, BlockPos breakingPos, BlockState state) { return super.canBreak(world, breakingPos, state) && !state.getCollisionShape(world, breakingPos) - .isEmpty() && !AllBlocks.TRACK.has(state); + .isEmpty() && !AllTags.AllBlockTags.TRACKS.matches(state); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java index 0fb8b8b73..6c70c56b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressTileEntity.java @@ -3,8 +3,8 @@ package com.simibubi.create.content.contraptions.components.press; import java.util.List; import java.util.Optional; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllTags; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCraftingRecipe; import com.simibubi.create.content.contraptions.components.press.PressingBehaviour.Mode; @@ -69,7 +69,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity implemen public void onItemPressed(ItemStack result) { award(AllAdvancements.PRESS); - if (AllBlocks.TRACK.isIn(result)) + if (AllTags.AllBlockTags.TRACKS.matches(result)) tracksCreated += result.getCount(); if (tracksCreated >= 1000) { award(AllAdvancements.TRACK_CRAFTING); diff --git a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlock.java b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlock.java index ff20a1c6b..4e206b1d9 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlock.java +++ b/src/main/java/com/simibubi/create/content/curiosities/girder/GirderBlock.java @@ -8,6 +8,7 @@ import java.util.Random; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlock; import com.simibubi.create.content.contraptions.relays.elementary.BracketedTileEntityBehaviour; @@ -224,7 +225,7 @@ public class GirderBlock extends Block implements SimpleWaterloggedBlock, IWrenc for (Direction d2 : Iterate.directionsInAxis(axis == Axis.X ? Axis.Z : Axis.X)) { BlockState above = level.getBlockState(pos.above() .relative(d2)); - if (AllBlocks.TRACK.has(above)) { + if (AllTags.AllBlockTags.GIRDABLE_TRACKS.matches(above)) { TrackShape shape = above.getValue(TrackBlock.SHAPE); if (shape == (axis == Axis.X ? TrackShape.XO : TrackShape.ZO)) state = state.setValue(updateProperty, true); diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java index 6889a801e..884d034cc 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java @@ -9,13 +9,13 @@ import java.util.Optional; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintCraftingInventory; import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSection; import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.item.filter.ItemAttribute; +import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.element.GuiGameElement; @@ -106,7 +106,7 @@ public class BlueprintOverlayRenderer { int tracks = info.requiredTracks; while (tracks > 0) { - ingredients.add(Pair.of(AllBlocks.TRACK.asStack(Math.min(64, tracks)), info.hasRequiredTracks)); + ingredients.add(Pair.of(((IHasTrackMaterial) info).getMaterial().getTrackBlock().asStack(Math.min(64, tracks)), info.hasRequiredTracks)); tracks -= 64; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java index 5c543536d..fa06d3fa4 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java @@ -31,7 +31,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class BezierConnection implements Iterable { +public class BezierConnection implements Iterable, IHasTrackMaterial { public Couple tePositions; public Couple starts; @@ -39,6 +39,7 @@ public class BezierConnection implements Iterable { public Couple normals; public boolean primary; public boolean hasGirder; + protected TrackMaterial trackMaterial; // runtime @@ -55,19 +56,20 @@ public class BezierConnection implements Iterable { private AABB bounds; public BezierConnection(Couple positions, Couple starts, Couple axes, Couple normals, - boolean primary, boolean girder) { + boolean primary, boolean girder, TrackMaterial material) { tePositions = positions; this.starts = starts; this.axes = axes; this.normals = normals; this.primary = primary; this.hasGirder = girder; + this.trackMaterial = material; resolved = false; } public BezierConnection secondary() { return new BezierConnection(tePositions.swap(), starts.swap(), axes.swap(), normals.swap(), !primary, - hasGirder); + hasGirder, trackMaterial); } public BezierConnection(CompoundTag compound, BlockPos localTo) { @@ -77,7 +79,7 @@ public class BezierConnection implements Iterable { .map(v -> v.add(Vec3.atLowerCornerOf(localTo))), Couple.deserializeEach(compound.getList("Axes", Tag.TAG_COMPOUND), VecHelper::readNBTCompound), Couple.deserializeEach(compound.getList("Normals", Tag.TAG_COMPOUND), VecHelper::readNBTCompound), - compound.getBoolean("Primary"), compound.getBoolean("Girder")); + compound.getBoolean("Primary"), compound.getBoolean("Girder"), TrackMaterial.deserialize(compound.getString("Material"))); } public CompoundTag write(BlockPos localTo) { @@ -91,13 +93,14 @@ public class BezierConnection implements Iterable { compound.put("Starts", starts.serializeEach(VecHelper::writeNBTCompound)); compound.put("Axes", axes.serializeEach(VecHelper::writeNBTCompound)); compound.put("Normals", normals.serializeEach(VecHelper::writeNBTCompound)); + compound.putString("Material", getMaterial().id.toString()); return compound; } public BezierConnection(FriendlyByteBuf buffer) { this(Couple.create(buffer::readBlockPos), Couple.create(() -> VecHelper.read(buffer)), Couple.create(() -> VecHelper.read(buffer)), Couple.create(() -> VecHelper.read(buffer)), - buffer.readBoolean(), buffer.readBoolean()); + buffer.readBoolean(), buffer.readBoolean(), TrackMaterial.deserialize(buffer.readUtf())); } public void write(FriendlyByteBuf buffer) { @@ -107,6 +110,7 @@ public class BezierConnection implements Iterable { normals.forEach(v -> VecHelper.write(v, buffer)); buffer.writeBoolean(primary); buffer.writeBoolean(hasGirder); + buffer.writeUtf(getMaterial().id.toString()); } public BlockPos getKey() { @@ -300,7 +304,7 @@ public class BezierConnection implements Iterable { Inventory inv = player.getInventory(); int tracks = getTrackItemCost(); while (tracks > 0) { - inv.placeItemBackInInventory(AllBlocks.TRACK.asStack(Math.min(64, tracks))); + inv.placeItemBackInInventory(getMaterial().getTrackBlock().asStack(Math.min(64, tracks))); tracks -= 64; } int girders = getGirderItemCost(); @@ -328,7 +332,7 @@ public class BezierConnection implements Iterable { continue; Vec3 v = VecHelper.offsetRandomly(segment.position, level.random, .125f) .add(origin); - ItemEntity entity = new ItemEntity(level, v.x, v.y, v.z, AllBlocks.TRACK.asStack()); + ItemEntity entity = new ItemEntity(level, v.x, v.y, v.z, getMaterial().getTrackBlock().asStack()); entity.setDefaultPickUpDelay(); level.addFreshEntity(entity); if (!hasGirder) @@ -342,7 +346,7 @@ public class BezierConnection implements Iterable { } public void spawnDestroyParticles(Level level) { - BlockParticleOption data = new BlockParticleOption(ParticleTypes.BLOCK, AllBlocks.TRACK.getDefaultState()); + BlockParticleOption data = new BlockParticleOption(ParticleTypes.BLOCK, getMaterial().getTrackBlock().getDefaultState()); BlockParticleOption girderData = new BlockParticleOption(ParticleTypes.BLOCK, AllBlocks.METAL_GIRDER.getDefaultState()); if (!(level instanceof ServerLevel slevel)) @@ -360,6 +364,19 @@ public class BezierConnection implements Iterable { } } + @Override + public TrackMaterial getMaterial() { + if (trackMaterial == null) { + trackMaterial = TrackMaterial.ANDESITE; + } + return trackMaterial; + } + + @Override + public void setMaterial(TrackMaterial material) { + trackMaterial = material; + } + public static class Segment { public int index; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java b/src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java new file mode 100644 index 000000000..8abe19640 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java @@ -0,0 +1,16 @@ +package com.simibubi.create.content.logistics.trains; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; + +public interface IHasTrackMaterial { + TrackMaterial getMaterial(); + + default void setMaterial(TrackMaterial material) {} + + static TrackMaterial fromItem(Item item) { + if (item instanceof BlockItem blockItem && blockItem.getBlock() instanceof IHasTrackMaterial hasTrackMaterial) + return hasTrackMaterial.getMaterial(); + return TrackMaterial.ANDESITE; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java new file mode 100644 index 000000000..d3ccd3910 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java @@ -0,0 +1,118 @@ +package com.simibubi.create.content.logistics.trains; + +import com.jozufozu.flywheel.core.PartialModel; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.track.TrackBlock; + +import com.tterrag.registrate.util.entry.BlockEntry; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraftforge.common.util.Lazy; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import static com.simibubi.create.content.logistics.trains.TrackMaterialFactory.make; + +public class TrackMaterial { + public static final List ALL = new ArrayList<>(); + + public static final TrackMaterial ANDESITE = make(Create.asResource("andesite")) + .lang("Andesite") + .block(Lazy.of(() -> AllBlocks.TRACK)) + .particle(Create.asResource("block/palettes/stone_types/polished/andesite_cut_polished")) + .setBuiltin() + .build(); + + public final ResourceLocation id; + public final String langName; + public final Supplier> trackBlock; + public final Ingredient sleeperIngredient; + public final Ingredient railsIngredient; + public final ResourceLocation particle; + public final TrackType trackType; + public final TrackModelHolder modelHolder; + + public TrackMaterial(ResourceLocation id, String langName, Supplier> trackBlock, ResourceLocation particle, Ingredient sleeperIngredient, Ingredient railsIngredient, TrackType trackType, TrackModelHolder modelHolder) { + this.id = id; + this.langName = langName; + this.trackBlock = trackBlock; + this.sleeperIngredient = sleeperIngredient; + this.railsIngredient = railsIngredient; + this.particle = particle; + this.trackType = trackType; + this.modelHolder = modelHolder; + ALL.add(this); + } + + public BlockEntry getTrackBlock() { + return this.trackBlock.get(); + } + + public TrackBlock create(BlockBehaviour.Properties properties) { + return this.trackType.factory.create(properties, this); + } + + public boolean isCustom(String modId) { + return this.id.getNamespace().equals(modId); + } + + public static TrackMaterial[] allCustom(String modid) { + return ALL.stream().filter(tm -> tm.isCustom(modid)).toArray(TrackMaterial[]::new); + } + + public static List> allCustomBlocks(String modid) { + List> list = new ArrayList<>(); + for (TrackMaterial material : allCustom(modid)) { + list.add(material.getTrackBlock()); + } + return list; + } + + public static List> allBlocks() { + List> list = new ArrayList<>(); + for (TrackMaterial material : ALL) { + list.add(material.getTrackBlock()); + } + return list; + } + + public String resourceName() { + return this.id.getPath(); + } + + public static TrackMaterial deserialize(String serializedName) { + ResourceLocation id = new ResourceLocation(serializedName); + for (TrackMaterial material : ALL) { + if (material.id.equals(id)) + return material; + } + return ANDESITE; + } + + public static class TrackType { + @FunctionalInterface + protected interface TrackBlockFactory { + TrackBlock create(BlockBehaviour.Properties properties, TrackMaterial material); + } + + public static final TrackType STANDARD = new TrackType(Create.asResource("standard"), TrackBlock::new); + + public final ResourceLocation id; + protected final TrackBlockFactory factory; + + public TrackType(ResourceLocation id, TrackBlockFactory factory) { + this.id = id; + this.factory = factory; + } + } + + public record TrackModelHolder(PartialModel tie, PartialModel segment_left, PartialModel segment_right) { + static final TrackModelHolder DEFAULT = new TrackModelHolder(AllBlockPartials.TRACK_TIE, AllBlockPartials.TRACK_SEGMENT_LEFT, AllBlockPartials.TRACK_SEGMENT_RIGHT); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java new file mode 100644 index 000000000..f0f54e27e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java @@ -0,0 +1,118 @@ +package com.simibubi.create.content.logistics.trains; + +import com.jozufozu.flywheel.core.PartialModel; +import com.simibubi.create.AllTags; +import com.simibubi.create.content.logistics.trains.track.TrackBlock; +import com.tterrag.registrate.util.entry.BlockEntry; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.function.Supplier; +import java.util.stream.Stream; + +public class TrackMaterialFactory { + private final ResourceLocation id; + private String langName; + private Supplier> trackBlock; + private Ingredient sleeperIngredient = Ingredient.EMPTY; + private Ingredient railsIngredient = Ingredient.fromValues(Stream.of(new Ingredient.TagValue(AllTags.forgeItemTag("nuggets/iron")), new Ingredient.TagValue(AllTags.forgeItemTag("nuggets/zinc")))); + private ResourceLocation particle; + private TrackMaterial.TrackType trackType = TrackMaterial.TrackType.STANDARD; + private TrackMaterial.TrackModelHolder modelHolder = null; + private PartialModel tieModel = null; + private PartialModel leftSegmentModel = null; + private PartialModel rightSegmentModel = null; + + public TrackMaterialFactory(ResourceLocation id) { + this.id = id; + } + + public static TrackMaterialFactory make(ResourceLocation id) { // Convenience function for static import + return new TrackMaterialFactory(id); + } + + public TrackMaterialFactory lang(String langName) { + this.langName = langName; + return this; + } + + public TrackMaterialFactory block(Supplier> trackBlock) { + this.trackBlock = trackBlock; + return this; + } + + public TrackMaterialFactory setBuiltin() { + this.modelHolder = TrackMaterial.TrackModelHolder.DEFAULT; + return this; + } + + public TrackMaterialFactory sleeper(Ingredient sleeperIngredient) { + this.sleeperIngredient = sleeperIngredient; + return this; + } + + public TrackMaterialFactory sleeper(ItemLike... items) { + this.sleeperIngredient = Ingredient.of(items); + return this; + } + + public TrackMaterialFactory rails(Ingredient railsIngredient) { + this.railsIngredient = railsIngredient; + return this; + } + + public TrackMaterialFactory rails(ItemLike... items) { + this.railsIngredient = Ingredient.of(items); + return this; + } + + public TrackMaterialFactory noRecipeGen() { + this.railsIngredient = Ingredient.EMPTY; + this.sleeperIngredient = Ingredient.EMPTY; + return this; + } + + public TrackMaterialFactory particle(ResourceLocation particle) { + this.particle = particle; + return this; + } + + public TrackMaterialFactory trackType(TrackMaterial.TrackType trackType) { + this.trackType = trackType; + return this; + } + + public TrackMaterialFactory defaultModels() { + String namespace = id.getNamespace(); + String prefix = "block/track/" + id.getPath() + "/"; + tieModel = new PartialModel(new ResourceLocation(namespace, prefix + "tie")); + leftSegmentModel = new PartialModel(new ResourceLocation(namespace, prefix + "segment_left")); + rightSegmentModel = new PartialModel(new ResourceLocation(namespace, prefix + "segment_right")); + return this; + } + + public TrackMaterialFactory customModels(PartialModel tieModel, PartialModel leftSegmentModel, PartialModel rightSegmentModel) { + this.tieModel = tieModel; + this.leftSegmentModel = leftSegmentModel; + this.rightSegmentModel = rightSegmentModel; + return this; + } + + public TrackMaterial build() { + assert trackBlock != null; + assert langName != null; + assert particle != null; + assert trackType != null; + assert sleeperIngredient != null; + assert railsIngredient != null; + assert id != null; + assert modelHolder != null; + if (tieModel != null || leftSegmentModel != null || rightSegmentModel != null) { + assert tieModel != null && leftSegmentModel != null && rightSegmentModel != null; + modelHolder = new TrackMaterial.TrackModelHolder(tieModel, leftSegmentModel, rightSegmentModel); + } + return new TrackMaterial(id, langName, trackBlock, particle, sleeperIngredient, railsIngredient, trackType, modelHolder); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/CurvedTrackInteraction.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/CurvedTrackInteraction.java index 4194b591e..2af5b5f38 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/CurvedTrackInteraction.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/CurvedTrackInteraction.java @@ -1,7 +1,7 @@ package com.simibubi.create.content.logistics.trains.track; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; +import com.simibubi.create.AllTags; import com.simibubi.create.content.logistics.trains.management.edgePoint.TrackTargetingBlockItem; import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline.BezierPointSelection; import com.simibubi.create.foundation.networking.AllPackets; @@ -117,7 +117,7 @@ public class CurvedTrackInteraction { if (event.isUseItem()) { ItemStack heldItem = player.getMainHandItem(); Item item = heldItem.getItem(); - if (AllBlocks.TRACK.isIn(heldItem)) { + if (AllTags.AllBlockTags.TRACKS.matches(heldItem)) { player.displayClientMessage(Lang.translateDirect("track.turn_start") .withStyle(ChatFormatting.RED), true); player.swing(InteractionHand.MAIN_HAND); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/PlaceExtendedCurvePacket.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/PlaceExtendedCurvePacket.java index 4d1859325..c488947b1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/PlaceExtendedCurvePacket.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/PlaceExtendedCurvePacket.java @@ -2,7 +2,7 @@ package com.simibubi.create.content.logistics.trains.track; import java.util.function.Supplier; -import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTags; import com.simibubi.create.foundation.networking.SimplePacketBase; import net.minecraft.nbt.CompoundTag; @@ -16,7 +16,7 @@ public class PlaceExtendedCurvePacket extends SimplePacketBase { boolean mainHand; boolean ctrlDown; - + public PlaceExtendedCurvePacket(boolean mainHand, boolean ctrlDown) { this.mainHand = mainHand; this.ctrlDown = ctrlDown; @@ -39,7 +39,7 @@ public class PlaceExtendedCurvePacket extends SimplePacketBase { ctx.enqueueWork(() -> { ServerPlayer sender = ctx.getSender(); ItemStack stack = sender.getItemInHand(mainHand ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND); - if (!AllBlocks.TRACK.isIn(stack) || !stack.hasTag()) + if (!AllTags.AllBlockTags.TRACKS.matches(stack) || !stack.hasTag()) return; CompoundTag tag = stack.getTag(); tag.putBoolean("ExtendCurve", true); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java index 94ac6122a..6b03ccad9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java @@ -11,6 +11,7 @@ import static com.simibubi.create.AllShapes.TRACK_ORTHO_LONG; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -19,6 +20,11 @@ import java.util.Random; import java.util.Set; import java.util.function.Consumer; +import com.simibubi.create.AllTags; +import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; + +import com.simibubi.create.content.logistics.trains.TrackMaterial; + import org.jetbrains.annotations.Nullable; import com.google.common.base.Predicates; @@ -108,18 +114,23 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.IBlockRenderProperties; //init public class TrackBlock extends Block - implements ITE, IWrenchable, ITrackBlock, ISpecialBlockItemRequirement, ProperWaterloggedBlock { + implements ITE, IWrenchable, ITrackBlock, ISpecialBlockItemRequirement, ProperWaterloggedBlock, IHasTrackMaterial { public static final EnumProperty SHAPE = EnumProperty.create("shape", TrackShape.class); public static final BooleanProperty HAS_TE = BooleanProperty.create("turn"); - public TrackBlock(Properties p_49795_) { + protected final TrackMaterial material; + + public TrackBlock(Properties p_49795_, TrackMaterial material) { super(p_49795_); registerDefaultState(defaultBlockState().setValue(SHAPE, TrackShape.ZO) .setValue(HAS_TE, false) .setValue(WATERLOGGED, false)); + this.material = material; } + + @Override protected void createBlockStateDefinition(Builder p_49915_) { super.createBlockStateDefinition(p_49915_.add(SHAPE, HAS_TE, WATERLOGGED)); @@ -407,7 +418,7 @@ public class TrackBlock extends Block return list; BlockPos boundPos = trackTE.boundLocation.getSecond(); BlockState boundState = otherLevel.getBlockState(boundPos); - if (!AllBlocks.TRACK.has(boundState)) + if (!AllTags.AllBlockTags.TRACKS.matches(boundState)) return list; Vec3 center = Vec3.atBottomCenterOf(pos) @@ -750,7 +761,8 @@ public class TrackBlock extends Block @Override public ItemRequirement getRequiredItems(BlockState state, BlockEntity te) { - int trackAmount = 1; + int sameTypeTrackAmount = 1; + Map otherTrackAmounts = new HashMap<>(); int girderAmount = 0; if (te instanceof TrackTileEntity track) { @@ -758,15 +770,27 @@ public class TrackBlock extends Block .values()) { if (!bezierConnection.isPrimary()) continue; - trackAmount += bezierConnection.getTrackItemCost(); + TrackMaterial material = ((IHasTrackMaterial) bezierConnection).getMaterial(); + if (material == getMaterial()) { + sameTypeTrackAmount += bezierConnection.getTrackItemCost(); + } else { + otherTrackAmounts.put(material, otherTrackAmounts.getOrDefault(material, 0) + 1); + } girderAmount += bezierConnection.getGirderItemCost(); } } List stacks = new ArrayList<>(); - while (trackAmount > 0) { - stacks.add(AllBlocks.TRACK.asStack(Math.min(trackAmount, 64))); - trackAmount -= 64; + while (sameTypeTrackAmount > 0) { + stacks.add(new ItemStack(state.getBlock(), Math.min(sameTypeTrackAmount, 64))); + sameTypeTrackAmount -= 64; + } + for (TrackMaterial material : otherTrackAmounts.keySet()) { + int amt = otherTrackAmounts.get(material); + while (amt > 0) { + stacks.add(new ItemStack(material.getTrackBlock().get(), Math.min(amt, 64))); + amt -= 64; + } } while (girderAmount > 0) { stacks.add(AllBlocks.METAL_GIRDER.asStack(Math.min(girderAmount, 64))); @@ -776,6 +800,11 @@ public class TrackBlock extends Block return new ItemRequirement(ItemUseType.CONSUME, stacks); } + @Override + public TrackMaterial getMaterial() { + return material; + } + public static class RenderProperties extends ReducedDestroyEffects implements MultiPosDestructionHandler { @Override @Nullable diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java index a8b5929dc..5cd2f93cc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockItem.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.logistics.trains.track; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.AllTags; import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.content.logistics.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.networking.AllPackets; @@ -111,7 +112,7 @@ public class TrackBlockItem extends BlockItem { return InteractionResult.SUCCESS; stack = player.getMainHandItem(); - if (AllBlocks.TRACK.isIn(stack)) { + if (AllTags.AllBlockTags.TRACKS.matches(stack)) { stack.setTag(null); player.setItemInHand(pContext.getHand(), stack); } @@ -154,7 +155,7 @@ public class TrackBlockItem extends BlockItem { @OnlyIn(Dist.CLIENT) public static void sendExtenderPacket(PlayerInteractEvent.RightClickBlock event) { ItemStack stack = event.getItemStack(); - if (!AllBlocks.TRACK.isIn(stack) || !stack.hasTag()) + if (!AllTags.AllBlockTags.TRACKS.matches(stack) || !stack.hasTag()) return; if (Minecraft.getInstance().options.keySprint.isDown()) AllPackets.channel diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java index 0417825dd..254c51786 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlockOutline.java @@ -8,8 +8,8 @@ import java.util.function.Consumer; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; +import com.simibubi.create.AllTags; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -161,7 +161,7 @@ public class TrackBlockOutline { .rotateXRadians(angles.x) .translate(-.5, -.125f, -.5); - boolean holdingTrack = AllBlocks.TRACK.isIn(Minecraft.getInstance().player.getMainHandItem()); + boolean holdingTrack = AllTags.AllBlockTags.TRACKS.matches(Minecraft.getInstance().player.getMainHandItem()); renderShape(AllShapes.TRACK_ORTHO.get(Direction.SOUTH), ms, vb, holdingTrack ? false : null); ms.popPose(); } @@ -189,7 +189,7 @@ public class TrackBlockOutline { ms.pushPose(); ms.translate(pos.getX() - camPos.x, pos.getY() - camPos.y, pos.getZ() - camPos.z); - boolean holdingTrack = AllBlocks.TRACK.isIn(Minecraft.getInstance().player.getMainHandItem()); + boolean holdingTrack = AllTags.AllBlockTags.TRACKS.matches(Minecraft.getInstance().player.getMainHandItem()); TrackShape shape = blockstate.getValue(TrackBlock.SHAPE); boolean isJunction = shape.isJunction(); walkShapes(shape, TransformStack.cast(ms), s -> { diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java index 7bb371ede..76118bac9 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java @@ -20,6 +20,8 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.content.logistics.trains.BezierConnection.GirderAngles; import com.simibubi.create.content.logistics.trains.BezierConnection.SegmentAngles; +import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; +import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; @@ -38,7 +40,7 @@ public class TrackInstance extends BlockEntityInstance { @Override public void update() { - if (blockEntity.connections.isEmpty()) + if (blockEntity.connections.isEmpty()) return; remove(); @@ -112,11 +114,13 @@ public class TrackInstance extends BlockEntityInstance { leftLightPos = new BlockPos[segCount]; rightLightPos = new BlockPos[segCount]; - mat.getModel(AllBlockPartials.TRACK_TIE) + TrackMaterial.TrackModelHolder modelHolder = ((IHasTrackMaterial) bc).getMaterial().modelHolder; + + mat.getModel(modelHolder.tie()) .createInstances(ties); - mat.getModel(AllBlockPartials.TRACK_SEGMENT_LEFT) + mat.getModel(modelHolder.segment_left()) .createInstances(left); - mat.getModel(AllBlockPartials.TRACK_SEGMENT_RIGHT) + mat.getModel(modelHolder.segment_right()) .createInstances(right); SegmentAngles[] segments = bc.getBakedSegments(); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index a34fa562d..0595f869e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -7,12 +7,14 @@ import java.util.List; import java.util.Set; import com.jozufozu.flywheel.util.Color; -import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSpecialTextures; +import com.simibubi.create.AllTags; import com.simibubi.create.CreateClient; import com.simibubi.create.content.curiosities.tools.BlueprintOverlayRenderer; import com.simibubi.create.content.logistics.trains.BezierConnection; +import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.ITrackBlock; +import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.block.ProperWaterloggedBlock; import com.simibubi.create.foundation.config.AllConfigs; @@ -47,6 +49,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.HitResult.Type; @@ -57,7 +60,7 @@ import net.minecraftforge.items.ItemHandlerHelper; public class TrackPlacement { - public static class PlacementInfo { + public static class PlacementInfo implements IHasTrackMaterial { BezierConnection curve = null; boolean valid = false; int end1Extent = 0; @@ -69,6 +72,7 @@ public class TrackPlacement { public int requiredPavement = 0; public boolean hasRequiredPavement = false; + private TrackMaterial trackMaterial; // for visualisation Vec3 end1; @@ -89,6 +93,19 @@ public class TrackPlacement { curve = null; return this; } + + @Override + public TrackMaterial getMaterial() { + if (trackMaterial == null) { + throw new RuntimeException("Track material should never be null in TrackPlacement#PlacementInfo"); + } + return trackMaterial; + } + + @Override + public void setMaterial(TrackMaterial material) { + trackMaterial = material; + } } public static PlacementInfo cached; @@ -109,6 +126,7 @@ public class TrackPlacement { return cached; PlacementInfo info = new PlacementInfo(); + info.trackMaterial = IHasTrackMaterial.fromItem(stack.getItem()); hoveringMaxed = maximiseTurn; hoveringAngle = lookAngle; hoveringPos = pos2; @@ -192,7 +210,7 @@ public class TrackPlacement { BlockPos targetPos2 = pos2.offset(offset2.x, offset2.y, offset2.z); info.curve = new BezierConnection(Couple.create(targetPos1, targetPos2), Couple.create(end1.add(offset1), end2.add(offset2)), Couple.create(normedAxis1, normedAxis2), - Couple.create(normal1, normal2), true, girder); + Couple.create(normal1, normal2), true, girder, IHasTrackMaterial.fromItem(stack.getItem())); } // S curve or Straight @@ -281,10 +299,10 @@ public class TrackPlacement { if (skipCurve && !Mth.equal(ascend, 0)) { int hDistance = info.end1Extent; if (axis1.y == 0 || !Mth.equal(absAscend + 1, dist / axis1.length())) { - + if (axis1.y != 0 && axis1.y == -axis2.y) return info.withMessage("ascending_s_curve"); - + info.end1Extent = 0; double minHDistance = Math.max(absAscend < 4 ? absAscend * 4 : absAscend * 3, 6) / axis1.length(); if (hDistance < minHDistance) @@ -352,7 +370,7 @@ public class TrackPlacement { info.curve = skipCurve ? null : new BezierConnection(Couple.create(targetPos1, targetPos2), Couple.create(end1.add(offset1), end2.add(offset2)), Couple.create(normedAxis1, normedAxis2), - Couple.create(normal1, normal2), true, girder); + Couple.create(normal1, normal2), true, girder, IHasTrackMaterial.fromItem(stack.getItem())); info.valid = true; @@ -397,7 +415,7 @@ public class TrackPlacement { continue; ItemStack stackInSlot = (offhand ? inv.offhand : inv.items).get(i); - boolean isTrack = AllBlocks.TRACK.isIn(stackInSlot); + boolean isTrack = AllTags.AllBlockTags.TRACKS.matches(stackInSlot) && stackInSlot.is(stack.getItem()); if (!isTrack && (!shouldPave || offhandItem.getItem() != stackInSlot.getItem())) continue; if (isTrack ? foundTracks >= tracks : foundPavement >= pavement) @@ -445,10 +463,10 @@ public class TrackPlacement { BlockItem paveItem = (BlockItem) offhandItem.getItem(); paveTracks(level, info, paveItem, false); } - + if (info.curve != null && info.curve.getLength() > 29) AllAdvancements.LONG_BEND.awardTo(player); - + return placeTracks(level, info, state1, state2, targetPos1, targetPos2, false); } @@ -474,6 +492,18 @@ public class TrackPlacement { info.requiredPavement += TrackPaver.paveCurve(level, info.curve, block, simulate, visited); } + private static BlockState copyProperties(BlockState from, BlockState onto) { + for (Property property : onto.getProperties()) { + if (from.hasProperty(property)) + onto = onto.setValue(property, from.getValue(property)); + } + return onto; + } + + private static BlockState copyProperties(BlockState from, BlockState onto, boolean keepFrom) { + return keepFrom ? copyProperties(from, onto) : from; + } + private static PlacementInfo placeTracks(Level level, PlacementInfo info, BlockState state1, BlockState state2, BlockPos targetPos1, BlockPos targetPos2, boolean simulate) { info.requiredTracks = 0; @@ -501,7 +531,8 @@ public class TrackPlacement { Vec3 offset = axis.scale(i); BlockPos offsetPos = pos.offset(offset.x, offset.y, offset.z); BlockState stateAtPos = level.getBlockState(offsetPos); - BlockState toPlace = state; + // copy over all shared properties from the shaped state to the correct track material block + BlockState toPlace = copyProperties(state, info.getMaterial().getTrackBlock().getDefaultState()); boolean canPlace = stateAtPos.getMaterial() .isReplaceable(); @@ -525,13 +556,14 @@ public class TrackPlacement { if (!simulate) { BlockState stateAtPos = level.getBlockState(targetPos1); + BlockState onto = info.getMaterial().getTrackBlock().getDefaultState(); level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, - (stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true), + copyProperties((stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1), onto, AllTags.AllBlockTags.TRACKS.matches(stateAtPos)).setValue(TrackBlock.HAS_TE, true), targetPos1), 3); stateAtPos = level.getBlockState(targetPos2); level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, - (stateAtPos.getBlock() == state2.getBlock() ? stateAtPos : state2).setValue(TrackBlock.HAS_TE, true), + copyProperties((stateAtPos.getBlock() == state2.getBlock() ? stateAtPos : state2), onto, AllTags.AllBlockTags.TRACKS.matches(stateAtPos)).setValue(TrackBlock.HAS_TE, true), targetPos2), 3); } @@ -579,10 +611,10 @@ public class TrackPlacement { return; InteractionHand hand = InteractionHand.MAIN_HAND; - if (!AllBlocks.TRACK.isIn(stack)) { + if (!AllTags.AllBlockTags.TRACKS.matches(stack)) { stack = player.getOffhandItem(); hand = InteractionHand.OFF_HAND; - if (!AllBlocks.TRACK.isIn(stack)) + if (!AllTags.AllBlockTags.TRACKS.matches(stack)) return; } @@ -621,7 +653,7 @@ public class TrackPlacement { if (bhr.getDirection() == Direction.UP) { Vec3 lookVec = player.getLookAngle(); int lookAngle = (int) (22.5 + AngleHelper.deg(Mth.atan2(lookVec.z, lookVec.x)) % 360) / 8; - + if (!pos.equals(hintPos) || lookAngle != hintAngle) { hints = Couple.create(ArrayList::new); hintAngle = lookAngle; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java index 1ee412ea0..cb5f3f9d7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java @@ -3,9 +3,6 @@ package com.simibubi.create.content.logistics.trains.track; import static com.simibubi.create.AllBlockPartials.GIRDER_SEGMENT_BOTTOM; import static com.simibubi.create.AllBlockPartials.GIRDER_SEGMENT_MIDDLE; import static com.simibubi.create.AllBlockPartials.GIRDER_SEGMENT_TOP; -import static com.simibubi.create.AllBlockPartials.TRACK_SEGMENT_LEFT; -import static com.simibubi.create.AllBlockPartials.TRACK_SEGMENT_RIGHT; -import static com.simibubi.create.AllBlockPartials.TRACK_TIE; import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.util.transform.TransformStack; @@ -15,6 +12,8 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.content.logistics.trains.BezierConnection.GirderAngles; import com.simibubi.create.content.logistics.trains.BezierConnection.SegmentAngles; +import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; +import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -66,7 +65,9 @@ public class TrackRenderer extends SafeTileEntityRenderer { SegmentAngles segment = segments[i]; int light = LevelRenderer.getLightColor(level, segment.lightPosition.offset(tePosition)); - CachedBufferer.partial(TRACK_TIE, air) + TrackMaterial.TrackModelHolder modelHolder = ((IHasTrackMaterial) bc).getMaterial().modelHolder; + + CachedBufferer.partial(modelHolder.tie(), air) .mulPose(segment.tieTransform.pose()) .mulNormal(segment.tieTransform.normal()) .light(light) @@ -74,7 +75,7 @@ public class TrackRenderer extends SafeTileEntityRenderer { for (boolean first : Iterate.trueAndFalse) { Pose transform = segment.railTransforms.get(first); - CachedBufferer.partial(first ? TRACK_SEGMENT_LEFT : TRACK_SEGMENT_RIGHT, air) + CachedBufferer.partial(first ? modelHolder.segment_left() : modelHolder.segment_right(), air) .mulPose(transform.pose()) .mulNormal(transform.normal()) .light(light) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java index 05431e8fd..a20c241cf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java @@ -9,6 +9,7 @@ import java.util.Set; import com.jozufozu.flywheel.backend.instancing.InstancedRenderDispatcher; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTags; import com.simibubi.create.content.contraptions.components.structureMovement.ITransformableTE; import com.simibubi.create.content.contraptions.components.structureMovement.StructureTransform; import com.simibubi.create.content.logistics.trains.BezierConnection; @@ -287,7 +288,7 @@ public class TrackTileEntity extends SmartTileEntity implements ITransformableTE .getLevel(boundLocation.getFirst()); if (otherLevel == null) return; - if (AllBlocks.TRACK.has(otherLevel.getBlockState(boundLocation.getSecond()))) + if (AllTags.AllBlockTags.TRACKS.matches(otherLevel.getBlockState(boundLocation.getSecond()))) otherLevel.destroyBlock(boundLocation.getSecond(), false); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index ed44673e8..c2b2d4742 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; +import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.ponder.PonderRegistrationHelper; import com.simibubi.create.foundation.ponder.PonderRegistry; @@ -303,7 +304,7 @@ public class PonderIndex { .addStoryBoard("rose_quartz_lamp", RedstoneScenes2::roseQuartzLamp); // Trains - HELPER.forComponents(AllBlocks.TRACK) + HELPER.forComponents(TrackMaterial.allBlocks()) .addStoryBoard("train_track/placement", TrackScenes::placement) .addStoryBoard("train_track/portal", TrackScenes::portal) .addStoryBoard("train_track/chunks", TrackScenes::chunks); From f7c56b867a6afe52fa742f4d4c310db9788cc2ef Mon Sep 17 00:00:00 2001 From: techno-sam Date: Thu, 6 Apr 2023 21:24:31 -0700 Subject: [PATCH 04/10] Track API maybe? Fix build - broken generic Not yet tested, but it is progress --- src/main/java/com/simibubi/create/AllTileEntities.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 0582ec7e6..be3363772 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -204,6 +204,8 @@ import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRendere import com.tterrag.registrate.util.entry.BlockEntityEntry; import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.world.level.block.Block; + public class AllTileEntities { // Schematics @@ -783,7 +785,7 @@ public class AllTileEntities { .tileEntity("track", TrackTileEntity::new) .instance(() -> TrackInstance::new) .renderer(() -> TrackRenderer::new) - .validBlocks(TrackMaterial.allBlocks().toArray(new BlockEntry[0])) + .validBlocks(((BlockEntry[]) TrackMaterial.allBlocks().toArray(new BlockEntry[0]))) .register(); public static final BlockEntityEntry FAKE_TRACK = REGISTRATE From 35644f143426bc2cae1a63c4f09d7145a4e18983 Mon Sep 17 00:00:00 2001 From: techno-sam Date: Sat, 8 Apr 2023 08:11:13 -0700 Subject: [PATCH 05/10] Track API maybe? Datagen Seems to be working --- src/generated/resources/.cache/cache | 2 ++ .../resources/data/create/tags/blocks/girdable_tracks.json | 6 ++++++ src/generated/resources/data/create/tags/blocks/tracks.json | 6 ++++++ 3 files changed, 14 insertions(+) create mode 100644 src/generated/resources/data/create/tags/blocks/girdable_tracks.json create mode 100644 src/generated/resources/data/create/tags/blocks/tracks.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index d50c09db9..b60cd2d8d 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -5611,6 +5611,7 @@ ac265a674626e0e832330086fd18fe0be37fc327 data/create/recipes/weathered_copper_ti 2a2700b43614f86d3294726595cb28ed7dca4387 data/create/tags/blocks/brittle.json d99d5c67bdffff60789a19bd51a5c5267c75e0a4 data/create/tags/blocks/casing.json 2b4c93e5a752ebf54217594766f30d8d60cb4343 data/create/tags/blocks/fan_transparent.json +ad8fa04f7bbbafd70d0ce158af78a35e899301e2 data/create/tags/blocks/girdable_tracks.json ee6d2b53d81f2bed492662b6c06f46c4f2b9ef9b data/create/tags/blocks/movable_empty_collider.json 6e5d3b2123fbb00e7f439c091623619502551bca data/create/tags/blocks/non_movable.json 10781e8cfcbb3486327aace3aa00e437fb44b331 data/create/tags/blocks/ore_override_stone.json @@ -5618,6 +5619,7 @@ ee6d2b53d81f2bed492662b6c06f46c4f2b9ef9b data/create/tags/blocks/movable_empty_c 23eb7cf8abff36f85320c35c69b98fdb775c8ec9 data/create/tags/blocks/safe_nbt.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json d063e12c9ef75f39518c6d129ea35d833464d547 data/create/tags/blocks/toolboxes.json +ad8fa04f7bbbafd70d0ce158af78a35e899301e2 data/create/tags/blocks/tracks.json 9460e92c8e483446318b849abe7e6f52dcd4a269 data/create/tags/blocks/tree_attachments.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json diff --git a/src/generated/resources/data/create/tags/blocks/girdable_tracks.json b/src/generated/resources/data/create/tags/blocks/girdable_tracks.json new file mode 100644 index 000000000..ef33e72ef --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/girdable_tracks.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:track" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/tracks.json b/src/generated/resources/data/create/tags/blocks/tracks.json new file mode 100644 index 000000000..ef33e72ef --- /dev/null +++ b/src/generated/resources/data/create/tags/blocks/tracks.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "create:track" + ] +} \ No newline at end of file From 7fbf08ba54ce3397045a8acdd6b7be813009ee7b Mon Sep 17 00:00:00 2001 From: techno-sam Date: Sat, 8 Apr 2023 11:11:24 -0700 Subject: [PATCH 06/10] Track API? Fix up some placement issues --- .../content/logistics/trains/track/TrackPlacement.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index 0595f869e..9ea76b131 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.function.Function; import com.jozufozu.flywheel.util.Color; import com.simibubi.create.AllSpecialTextures; @@ -500,8 +501,8 @@ public class TrackPlacement { return onto; } - private static BlockState copyProperties(BlockState from, BlockState onto, boolean keepFrom) { - return keepFrom ? copyProperties(from, onto) : from; + private static BlockState copyProperties(BlockState from, BlockState onto, Function keepFrom) { + return keepFrom.apply(from) ? copyProperties(from, onto) : from; } private static PlacementInfo placeTracks(Level level, PlacementInfo info, BlockState state1, BlockState state2, @@ -558,12 +559,12 @@ public class TrackPlacement { BlockState stateAtPos = level.getBlockState(targetPos1); BlockState onto = info.getMaterial().getTrackBlock().getDefaultState(); level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, - copyProperties((stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1), onto, AllTags.AllBlockTags.TRACKS.matches(stateAtPos)).setValue(TrackBlock.HAS_TE, true), + copyProperties((stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1), onto, AllTags.AllBlockTags.TRACKS::matches).setValue(TrackBlock.HAS_TE, true), targetPos1), 3); stateAtPos = level.getBlockState(targetPos2); level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, - copyProperties((stateAtPos.getBlock() == state2.getBlock() ? stateAtPos : state2), onto, AllTags.AllBlockTags.TRACKS.matches(stateAtPos)).setValue(TrackBlock.HAS_TE, true), + copyProperties((stateAtPos.getBlock() == state2.getBlock() ? stateAtPos : state2), onto, AllTags.AllBlockTags.TRACKS::matches).setValue(TrackBlock.HAS_TE, true), targetPos2), 3); } From d9ce6ce995128e64d079145b96273235c4fec783 Mon Sep 17 00:00:00 2001 From: techno-sam Date: Sun, 9 Apr 2023 07:14:46 -0700 Subject: [PATCH 07/10] Track API? Fix placement --- .../logistics/trains/BezierConnection.java | 14 +++++++++++ .../trains/track/TrackPlacement.java | 24 ++++++++++++------- .../trains/track/TrackTileEntity.java | 3 +++ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java index fa06d3fa4..10b2fbead 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java @@ -72,6 +72,20 @@ public class BezierConnection implements Iterable, IHa hasGirder, trackMaterial); } + private static boolean coupleEquals(Couple a, Couple b) { + return (a.getFirst().equals(b.getFirst()) && a.getSecond().equals(b.getSecond())) || (a.getFirst() instanceof Vec3 aFirst && a.getSecond() instanceof Vec3 aSecond && b.getFirst() instanceof Vec3 bFirst && b.getSecond() instanceof Vec3 bSecond && aFirst.closerThan(bFirst, 1e-6) && aSecond.closerThan(bSecond, 1e-6)); + } + + public boolean equalsSansMaterial(BezierConnection other) { + return equalsSansMaterialInner(other) || equalsSansMaterialInner(other.secondary()); + } + + private boolean equalsSansMaterialInner(BezierConnection other) { + return this == other || (other != null && coupleEquals(this.tePositions, other.tePositions) && coupleEquals(this.starts, other.starts) + && coupleEquals(this.axes, other.axes) && coupleEquals(this.normals, other.normals) + && this.hasGirder == other.hasGirder); + } + public BezierConnection(CompoundTag compound, BlockPos localTo) { this(Couple.deserializeEach(compound.getList("Positions", Tag.TAG_COMPOUND), NbtUtils::readBlockPos) .map(b -> b.offset(localTo)), diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index 9ea76b131..d23751c15 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -501,8 +501,8 @@ public class TrackPlacement { return onto; } - private static BlockState copyProperties(BlockState from, BlockState onto, Function keepFrom) { - return keepFrom.apply(from) ? copyProperties(from, onto) : from; + private static BlockState copyProperties(BlockState from, BlockState onto, boolean keepFrom) { + return keepFrom ? from : copyProperties(from, onto); } private static PlacementInfo placeTracks(Level level, PlacementInfo info, BlockState state1, BlockState state2, @@ -556,16 +556,22 @@ public class TrackPlacement { return info; if (!simulate) { - BlockState stateAtPos = level.getBlockState(targetPos1); BlockState onto = info.getMaterial().getTrackBlock().getDefaultState(); - level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, - copyProperties((stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1), onto, AllTags.AllBlockTags.TRACKS::matches).setValue(TrackBlock.HAS_TE, true), - targetPos1), 3); + var relevantState = state1; + BlockState stateAtPos = level.getBlockState(targetPos1); + var stateAtPosVar = stateAtPos; +// BlockState injectorAllocatedLocal30 = (BlockState)(stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true); + relevantState = copyProperties(relevantState, onto); + var modifiedBlock = (AllTags.AllBlockTags.TRACKS.matches(stateAtPosVar) ? stateAtPosVar : relevantState).setValue(TrackBlock.HAS_TE, true); + level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, modifiedBlock, targetPos1), 3); + relevantState = state2; stateAtPos = level.getBlockState(targetPos2); - level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, - copyProperties((stateAtPos.getBlock() == state2.getBlock() ? stateAtPos : state2), onto, AllTags.AllBlockTags.TRACKS::matches).setValue(TrackBlock.HAS_TE, true), - targetPos2), 3); + stateAtPosVar = stateAtPos; +// BlockState injectorAllocatedLocal30 = (BlockState)(stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true); + relevantState = copyProperties(relevantState, onto); + modifiedBlock = (AllTags.AllBlockTags.TRACKS.matches(stateAtPosVar) ? stateAtPosVar : relevantState).setValue(TrackBlock.HAS_TE, true); + level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, modifiedBlock, targetPos2), 3); } BlockEntity te1 = level.getBlockEntity(targetPos1); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java index a20c241cf..317ca94a6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackTileEntity.java @@ -113,6 +113,9 @@ public class TrackTileEntity extends SmartTileEntity implements ITransformableTE } public void addConnection(BezierConnection connection) { + // don't replace existing connections with different materials + if (connections.containsKey(connection.getKey()) && connection.equalsSansMaterial(connections.get(connection.getKey()))) + return; connections.put(connection.getKey(), connection); level.scheduleTick(worldPosition, getBlockState().getBlock(), 1); notifyUpdate(); From e629d02f505c7de2d786a126fe49168351f17124 Mon Sep 17 00:00:00 2001 From: techno-sam Date: Sun, 9 Apr 2023 07:18:22 -0700 Subject: [PATCH 08/10] Track API Clean up code a bit --- .../logistics/trains/track/TrackPlacement.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index d23751c15..28a0cd4ce 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -557,21 +557,15 @@ public class TrackPlacement { if (!simulate) { BlockState onto = info.getMaterial().getTrackBlock().getDefaultState(); - var relevantState = state1; BlockState stateAtPos = level.getBlockState(targetPos1); - var stateAtPosVar = stateAtPos; -// BlockState injectorAllocatedLocal30 = (BlockState)(stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true); - relevantState = copyProperties(relevantState, onto); - var modifiedBlock = (AllTags.AllBlockTags.TRACKS.matches(stateAtPosVar) ? stateAtPosVar : relevantState).setValue(TrackBlock.HAS_TE, true); - level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, modifiedBlock, targetPos1), 3); + level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, + (AllTags.AllBlockTags.TRACKS.matches(stateAtPos) ? stateAtPos : copyProperties(state1, onto)) + .setValue(TrackBlock.HAS_TE, true), targetPos1), 3); - relevantState = state2; stateAtPos = level.getBlockState(targetPos2); - stateAtPosVar = stateAtPos; -// BlockState injectorAllocatedLocal30 = (BlockState)(stateAtPos.getBlock() == state1.getBlock() ? stateAtPos : state1).setValue(TrackBlock.HAS_TE, true); - relevantState = copyProperties(relevantState, onto); - modifiedBlock = (AllTags.AllBlockTags.TRACKS.matches(stateAtPosVar) ? stateAtPosVar : relevantState).setValue(TrackBlock.HAS_TE, true); - level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, modifiedBlock, targetPos2), 3); + level.setBlock(targetPos2, ProperWaterloggedBlock.withWater(level, + (AllTags.AllBlockTags.TRACKS.matches(stateAtPos) ? stateAtPos : copyProperties(state2, onto)) + .setValue(TrackBlock.HAS_TE, true), targetPos2), 3); } BlockEntity te1 = level.getBlockEntity(targetPos1); From 4ebcf820122e83d9be3b14dc59877fb067134d8e Mon Sep 17 00:00:00 2001 From: Zelophed Date: Mon, 17 Apr 2023 20:37:45 +0200 Subject: [PATCH 09/10] Update crowdin.yml --- crowdin.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crowdin.yml b/crowdin.yml index 39f243b83..1c4eca6e9 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -13,6 +13,7 @@ "cs": "cs_cz", "da": "da_dk", "de": "de_de", + "eo": "eo_uy", "es-CL": "es_cl", "es-ES": "es_es", "es-MX": "es_mx", @@ -30,6 +31,7 @@ "pt-BR": "pt_br", "pt-PT": "pt_pt", "ro": "ro_ro", + "rpr": "rpr", "ru": "ru_ru", "sv-SE": "sv_se", "th": "th_th", From e91753a33cde6dbe0caaface45a7f377d75acbed Mon Sep 17 00:00:00 2001 From: techno-sam Date: Sun, 30 Apr 2023 19:51:26 -0700 Subject: [PATCH 10/10] Fix up some problems --- src/generated/resources/.cache/cache | 2 - .../java/com/simibubi/create/AllBlocks.java | 2 +- .../com/simibubi/create/AllTileEntities.java | 5 +- .../tools/BlueprintOverlayRenderer.java | 3 +- .../logistics/trains/BezierConnection.java | 19 +++--- .../logistics/trains/IHasTrackMaterial.java | 16 ----- .../content/logistics/trains/ITrackBlock.java | 4 +- .../logistics/trains/TrackMaterial.java | 66 +++++++++++++------ .../trains/TrackMaterialFactory.java | 65 +++++++++++------- .../logistics/trains/track/TrackBlock.java | 13 ++-- .../logistics/trains/track/TrackInstance.java | 3 +- .../trains/track/TrackPlacement.java | 35 ++++------ .../logistics/trains/track/TrackRenderer.java | 3 +- .../ponder/content/PonderIndex.java | 15 ++++- 14 files changed, 140 insertions(+), 111 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index b60cd2d8d..d50c09db9 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -5611,7 +5611,6 @@ ac265a674626e0e832330086fd18fe0be37fc327 data/create/recipes/weathered_copper_ti 2a2700b43614f86d3294726595cb28ed7dca4387 data/create/tags/blocks/brittle.json d99d5c67bdffff60789a19bd51a5c5267c75e0a4 data/create/tags/blocks/casing.json 2b4c93e5a752ebf54217594766f30d8d60cb4343 data/create/tags/blocks/fan_transparent.json -ad8fa04f7bbbafd70d0ce158af78a35e899301e2 data/create/tags/blocks/girdable_tracks.json ee6d2b53d81f2bed492662b6c06f46c4f2b9ef9b data/create/tags/blocks/movable_empty_collider.json 6e5d3b2123fbb00e7f439c091623619502551bca data/create/tags/blocks/non_movable.json 10781e8cfcbb3486327aace3aa00e437fb44b331 data/create/tags/blocks/ore_override_stone.json @@ -5619,7 +5618,6 @@ ee6d2b53d81f2bed492662b6c06f46c4f2b9ef9b data/create/tags/blocks/movable_empty_c 23eb7cf8abff36f85320c35c69b98fdb775c8ec9 data/create/tags/blocks/safe_nbt.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/blocks/seats.json d063e12c9ef75f39518c6d129ea35d833464d547 data/create/tags/blocks/toolboxes.json -ad8fa04f7bbbafd70d0ce158af78a35e899301e2 data/create/tags/blocks/tracks.json 9460e92c8e483446318b849abe7e6f52dcd4a269 data/create/tags/blocks/tree_attachments.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/blocks/valve_handles.json eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails.json diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 071f944d3..3dfe2f87a 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1501,7 +1501,7 @@ public class AllBlocks { .transform(customItemModel()) .register(); - public static final BlockEntry TRACK = REGISTRATE.block("track", TrackMaterial.ANDESITE::create) + public static final BlockEntry TRACK = REGISTRATE.block("track", TrackMaterial.ANDESITE::createBlock) .initialProperties(Material.STONE) .properties(p -> p.color(MaterialColor.METAL) .strength(0.8F) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index be3363772..ba342d0f8 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -193,6 +193,7 @@ import com.simibubi.create.content.logistics.trains.management.edgePoint.station import com.simibubi.create.content.logistics.trains.management.edgePoint.station.StationTileEntity; import com.simibubi.create.content.logistics.trains.track.FakeTrackTileEntity; import com.simibubi.create.content.logistics.trains.track.StandardBogeyTileEntity; +import com.simibubi.create.content.logistics.trains.track.TrackBlock; import com.simibubi.create.content.logistics.trains.track.TrackInstance; import com.simibubi.create.content.logistics.trains.track.TrackRenderer; import com.simibubi.create.content.logistics.trains.track.TrackTileEntity; @@ -204,6 +205,8 @@ import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRendere import com.tterrag.registrate.util.entry.BlockEntityEntry; import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.nullness.NonNullSupplier; + import net.minecraft.world.level.block.Block; public class AllTileEntities { @@ -785,7 +788,7 @@ public class AllTileEntities { .tileEntity("track", TrackTileEntity::new) .instance(() -> TrackInstance::new) .renderer(() -> TrackRenderer::new) - .validBlocks(((BlockEntry[]) TrackMaterial.allBlocks().toArray(new BlockEntry[0]))) + .validBlocks((NonNullSupplier[]) TrackMaterial.allBlocks().toArray(new NonNullSupplier[0])) .register(); public static final BlockEntityEntry FAKE_TRACK = REGISTRATE diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java index 884d034cc..a3aec3eab 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/BlueprintOverlayRenderer.java @@ -15,7 +15,6 @@ import com.simibubi.create.content.curiosities.tools.BlueprintEntity.BlueprintSe import com.simibubi.create.content.logistics.item.filter.AttributeFilterContainer.WhitelistMode; import com.simibubi.create.content.logistics.item.filter.FilterItem; import com.simibubi.create.content.logistics.item.filter.ItemAttribute; -import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.track.TrackPlacement.PlacementInfo; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.element.GuiGameElement; @@ -106,7 +105,7 @@ public class BlueprintOverlayRenderer { int tracks = info.requiredTracks; while (tracks > 0) { - ingredients.add(Pair.of(((IHasTrackMaterial) info).getMaterial().getTrackBlock().asStack(Math.min(64, tracks)), info.hasRequiredTracks)); + ingredients.add(Pair.of(new ItemStack(info.trackMaterial.getTrackBlock().get(), Math.min(64, tracks)), info.hasRequiredTracks)); tracks -= 64; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java index 10b2fbead..a65cdb8f6 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/BezierConnection.java @@ -24,6 +24,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; @@ -31,7 +32,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class BezierConnection implements Iterable, IHasTrackMaterial { +public class BezierConnection implements Iterable { public Couple tePositions; public Couple starts; @@ -73,7 +74,10 @@ public class BezierConnection implements Iterable, IHa } private static boolean coupleEquals(Couple a, Couple b) { - return (a.getFirst().equals(b.getFirst()) && a.getSecond().equals(b.getSecond())) || (a.getFirst() instanceof Vec3 aFirst && a.getSecond() instanceof Vec3 aSecond && b.getFirst() instanceof Vec3 bFirst && b.getSecond() instanceof Vec3 bSecond && aFirst.closerThan(bFirst, 1e-6) && aSecond.closerThan(bSecond, 1e-6)); + return (a.getFirst().equals(b.getFirst()) && a.getSecond().equals(b.getSecond())) + || (a.getFirst() instanceof Vec3 aFirst && a.getSecond() instanceof Vec3 aSecond + && b.getFirst() instanceof Vec3 bFirst && b.getSecond() instanceof Vec3 bSecond + && aFirst.closerThan(bFirst, 1e-6) && aSecond.closerThan(bSecond, 1e-6)); } public boolean equalsSansMaterial(BezierConnection other) { @@ -318,7 +322,7 @@ public class BezierConnection implements Iterable, IHa Inventory inv = player.getInventory(); int tracks = getTrackItemCost(); while (tracks > 0) { - inv.placeItemBackInInventory(getMaterial().getTrackBlock().asStack(Math.min(64, tracks))); + inv.placeItemBackInInventory(new ItemStack(getMaterial().getTrackBlock().get(), Math.min(64, tracks))); tracks -= 64; } int girders = getGirderItemCost(); @@ -346,7 +350,7 @@ public class BezierConnection implements Iterable, IHa continue; Vec3 v = VecHelper.offsetRandomly(segment.position, level.random, .125f) .add(origin); - ItemEntity entity = new ItemEntity(level, v.x, v.y, v.z, getMaterial().getTrackBlock().asStack()); + ItemEntity entity = new ItemEntity(level, v.x, v.y, v.z, new ItemStack(getMaterial().getTrackBlock().get())); entity.setDefaultPickUpDelay(); level.addFreshEntity(entity); if (!hasGirder) @@ -360,7 +364,7 @@ public class BezierConnection implements Iterable, IHa } public void spawnDestroyParticles(Level level) { - BlockParticleOption data = new BlockParticleOption(ParticleTypes.BLOCK, getMaterial().getTrackBlock().getDefaultState()); + BlockParticleOption data = new BlockParticleOption(ParticleTypes.BLOCK, getMaterial().getTrackBlock().get().defaultBlockState()); BlockParticleOption girderData = new BlockParticleOption(ParticleTypes.BLOCK, AllBlocks.METAL_GIRDER.getDefaultState()); if (!(level instanceof ServerLevel slevel)) @@ -378,15 +382,10 @@ public class BezierConnection implements Iterable, IHa } } - @Override public TrackMaterial getMaterial() { - if (trackMaterial == null) { - trackMaterial = TrackMaterial.ANDESITE; - } return trackMaterial; } - @Override public void setMaterial(TrackMaterial material) { trackMaterial = material; } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java b/src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java deleted file mode 100644 index 8abe19640..000000000 --- a/src/main/java/com/simibubi/create/content/logistics/trains/IHasTrackMaterial.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.simibubi.create.content.logistics.trains; - -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; - -public interface IHasTrackMaterial { - TrackMaterial getMaterial(); - - default void setMaterial(TrackMaterial material) {} - - static TrackMaterial fromItem(Item item) { - if (item instanceof BlockItem blockItem && blockItem.getBlock() instanceof IHasTrackMaterial hasTrackMaterial) - return hasTrackMaterial.getMaterial(); - return TrackMaterial.ANDESITE; - } -} diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java index 33946c2a5..ad3f7c99b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/ITrackBlock.java @@ -97,7 +97,7 @@ public interface ITrackBlock { firstLocation.forceNode(); secondLocation.forceNode(); } - + boolean skipFirst = false; boolean skipSecond = false; @@ -152,4 +152,6 @@ public interface ITrackBlock { .normalize()) < 0 ? AxisDirection.POSITIVE : AxisDirection.NEGATIVE); } + TrackMaterial getMaterial(); + } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java index d3ccd3910..759a243ea 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterial.java @@ -6,39 +6,55 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.track.TrackBlock; -import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.fml.DistExecutor; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Supplier; import static com.simibubi.create.content.logistics.trains.TrackMaterialFactory.make; public class TrackMaterial { - public static final List ALL = new ArrayList<>(); + public static final Map ALL = new HashMap<>(); public static final TrackMaterial ANDESITE = make(Create.asResource("andesite")) .lang("Andesite") - .block(Lazy.of(() -> AllBlocks.TRACK)) + .block(NonNullSupplier.lazy(() -> AllBlocks.TRACK)) .particle(Create.asResource("block/palettes/stone_types/polished/andesite_cut_polished")) - .setBuiltin() + .defaultModels() .build(); public final ResourceLocation id; public final String langName; - public final Supplier> trackBlock; + public final NonNullSupplier> trackBlock; public final Ingredient sleeperIngredient; public final Ingredient railsIngredient; public final ResourceLocation particle; public final TrackType trackType; - public final TrackModelHolder modelHolder; - public TrackMaterial(ResourceLocation id, String langName, Supplier> trackBlock, ResourceLocation particle, Ingredient sleeperIngredient, Ingredient railsIngredient, TrackType trackType, TrackModelHolder modelHolder) { + @OnlyIn(Dist.CLIENT) + protected TrackModelHolder modelHolder; + + @OnlyIn(Dist.CLIENT) + public TrackModelHolder getModelHolder() { + return modelHolder; + } + + public TrackMaterial(ResourceLocation id, String langName, NonNullSupplier> trackBlock, + ResourceLocation particle, Ingredient sleeperIngredient, Ingredient railsIngredient, + TrackType trackType, Supplier> modelHolder) { this.id = id; this.langName = langName; this.trackBlock = trackBlock; @@ -46,15 +62,15 @@ public class TrackMaterial { this.railsIngredient = railsIngredient; this.particle = particle; this.trackType = trackType; - this.modelHolder = modelHolder; - ALL.add(this); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.modelHolder = modelHolder.get().get()); + ALL.put(this.id, this); } - public BlockEntry getTrackBlock() { + public NonNullSupplier getTrackBlock() { return this.trackBlock.get(); } - public TrackBlock create(BlockBehaviour.Properties properties) { + public TrackBlock createBlock(BlockBehaviour.Properties properties) { return this.trackType.factory.create(properties, this); } @@ -63,20 +79,20 @@ public class TrackMaterial { } public static TrackMaterial[] allCustom(String modid) { - return ALL.stream().filter(tm -> tm.isCustom(modid)).toArray(TrackMaterial[]::new); + return ALL.values().stream().filter(tm -> tm.isCustom(modid)).toArray(TrackMaterial[]::new); } - public static List> allCustomBlocks(String modid) { - List> list = new ArrayList<>(); + public static List> allCustomBlocks(String modid) { + List> list = new ArrayList<>(); for (TrackMaterial material : allCustom(modid)) { list.add(material.getTrackBlock()); } return list; } - public static List> allBlocks() { - List> list = new ArrayList<>(); - for (TrackMaterial material : ALL) { + public static List> allBlocks() { + List> list = new ArrayList<>(); + for (TrackMaterial material : ALL.values()) { list.add(material.getTrackBlock()); } return list; @@ -87,11 +103,16 @@ public class TrackMaterial { } public static TrackMaterial deserialize(String serializedName) { - ResourceLocation id = new ResourceLocation(serializedName); - for (TrackMaterial material : ALL) { + ResourceLocation id = ResourceLocation.tryParse(serializedName); + if (id == null) { + Create.LOGGER.error("Failed to parse serialized track material: "+serializedName); + return ANDESITE; + } + for (TrackMaterial material : ALL.values()) { if (material.id.equals(id)) return material; } + Create.LOGGER.error("Failed to locate serialized track material: "+serializedName); return ANDESITE; } @@ -112,6 +133,13 @@ public class TrackMaterial { } } + public static TrackMaterial fromItem(Item item) { + if (item instanceof BlockItem blockItem && blockItem.getBlock() instanceof ITrackBlock trackBlock) + return trackBlock.getMaterial(); + return TrackMaterial.ANDESITE; + } + + @OnlyIn(Dist.CLIENT) public record TrackModelHolder(PartialModel tie, PartialModel segment_left, PartialModel segment_right) { static final TrackModelHolder DEFAULT = new TrackModelHolder(AllBlockPartials.TRACK_TIE, AllBlockPartials.TRACK_SEGMENT_LEFT, AllBlockPartials.TRACK_SEGMENT_RIGHT); } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java index f0f54e27e..878f09ce2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/TrackMaterialFactory.java @@ -3,11 +3,15 @@ package com.simibubi.create.content.logistics.trains; import com.jozufozu.flywheel.core.PartialModel; import com.simibubi.create.AllTags; import com.simibubi.create.content.logistics.trains.track.TrackBlock; -import com.tterrag.registrate.util.entry.BlockEntry; + +import com.tterrag.registrate.util.nullness.NonNullSupplier; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.level.ItemLike; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; import java.util.function.Supplier; import java.util.stream.Stream; @@ -15,15 +19,20 @@ import java.util.stream.Stream; public class TrackMaterialFactory { private final ResourceLocation id; private String langName; - private Supplier> trackBlock; + private NonNullSupplier> trackBlock; private Ingredient sleeperIngredient = Ingredient.EMPTY; private Ingredient railsIngredient = Ingredient.fromValues(Stream.of(new Ingredient.TagValue(AllTags.forgeItemTag("nuggets/iron")), new Ingredient.TagValue(AllTags.forgeItemTag("nuggets/zinc")))); private ResourceLocation particle; private TrackMaterial.TrackType trackType = TrackMaterial.TrackType.STANDARD; - private TrackMaterial.TrackModelHolder modelHolder = null; - private PartialModel tieModel = null; - private PartialModel leftSegmentModel = null; - private PartialModel rightSegmentModel = null; + + @OnlyIn(Dist.CLIENT) + private TrackMaterial.TrackModelHolder modelHolder; + @OnlyIn(Dist.CLIENT) + private PartialModel tieModel; + @OnlyIn(Dist.CLIENT) + private PartialModel leftSegmentModel; + @OnlyIn(Dist.CLIENT) + private PartialModel rightSegmentModel; public TrackMaterialFactory(ResourceLocation id) { this.id = id; @@ -38,13 +47,13 @@ public class TrackMaterialFactory { return this; } - public TrackMaterialFactory block(Supplier> trackBlock) { + public TrackMaterialFactory block(NonNullSupplier> trackBlock) { this.trackBlock = trackBlock; return this; } - public TrackMaterialFactory setBuiltin() { - this.modelHolder = TrackMaterial.TrackModelHolder.DEFAULT; + public TrackMaterialFactory defaultModels() { // was setBuiltin + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.modelHolder = TrackMaterial.TrackModelHolder.DEFAULT); return this; } @@ -84,19 +93,23 @@ public class TrackMaterialFactory { return this; } - public TrackMaterialFactory defaultModels() { - String namespace = id.getNamespace(); - String prefix = "block/track/" + id.getPath() + "/"; - tieModel = new PartialModel(new ResourceLocation(namespace, prefix + "tie")); - leftSegmentModel = new PartialModel(new ResourceLocation(namespace, prefix + "segment_left")); - rightSegmentModel = new PartialModel(new ResourceLocation(namespace, prefix + "segment_right")); + public TrackMaterialFactory standardModels() { // was defaultModels + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + String namespace = id.getNamespace(); + String prefix = "block/track/" + id.getPath() + "/"; + tieModel = new PartialModel(new ResourceLocation(namespace, prefix + "tie")); + leftSegmentModel = new PartialModel(new ResourceLocation(namespace, prefix + "segment_left")); + rightSegmentModel = new PartialModel(new ResourceLocation(namespace, prefix + "segment_right")); + }); return this; } - public TrackMaterialFactory customModels(PartialModel tieModel, PartialModel leftSegmentModel, PartialModel rightSegmentModel) { - this.tieModel = tieModel; - this.leftSegmentModel = leftSegmentModel; - this.rightSegmentModel = rightSegmentModel; + public TrackMaterialFactory customModels(Supplier> tieModel, Supplier> leftSegmentModel, Supplier> rightSegmentModel) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + this.tieModel = tieModel.get().get(); + this.leftSegmentModel = leftSegmentModel.get().get(); + this.rightSegmentModel = rightSegmentModel.get().get(); + }); return this; } @@ -108,11 +121,13 @@ public class TrackMaterialFactory { assert sleeperIngredient != null; assert railsIngredient != null; assert id != null; - assert modelHolder != null; - if (tieModel != null || leftSegmentModel != null || rightSegmentModel != null) { - assert tieModel != null && leftSegmentModel != null && rightSegmentModel != null; - modelHolder = new TrackMaterial.TrackModelHolder(tieModel, leftSegmentModel, rightSegmentModel); - } - return new TrackMaterial(id, langName, trackBlock, particle, sleeperIngredient, railsIngredient, trackType, modelHolder); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { + assert modelHolder != null; + if (tieModel != null || leftSegmentModel != null || rightSegmentModel != null) { + assert tieModel != null && leftSegmentModel != null && rightSegmentModel != null; + modelHolder = new TrackMaterial.TrackModelHolder(tieModel, leftSegmentModel, rightSegmentModel); + } + }); + return new TrackMaterial(id, langName, trackBlock, particle, sleeperIngredient, railsIngredient, trackType, () -> () -> modelHolder); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java index 6b03ccad9..c764f143f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackBlock.java @@ -11,7 +11,6 @@ import static com.simibubi.create.AllShapes.TRACK_ORTHO_LONG; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -21,10 +20,12 @@ import java.util.Set; import java.util.function.Consumer; import com.simibubi.create.AllTags; -import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.TrackMaterial; +import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; + import org.jetbrains.annotations.Nullable; import com.google.common.base.Predicates; @@ -114,7 +115,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.IBlockRenderProperties; //init public class TrackBlock extends Block - implements ITE, IWrenchable, ITrackBlock, ISpecialBlockItemRequirement, ProperWaterloggedBlock, IHasTrackMaterial { + implements ITE, IWrenchable, ITrackBlock, ISpecialBlockItemRequirement, ProperWaterloggedBlock { public static final EnumProperty SHAPE = EnumProperty.create("shape", TrackShape.class); public static final BooleanProperty HAS_TE = BooleanProperty.create("turn"); @@ -762,7 +763,7 @@ public class TrackBlock extends Block @Override public ItemRequirement getRequiredItems(BlockState state, BlockEntity te) { int sameTypeTrackAmount = 1; - Map otherTrackAmounts = new HashMap<>(); + Object2IntMap otherTrackAmounts = new Object2IntArrayMap<>(); int girderAmount = 0; if (te instanceof TrackTileEntity track) { @@ -770,7 +771,7 @@ public class TrackBlock extends Block .values()) { if (!bezierConnection.isPrimary()) continue; - TrackMaterial material = ((IHasTrackMaterial) bezierConnection).getMaterial(); + TrackMaterial material = bezierConnection.getMaterial(); if (material == getMaterial()) { sameTypeTrackAmount += bezierConnection.getTrackItemCost(); } else { @@ -786,7 +787,7 @@ public class TrackBlock extends Block sameTypeTrackAmount -= 64; } for (TrackMaterial material : otherTrackAmounts.keySet()) { - int amt = otherTrackAmounts.get(material); + int amt = otherTrackAmounts.getOrDefault(material, 0); while (amt > 0) { stacks.add(new ItemStack(material.getTrackBlock().get(), Math.min(amt, 64))); amt -= 64; diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java index 76118bac9..37cb3b6e0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackInstance.java @@ -20,7 +20,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.content.logistics.trains.BezierConnection.GirderAngles; import com.simibubi.create.content.logistics.trains.BezierConnection.SegmentAngles; -import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; @@ -114,7 +113,7 @@ public class TrackInstance extends BlockEntityInstance { leftLightPos = new BlockPos[segCount]; rightLightPos = new BlockPos[segCount]; - TrackMaterial.TrackModelHolder modelHolder = ((IHasTrackMaterial) bc).getMaterial().modelHolder; + TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); mat.getModel(modelHolder.tie()) .createInstances(ties); diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java index 28a0cd4ce..adf3e9707 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackPlacement.java @@ -5,7 +5,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.function.Function; import com.jozufozu.flywheel.util.Color; import com.simibubi.create.AllSpecialTextures; @@ -13,7 +12,6 @@ import com.simibubi.create.AllTags; import com.simibubi.create.CreateClient; import com.simibubi.create.content.curiosities.tools.BlueprintOverlayRenderer; import com.simibubi.create.content.logistics.trains.BezierConnection; -import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.ITrackBlock; import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.advancement.AllAdvancements; @@ -61,7 +59,12 @@ import net.minecraftforge.items.ItemHandlerHelper; public class TrackPlacement { - public static class PlacementInfo implements IHasTrackMaterial { + public static class PlacementInfo { + + public PlacementInfo(TrackMaterial material) { + this.trackMaterial = material; + } + BezierConnection curve = null; boolean valid = false; int end1Extent = 0; @@ -73,7 +76,7 @@ public class TrackPlacement { public int requiredPavement = 0; public boolean hasRequiredPavement = false; - private TrackMaterial trackMaterial; + public final TrackMaterial trackMaterial; // for visualisation Vec3 end1; @@ -94,19 +97,6 @@ public class TrackPlacement { curve = null; return this; } - - @Override - public TrackMaterial getMaterial() { - if (trackMaterial == null) { - throw new RuntimeException("Track material should never be null in TrackPlacement#PlacementInfo"); - } - return trackMaterial; - } - - @Override - public void setMaterial(TrackMaterial material) { - trackMaterial = material; - } } public static PlacementInfo cached; @@ -126,8 +116,7 @@ public class TrackPlacement { && hoveringMaxed == maximiseTurn && lookAngle == hoveringAngle) return cached; - PlacementInfo info = new PlacementInfo(); - info.trackMaterial = IHasTrackMaterial.fromItem(stack.getItem()); + PlacementInfo info = new PlacementInfo(TrackMaterial.fromItem(stack.getItem())); hoveringMaxed = maximiseTurn; hoveringAngle = lookAngle; hoveringPos = pos2; @@ -211,7 +200,7 @@ public class TrackPlacement { BlockPos targetPos2 = pos2.offset(offset2.x, offset2.y, offset2.z); info.curve = new BezierConnection(Couple.create(targetPos1, targetPos2), Couple.create(end1.add(offset1), end2.add(offset2)), Couple.create(normedAxis1, normedAxis2), - Couple.create(normal1, normal2), true, girder, IHasTrackMaterial.fromItem(stack.getItem())); + Couple.create(normal1, normal2), true, girder, TrackMaterial.fromItem(stack.getItem())); } // S curve or Straight @@ -371,7 +360,7 @@ public class TrackPlacement { info.curve = skipCurve ? null : new BezierConnection(Couple.create(targetPos1, targetPos2), Couple.create(end1.add(offset1), end2.add(offset2)), Couple.create(normedAxis1, normedAxis2), - Couple.create(normal1, normal2), true, girder, IHasTrackMaterial.fromItem(stack.getItem())); + Couple.create(normal1, normal2), true, girder, TrackMaterial.fromItem(stack.getItem())); info.valid = true; @@ -533,7 +522,7 @@ public class TrackPlacement { BlockPos offsetPos = pos.offset(offset.x, offset.y, offset.z); BlockState stateAtPos = level.getBlockState(offsetPos); // copy over all shared properties from the shaped state to the correct track material block - BlockState toPlace = copyProperties(state, info.getMaterial().getTrackBlock().getDefaultState()); + BlockState toPlace = copyProperties(state, info.trackMaterial.getTrackBlock().get().defaultBlockState()); boolean canPlace = stateAtPos.getMaterial() .isReplaceable(); @@ -556,7 +545,7 @@ public class TrackPlacement { return info; if (!simulate) { - BlockState onto = info.getMaterial().getTrackBlock().getDefaultState(); + BlockState onto = info.trackMaterial.getTrackBlock().get().defaultBlockState(); BlockState stateAtPos = level.getBlockState(targetPos1); level.setBlock(targetPos1, ProperWaterloggedBlock.withWater(level, (AllTags.AllBlockTags.TRACKS.matches(stateAtPos) ? stateAtPos : copyProperties(state1, onto)) diff --git a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java index cb5f3f9d7..fdb66a005 100644 --- a/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/trains/track/TrackRenderer.java @@ -12,7 +12,6 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.simibubi.create.content.logistics.trains.BezierConnection; import com.simibubi.create.content.logistics.trains.BezierConnection.GirderAngles; import com.simibubi.create.content.logistics.trains.BezierConnection.SegmentAngles; -import com.simibubi.create.content.logistics.trains.IHasTrackMaterial; import com.simibubi.create.content.logistics.trains.TrackMaterial; import com.simibubi.create.foundation.render.CachedBufferer; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; @@ -65,7 +64,7 @@ public class TrackRenderer extends SafeTileEntityRenderer { SegmentAngles segment = segments[i]; int light = LevelRenderer.getLightColor(level, segment.lightPosition.offset(tePosition)); - TrackMaterial.TrackModelHolder modelHolder = ((IHasTrackMaterial) bc).getMaterial().modelHolder; + TrackMaterial.TrackModelHolder modelHolder = bc.getMaterial().getModelHolder(); CachedBufferer.partial(modelHolder.tie(), air) .mulPose(segment.tieTransform.pose()) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index c2b2d4742..e3905f033 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -4,6 +4,7 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.Create; import com.simibubi.create.content.logistics.trains.TrackMaterial; +import com.simibubi.create.content.logistics.trains.track.TrackBlock; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.ponder.PonderRegistrationHelper; import com.simibubi.create.foundation.ponder.PonderRegistry; @@ -21,8 +22,15 @@ import com.simibubi.create.foundation.ponder.content.trains.TrainScenes; import com.simibubi.create.foundation.ponder.content.trains.TrainSignalScenes; import com.simibubi.create.foundation.ponder.content.trains.TrainStationScenes; +import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.entry.ItemProviderEntry; + import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import java.util.stream.Collectors; public class PonderIndex { @@ -304,7 +312,12 @@ public class PonderIndex { .addStoryBoard("rose_quartz_lamp", RedstoneScenes2::roseQuartzLamp); // Trains - HELPER.forComponents(TrackMaterial.allBlocks()) + HELPER.forComponents(TrackMaterial.allBlocks().stream() + .map((trackSupplier) -> new BlockEntry( + // note: these blocks probably WON'T be in the Create Registrate, but a simple code trace reveals the Entry's registrate isn't used + Create.REGISTRATE, + RegistryObject.create(trackSupplier.get().getRegistryName(), ForgeRegistries.BLOCKS))) + .toList()) .addStoryBoard("train_track/placement", TrackScenes::placement) .addStoryBoard("train_track/portal", TrackScenes::portal) .addStoryBoard("train_track/chunks", TrackScenes::chunks);